Skip to content

Instantly share code, notes, and snippets.

@manugarri
Created February 21, 2016 21:19
Show Gist options
  • Star 15 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save manugarri/404dde176ebeea41df50 to your computer and use it in GitHub Desktop.
Save manugarri/404dde176ebeea41df50 to your computer and use it in GitHub Desktop.
Where the f*** can I park?
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Where the fuck can I park?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This notebook is the code that accompanies [this blog post](http://blog.manugarri.com/where-the-f-can-i-park/). Basically I explain there the issues I found when trying to figure out where can I park on my town in Spain."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Populating the interactive namespace from numpy and matplotlib\n"
]
}
],
"source": [
"%pylab inline"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You will need to download the geojson data from [here](https://s3.amazonaws.com/metro-extracts.mapzen.com/murcia_spain.imposm-geojson.zip) , and the clean street file from [this spreadsheet](https://docs.google.com/spreadsheets/d/1tdlmli43oq1bFBf8n41XfdUouquXRA7RQKkQIF4CJ3c/edit?usp=sharing)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import pandas as pd\n",
"import unicodedata\n",
"import geopandas as gpd\n",
"import geopy\n",
"import shapely.ops\n",
"from shapely.geometry.point import Point\n",
"from shapely.geometry.linestring import LineString\n",
"from shapely.geometry import MultiPoint\n",
"import folium"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First we load the geojson data and the clean list from the spreadsheet ,as a geopandas dataframes."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"(2376, 13)"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"roads_df = gpd.read_file('murcia_spain.imposm-geojson/murcia_spain_roads.geojson')\n",
"roads_df = roads_df[roads_df['name'].notnull()]\n",
"roads_df.shape"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>access</th>\n",
" <th>bridge</th>\n",
" <th>class</th>\n",
" <th>geometry</th>\n",
" <th>id</th>\n",
" <th>name</th>\n",
" <th>oneway</th>\n",
" <th>osm_id</th>\n",
" <th>ref</th>\n",
" <th>service</th>\n",
" <th>tunnel</th>\n",
" <th>type</th>\n",
" <th>z_order</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>None</td>\n",
" <td>0</td>\n",
" <td>highway</td>\n",
" <td>LINESTRING (-1.125423512183801 37.991579170480...</td>\n",
" <td>1</td>\n",
" <td>plaza Juan XXIII</td>\n",
" <td>0</td>\n",
" <td>23067118</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" <td>0</td>\n",
" <td>primary</td>\n",
" <td>6</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>None</td>\n",
" <td>0</td>\n",
" <td>highway</td>\n",
" <td>LINESTRING (-1.125423512183801 37.991579170480...</td>\n",
" <td>3</td>\n",
" <td>Avenida Rector José Loustau</td>\n",
" <td>0</td>\n",
" <td>23067664</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" <td>0</td>\n",
" <td>residential</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>None</td>\n",
" <td>0</td>\n",
" <td>highway</td>\n",
" <td>LINESTRING (-1.127376663261316 37.981144455400...</td>\n",
" <td>4</td>\n",
" <td>Avenida Río Segura</td>\n",
" <td>0</td>\n",
" <td>23067712</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" <td>0</td>\n",
" <td>residential</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>None</td>\n",
" <td>0</td>\n",
" <td>highway</td>\n",
" <td>LINESTRING (-1.117595401352986 37.990002031579...</td>\n",
" <td>5</td>\n",
" <td>Ronda de Levante</td>\n",
" <td>1</td>\n",
" <td>23067799</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" <td>0</td>\n",
" <td>primary</td>\n",
" <td>6</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>None</td>\n",
" <td>0</td>\n",
" <td>highway</td>\n",
" <td>LINESTRING (-1.131457141364223 37.992166071340...</td>\n",
" <td>7</td>\n",
" <td>Avenida General Primo de Rivera</td>\n",
" <td>1</td>\n",
" <td>23067354</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" <td>0</td>\n",
" <td>primary</td>\n",
" <td>6</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" access bridge class geometry \\\n",
"0 None 0 highway LINESTRING (-1.125423512183801 37.991579170480... \n",
"2 None 0 highway LINESTRING (-1.125423512183801 37.991579170480... \n",
"3 None 0 highway LINESTRING (-1.127376663261316 37.981144455400... \n",
"4 None 0 highway LINESTRING (-1.117595401352986 37.990002031579... \n",
"6 None 0 highway LINESTRING (-1.131457141364223 37.992166071340... \n",
"\n",
" id name oneway osm_id ref service \\\n",
"0 1 plaza Juan XXIII 0 23067118 None None \n",
"2 3 Avenida Rector José Loustau 0 23067664 None None \n",
"3 4 Avenida Río Segura 0 23067712 None None \n",
"4 5 Ronda de Levante 1 23067799 None None \n",
"6 7 Avenida General Primo de Rivera 1 23067354 None None \n",
"\n",
" tunnel type z_order \n",
"0 0 primary 6 \n",
"2 0 residential 3 \n",
"3 0 residential 3 \n",
"4 0 primary 6 \n",
"6 0 primary 6 "
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"roads_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x7f872824a8d0>"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n188AAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f8728266310>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"roads_df.plot()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
" # we clean the zones files in google sheets\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"zones = pd.read_csv('ORA Murcia.csv', encoding='utf8')\n",
"zones.road_type = zones.road_type.apply(lambda x: unicodedata.normalize('NFKD',x).encode('ascii', 'ignore'))\n",
"zones = zones[zones.road_name.notnull()]\n",
"zones.road_name = zones.road_name.apply(lambda x: unicodedata.normalize('NFKD',x).encode('ascii', 'ignore'))"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"g = geopy.geocoders.GoogleV3(api_key='GOOGLE API KEY')"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"zones['geo_name'] = zones.road_type.apply(str) +' ' +zones.road_name.apply(str) + ', Murcia'\n",
"zones['geocode'] = zones.geo_name.apply(lambda x: g.geocode(x))\n",
"zones['latlon'] = zones.geocode.apply(lambda x: [x.latitude, x.longitude])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### We save the geocoded data and reload so we dont have to geocode again if we have to stop the session"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"zones.to_csv('ORA Murcia2.csv', index=False, encoding='utf8')"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"zones = pd.read_csv('ORA Murcia2.csv', encoding='utf8')\n",
"zones['latlon'] = zones['latlon'].apply(lambda x: x.replace('[','').replace(']','').split(','))\n",
"zones['latlon'] = zones['latlon'] .apply(lambda x: [float(x[0]), float(x[1])])"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"zones_osm = gpd.GeoDataFrame(pd.merge(roads_df, zones[zones.osm_name.notnull()],\n",
" left_on='name', \n",
" right_on='osm_name')[['name','geometry','zone', 'geocode', 'latlon']])\n",
"zones_osm.drop_duplicates(subset=['zone','name'],inplace=True)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([u'1-2-3', u'5', u'4', u'6'], dtype=object)"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"zones_osm.zone.unique()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### We see that there are 6 zones, with 1-2-3 being all together"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/manuel/anaconda3/lib/python2.7/site-packages/ipykernel/__main__.py:11: FutureWarning: simple_marker is deprecated. Use add_children(Marker) instead\n"
]
},
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;base64,CiAgICAgICAgPCFET0NUWVBFIGh0bWw+CiAgICAgICAgPGhlYWQ+CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICA8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgLz4KICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9sZWFmbGV0LzAuNy4zL2xlYWZsZXQuanMiPjwvc2NyaXB0PgogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vYWpheC5nb29nbGVhcGlzLmNvbS9hamF4L2xpYnMvanF1ZXJ5LzEuMTEuMS9qcXVlcnkubWluLmpzIj48L3NjcmlwdD4KICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIDxzY3JpcHQgc3JjPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9qcy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIDxzY3JpcHQgc3JjPSJodHRwczovL3Jhd2dpdGh1Yi5jb20vbHZvb2dkdC9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAvZGV2ZWxvcC9kaXN0L2xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLmpzIj48L3NjcmlwdD4KICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9sZWFmbGV0Lm1hcmtlcmNsdXN0ZXIvMC40LjAvbGVhZmxldC5tYXJrZXJjbHVzdGVyLXNyYy5qcyI+PC9zY3JpcHQ+CiAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvbGVhZmxldC5tYXJrZXJjbHVzdGVyLzAuNC4wL2xlYWZsZXQubWFya2VyY2x1c3Rlci5qcyI+PC9zY3JpcHQ+CiAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2xlYWZsZXQvMC43LjMvbGVhZmxldC5jc3MiIC8+CiAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMi4wL2Nzcy9ib290c3RyYXAubWluLmNzcyIgLz4KICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIiAvPgogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2ZvbnQtYXdlc29tZS80LjEuMC9jc3MvZm9udC1hd2Vzb21lLm1pbi5jc3MiIC8+CiAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vcmF3Z2l0LmNvbS9sdm9vZ2R0L0xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLzIuMC9kZXZlbG9wL2Rpc3QvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuY3NzIiAvPgogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9sZWFmbGV0Lm1hcmtlcmNsdXN0ZXIvMC40LjAvTWFya2VyQ2x1c3Rlci5EZWZhdWx0LmNzcyIgLz4KICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvbGVhZmxldC5tYXJrZXJjbHVzdGVyLzAuNC4wL01hcmtlckNsdXN0ZXIuY3NzIiAvPgogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcHl0aG9uLXZpc3VhbGl6YXRpb24vZm9saXVtL21hc3Rlci9mb2xpdW0vdGVtcGxhdGVzL2xlYWZsZXQuYXdlc29tZS5yb3RhdGUuY3NzIiAvPgogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgPHN0eWxlPgoKICAgICAgICAgICAgaHRtbCwgYm9keSB7CiAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICAgICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICAgICAgICAgIG1hcmdpbjogMDsKICAgICAgICAgICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAjbWFwIHsKICAgICAgICAgICAgICAgIHBvc2l0aW9uOmFic29sdXRlOwogICAgICAgICAgICAgICAgdG9wOjA7CiAgICAgICAgICAgICAgICBib3R0b206MDsKICAgICAgICAgICAgICAgIHJpZ2h0OjA7CiAgICAgICAgICAgICAgICBsZWZ0OjA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIDwvc3R5bGU+CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgPHN0eWxlPiAjbWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmIHsKICAgICAgICAgICAgICAgIHBvc2l0aW9uIDogcmVsYXRpdmU7CiAgICAgICAgICAgICAgICB3aWR0aCA6IDEwMC4wJTsKICAgICAgICAgICAgICAgIGhlaWdodDogMTAwLjAlOwogICAgICAgICAgICAgICAgbGVmdDogMC4wJTsKICAgICAgICAgICAgICAgIHRvcDogMC4wJTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgPC9zdHlsZT4KICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICA8L2hlYWQ+CiAgICAgICAgPGJvZHk+CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9saXVtLW1hcCIgaWQ9Im1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0ZiIgPjwvZGl2PgogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgIDwvYm9keT4KICAgICAgICA8c2NyaXB0PgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgc291dGhXZXN0ID0gTC5sYXRMbmcoLTkwLCAtMTgwKTsKICAgICAgICAgICAgdmFyIG5vcnRoRWFzdCA9IEwubGF0TG5nKDkwLCAxODApOwogICAgICAgICAgICB2YXIgYm91bmRzID0gTC5sYXRMbmdCb3VuZHMoc291dGhXZXN0LCBub3J0aEVhc3QpOwoKICAgICAgICAgICAgdmFyIG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0ZiA9IEwubWFwKCdtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXI6WzM3Ljk4MjkyNzIsLTEuMTI1MTk0OF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiAxNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgdGlsZV9sYXllcl80MzU2OTE3Y2ZkYTU0ZTllOTY5NmYyZTEwMjhiZDdmOCA9IEwudGlsZUxheWVyKAogICAgICAgICAgICAgICAgJ2h0dHBzOi8vY2FydG9kYi1iYXNlbWFwcy17c30uZ2xvYmFsLnNzbC5mYXN0bHkubmV0L2xpZ2h0X2FsbC97en0ve3h9L3t5fS5wbmcnLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1heFpvb206IDE4LAogICAgICAgICAgICAgICAgICAgIG1pblpvb206IDEsCiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRpb246ICcoYykgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuc3RyZWV0bWFwLm9yZy9jb3B5cmlnaHQiPk9wZW5TdHJlZXRNYXA8L2E+IGNvbnRyaWJ1dG9ycyAoYykgPGEgaHJlZj0iaHR0cDovL2NhcnRvZGIuY29tL2F0dHJpYnV0aW9ucyI+Q2FydG9EQjwvYT4sIENhcnRvREIgPGEgaHJlZiA9Imh0dHA6Ly9jYXJ0b2RiLmNvbS9hdHRyaWJ1dGlvbnMiPmF0dHJpYnV0aW9uczwvYT4nLAogICAgICAgICAgICAgICAgICAgIGRldGVjdFJldGluYTogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CgogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNGQ5ZTMwMTQwNGZmNDMyMGJjYzljMjUzOTc3YzlmYzkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45NDUwMDE0LC0xLjExMDc0MV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzVlZWU4YTE4YzIzMTQyOWJiMmU3ZDUyYmQ2ZGMzZjFhID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzRkOWUzMDE0MDRmZjQzMjBiY2M5YzI1Mzk3N2M5ZmM5LnNldEljb24oaWNvbl81ZWVlOGExOGMyMzE0MjliYjJlN2Q1MmJkNmRjM2YxYSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzliYzMwY2E2ZDYxNjRhNGY4YWM5YWMzNTk1MjdhM2E0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RhMDRkNzQzYjI4YjRjMjBhMzcxMzAwYTlhM2RjMjlkID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9kYTA0ZDc0M2IyOGI0YzIwYTM3MTMwMGE5YTNkYzI5ZCIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgcGxhemEgSnVhbiBYWElJSSAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWJjMzBjYTZkNjE2NGE0ZjhhYzlhYzM1OTUyN2EzYTQuc2V0Q29udGVudChodG1sX2RhMDRkNzQzYjI4YjRjMjBhMzcxMzAwYTlhM2RjMjlkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNGQ5ZTMwMTQwNGZmNDMyMGJjYzljMjUzOTc3YzlmYzkuYmluZFBvcHVwKHBvcHVwXzliYzMwY2E2ZDYxNjRhNGY4YWM5YWMzNTk1MjdhM2E0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMmVmYTdjYTUzMTg0NDUxNmI0NGM1ODAwZTVlZGQ1YTAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45OTE1Mzg5LC0xLjEyNDQ5MjNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl9iMmRjM2NmZmViM2E0MjhhYWM5MDkxYTUyOGQzOTM0YyA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl8yZWZhN2NhNTMxODQ0NTE2YjQ0YzU4MDBlNWVkZDVhMC5zZXRJY29uKGljb25fYjJkYzNjZmZlYjNhNDI4YWFjOTA5MWE1MjhkMzkzNGMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jMTgxNGVkZjhjNWE0YjJlYThiMTY3ZTNkY2E3MTk5NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mYTJhZjUzODNkMTI0YmJlYTlmNDhlZmYwM2ViOWUzMSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfZmEyYWY1MzgzZDEyNGJiZWE5ZjQ4ZWZmMDNlYjllMzEiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIFJvbmRhIGRlIExldmFudGUgKFpvbmEgMS0yLTMpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2MxODE0ZWRmOGM1YTRiMmVhOGIxNjdlM2RjYTcxOTk2LnNldENvbnRlbnQoaHRtbF9mYTJhZjUzODNkMTI0YmJlYTlmNDhlZmYwM2ViOWUzMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzJlZmE3Y2E1MzE4NDQ1MTZiNDRjNTgwMGU1ZWRkNWEwLmJpbmRQb3B1cChwb3B1cF9jMTgxNGVkZjhjNWE0YjJlYThiMTY3ZTNkY2E3MTk5Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2M5ODkyNTk4NzUyYjRjNDZhN2U1OGYwZGUwYWFhNTI5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTkxMDM5NiwtMS4xMzQwMTA4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fMDVlYmQ5NDE3NDYyNGZjMzliOTk3ZDI1NWVjZThlNjEgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfYzk4OTI1OTg3NTJiNGM0NmE3ZTU4ZjBkZTBhYWE1Mjkuc2V0SWNvbihpY29uXzA1ZWJkOTQxNzQ2MjRmYzM5Yjk5N2QyNTVlY2U4ZTYxKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmFjZDg2ZWRmNTJmNGFkYzk2OTI2MWQ2OTViMjYzMDggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODg1Njg5ZDg2OTJlNDNkMTk2M2YxNGFkMTgzNGIzOGMgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzg4NTY4OWQ4NjkyZTQzZDE5NjNmMTRhZDE4MzRiMzhjIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBBdmVuaWRhIEdlbmVyYWwgUHJpbW8gZGUgUml2ZXJhIChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82YWNkODZlZGY1MmY0YWRjOTY5MjYxZDY5NWIyNjMwOC5zZXRDb250ZW50KGh0bWxfODg1Njg5ZDg2OTJlNDNkMTk2M2YxNGFkMTgzNGIzOGMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jOTg5MjU5ODc1MmI0YzQ2YTdlNThmMGRlMGFhYTUyOS5iaW5kUG9wdXAocG9wdXBfNmFjZDg2ZWRmNTJmNGFkYzk2OTI2MWQ2OTViMjYzMDgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9hZjI0OWRjZTgyNTk0MWM5ODI3ODJjMTM1Y2I5ZGRlNyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk5MjU5MjcsLTEuMTM5NTYzOV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uX2VmYjA5NjcyZDQzYTQwM2JiMDM0MGNmMjkwZWI3ZTZhID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyX2FmMjQ5ZGNlODI1OTQxYzk4Mjc4MmMxMzVjYjlkZGU3LnNldEljb24oaWNvbl9lZmIwOTY3MmQ0M2E0MDNiYjAzNDBjZjI5MGViN2U2YSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U1Njc2YzE4ZTg3YzQ0MDc5NDFkYmVjMWVkMjczNWFjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFlZTllYTU1MTI0NTQzOTA5ZGRhMTBjZjMyNzc0ZDBlID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF8xZWU5ZWE1NTEyNDU0MzkwOWRkYTEwY2YzMjc3NGQwZSIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgUm9uZGEgTm9ydGUgKFpvbmEgMS0yLTMpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U1Njc2YzE4ZTg3YzQ0MDc5NDFkYmVjMWVkMjczNWFjLnNldENvbnRlbnQoaHRtbF8xZWU5ZWE1NTEyNDU0MzkwOWRkYTEwY2YzMjc3NGQwZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2FmMjQ5ZGNlODI1OTQxYzk4Mjc4MmMxMzVjYjlkZGU3LmJpbmRQb3B1cChwb3B1cF9lNTY3NmMxOGU4N2M0NDA3OTQxZGJlYzFlZDI3MzVhYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzhkMjlkYjZiZWNjNjRhYjFiYzYxYWZiY2FjMjM5M2YxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTQxNTY2MiwtMS4xMDk1NzFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl8zMmY5NGRhNDNiNDA0N2IxOGZiYTc1MjJkYjkyNzJiNiA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl84ZDI5ZGI2YmVjYzY0YWIxYmM2MWFmYmNhYzIzOTNmMS5zZXRJY29uKGljb25fMzJmOTRkYTQzYjQwNDdiMThmYmE3NTIyZGI5MjcyYjYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lZGRiNWJkMjViY2U0NDEyOGQ5ZDJiZmU2NDJmYzJhMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85Nzg4NTAxNTU0OTI0OGFlODYyMmM4ODE1YjMxNzU1MyA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfOTc4ODUwMTU1NDkyNDhhZTg2MjJjODgxNWIzMTc1NTMiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIERvY3RvciBNYXJhbm9uIChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lZGRiNWJkMjViY2U0NDEyOGQ5ZDJiZmU2NDJmYzJhMC5zZXRDb250ZW50KGh0bWxfOTc4ODUwMTU1NDkyNDhhZTg2MjJjODgxNWIzMTc1NTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84ZDI5ZGI2YmVjYzY0YWIxYmM2MWFmYmNhYzIzOTNmMS5iaW5kUG9wdXAocG9wdXBfZWRkYjViZDI1YmNlNDQxMjhkOWQyYmZlNjQyZmMyYTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl81MWU3NTYxMzk4ZjM0ZDI3YjA3YWFlZDI5N2Y4MjVlOCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4OTM3NzYsLTEuMTMxNTQ2MV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzgxYzQ0YmM4NGUyNjQ4MDhiYTA4Yzc5MGE3ODllNDRjID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzUxZTc1NjEzOThmMzRkMjdiMDdhYWVkMjk3ZjgyNWU4LnNldEljb24oaWNvbl84MWM0NGJjODRlMjY0ODA4YmEwOGM3OTBhNzg5ZTQ0Yyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FjNjFmM2JkYTk1NzQ2YTA4MDFkZDE3MTQ0NTQ4MDcyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NmYzRhNGE1MDIwMjRjOWY4MzJlYThmN2EzNmU3MzI4ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9jZmM0YTRhNTAyMDI0YzlmODMyZWE4ZjdhMzZlNzMyOCIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgSmFpbWUgSSBlbCBDb25xdWlzdGFkb3IgKFpvbmEgMS0yLTMpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FjNjFmM2JkYTk1NzQ2YTA4MDFkZDE3MTQ0NTQ4MDcyLnNldENvbnRlbnQoaHRtbF9jZmM0YTRhNTAyMDI0YzlmODMyZWE4ZjdhMzZlNzMyOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzUxZTc1NjEzOThmMzRkMjdiMDdhYWVkMjk3ZjgyNWU4LmJpbmRQb3B1cChwb3B1cF9hYzYxZjNiZGE5NTc0NmEwODAxZGQxNzE0NDU0ODA3Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzhlNGM1MDk1MzA1MjQzODliY2VjM2JkMmQ5YWFiYWRkID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTg3NzU1NiwtMS4xMjkwOTQzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fZTZmMTBhZjhjMmI2NGU3M2FkYjkyMGU0N2U3Nzk4NjggPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfOGU0YzUwOTUzMDUyNDM4OWJjZWMzYmQyZDlhYWJhZGQuc2V0SWNvbihpY29uX2U2ZjEwYWY4YzJiNjRlNzNhZGI5MjBlNDdlNzc5ODY4KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzAxMmFhNDUzZjFjNDE1MThmY2U0N2I2ZjYxNTkyM2YgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGIwZTAzZGI2NjkzNDAzZWFiMTNhMGU0ZGZlM2I3ZmQgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzhiMGUwM2RiNjY5MzQwM2VhYjEzYTBlNGRmZTNiN2ZkIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBjYWxsZSBFbnJpcXVlIFZpbGxhciAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzAxMmFhNDUzZjFjNDE1MThmY2U0N2I2ZjYxNTkyM2Yuc2V0Q29udGVudChodG1sXzhiMGUwM2RiNjY5MzQwM2VhYjEzYTBlNGRmZTNiN2ZkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOGU0YzUwOTUzMDUyNDM4OWJjZWMzYmQyZDlhYWJhZGQuYmluZFBvcHVwKHBvcHVwXzMwMTJhYTQ1M2YxYzQxNTE4ZmNlNDdiNmY2MTU5MjNmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMDJhNWJlNDVjNzQ5NDI5N2I2MzdlODgwYzhhNGQwMWQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45OTIxLC0xLjEyOTAzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fNGY1ODU3YzM5ODgzNDI5OTgwMTg5OTljOTNiYWUxN2MgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfMDJhNWJlNDVjNzQ5NDI5N2I2MzdlODgwYzhhNGQwMWQuc2V0SWNvbihpY29uXzRmNTg1N2MzOTg4MzQyOTk4MDE4OTk5YzkzYmFlMTdjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTY5M2ExYmRiZThkNDIwNDk3NjQ3YjBjYmI5MGIyOTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjdjOTYxMzhlMWZiNDI5YmIyMzMyNTgzYjA0Nzc4OTAgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzY3Yzk2MTM4ZTFmYjQyOWJiMjMzMjU4M2IwNDc3ODkwIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBQbGF6YSBDaXJjdWxhciAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTY5M2ExYmRiZThkNDIwNDk3NjQ3YjBjYmI5MGIyOTQuc2V0Q29udGVudChodG1sXzY3Yzk2MTM4ZTFmYjQyOWJiMjMzMjU4M2IwNDc3ODkwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMDJhNWJlNDVjNzQ5NDI5N2I2MzdlODgwYzhhNGQwMWQuYmluZFBvcHVwKHBvcHVwXzU2OTNhMWJkYmU4ZDQyMDQ5NzY0N2IwY2JiOTBiMjk0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOGRjN2NlNGI0MjdmNDEwODhhNjc0ZTdmODZkZGYxN2YgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45MzYxMjMxLC0xLjE0NzA1MzFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl82OWVjOGU3OGRhNWI0NmFhYTUwNzQ5OGU0NmRkNzEzZSA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl84ZGM3Y2U0YjQyN2Y0MTA4OGE2NzRlN2Y4NmRkZjE3Zi5zZXRJY29uKGljb25fNjllYzhlNzhkYTViNDZhYWE1MDc0OThlNDZkZDcxM2UpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85ZmE1ZDA0Y2EwNWY0MzI3YTVjY2IzYzY1MDg1Nzc0ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zYzZlMzE5N2NmMzU0M2MwYWU5OWEwYzNhY2JkOTBkZiA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfM2M2ZTMxOTdjZjM1NDNjMGFlOTlhMGMzYWNiZDkwZGYiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIENhbGRlcm9uIGRlIGxhIEJhcmNhIChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85ZmE1ZDA0Y2EwNWY0MzI3YTVjY2IzYzY1MDg1Nzc0Zi5zZXRDb250ZW50KGh0bWxfM2M2ZTMxOTdjZjM1NDNjMGFlOTlhMGMzYWNiZDkwZGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84ZGM3Y2U0YjQyN2Y0MTA4OGE2NzRlN2Y4NmRkZjE3Zi5iaW5kUG9wdXAocG9wdXBfOWZhNWQwNGNhMDVmNDMyN2E1Y2NiM2M2NTA4NTc3NGYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9lMDU4Y2FmMzI3YmY0OTJjOWQyYjdiNDVjZjNmNWE1MyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4NzEwNTQsLTEuMTM0OTYwMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzY3ODlhMjZmNzM1ODQ5NjNhMzRmNTM1MGM2ZTJkM2U5ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyX2UwNThjYWYzMjdiZjQ5MmM5ZDJiN2I0NWNmM2Y1YTUzLnNldEljb24oaWNvbl82Nzg5YTI2ZjczNTg0OTYzYTM0ZjUzNTBjNmUyZDNlOSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzYxNzAyMjBhNmYyMjQwMmJhYTkxZWVhMTkzNTE2YzA1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFjNzUxYjM2MzA1ODRkMjk4NzU4NzJhZGQyYmY0NGMxID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF8xYzc1MWIzNjMwNTg0ZDI5ODc1ODcyYWRkMmJmNDRjMSIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgU2FudGEgVGVyZXNhIChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MTcwMjIwYTZmMjI0MDJiYWE5MWVlYTE5MzUxNmMwNS5zZXRDb250ZW50KGh0bWxfMWM3NTFiMzYzMDU4NGQyOTg3NTg3MmFkZDJiZjQ0YzEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9lMDU4Y2FmMzI3YmY0OTJjOWQyYjdiNDVjZjNmNWE1My5iaW5kUG9wdXAocG9wdXBfNjE3MDIyMGE2ZjIyNDAyYmFhOTFlZWExOTM1MTZjMDUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl85ZDQyYjg2YWI3NTg0NTk4OWY4ZjVmYTA1MDlkOTFhNSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4OTg5OTUsLTEuMTM0OTU0M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uX2NkNDgzMDAxNTA0ZDQ5NDJhNDFhYjE0ZjgwZTVmMzBhID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzlkNDJiODZhYjc1ODQ1OTg5ZjhmNWZhMDUwOWQ5MWE1LnNldEljb24oaWNvbl9jZDQ4MzAwMTUwNGQ0OTQyYTQxYWIxNGY4MGU1ZjMwYSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JhMDUwMWZlMjgzZDRhOTNiMjgwZDUyYzQ4MTEzYjk0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NlMDU1OTYxMTNmZTRiMzA5OTkwZTk0Nzc3ZjdiZTc1ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9jZTA1NTk2MTEzZmU0YjMwOTk5MGU5NDc3N2Y3YmU3NSIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgQ29uZGVzdGFibGUgKFpvbmEgMS0yLTMpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JhMDUwMWZlMjgzZDRhOTNiMjgwZDUyYzQ4MTEzYjk0LnNldENvbnRlbnQoaHRtbF9jZTA1NTk2MTEzZmU0YjMwOTk5MGU5NDc3N2Y3YmU3NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzlkNDJiODZhYjc1ODQ1OTg5ZjhmNWZhMDUwOWQ5MWE1LmJpbmRQb3B1cChwb3B1cF9iYTA1MDFmZTI4M2Q0YTkzYjI4MGQ1MmM0ODExM2I5NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzRmMGUzMjZkOWQwMzRjNDc4MGZmZTRiMGIxYTg2ZmZmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTkwNTE1LC0xLjEzNTEyODVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl82MWYzOGYzZTJiMzI0Y2M5OWRiNjZhOTgxNTJlMzg1NCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl80ZjBlMzI2ZDlkMDM0YzQ3ODBmZmU0YjBiMWE4NmZmZi5zZXRJY29uKGljb25fNjFmMzhmM2UyYjMyNGNjOTlkYjY2YTk4MTUyZTM4NTQpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xMjc0NTZjYmYzZjk0MzE2YmEyOTViOGY3OWJkN2RhOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMGFkNzJhNjA0OGU0YWEwOThhMTFjMWZjZjA4NTJkZCA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfZjBhZDcyYTYwNDhlNGFhMDk4YTExYzFmY2YwODUyZGQiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIGNhbGxlIHBvZXRhIENhbm8gUGF0byAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTI3NDU2Y2JmM2Y5NDMxNmJhMjk1YjhmNzliZDdkYTguc2V0Q29udGVudChodG1sX2YwYWQ3MmE2MDQ4ZTRhYTA5OGExMWMxZmNmMDg1MmRkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNGYwZTMyNmQ5ZDAzNGM0NzgwZmZlNGIwYjFhODZmZmYuYmluZFBvcHVwKHBvcHVwXzEyNzQ1NmNiZjNmOTQzMTZiYTI5NWI4Zjc5YmQ3ZGE4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZDEzZThkYWQ3ZWQ1NDM2N2I1ZjY2ZjhkZGEzODYwZWMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45ODc0MTgyLC0xLjEzMzYzNzVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl8yOWU1ZjBlYTI1MzY0NTc1YjBmMmUwNjE5OTkwZmYyYSA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl9kMTNlOGRhZDdlZDU0MzY3YjVmNjZmOGRkYTM4NjBlYy5zZXRJY29uKGljb25fMjllNWYwZWEyNTM2NDU3NWIwZjJlMDYxOTk5MGZmMmEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMTg0NzljOTNhMDk0OWQzODBkYWIyNDNlZTY1MjhmZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kYWI3ZGU5MWVkZTA0Y2YyOTc1MDM2NTk4OTBmMWZkOCA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfZGFiN2RlOTFlZGUwNGNmMjk3NTAzNjU5ODkwZjFmZDgiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIEF5bGxvbiAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjE4NDc5YzkzYTA5NDlkMzgwZGFiMjQzZWU2NTI4ZmUuc2V0Q29udGVudChodG1sX2RhYjdkZTkxZWRlMDRjZjI5NzUwMzY1OTg5MGYxZmQ4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZDEzZThkYWQ3ZWQ1NDM2N2I1ZjY2ZjhkZGEzODYwZWMuYmluZFBvcHVwKHBvcHVwX2IxODQ3OWM5M2EwOTQ5ZDM4MGRhYjI0M2VlNjUyOGZlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOTg5MzBlMjgxMTY0NGQyN2E5YTJjZmFkMmY3YzE5ZjkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45OTIyMzk5LC0xLjEzMDY1NDRdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl82MDNjMmRlMTVlY2E0ZTU1YmQ4NDU4MTgxOTFmMjc3MCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl85ODkzMGUyODExNjQ0ZDI3YTlhMmNmYWQyZjdjMTlmOS5zZXRJY29uKGljb25fNjAzYzJkZTE1ZWNhNGU1NWJkODQ1ODE4MTkxZjI3NzApOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wZDA2ZTk5OGJiYjk0ODM0OWQ0YWYyNmMxZGQ5ZjNlNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lOTdjOGE1ZmZjYWE0MWYyYjVmODZjNzZkMzkyYTI2NyA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfZTk3YzhhNWZmY2FhNDFmMmI1Zjg2Yzc2ZDM5MmEyNjciICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIGNhbGxlam9uIGRlIEJ1cnJ1ZXpvIChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wZDA2ZTk5OGJiYjk0ODM0OWQ0YWYyNmMxZGQ5ZjNlNi5zZXRDb250ZW50KGh0bWxfZTk3YzhhNWZmY2FhNDFmMmI1Zjg2Yzc2ZDM5MmEyNjcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85ODkzMGUyODExNjQ0ZDI3YTlhMmNmYWQyZjdjMTlmOS5iaW5kUG9wdXAocG9wdXBfMGQwNmU5OThiYmI5NDgzNDlkNGFmMjZjMWRkOWYzZTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8zZjdlMzdjMmYzYWI0YmEwOWMwMTBlZjMzNDY4M2E5YiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk5MDAzMywtMS4xMzg2MjQ2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fODYwY2FhOGNjNjYzNDY1Y2IyYjAyYzNlMGYyMGMwNTMgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfM2Y3ZTM3YzJmM2FiNGJhMDljMDEwZWYzMzQ2ODNhOWIuc2V0SWNvbihpY29uXzg2MGNhYThjYzY2MzQ2NWNiMmIwMmMzZTBmMjBjMDUzKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjNkNDgyM2ZiNGQwNDA2N2E1NWQ0ZmEyNzA0ZGE1YTEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGE5YzUzMTliMTU4NGIzNmFlNmNjZjVkZGNiODRhZjggPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2RhOWM1MzE5YjE1ODRiMzZhZTZjY2Y1ZGRjYjg0YWY4IiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBJc2FhYyBBbGJlbml6IChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iM2Q0ODIzZmI0ZDA0MDY3YTU1ZDRmYTI3MDRkYTVhMS5zZXRDb250ZW50KGh0bWxfZGE5YzUzMTliMTU4NGIzNmFlNmNjZjVkZGNiODRhZjgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8zZjdlMzdjMmYzYWI0YmEwOWMwMTBlZjMzNDY4M2E5Yi5iaW5kUG9wdXAocG9wdXBfYjNkNDgyM2ZiNGQwNDA2N2E1NWQ0ZmEyNzA0ZGE1YTEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl84ZTg1NjZlYTJmZTM0M2RkYjNlYmNjY2QxY2JlMGZiOCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk3ODcyOTYsLTEuMTcxMDcwMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uX2E2MGIxOTE0NDJmYzQyMDg5MTY0ZDAzODY4ZWE5OWY3ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzhlODU2NmVhMmZlMzQzZGRiM2ViY2NjZDFjYmUwZmI4LnNldEljb24oaWNvbl9hNjBiMTkxNDQyZmM0MjA4OTE2NGQwMzg2OGVhOTlmNyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E0Y2IyNjJiNWU0ZDQ3MTViMjA0NmNiYzA2NmNiYTBiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M5N2Q0ZDBkZGQwMDQ0ODA4ZjM5YmUxNzU2MWMwZTk5ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9jOTdkNGQwZGRkMDA0NDgwOGYzOWJlMTc1NjFjMGU5OSIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgRmVybmFuZGV6IENhYmFsbGVybyAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTRjYjI2MmI1ZTRkNDcxNWIyMDQ2Y2JjMDY2Y2JhMGIuc2V0Q29udGVudChodG1sX2M5N2Q0ZDBkZGQwMDQ0ODA4ZjM5YmUxNzU2MWMwZTk5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOGU4NTY2ZWEyZmUzNDNkZGIzZWJjY2NkMWNiZTBmYjguYmluZFBvcHVwKHBvcHVwX2E0Y2IyNjJiNWU0ZDQ3MTViMjA0NmNiYzA2NmNiYTBiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNTEwZTViNmU3NDhkNGViOTllYzE4ZDEzMzgxZmI0ZGYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45OTM1NjYyLC0xLjEzNjAzNTddLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl8xYTA4ODJlMWI3NTg0NDYzYTYwMmRmYzIyYmQ3YTQ0NiA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl81MTBlNWI2ZTc0OGQ0ZWI5OWVjMThkMTMzODFmYjRkZi5zZXRJY29uKGljb25fMWEwODgyZTFiNzU4NDQ2M2E2MDJkZmMyMmJkN2E0NDYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84NWNlMGE4OWI1MjA0N2U5OTc0ZTdmOTY5MzlhNTMxYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kNTVjMmMxOTFiYTc0MjA3YjE3MDI2ZDc3ZDkzNDVkNCA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfZDU1YzJjMTkxYmE3NDIwN2IxNzAyNmQ3N2Q5MzQ1ZDQiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIGNhbGxlIE1hciBNZW5vciAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODVjZTBhODliNTIwNDdlOTk3NGU3Zjk2OTM5YTUzMWMuc2V0Q29udGVudChodG1sX2Q1NWMyYzE5MWJhNzQyMDdiMTcwMjZkNzdkOTM0NWQ0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNTEwZTViNmU3NDhkNGViOTllYzE4ZDEzMzgxZmI0ZGYuYmluZFBvcHVwKHBvcHVwXzg1Y2UwYTg5YjUyMDQ3ZTk5NzRlN2Y5NjkzOWE1MzFjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMjhmNzk1ZWVlZWUxNGUzMGI1NDE2MGQzMWM5NjlkNTYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45OTQxMzI1LC0xLjEzNDAxODRdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl9jNjMwZmM1NTUwMDY0YmViODVlZGRjZjNjMzZiODBhYiA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl8yOGY3OTVlZWVlZTE0ZTMwYjU0MTYwZDMxYzk2OWQ1Ni5zZXRJY29uKGljb25fYzYzMGZjNTU1MDA2NGJlYjg1ZWRkY2YzYzM2YjgwYWIpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNzBlNDU1ZWQ0NDU0ZThjODFhMzIzMzE5ZjJmNDJiZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hODAzZTVlZjgyOGY0OTM1YmQwNzhkYjQ0MWQyYTE0YyA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfYTgwM2U1ZWY4MjhmNDkzNWJkMDc4ZGI0NDFkMmExNGMiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIGNhbGxlIEF1ZGl0b3JpdW0gKFpvbmEgMS0yLTMpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA3MGU0NTVlZDQ0NTRlOGM4MWEzMjMzMTlmMmY0MmJlLnNldENvbnRlbnQoaHRtbF9hODAzZTVlZjgyOGY0OTM1YmQwNzhkYjQ0MWQyYTE0Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzI4Zjc5NWVlZWVlMTRlMzBiNTQxNjBkMzFjOTY5ZDU2LmJpbmRQb3B1cChwb3B1cF8wNzBlNDU1ZWQ0NDU0ZThjODFhMzIzMzE5ZjJmNDJiZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzBiOGY3NTlkNTJhODQzMjZiNGEzNTEzNzQ2ODIxZGNiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTkzOTc4OSwtMS4xMzMzMTIzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fMDQxNWYwOGRhZWE5NDVlOGE4YzU0NWQ1MGI5ODNkZTQgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfMGI4Zjc1OWQ1MmE4NDMyNmI0YTM1MTM3NDY4MjFkY2Iuc2V0SWNvbihpY29uXzA0MTVmMDhkYWVhOTQ1ZThhOGM1NDVkNTBiOTgzZGU0KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmU1YmI2YTg2YzJmNGJlYmJkYTVlMmI0M2Y0YzkxNjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTRkMjRhNzJhNTk4NDE4NGFhY2NlNWQyYmQ3NzEzZTkgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2E0ZDI0YTcyYTU5ODQxODRhYWNjZTVkMmJkNzcxM2U5IiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBjYWxsZSBUb3JyZSBkZSBsYSBNYXJxdWVzYSAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmU1YmI2YTg2YzJmNGJlYmJkYTVlMmI0M2Y0YzkxNjcuc2V0Q29udGVudChodG1sX2E0ZDI0YTcyYTU5ODQxODRhYWNjZTVkMmJkNzcxM2U5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMGI4Zjc1OWQ1MmE4NDMyNmI0YTM1MTM3NDY4MjFkY2IuYmluZFBvcHVwKHBvcHVwX2JlNWJiNmE4NmMyZjRiZWJiZGE1ZTJiNDNmNGM5MTY3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYTAzMjhmN2MzYjdkNDMyZTg4YzY3NzJlNjJmMzE5OGYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45OTU1MTAyLC0xLjEyOTkyMjhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl9iNzg3Y2YwOWMxM2I0MDFiYTExYTMzOThlMTFhZDBmYSA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl9hMDMyOGY3YzNiN2Q0MzJlODhjNjc3MmU2MmYzMTk4Zi5zZXRJY29uKGljb25fYjc4N2NmMDljMTNiNDAxYmExMWEzMzk4ZTExYWQwZmEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xOGVjOTk0MTlmODE0ODJjOTJhNTUyNWU1OGI1M2I0NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wYWZkMWMwYjJiOTc0N2Q5ODk1OGQ2ZjEwYmJjZWIzMiA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfMGFmZDFjMGIyYjk3NDdkOTg5NThkNmYxMGJiY2ViMzIiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIERyLiBKdWxpbyBMb3BleiBBbWJpdCAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMThlYzk5NDE5ZjgxNDgyYzkyYTU1MjVlNThiNTNiNDcuc2V0Q29udGVudChodG1sXzBhZmQxYzBiMmI5NzQ3ZDk4OTU4ZDZmMTBiYmNlYjMyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYTAzMjhmN2MzYjdkNDMyZTg4YzY3NzJlNjJmMzE5OGYuYmluZFBvcHVwKHBvcHVwXzE4ZWM5OTQxOWY4MTQ4MmM5MmE1NTI1ZTU4YjUzYjQ3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOWMzNmQ1MDg5YWU4NGMzYzliYmI5NTM1N2NmZTM5Y2QgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45OTYzMTM2LC0xLjEzMDkyMTNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl9iY2ExNTY4YzQyNGM0OTllOGY0ZjNiNTQ2NDNlZGMxOCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl85YzM2ZDUwODlhZTg0YzNjOWJiYjk1MzU3Y2ZlMzljZC5zZXRJY29uKGljb25fYmNhMTU2OGM0MjRjNDk5ZThmNGYzYjU0NjQzZWRjMTgpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zZThkNzdiNmUyYzQ0OWNmOWE0ODY5NWNlM2VlZjY4NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lODAzOTFmOGFiOTY0YjQzOTlkOTIyYWM3ODJhZGExYiA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfZTgwMzkxZjhhYjk2NGI0Mzk5ZDkyMmFjNzgyYWRhMWIiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIEF2ZW5pZGEgTWFycXVlcyBkZSBMb3MgVmVsZXogKFpvbmEgMS0yLTMpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNlOGQ3N2I2ZTJjNDQ5Y2Y5YTQ4Njk1Y2UzZWVmNjg2LnNldENvbnRlbnQoaHRtbF9lODAzOTFmOGFiOTY0YjQzOTlkOTIyYWM3ODJhZGExYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzljMzZkNTA4OWFlODRjM2M5YmJiOTUzNTdjZmUzOWNkLmJpbmRQb3B1cChwb3B1cF8zZThkNzdiNmUyYzQ0OWNmOWE0ODY5NWNlM2VlZjY4Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzliYmU4YjQ5YWY1ZDQzNjE5OTM1MTA5NzYyMDhiM2I3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTk2NDc4NywtMS4xMjkxMjA5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fMTVkZGVmMzUzM2EzNGU5N2EwOWRiNzhlNDdjM2I0YTggPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfOWJiZThiNDlhZjVkNDM2MTk5MzUxMDk3NjIwOGIzYjcuc2V0SWNvbihpY29uXzE1ZGRlZjM1MzNhMzRlOTdhMDlkYjc4ZTQ3YzNiNGE4KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTdjNDc4NzI3ZWQyNDliZGFlNDNkYThkMTYzNzEwOGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjkwZmY0ZTA1ODc2NGViYjgzMWUxNDU0MGQ5MDM3MDIgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2Y5MGZmNGUwNTg3NjRlYmI4MzFlMTQ1NDBkOTAzNzAyIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBEb2N0b3IgQWxvbnNvIGRlIEVzcGVqbyAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTdjNDc4NzI3ZWQyNDliZGFlNDNkYThkMTYzNzEwOGEuc2V0Q29udGVudChodG1sX2Y5MGZmNGUwNTg3NjRlYmI4MzFlMTQ1NDBkOTAzNzAyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOWJiZThiNDlhZjVkNDM2MTk5MzUxMDk3NjIwOGIzYjcuYmluZFBvcHVwKHBvcHVwXzU3YzQ3ODcyN2VkMjQ5YmRhZTQzZGE4ZDE2MzcxMDhhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfM2VlNDcwOTNlYWNlNGM2ZWJhOTIxODhlOGZlMjM2OWMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45OTIyMzk5LC0xLjEzMDY1NDRdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl80YWM3NDU5ODY4OWQ0MzRmYjI4NGY4MjEyNzAwOGQ1NCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl8zZWU0NzA5M2VhY2U0YzZlYmE5MjE4OGU4ZmUyMzY5Yy5zZXRJY29uKGljb25fNGFjNzQ1OTg2ODlkNDM0ZmIyODRmODIxMjcwMDhkNTQpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xYWM2ZDhkOGNlNTM0NDA3YmM2MzIxMWJhOTMzNzFhMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wODkxNmQzN2NmZjM0OTMwYTgwNTk3YTgyMTJhMTk3MSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfMDg5MTZkMzdjZmYzNDkzMGE4MDU5N2E4MjEyYTE5NzEiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIERvY3RvciBKb3NlIFRhcGlhIFNhbnogKFpvbmEgMS0yLTMpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFhYzZkOGQ4Y2U1MzQ0MDdiYzYzMjExYmE5MzM3MWEwLnNldENvbnRlbnQoaHRtbF8wODkxNmQzN2NmZjM0OTMwYTgwNTk3YTgyMTJhMTk3MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzNlZTQ3MDkzZWFjZTRjNmViYTkyMTg4ZThmZTIzNjljLmJpbmRQb3B1cChwb3B1cF8xYWM2ZDhkOGNlNTM0NDA3YmM2MzIxMWJhOTMzNzFhMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2ZjYWFlZWFiMDViOTQ4NzRhMjY1MGQ1YTQ0ODdlOTQ5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTg2OTMyMiwtMS4xMzI3Mjk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fNjEzOGJiMmNiMjg2NDYxZWIzMzEzODZhYzVjOTM5NGMgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfZmNhYWVlYWIwNWI5NDg3NGEyNjUwZDVhNDQ4N2U5NDkuc2V0SWNvbihpY29uXzYxMzhiYjJjYjI4NjQ2MWViMzMxMzg2YWM1YzkzOTRjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWFlNDM2MDFiNWM0NDdiM2FiYTU3NzgzMTFlNGVjN2IgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGY5OGU0YTZiYThjNDUxMTg5NDc3ZGNiYzVlYmQ0OWUgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2RmOThlNGE2YmE4YzQ1MTE4OTQ3N2RjYmM1ZWJkNDllIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYXJyaWwgTWFucmVzYSAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWFlNDM2MDFiNWM0NDdiM2FiYTU3NzgzMTFlNGVjN2Iuc2V0Q29udGVudChodG1sX2RmOThlNGE2YmE4YzQ1MTE4OTQ3N2RjYmM1ZWJkNDllKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZmNhYWVlYWIwNWI5NDg3NGEyNjUwZDVhNDQ4N2U5NDkuYmluZFBvcHVwKHBvcHVwX2FhZTQzNjAxYjVjNDQ3YjNhYmE1Nzc4MzExZTRlYzdiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfM2ExYzRjYjEyYTQ0NDY1ZThkYzU1NWE5ZmRlYjBjYTcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45ODg5MjA3LC0xLjEyNjQ4OTZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl9hMmY1ODdhODdlYTU0NzNkOWQyYmZjNTk4M2QwZjFiOCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl8zYTFjNGNiMTJhNDQ0NjVlOGRjNTU1YTlmZGViMGNhNy5zZXRJY29uKGljb25fYTJmNTg3YTg3ZWE1NDczZDlkMmJmYzU5ODNkMGYxYjgpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zNjU4OGI3MDI1MGI0NzU4OTZkMTdjYjgxZDBlMmE2ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83YzZhM2YyMzU0OWE0NDc4YjA4NWVjZDQyYTQ2NGRmNyA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfN2M2YTNmMjM1NDlhNDQ3OGIwODVlY2Q0MmE0NjRkZjciICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIEFudG9uaW8gUHVpZyAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzY1ODhiNzAyNTBiNDc1ODk2ZDE3Y2I4MWQwZTJhNmYuc2V0Q29udGVudChodG1sXzdjNmEzZjIzNTQ5YTQ0NzhiMDg1ZWNkNDJhNDY0ZGY3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfM2ExYzRjYjEyYTQ0NDY1ZThkYzU1NWE5ZmRlYjBjYTcuYmluZFBvcHVwKHBvcHVwXzM2NTg4YjcwMjUwYjQ3NTg5NmQxN2NiODFkMGUyYTZmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMmMwNWU4MzE1YjczNDc0M2FiOWY5MTJmYTA5NzE4MWUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45ODgyMDEsLTEuMTI3ODMzM10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uX2M1YzhlYzA1YmRmMzQ5NTE4NzhlOTZkZmM4NjhlM2YxID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzJjMDVlODMxNWI3MzQ3NDNhYjlmOTEyZmEwOTcxODFlLnNldEljb24oaWNvbl9jNWM4ZWMwNWJkZjM0OTUxODc4ZTk2ZGZjODY4ZTNmMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI1M2RlY2U3ZGZlODRiODI5YmM5ZjUxNDM0MDUyMmE3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU4YjNmNjM2ZTJiZTQwOWM4NzhiNWQxN2QxNmRiM2UxID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF81OGIzZjYzNmUyYmU0MDljODc4YjVkMTdkMTZkYjNlMSIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgU2FuIElnbmFjaW8gZGUgTG95b2xhIChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yNTNkZWNlN2RmZTg0YjgyOWJjOWY1MTQzNDA1MjJhNy5zZXRDb250ZW50KGh0bWxfNThiM2Y2MzZlMmJlNDA5Yzg3OGI1ZDE3ZDE2ZGIzZTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8yYzA1ZTgzMTViNzM0NzQzYWI5ZjkxMmZhMDk3MTgxZS5iaW5kUG9wdXAocG9wdXBfMjUzZGVjZTdkZmU4NGI4MjliYzlmNTE0MzQwNTIyYTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8yZDM4MWY3YzczNzg0MTQ0OWRjZjBhOTdhN2IxYjJmMyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4OTU5MzMsLTEuMTI2MTY3NV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzZiNzY2NGY3ODE0YjQwMzQ4OWIyZjQ2ODViMmVjODE4ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzJkMzgxZjdjNzM3ODQxNDQ5ZGNmMGE5N2E3YjFiMmYzLnNldEljb24oaWNvbl82Yjc2NjRmNzgxNGI0MDM0ODliMmY0Njg1YjJlYzgxOCk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNhMzJlMjZhYTYxMzQzMjFiNDlmZjdjZTY2YWY5ODIzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk1NWZiMjBmNDlhMDQ4NzBiYTM0MGVmMWMxMmQ0OGViID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF85NTVmYjIwZjQ5YTA0ODcwYmEzNDBlZjFjMTJkNDhlYiIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgU2FuIE1hcnRpbiBkZSBQb3JyZXMgKFpvbmEgMS0yLTMpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNhMzJlMjZhYTYxMzQzMjFiNDlmZjdjZTY2YWY5ODIzLnNldENvbnRlbnQoaHRtbF85NTVmYjIwZjQ5YTA0ODcwYmEzNDBlZjFjMTJkNDhlYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzJkMzgxZjdjNzM3ODQxNDQ5ZGNmMGE5N2E3YjFiMmYzLmJpbmRQb3B1cChwb3B1cF8zYTMyZTI2YWE2MTM0MzIxYjQ5ZmY3Y2U2NmFmOTgyMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2IzOGVmODUwNDBlMjQwMzE5Mjc2MDBlMmRlOGFhYzIzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTg5MzgyNiwtMS4xMjY2NTYxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fNjgwODVhYzg5YjEyNDZhZmE5N2QwMjNiNzA5NGVlZWUgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfYjM4ZWY4NTA0MGUyNDAzMTkyNzYwMGUyZGU4YWFjMjMuc2V0SWNvbihpY29uXzY4MDg1YWM4OWIxMjQ2YWZhOTdkMDIzYjcwOTRlZWVlKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGUxMmMxOGFhNGY3NDA1NzlkODFmZTM1MWI5NzdkY2QgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjAzNTFhMzE0ZWM1NDliMjkwNjM4YTBmZjk5YjFlMDUgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2YwMzUxYTMxNGVjNTQ5YjI5MDYzOGEwZmY5OWIxZTA1IiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBKYWNvYm8gZGUgbGFzIExleWVzIChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80ZTEyYzE4YWE0Zjc0MDU3OWQ4MWZlMzUxYjk3N2RjZC5zZXRDb250ZW50KGh0bWxfZjAzNTFhMzE0ZWM1NDliMjkwNjM4YTBmZjk5YjFlMDUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9iMzhlZjg1MDQwZTI0MDMxOTI3NjAwZTJkZThhYWMyMy5iaW5kUG9wdXAocG9wdXBfNGUxMmMxOGFhNGY3NDA1NzlkODFmZTM1MWI5NzdkY2QpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl82ZjMyN2JiMTk5YWU0NmNlOTZlMzU0ZGY1Yjk4M2YzMyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk2NzM2MTgsLTEuMDg0NjAxNF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzMxMGYwNzUxMWU4MTRmYzQ4MmM3ODQ4NjMxMDI0NzViID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzZmMzI3YmIxOTlhZTQ2Y2U5NmUzNTRkZjViOTgzZjMzLnNldEljb24oaWNvbl8zMTBmMDc1MTFlODE0ZmM0ODJjNzg0ODYzMTAyNDc1Yik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2EyNzlmNTcyOGI1NzQ1OGNhYzVjYmE0Njk3NGE2MGFhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIwOTA4YTczOTVjYTQ2NTRiNWYzMjczYjU4NzUzNTY1ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF8yMDkwOGE3Mzk1Y2E0NjU0YjVmMzI3M2I1ODc1MzU2NSIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQXZlbmlkYSBkZSBsYSBMaWJlcnRhZCAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTI3OWY1NzI4YjU3NDU4Y2FjNWNiYTQ2OTc0YTYwYWEuc2V0Q29udGVudChodG1sXzIwOTA4YTczOTVjYTQ2NTRiNWYzMjczYjU4NzUzNTY1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNmYzMjdiYjE5OWFlNDZjZTk2ZTM1NGRmNWI5ODNmMzMuYmluZFBvcHVwKHBvcHVwX2EyNzlmNTcyOGI1NzQ1OGNhYzVjYmE0Njk3NGE2MGFhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNDRlMzgwYmM4MWUyNGFlNzg0MWJjMmZiYjA3MDVhYzIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45ODc1MjM1LC0xLjEyNzU0OTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl9mNzNlY2U5NzE5MjA0MWQwYmZlZjlmZjI0MzdjN2FmOSA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl80NGUzODBiYzgxZTI0YWU3ODQxYmMyZmJiMDcwNWFjMi5zZXRJY29uKGljb25fZjczZWNlOTcxOTIwNDFkMGJmZWY5ZmYyNDM3YzdhZjkpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83MWJhMTk2YjM4NDk0NTFhOGVmOTg1N2NmM2YyNGQ3NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wODcyNjM0NGY2NzQ0ZmU1YmYyOTY1ZjAzMzg4YTc3YyA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfMDg3MjYzNDRmNjc0NGZlNWJmMjk2NWYwMzM4OGE3N2MiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIGRlIGxhIE1lcmNlZCAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzFiYTE5NmIzODQ5NDUxYThlZjk4NTdjZjNmMjRkNzcuc2V0Q29udGVudChodG1sXzA4NzI2MzQ0ZjY3NDRmZTViZjI5NjVmMDMzODhhNzdjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNDRlMzgwYmM4MWUyNGFlNzg0MWJjMmZiYjA3MDVhYzIuYmluZFBvcHVwKHBvcHVwXzcxYmExOTZiMzg0OTQ1MWE4ZWY5ODU3Y2YzZjI0ZDc3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYmFmMzY4MDdkYjZkNGZlMWIxOWZhNjk1M2ViNTI3NDQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45OTI1NTM5LC0xLjEzMzM3N10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzM1MmNjZWI2OTI2NzQzMzNhZWUxNmQyZDJjNDZhZjU5ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyX2JhZjM2ODA3ZGI2ZDRmZTFiMTlmYTY5NTNlYjUyNzQ0LnNldEljb24oaWNvbl8zNTJjY2ViNjkyNjc0MzMzYWVlMTZkMmQyYzQ2YWY1OSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhmMDYyNTgzZWFkODQ5OGQ4ZDAzMmZlODEwMzk5ZDY5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzMyMDgxN2U2YzA0ZjQ2YjI5ZTdiODdmYTY4ZjhlZTJmID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF8zMjA4MTdlNmMwNGY0NmIyOWU3Yjg3ZmE2OGY4ZWUyZiIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgY2FsbGUgZG9jdG9yIFJvbWFuIEFsYmVyY2EgKFpvbmEgMS0yLTMpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhmMDYyNTgzZWFkODQ5OGQ4ZDAzMmZlODEwMzk5ZDY5LnNldENvbnRlbnQoaHRtbF8zMjA4MTdlNmMwNGY0NmIyOWU3Yjg3ZmE2OGY4ZWUyZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2JhZjM2ODA3ZGI2ZDRmZTFiMTlmYTY5NTNlYjUyNzQ0LmJpbmRQb3B1cChwb3B1cF84ZjA2MjU4M2VhZDg0OThkOGQwMzJmZTgxMDM5OWQ2OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2Q2OTE0MjFhNjhhZDQyODBiMzIyZjRhODVjZmRmNTFiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTQ3NzI3NywtMS4xODEzMDA4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fOWQ4OWIwYzNkYWEyNGM1Mzg3NTg4OTViOTA1M2MwOGYgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfZDY5MTQyMWE2OGFkNDI4MGIzMjJmNGE4NWNmZGY1MWIuc2V0SWNvbihpY29uXzlkODliMGMzZGFhMjRjNTM4NzU4ODk1YjkwNTNjMDhmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDU2MWFkMDZkZWU0NDZmNDg0NDVmOGI2NDYwNTViZTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGJlMTA0MjE4ZWJiNDgyYmJlNzU1ZGY5MTI5ZDZlMmYgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzhiZTEwNDIxOGViYjQ4MmJiZTc1NWRmOTEyOWQ2ZTJmIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBjYWxsZSBlc2N1bHRvciBSb3F1ZSBMb3BleiAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDU2MWFkMDZkZWU0NDZmNDg0NDVmOGI2NDYwNTViZTYuc2V0Q29udGVudChodG1sXzhiZTEwNDIxOGViYjQ4MmJiZTc1NWRmOTEyOWQ2ZTJmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZDY5MTQyMWE2OGFkNDI4MGIzMjJmNGE4NWNmZGY1MWIuYmluZFBvcHVwKHBvcHVwXzQ1NjFhZDA2ZGVlNDQ2ZjQ4NDQ1ZjhiNjQ2MDU1YmU2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZGI5ZDYyNTE5ZTM3NGExYWIzNTY4NDQ1ZjgwZThlNWMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45OTIwNTgyLC0xLjEzNTYyMDJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl9iNjczMDhjYjBjNDg0MGU4ODhhOTU5MmU1YWNjMmQ5OSA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl9kYjlkNjI1MTllMzc0YTFhYjM1Njg0NDVmODBlOGU1Yy5zZXRJY29uKGljb25fYjY3MzA4Y2IwYzQ4NDBlODg4YTk1OTJlNWFjYzJkOTkpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yZmM2OTE5NTIyZWU0NTlmOWUxZDJmOWUzYTJhZjYwMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wOThjZjYwZmMzMDc0MjMzOGY0Mzk3YzAyOGQ5NjQyZSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfMDk4Y2Y2MGZjMzA3NDIzMzhmNDM5N2MwMjhkOTY0MmUiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIGNhbGxlIEpvYXF1aW4gQmx1bWUgKFpvbmEgMS0yLTMpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJmYzY5MTk1MjJlZTQ1OWY5ZTFkMmY5ZTNhMmFmNjAxLnNldENvbnRlbnQoaHRtbF8wOThjZjYwZmMzMDc0MjMzOGY0Mzk3YzAyOGQ5NjQyZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2RiOWQ2MjUxOWUzNzRhMWFiMzU2ODQ0NWY4MGU4ZTVjLmJpbmRQb3B1cChwb3B1cF8yZmM2OTE5NTIyZWU0NTlmOWUxZDJmOWUzYTJhZjYwMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2NlNDQxYmRkNWM5NDQxZmU4ZTIwM2U3YzFmNDQyOWFiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTg4NTI4MiwtMS4xMzI3NTY1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fMmFlODg2OWU2Nzk3NGE1NjliNzZiYmQ5YTg4ZjkyZTAgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfY2U0NDFiZGQ1Yzk0NDFmZThlMjAzZTdjMWY0NDI5YWIuc2V0SWNvbihpY29uXzJhZTg4NjllNjc5NzRhNTY5Yjc2YmJkOWE4OGY5MmUwKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzFkZDIwZWJlODkxNGIzZTk5NDE2MzlkZTdlMGM5ODMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzViNzNmYzdkYTZkNGNjZjkzYTljMzc3OGI1Nzk2OGIgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzc1YjczZmM3ZGE2ZDRjY2Y5M2E5YzM3NzhiNTc5NjhiIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBjYWxsZSBQb3J0aWxsbyBkZSBTYW4gQW50b25pbyAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzFkZDIwZWJlODkxNGIzZTk5NDE2MzlkZTdlMGM5ODMuc2V0Q29udGVudChodG1sXzc1YjczZmM3ZGE2ZDRjY2Y5M2E5YzM3NzhiNTc5NjhiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfY2U0NDFiZGQ1Yzk0NDFmZThlMjAzZTdjMWY0NDI5YWIuYmluZFBvcHVwKHBvcHVwX2MxZGQyMGViZTg5MTRiM2U5OTQxNjM5ZGU3ZTBjOTgzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMmI0MDViMTIzMzU1NGFkMDg5YzNjNWEzN2QyOWI1NTIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45OTE5Mzk2LC0xLjEzNDQ0OTddLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl8wNWQxMjg2NGNhZGQ0ZDVkOWZlODkzNDU1N2ExOWNkNSA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl8yYjQwNWIxMjMzNTU0YWQwODljM2M1YTM3ZDI5YjU1Mi5zZXRJY29uKGljb25fMDVkMTI4NjRjYWRkNGQ1ZDlmZTg5MzQ1NTdhMTljZDUpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85MzlhYzJjMzJlMzM0OTkyYjU4ZDIzZjEzMWUxNDk5MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hYjVjODIxMWViODg0ODcxOTRmYzBiNjI2N2E1MWE3YyA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfYWI1YzgyMTFlYjg4NDg3MTk0ZmMwYjYyNjdhNTFhN2MiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIGNhbGxlIFNpZXJyYSBkZSBBc2NveSAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTM5YWMyYzMyZTMzNDk5MmI1OGQyM2YxMzFlMTQ5OTIuc2V0Q29udGVudChodG1sX2FiNWM4MjExZWI4ODQ4NzE5NGZjMGI2MjY3YTUxYTdjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMmI0MDViMTIzMzU1NGFkMDg5YzNjNWEzN2QyOWI1NTIuYmluZFBvcHVwKHBvcHVwXzkzOWFjMmMzMmUzMzQ5OTJiNThkMjNmMTMxZTE0OTkyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMjgxZmQ5YjUwNTM2NDBmZTg4MzBiNzQzNTkzMWI3MWUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45ODkzNTE5LC0xLjEzMTAyODZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl82YWVlZDA5MTdhZjk0MTAwYWQyMGE1ZTUxMWMzNmI5YiA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl8yODFmZDliNTA1MzY0MGZlODgzMGI3NDM1OTMxYjcxZS5zZXRJY29uKGljb25fNmFlZWQwOTE3YWY5NDEwMGFkMjBhNWU1MTFjMzZiOWIpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xMTI3YmIzZDAzNjA0NzlkOWY3NTMwMDc0MzgyNDBiNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xZjI3YTY0M2JlZGE0ZTY3OTAzYjYyZmUwNDUxNzA4NyA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfMWYyN2E2NDNiZWRhNGU2NzkwM2I2MmZlMDQ1MTcwODciICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIENhcmxvcyBJSUkgKFpvbmEgMS0yLTMpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzExMjdiYjNkMDM2MDQ3OWQ5Zjc1MzAwNzQzODI0MGI1LnNldENvbnRlbnQoaHRtbF8xZjI3YTY0M2JlZGE0ZTY3OTAzYjYyZmUwNDUxNzA4Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzI4MWZkOWI1MDUzNjQwZmU4ODMwYjc0MzU5MzFiNzFlLmJpbmRQb3B1cChwb3B1cF8xMTI3YmIzZDAzNjA0NzlkOWY3NTMwMDc0MzgyNDBiNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2FjZDllNmI4ZWU4NjQyNGJiNTQ2MzY5MjlmODE4NDQ0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTkxODkwMSwtMS4xMzQ3MjJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl8yYjMxMzQ0NTkzMjc0YmMzYmQyNzFkZWIyODIzNzRlNiA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl9hY2Q5ZTZiOGVlODY0MjRiYjU0NjM2OTI5ZjgxODQ0NC5zZXRJY29uKGljb25fMmIzMTM0NDU5MzI3NGJjM2JkMjcxZGViMjgyMzc0ZTYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83MDVmNTM0NTU1YzM0YzRkODIwY2Y5NTc2NGUxOGE4ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hOTIyZGM3ZjNmYTk0N2JmODZiMjczMDVmZGNiODcxZCA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfYTkyMmRjN2YzZmE5NDdiZjg2YjI3MzA1ZmRjYjg3MWQiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIGNhbGxlIFNhbnRhIE1hcnRhIChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83MDVmNTM0NTU1YzM0YzRkODIwY2Y5NTc2NGUxOGE4ZC5zZXRDb250ZW50KGh0bWxfYTkyMmRjN2YzZmE5NDdiZjg2YjI3MzA1ZmRjYjg3MWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9hY2Q5ZTZiOGVlODY0MjRiYjU0NjM2OTI5ZjgxODQ0NC5iaW5kUG9wdXAocG9wdXBfNzA1ZjUzNDU1NWMzNGM0ZDgyMGNmOTU3NjRlMThhOGQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl83NThhNWQxYTA2MWM0ZjIzOGQzZjVjMGVmZmFjZDUyMyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk5MTMxODQsLTEuMTMyODY1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fM2Q2NWE3MWEyNjM0NDNkMGIyNTEzOTViZTU3NWNlNGEgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfNzU4YTVkMWEwNjFjNGYyMzhkM2Y1YzBlZmZhY2Q1MjMuc2V0SWNvbihpY29uXzNkNjVhNzFhMjYzNDQzZDBiMjUxMzk1YmU1NzVjZTRhKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTcwZjIyZWM5MWM5NDY5Yjg4NjlkMmFmMzM1YTc4NTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjE3YWE3OWE2OTBmNGJkNmIzOWJiNDYyYmI3ZTY2NWEgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2IxN2FhNzlhNjkwZjRiZDZiMzliYjQ2MmJiN2U2NjVhIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBCYXRhbGxhIGRlIGxhcyBGbG9yZXMgKFpvbmEgMS0yLTMpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E3MGYyMmVjOTFjOTQ2OWI4ODY5ZDJhZjMzNWE3ODU0LnNldENvbnRlbnQoaHRtbF9iMTdhYTc5YTY5MGY0YmQ2YjM5YmI0NjJiYjdlNjY1YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzc1OGE1ZDFhMDYxYzRmMjM4ZDNmNWMwZWZmYWNkNTIzLmJpbmRQb3B1cChwb3B1cF9hNzBmMjJlYzkxYzk0NjliODg2OWQyYWYzMzVhNzg1NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2Y4N2U0MDJkMzY2MDQzOGE4MWZhY2UyN2ZkMGM4MDhkID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTkwNzM3NywtMS4xMzA2NzcxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fMTAwYWE4OGUzNzI4NGQxMmFkN2Y3NTBmODZjODkyYzUgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfZjg3ZTQwMmQzNjYwNDM4YTgxZmFjZTI3ZmQwYzgwOGQuc2V0SWNvbihpY29uXzEwMGFhODhlMzcyODRkMTJhZDdmNzUwZjg2Yzg5MmM1KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDNkOTc1MDMzMjJhNGY3ZjgwMjNmYWZiMzNiMGZhMzIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGExNjAyOTcxNzI3NGRlMmJkMmIyODJmMWYwMjdlZWYgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2RhMTYwMjk3MTcyNzRkZTJiZDJiMjgyZjFmMDI3ZWVmIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBjYWxsZSBMZXBhbnRvIChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wM2Q5NzUwMzMyMmE0ZjdmODAyM2ZhZmIzM2IwZmEzMi5zZXRDb250ZW50KGh0bWxfZGExNjAyOTcxNzI3NGRlMmJkMmIyODJmMWYwMjdlZWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9mODdlNDAyZDM2NjA0MzhhODFmYWNlMjdmZDBjODA4ZC5iaW5kUG9wdXAocG9wdXBfMDNkOTc1MDMzMjJhNGY3ZjgwMjNmYWZiMzNiMGZhMzIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9hNTQ4Y2ZkMmQxM2M0NDFjYTNiMWJmMTUxMjQ2ODQzOCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk5Mzk4NDEsLTEuMTMyODIxOV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uX2VlMjU4MGU0MzhlYzRkN2M4NDBkNmI0YmU3ZWFlMjgwID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyX2E1NDhjZmQyZDEzYzQ0MWNhM2IxYmYxNTEyNDY4NDM4LnNldEljb24oaWNvbl9lZTI1ODBlNDM4ZWM0ZDdjODQwZDZiNGJlN2VhZTI4MCk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU3NzgyNzNkMDVkYjRmZTliODM0ZDg5MzkzZjQ2MTJiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI3MmM0NTg3YTMyODQxODE4NjcyMDhlYjk2ODFjNWUwID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF8yNzJjNDU4N2EzMjg0MTgxODY3MjA4ZWI5NjgxYzVlMCIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgY2FsbGUgSm9zZSBCYWxsZXN0ZXIgKFpvbmEgMS0yLTMpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU3NzgyNzNkMDVkYjRmZTliODM0ZDg5MzkzZjQ2MTJiLnNldENvbnRlbnQoaHRtbF8yNzJjNDU4N2EzMjg0MTgxODY3MjA4ZWI5NjgxYzVlMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2E1NDhjZmQyZDEzYzQ0MWNhM2IxYmYxNTEyNDY4NDM4LmJpbmRQb3B1cChwb3B1cF81Nzc4MjczZDA1ZGI0ZmU5YjgzNGQ4OTM5M2Y0NjEyYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzk2MjliMjg3OGViZTQ2MTQ4MGIwNWMwMDI1ZTgzMmY3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTkzMDIwMywtMS4xMzI5NzkxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fYjgzMGFiMzA1ZjFmNGEzZWExYjIwMzgwNzg3NGZjNjEgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfOTYyOWIyODc4ZWJlNDYxNDgwYjA1YzAwMjVlODMyZjcuc2V0SWNvbihpY29uX2I4MzBhYjMwNWYxZjRhM2VhMWIyMDM4MDc4NzRmYzYxKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTdiMWZkZDY2ODViNGVmZjhmMmY2OGJjYjAyYjA1MjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTJhNmMxMDgzMWFlNDFiMTljZGQ4NzIwOGRjMWE4M2QgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzUyYTZjMTA4MzFhZTQxYjE5Y2RkODcyMDhkYzFhODNkIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBjYWxsZSBSaW8gQXJnb3MgKFpvbmEgMS0yLTMpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E3YjFmZGQ2Njg1YjRlZmY4ZjJmNjhiY2IwMmIwNTIyLnNldENvbnRlbnQoaHRtbF81MmE2YzEwODMxYWU0MWIxOWNkZDg3MjA4ZGMxYTgzZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzk2MjliMjg3OGViZTQ2MTQ4MGIwNWMwMDI1ZTgzMmY3LmJpbmRQb3B1cChwb3B1cF9hN2IxZmRkNjY4NWI0ZWZmOGYyZjY4YmNiMDJiMDUyMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzk1MTFmMzAxODk5ZDRlNWFiNDZlNjllM2UzYmJmNTIxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzguMDQwNTE1LC0xLjA5MzE5ODFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl9mYTc2ZjIxOWYxNzA0YmI2YWNkMGE4MmY4Y2ViNGQ2MCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl85NTExZjMwMTg5OWQ0ZTVhYjQ2ZTY5ZTNlM2JiZjUyMS5zZXRJY29uKGljb25fZmE3NmYyMTlmMTcwNGJiNmFjZDBhODJmOGNlYjRkNjApOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMjFmNWJlN2YxYTM0ZDY3YTk1OGVjZGI4YTc3ZjExMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hNjhmYTNmNjBmN2Q0OWFlYWI1YzUxN2Q2MTAzMTU0ZiA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfYTY4ZmEzZjYwZjdkNDlhZWFiNWM1MTdkNjEwMzE1NGYiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIGNhbGxlIFNpZXJyYSBkZSBsYSBNdWVsYSAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTIxZjViZTdmMWEzNGQ2N2E5NThlY2RiOGE3N2YxMTAuc2V0Q29udGVudChodG1sX2E2OGZhM2Y2MGY3ZDQ5YWVhYjVjNTE3ZDYxMDMxNTRmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOTUxMWYzMDE4OTlkNGU1YWI0NmU2OWUzZTNiYmY1MjEuYmluZFBvcHVwKHBvcHVwX2EyMWY1YmU3ZjFhMzRkNjdhOTU4ZWNkYjhhNzdmMTEwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfN2I2OGI2MTI3MDM0NDAxYzlkMTZmZGJiYmRlMTA5MjUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45OTUxNTY0LC0xLjE5MjEwMTFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl9iYTkxMjhkMTU5ODY0M2I1OWM3YmM1NWQ2NWQ0ZDVhMSA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl83YjY4YjYxMjcwMzQ0MDFjOWQxNmZkYmJiZGUxMDkyNS5zZXRJY29uKGljb25fYmE5MTI4ZDE1OTg2NDNiNTljN2JjNTVkNjVkNGQ1YTEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83MDEwYjQ0NTA2ZTA0NWQ1YjMzMTBiNmU2NDVlMzQ4ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83YmJhMTFmZTI2Mjc0NTI0ODBkMjcxNzQ3MGVkMTdmMiA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfN2JiYTExZmUyNjI3NDUyNDgwZDI3MTc0NzBlZDE3ZjIiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIGNhbGxlIEJhcnRvbG9tZSBQZXJleiBDYXNhcyAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzAxMGI0NDUwNmUwNDVkNWIzMzEwYjZlNjQ1ZTM0OGQuc2V0Q29udGVudChodG1sXzdiYmExMWZlMjYyNzQ1MjQ4MGQyNzE3NDcwZWQxN2YyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfN2I2OGI2MTI3MDM0NDAxYzlkMTZmZGJiYmRlMTA5MjUuYmluZFBvcHVwKHBvcHVwXzcwMTBiNDQ1MDZlMDQ1ZDViMzMxMGI2ZTY0NWUzNDhkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNDdmMWY2NzE0NWViNDdmZTk5ZDIyM2I1M2UwOWNjZDkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45OTEwMTE3LC0xLjEzMTkyNzFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl83OTkwNmNlMmJjOGM0MDhiYTFlMGZjNDRlZWFlNzJmNiA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl80N2YxZjY3MTQ1ZWI0N2ZlOTlkMjIzYjUzZTA5Y2NkOS5zZXRJY29uKGljb25fNzk5MDZjZTJiYzhjNDA4YmExZTBmYzQ0ZWVhZTcyZjYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NjQzMzRlZmQwNzI0MzgzYjU0ZDU0OGI3YzU5NTEzMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jNGMyZDIwOWUyMGU0NDUyYTk4YmYwMTU5MmU4YTM1ZiA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfYzRjMmQyMDllMjBlNDQ1MmE5OGJmMDE1OTJlOGEzNWYiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIGNhbGxlIEp1bnRlcm9uZXMgKFpvbmEgMS0yLTMpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk2NDMzNGVmZDA3MjQzODNiNTRkNTQ4YjdjNTk1MTMzLnNldENvbnRlbnQoaHRtbF9jNGMyZDIwOWUyMGU0NDUyYTk4YmYwMTU5MmU4YTM1Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzQ3ZjFmNjcxNDVlYjQ3ZmU5OWQyMjNiNTNlMDljY2Q5LmJpbmRQb3B1cChwb3B1cF85NjQzMzRlZmQwNzI0MzgzYjU0ZDU0OGI3YzU5NTEzMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2ExZjJiNWFjYWRjNTRhODc5M2Y0ZmRiYWI2YzgwMmVhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTkwMjE2MywtMS4xMjc1MTE3XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fYjVjNDdiZTY2ZTUxNGVhNTgwMzFiYTU2YTYwZjgzNDcgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfYTFmMmI1YWNhZGM1NGE4NzkzZjRmZGJhYjZjODAyZWEuc2V0SWNvbihpY29uX2I1YzQ3YmU2NmU1MTRlYTU4MDMxYmE1NmE2MGY4MzQ3KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGFiMTdlODNiOGIwNDQ1NjlmN2Q3MWNlOGQ1YWZlN2EgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2Y1YWYxOGJjNjE2NGY1N2JkN2ExYjVlMzZjYzhjZDEgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2NmNWFmMThiYzYxNjRmNTdiZDdhMWI1ZTM2Y2M4Y2QxIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBjYWxsZSBQdWVydGEgTnVldmEgKFpvbmEgMS0yLTMpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhhYjE3ZTgzYjhiMDQ0NTY5ZjdkNzFjZThkNWFmZTdhLnNldENvbnRlbnQoaHRtbF9jZjVhZjE4YmM2MTY0ZjU3YmQ3YTFiNWUzNmNjOGNkMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2ExZjJiNWFjYWRjNTRhODc5M2Y0ZmRiYWI2YzgwMmVhLmJpbmRQb3B1cChwb3B1cF84YWIxN2U4M2I4YjA0NDU2OWY3ZDcxY2U4ZDVhZmU3YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2RmYmM1MzlkNGJmMDRhODZhZjdiNDdiZGEyMGMyM2ZjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTg4OTI3MiwtMS4xMzQ2MTU4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fY2MyYmRmODM4YjA3NDg3YjhkZjIyMmYxNjhhNjJjYjkgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfZGZiYzUzOWQ0YmYwNGE4NmFmN2I0N2JkYTIwYzIzZmMuc2V0SWNvbihpY29uX2NjMmJkZjgzOGIwNzQ4N2I4ZGYyMjJmMTY4YTYyY2I5KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjNhMGU1OTczNmIwNDMwODhjY2NlZjNmZTBkODM2YmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTQ0NGQ4MDkyMTk0NGUwOWFmNGE1MmY5YmRmZGFmZTggPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzU0NDRkODA5MjE5NDRlMDlhZjRhNTJmOWJkZmRhZmU4IiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBKZXJvbmltbyBkZSBSb2RhIChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yM2EwZTU5NzM2YjA0MzA4OGNjY2VmM2ZlMGQ4MzZiZC5zZXRDb250ZW50KGh0bWxfNTQ0NGQ4MDkyMTk0NGUwOWFmNGE1MmY5YmRmZGFmZTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kZmJjNTM5ZDRiZjA0YTg2YWY3YjQ3YmRhMjBjMjNmYy5iaW5kUG9wdXAocG9wdXBfMjNhMGU1OTczNmIwNDMwODhjY2NlZjNmZTBkODM2YmQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9hNTYzNzI0NDg5NTA0Y2RlODFkNDcxMTMxOWQxNGM4OCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM4LjA1MzM5NzcsLTEuNjYwODg4N10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzUxYzYwMGE0ZjdjMDRmYWFhMjRlYjAzMDE3YTcxN2UzID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyX2E1NjM3MjQ0ODk1MDRjZGU4MWQ0NzExMzE5ZDE0Yzg4LnNldEljb24oaWNvbl81MWM2MDBhNGY3YzA0ZmFhYTI0ZWIwMzAxN2E3MTdlMyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E1OWQ5MzQ0MTAzNjRjN2Q5ZTk3NWYzMmM4ZTk4Yjg0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MzODExM2E4N2ZhNDQ1OTg5YjQ3NTIwZTVlNDI3YWExID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9jMzgxMTNhODdmYTQ0NTk4OWI0NzUyMGU1ZTQyN2FhMSIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgY2FsbGUgVGVuaWVudGUgR2VuZXJhbCBHdXRpZXJyZXogTWVsbGFkbyAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTU5ZDkzNDQxMDM2NGM3ZDllOTc1ZjMyYzhlOThiODQuc2V0Q29udGVudChodG1sX2MzODExM2E4N2ZhNDQ1OTg5YjQ3NTIwZTVlNDI3YWExKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYTU2MzcyNDQ4OTUwNGNkZTgxZDQ3MTEzMTlkMTRjODguYmluZFBvcHVwKHBvcHVwX2E1OWQ5MzQ0MTAzNjRjN2Q5ZTk3NWYzMmM4ZTk4Yjg0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNGZlYmU5NzNiYTRlNDFkNTkzZmMxMDZiNTNlY2RkNzYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45OTI5NTk4LC0xLjEzMzk3ODZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl9lZGJhNzA5ZDQ1YTg0OTdmODc1NDdhYzNiOGRiYzdmZiA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl80ZmViZTk3M2JhNGU0MWQ1OTNmYzEwNmI1M2VjZGQ3Ni5zZXRJY29uKGljb25fZWRiYTcwOWQ0NWE4NDk3Zjg3NTQ3YWMzYjhkYmM3ZmYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMTA5ZmU3ZTVlMmU0MTU5OGI5NWE5YTcwNjg5NzE1NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zNjhkNzlkNzViZDQ0NjhlYWY2N2I1YmExZGMxOTk5OSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfMzY4ZDc5ZDc1YmQ0NDY4ZWFmNjdiNWJhMWRjMTk5OTkiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIGNhbGxlIENyb25pc3RhIENhcmxvcyBWYWxjYXJjZWwgKFpvbmEgMS0yLTMpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ExMDlmZTdlNWUyZTQxNTk4Yjk1YTlhNzA2ODk3MTU0LnNldENvbnRlbnQoaHRtbF8zNjhkNzlkNzViZDQ0NjhlYWY2N2I1YmExZGMxOTk5OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzRmZWJlOTczYmE0ZTQxZDU5M2ZjMTA2YjUzZWNkZDc2LmJpbmRQb3B1cChwb3B1cF9hMTA5ZmU3ZTVlMmU0MTU5OGI5NWE5YTcwNjg5NzE1NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2I0MWRmM2Y5ZmQ1NTRmNzY4ZDU4MDVhNDE5NDgxYWYwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTg5NDAyNCwtMS4xMzU2ODk3XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fOTVlNmYwYTExNjg1NGIwNWI2NjViZWM3ODc5ZjBmZjMgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfYjQxZGYzZjlmZDU1NGY3NjhkNTgwNWE0MTk0ODFhZjAuc2V0SWNvbihpY29uXzk1ZTZmMGExMTY4NTRiMDViNjY1YmVjNzg3OWYwZmYzKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGU2Y2RjZmQ2OWY5NDFhOTkwMzFkYjA2NDUwZjM5NWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGY0OGFlYjFlYjAyNDc2MThjMTczYTMyYWViYjExOWMgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2RmNDhhZWIxZWIwMjQ3NjE4YzE3M2EzMmFlYmIxMTljIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBQYXNvcyBkZSBTYW50aWFnbyAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGU2Y2RjZmQ2OWY5NDFhOTkwMzFkYjA2NDUwZjM5NWYuc2V0Q29udGVudChodG1sX2RmNDhhZWIxZWIwMjQ3NjE4YzE3M2EzMmFlYmIxMTljKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYjQxZGYzZjlmZDU1NGY3NjhkNTgwNWE0MTk0ODFhZjAuYmluZFBvcHVwKHBvcHVwXzBlNmNkY2ZkNjlmOTQxYTk5MDMxZGIwNjQ1MGYzOTVmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYmJkYjdmNzE3NjQ4NGFlMDkxMzhhNTlhZjAyZjIxZjcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45MzQ3ODkxLC0xLjE2OTA4NDVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl8xMDE1YmViOWFjODA0ZDQzODNjZGRkYzllMTNmMmVhMyA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl9iYmRiN2Y3MTc2NDg0YWUwOTEzOGE1OWFmMDJmMjFmNy5zZXRJY29uKGljb25fMTAxNWJlYjlhYzgwNGQ0MzgzY2RkZGM5ZTEzZjJlYTMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kMmM3NTA1OGM0Yzk0MTk3YTYzY2ZkNWE4MmNkYTdjZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81NThiMjE1N2VmNDc0NjM4OWI5MjI4NjgzMGE0ZGE3YSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfNTU4YjIxNTdlZjQ3NDYzODliOTIyODY4MzBhNGRhN2EiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIFBpbnRvciBFbCBHcmVjbyAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDJjNzUwNThjNGM5NDE5N2E2M2NmZDVhODJjZGE3Y2Yuc2V0Q29udGVudChodG1sXzU1OGIyMTU3ZWY0NzQ2Mzg5YjkyMjg2ODMwYTRkYTdhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYmJkYjdmNzE3NjQ4NGFlMDkxMzhhNTlhZjAyZjIxZjcuYmluZFBvcHVwKHBvcHVwX2QyYzc1MDU4YzRjOTQxOTdhNjNjZmQ1YTgyY2RhN2NmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYzQwYTU3N2FiNzI4NGVmZmFlNTk0NGFjN2Q1Yjc0ZGYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45OTE5OTEyLC0xLjEzNjAyMDFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl8wNDQ1YzM4ZTE4YWM0NjM2ODgyNWQ2YjM1MWRiZDk1NyA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl9jNDBhNTc3YWI3Mjg0ZWZmYWU1OTQ0YWM3ZDViNzRkZi5zZXRJY29uKGljb25fMDQ0NWMzOGUxOGFjNDYzNjg4MjVkNmIzNTFkYmQ5NTcpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jNzkxOWJhMGJjODI0NzhkODBkYTFlMWYxMjVlODhmNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kNjg3ZDcyNGYzNmI0NjY3Yjg2NDZmMTg2ODA5MjgyOCA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfZDY4N2Q3MjRmMzZiNDY2N2I4NjQ2ZjE4NjgwOTI4MjgiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIFNlbmRhIFBpY2F6byAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzc5MTliYTBiYzgyNDc4ZDgwZGExZTFmMTI1ZTg4ZjUuc2V0Q29udGVudChodG1sX2Q2ODdkNzI0ZjM2YjQ2NjdiODY0NmYxODY4MDkyODI4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYzQwYTU3N2FiNzI4NGVmZmFlNTk0NGFjN2Q1Yjc0ZGYuYmluZFBvcHVwKHBvcHVwX2M3OTE5YmEwYmM4MjQ3OGQ4MGRhMWUxZjEyNWU4OGY1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNTA2ZWEwYWY5OTdlNDcxNzljYjIyOTRkYTJkZTVjZDYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45OTE4NjcyLC0xLjEzOTYyNDddLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl84ZTg0NjJkYzliNjM0NTU2YWYwOTYyMjY3ZjhlMDQ1NCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl81MDZlYTBhZjk5N2U0NzE3OWNiMjI5NGRhMmRlNWNkNi5zZXRJY29uKGljb25fOGU4NDYyZGM5YjYzNDU1NmFmMDk2MjI2N2Y4ZTA0NTQpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hNzFmNzIxNGMzMzc0YjljYWQ4ZmRhYmVhYjIzNGQ0MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hYTY1NWY2YWIwNzI0MjUzYjYwNDliNmM1MDViZjllYiA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfYWE2NTVmNmFiMDcyNDI1M2I2MDQ5YjZjNTA1YmY5ZWIiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIGRlbCBFbWlncmFudGUgKFpvbmEgMS0yLTMpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E3MWY3MjE0YzMzNzRiOWNhZDhmZGFiZWFiMjM0ZDQyLnNldENvbnRlbnQoaHRtbF9hYTY1NWY2YWIwNzI0MjUzYjYwNDliNmM1MDViZjllYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzUwNmVhMGFmOTk3ZTQ3MTc5Y2IyMjk0ZGEyZGU1Y2Q2LmJpbmRQb3B1cChwb3B1cF9hNzFmNzIxNGMzMzc0YjljYWQ4ZmRhYmVhYjIzNGQ0Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzVhMTM1MDA5MDE1NzQ1OWU5NzRmMzI0YzJiZmI0NzI3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTkyMzc1MywtMS4xMzY1MzAxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fMzg2MTZiZTU1Y2MyNDJjZGEyYWY3OTQ0MDVhZjZjZmYgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfNWExMzUwMDkwMTU3NDU5ZTk3NGYzMjRjMmJmYjQ3Mjcuc2V0SWNvbihpY29uXzM4NjE2YmU1NWNjMjQyY2RhMmFmNzk0NDA1YWY2Y2ZmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjRlM2FiZTVkMWQ0NDBhODgyYTYzNWE5ZWZmN2JiYzggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2FkYjYxNjZmYTUzNDQ3NmE2Njc2NDYzYjQxYWY4OWMgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzNhZGI2MTY2ZmE1MzQ0NzZhNjY3NjQ2M2I0MWFmODljIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBQbGF6YSBTYW50YSBNYXJpYSBkZSBHcmFjaWEgKFpvbmEgMS0yLTMpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY0ZTNhYmU1ZDFkNDQwYTg4MmE2MzVhOWVmZjdiYmM4LnNldENvbnRlbnQoaHRtbF8zYWRiNjE2NmZhNTM0NDc2YTY2NzY0NjNiNDFhZjg5Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzVhMTM1MDA5MDE1NzQ1OWU5NzRmMzI0YzJiZmI0NzI3LmJpbmRQb3B1cChwb3B1cF82NGUzYWJlNWQxZDQ0MGE4ODJhNjM1YTllZmY3YmJjOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzNmYmFmOGQ5ZmY0ZTQ1OTFiOGJlMDgyMzFhYzM0ZWI0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTkzNDMzLC0xLjEzOTE0MzRdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl9kODZlNTUyZWUyYmI0YThhYmExMTY0NGZhYTBmZjZiMCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl8zZmJhZjhkOWZmNGU0NTkxYjhiZTA4MjMxYWMzNGViNC5zZXRJY29uKGljb25fZDg2ZTU1MmVlMmJiNGE4YWJhMTE2NDRmYWEwZmY2YjApOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82YmNiMDY0YWRjZGI0NDI1ODE3YjQ1MTUwMGZhNjg3ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84NjdkYWI0YmQ1N2M0ODcxYTZkNTcyMDI0NmFjMGJjOCA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfODY3ZGFiNGJkNTdjNDg3MWE2ZDU3MjAyNDZhYzBiYzgiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIEF6b3JpbiAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmJjYjA2NGFkY2RiNDQyNTgxN2I0NTE1MDBmYTY4N2Quc2V0Q29udGVudChodG1sXzg2N2RhYjRiZDU3YzQ4NzFhNmQ1NzIwMjQ2YWMwYmM4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfM2ZiYWY4ZDlmZjRlNDU5MWI4YmUwODIzMWFjMzRlYjQuYmluZFBvcHVwKHBvcHVwXzZiY2IwNjRhZGNkYjQ0MjU4MTdiNDUxNTAwZmE2ODdkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYTA4ZTRiODUxNjg0NGRmMmIyNTVhMWUzMGM0N2IzZTAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45OTM5MjA2LC0xLjEzNjY1MDddLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl9iM2NlNWVlOWMwOTM0ZTkzYWUwNDllZWQxYTg4YTAxMSA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl9hMDhlNGI4NTE2ODQ0ZGYyYjI1NWExZTMwYzQ3YjNlMC5zZXRJY29uKGljb25fYjNjZTVlZTljMDkzNGU5M2FlMDQ5ZWVkMWE4OGEwMTEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xYzE3Y2EwNmVlNTI0ZWI0ODgzMjQ4YmY0NmUzYzMxNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82YzdhYjBhZTg5MGE0ZTlhOGRhMjdhYzgwYjQzOTFhOSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfNmM3YWIwYWU4OTBhNGU5YThkYTI3YWM4MGI0MzkxYTkiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIFBpY28gZGVsIE1vcnJvbiAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWMxN2NhMDZlZTUyNGViNDg4MzI0OGJmNDZlM2MzMTQuc2V0Q29udGVudChodG1sXzZjN2FiMGFlODkwYTRlOWE4ZGEyN2FjODBiNDM5MWE5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYTA4ZTRiODUxNjg0NGRmMmIyNTVhMWUzMGM0N2IzZTAuYmluZFBvcHVwKHBvcHVwXzFjMTdjYTA2ZWU1MjRlYjQ4ODMyNDhiZjQ2ZTNjMzE0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNWFlY2IzOWVhNTI3NDY1YmE0NTAyMTdiZTIyMDFjNzcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45MzkwODg3LC0xLjI1NTgxNzddLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl9hNDAxNjQ5OGUzNTQ0ZmNjOTViMGFhNmJmNTUwNjY0ZiA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl81YWVjYjM5ZWE1Mjc0NjViYTQ1MDIxN2JlMjIwMWM3Ny5zZXRJY29uKGljb25fYTQwMTY0OThlMzU0NGZjYzk1YjBhYTZiZjU1MDY2NGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hYTc1MTFlMzg5OTI0MGM1OWZjMTZhNjliMDYxZGE2NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82YzM4ODU3NDZmNGQ0NTA1ODkzNmQ4MWVjZjhjY2U4NSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfNmMzODg1NzQ2ZjRkNDUwNTg5MzZkODFlY2Y4Y2NlODUiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIFBhbnRhbm8gZGUgQ2FtYXJpbGxhcyAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWE3NTExZTM4OTkyNDBjNTlmYzE2YTY5YjA2MWRhNjQuc2V0Q29udGVudChodG1sXzZjMzg4NTc0NmY0ZDQ1MDU4OTM2ZDgxZWNmOGNjZTg1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNWFlY2IzOWVhNTI3NDY1YmE0NTAyMTdiZTIyMDFjNzcuYmluZFBvcHVwKHBvcHVwX2FhNzUxMWUzODk5MjQwYzU5ZmMxNmE2OWIwNjFkYTY0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMzBlMjRiZmZiYjdhNDQ3N2JiNTliMGI2YWMxYTdkZTEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45OTI4MDEsLTEuMTM3NDU4NV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uX2VhMDdhNTI1NmUwYTQwZDA4ZGQxYTlhYzQ3NzJiYzQxID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzMwZTI0YmZmYmI3YTQ0NzdiYjU5YjBiNmFjMWE3ZGUxLnNldEljb24oaWNvbl9lYTA3YTUyNTZlMGE0MGQwOGRkMWE5YWM0NzcyYmM0MSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhlZTdjNGFkNGU4NzRlZDE5ODllNmY4MDNmOGU5YjEwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzMwYmRjNDRhYzM1MzQwZjJiM2I1MWU5Y2M1NmEwMGU0ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF8zMGJkYzQ0YWMzNTM0MGYyYjNiNTFlOWNjNTZhMDBlNCIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgRXNjcml0b3IgU2FuY2hleiBNb3Jlbm8gKFpvbmEgMS0yLTMpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhlZTdjNGFkNGU4NzRlZDE5ODllNmY4MDNmOGU5YjEwLnNldENvbnRlbnQoaHRtbF8zMGJkYzQ0YWMzNTM0MGYyYjNiNTFlOWNjNTZhMDBlNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzMwZTI0YmZmYmI3YTQ0NzdiYjU5YjBiNmFjMWE3ZGUxLmJpbmRQb3B1cChwb3B1cF84ZWU3YzRhZDRlODc0ZWQxOTg5ZTZmODAzZjhlOWIxMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2JhNWVkMGRhZTY1ZjRhMTg5OTc4OTY3YzViMzZlZTVjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTkyNTI3NywtMS4xMzY3OTU1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fNDlmODIzMTZhYzAyNGZmMWJmNGEyN2RhZWMxZjllZWQgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfYmE1ZWQwZGFlNjVmNGExODk5Nzg5NjdjNWIzNmVlNWMuc2V0SWNvbihpY29uXzQ5ZjgyMzE2YWMwMjRmZjFiZjRhMjdkYWVjMWY5ZWVkKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2MzOTA5YWU3NDZiNDA1OWE1YzU3YTFiYTNlZWM1YzMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzA2YjI1ZTM2NjAwNDljMzk2NTg5Nzg4OTdmNWJlMjcgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzcwNmIyNWUzNjYwMDQ5YzM5NjU4OTc4ODk3ZjViZTI3IiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBTaWVycmEgZGUgQ2FycmFzY295IChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zYzM5MDlhZTc0NmI0MDU5YTVjNTdhMWJhM2VlYzVjMy5zZXRDb250ZW50KGh0bWxfNzA2YjI1ZTM2NjAwNDljMzk2NTg5Nzg4OTdmNWJlMjcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9iYTVlZDBkYWU2NWY0YTE4OTk3ODk2N2M1YjM2ZWU1Yy5iaW5kUG9wdXAocG9wdXBfM2MzOTA5YWU3NDZiNDA1OWE1YzU3YTFiYTNlZWM1YzMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9kZmI4NTI4OTAyM2U0ODJjODU5NzhmMDI5ZGFiMDU3MSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk5MjQ2OTUsLTEuMTI3NDI5NF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzQ2OTNjOWQ5ZjUzODQ3YmNiZjhiMThhNDA3NTI1ZmI5ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyX2RmYjg1Mjg5MDIzZTQ4MmM4NTk3OGYwMjlkYWIwNTcxLnNldEljb24oaWNvbl80NjkzYzlkOWY1Mzg0N2JjYmY4YjE4YTQwNzUyNWZiOSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZhODM5ZDI5YTRkOTQ3YjdiMGRlOTJlMzhiYmM1YjEyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I5ODU1OGZkODA4YTQ3Y2U5ZmJkMzMxNWU4M2YyODY3ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9iOTg1NThmZDgwOGE0N2NlOWZiZDMzMTVlODNmMjg2NyIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgQ29ycmVnaWRvciBQdWV5byAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmE4MzlkMjlhNGQ5NDdiN2IwZGU5MmUzOGJiYzViMTIuc2V0Q29udGVudChodG1sX2I5ODU1OGZkODA4YTQ3Y2U5ZmJkMzMxNWU4M2YyODY3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZGZiODUyODkwMjNlNDgyYzg1OTc4ZjAyOWRhYjA1NzEuYmluZFBvcHVwKHBvcHVwXzZhODM5ZDI5YTRkOTQ3YjdiMGRlOTJlMzhiYmM1YjEyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYjQ1ZDUyY2QwY2U5NGQxZDg3YjExNzU1MTA1NTBlY2EgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45OTI1MzQ2LC0xLjEyNDgxNTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl83N2QwMmRiZmI4YTM0NGZmYTdlOWI5YzY2ZGIwMDQ4NCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl9iNDVkNTJjZDBjZTk0ZDFkODdiMTE3NTUxMDU1MGVjYS5zZXRJY29uKGljb25fNzdkMDJkYmZiOGEzNDRmZmE3ZTliOWM2NmRiMDA0ODQpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NmM0NmZlNjJmOGU0MDIwYjQxN2UzNjZkZjA4NmQzOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85OTY1MmEzYjY4YjI0NmZhOTM5NDJlMDAwYzk3YTdkYiA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfOTk2NTJhM2I2OGIyNDZmYTkzOTQyZTAwMGM5N2E3ZGIiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIGRlIGxhIEZsb3RhIChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NmM0NmZlNjJmOGU0MDIwYjQxN2UzNjZkZjA4NmQzOC5zZXRDb250ZW50KGh0bWxfOTk2NTJhM2I2OGIyNDZmYTkzOTQyZTAwMGM5N2E3ZGIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9iNDVkNTJjZDBjZTk0ZDFkODdiMTE3NTUxMDU1MGVjYS5iaW5kUG9wdXAocG9wdXBfOTZjNDZmZTYyZjhlNDAyMGI0MTdlMzY2ZGYwODZkMzgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl84YmVkZjAzNDkxMTc0MWMzYTcyZWI5ODNlODI5MGQ2ZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4NjgzNTUsLTEuMTMzMzg2MV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzg4NGQ2YmZjYzg0MDQwYzBiYWM2MGVmMWQ4ZTY5OTM1ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzhiZWRmMDM0OTExNzQxYzNhNzJlYjk4M2U4MjkwZDZkLnNldEljb24oaWNvbl84ODRkNmJmY2M4NDA0MGMwYmFjNjBlZjFkOGU2OTkzNSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQyNjdjMTUxOGI5NDQwNDU5MWVhOGRlYTBiZDlmYTEyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ExNjU0YWFiYmE4MzRhYzM5N2JiZTYxMmI4MDQ5MzU3ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9hMTY1NGFhYmJhODM0YWMzOTdiYmU2MTJiODA0OTM1NyIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgQ29uZGUgZGUgUm9jaGUgKFpvbmEgMS0yLTMpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQyNjdjMTUxOGI5NDQwNDU5MWVhOGRlYTBiZDlmYTEyLnNldENvbnRlbnQoaHRtbF9hMTY1NGFhYmJhODM0YWMzOTdiYmU2MTJiODA0OTM1Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzhiZWRmMDM0OTExNzQxYzNhNzJlYjk4M2U4MjkwZDZkLmJpbmRQb3B1cChwb3B1cF80MjY3YzE1MThiOTQ0MDQ1OTFlYThkZWEwYmQ5ZmExMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2UxMmYxYTQxODdhMjRlZGNhZjM0NWU2YzhlYjExNTMwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTkyMjM5OSwtMS4xMzA2NTQ0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fZmFkYmEyYzIxZjNhNDk0NzhlYzlkNDE0NWJjYzk2YmQgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfZTEyZjFhNDE4N2EyNGVkY2FmMzQ1ZTZjOGViMTE1MzAuc2V0SWNvbihpY29uX2ZhZGJhMmMyMWYzYTQ5NDc4ZWM5ZDQxNDViY2M5NmJkKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTc1ZjFiMjE2YjE0NGJjMDhhYmI3ODk0OWEyYzk4ZmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjFjYTYzZjJmNjJhNGExNmFkMjEyZDA2ZDM1NWE0ODQgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2YxY2E2M2YyZjYyYTRhMTZhZDIxMmQwNmQzNTVhNDg0IiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBjYWxsZSBKdWFuIEd1ZXJyZXJvIFJ1aXogKFpvbmEgMS0yLTMpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk3NWYxYjIxNmIxNDRiYzA4YWJiNzg5NDlhMmM5OGZlLnNldENvbnRlbnQoaHRtbF9mMWNhNjNmMmY2MmE0YTE2YWQyMTJkMDZkMzU1YTQ4NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2UxMmYxYTQxODdhMjRlZGNhZjM0NWU2YzhlYjExNTMwLmJpbmRQb3B1cChwb3B1cF85NzVmMWIyMTZiMTQ0YmMwOGFiYjc4OTQ5YTJjOThmZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzU2ODE2NDQwZjJjYTRmNDE5NzEyOTY2MjljNWNmMDE5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTg2ODIwNCwtMS4xMzQwMjU4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fMDk5ODM3NzM5ZWRhNDI1Mjk5NTk0MDlmNzk2YjViMmQgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfNTY4MTY0NDBmMmNhNGY0MTk3MTI5NjYyOWM1Y2YwMTkuc2V0SWNvbihpY29uXzA5OTgzNzczOWVkYTQyNTI5OTU5NDA5Zjc5NmI1YjJkKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzhjMTc2NWI5MTkzNGZlNTg4NTI4NTdhYjc2ZDU5OTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjAwNGE4OGEwZjQ2NGFhYWIwMzEwMWEyZmU3NzczNGQgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2IwMDRhODhhMGY0NjRhYWFiMDMxMDFhMmZlNzc3MzRkIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBMYXJlZG8gKFpvbmEgMS0yLTMpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM4YzE3NjViOTE5MzRmZTU4ODUyODU3YWI3NmQ1OTkyLnNldENvbnRlbnQoaHRtbF9iMDA0YTg4YTBmNDY0YWFhYjAzMTAxYTJmZTc3NzM0ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzU2ODE2NDQwZjJjYTRmNDE5NzEyOTY2MjljNWNmMDE5LmJpbmRQb3B1cChwb3B1cF8zOGMxNzY1YjkxOTM0ZmU1ODg1Mjg1N2FiNzZkNTk5Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2EyNDFiMmI0MTlkNDQ3ZjhhYmE1NmUxOTUxNTA4MDdlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTY1NzE5NywtMS4xMjgwODA2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fZjU1ZWQ1NzA2OWJjNDkzZjhmYzA3ZDgxNDQwODhjMmEgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfYTI0MWIyYjQxOWQ0NDdmOGFiYTU2ZTE5NTE1MDgwN2Uuc2V0SWNvbihpY29uX2Y1NWVkNTcwNjliYzQ5M2Y4ZmMwN2Q4MTQ0MDg4YzJhKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTNiNzI1ZWVkYmRjNGIyNmFlZGI2YzMzMDkzZDBlZTEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODVmNTZjY2YxYTlkNGJiZGI4MDUyMTdiZTdiYjMzM2MgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzg1ZjU2Y2NmMWE5ZDRiYmRiODA1MjE3YmU3YmIzMzNjIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBTYW4gTWlndWVsIChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lM2I3MjVlZWRiZGM0YjI2YWVkYjZjMzMwOTNkMGVlMS5zZXRDb250ZW50KGh0bWxfODVmNTZjY2YxYTlkNGJiZGI4MDUyMTdiZTdiYjMzM2MpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9hMjQxYjJiNDE5ZDQ0N2Y4YWJhNTZlMTk1MTUwODA3ZS5iaW5kUG9wdXAocG9wdXBfZTNiNzI1ZWVkYmRjNGIyNmFlZGI2YzMzMDkzZDBlZTEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9hMjlmNmIwNjBjNjI0OWJkOGIzNzUyZDdkYjYyMTU2ZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk0Mjg4MTIsLTEuMTU5ODYxMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uX2ZmMTZhMTg4MDBiNDQ2NzQ4ODNiNzZmNjYxMGY0Yzc5ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyX2EyOWY2YjA2MGM2MjQ5YmQ4YjM3NTJkN2RiNjIxNTZmLnNldEljb24oaWNvbl9mZjE2YTE4ODAwYjQ0Njc0ODgzYjc2ZjY2MTBmNGM3OSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E0NzBmNzY2N2I1MzQwZDJiYjM0OWQzNmI1OGM0YzBjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA1NzMwNjk5ZTc1ZjRlNTc5ZDA4NmIwYTQ0MzMxODFhID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF8wNTczMDY5OWU3NWY0ZTU3OWQwODZiMGE0NDMzMTgxYSIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQXZlbmlkYSBBbGZvbnNvIFggRWwgU2FiaW8gKFpvbmEgMS0yLTMpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E0NzBmNzY2N2I1MzQwZDJiYjM0OWQzNmI1OGM0YzBjLnNldENvbnRlbnQoaHRtbF8wNTczMDY5OWU3NWY0ZTU3OWQwODZiMGE0NDMzMTgxYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2EyOWY2YjA2MGM2MjQ5YmQ4YjM3NTJkN2RiNjIxNTZmLmJpbmRQb3B1cChwb3B1cF9hNDcwZjc2NjdiNTM0MGQyYmIzNDlkMzZiNThjNGMwYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzJmMDJhZWZjZTNlYzQ0YmQ5YWNmYzBiNmE1YWRlZWQ5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTcyOTQxMSwtMS4xMzYzNjYzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fYzU5NzI5ZmJjNTIyNDUxM2EwMjA3NjkyOWY5OTgyNjYgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfMmYwMmFlZmNlM2VjNDRiZDlhY2ZjMGI2YTVhZGVlZDkuc2V0SWNvbihpY29uX2M1OTcyOWZiYzUyMjQ1MTNhMDIwNzY5MjlmOTk4MjY2KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTZjZjg5OGUyZGFlNDU2YmJiZTUwZDBmYTIxMjA0NDkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTk1YmVlMzNlYmJlNGZiZDk1MmJkZjA3ZTJiZTEyZWMgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzE5NWJlZTMzZWJiZTRmYmQ5NTJiZGYwN2UyYmUxMmVjIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBaYXJhaWNoaWNvIChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hNmNmODk4ZTJkYWU0NTZiYmJlNTBkMGZhMjEyMDQ0OS5zZXRDb250ZW50KGh0bWxfMTk1YmVlMzNlYmJlNGZiZDk1MmJkZjA3ZTJiZTEyZWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8yZjAyYWVmY2UzZWM0NGJkOWFjZmMwYjZhNWFkZWVkOS5iaW5kUG9wdXAocG9wdXBfYTZjZjg5OGUyZGFlNDU2YmJiZTUwZDBmYTIxMjA0NDkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl82MjI2Y2Q0NmRiY2U0NzViYTBhMGU5ZmRkNzU1ZmNkNiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk3NTIyOTMsLTEuMDU3ODM5NV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzVjOGNlM2I1OTI3YzRkZWM5MWUxMGVlYzQ3MzZiNWVjID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzYyMjZjZDQ2ZGJjZTQ3NWJhMGEwZTlmZGQ3NTVmY2Q2LnNldEljb24oaWNvbl81YzhjZTNiNTkyN2M0ZGVjOTFlMTBlZWM0NzM2YjVlYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2UxOTgxNWVhZTNmMjRkM2M4MDI3NTNlYWY2MDUzYjZlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBjODU0OWRhM2JlODQ2NzU4MjRkY2Q0OGY0ZjRjNzJhID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF8wYzg1NDlkYTNiZTg0Njc1ODI0ZGNkNDhmNGY0YzcyYSIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgY2FsbGUgQmFuZG8gZGUgbGEgSHVlcnRhIChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lMTk4MTVlYWUzZjI0ZDNjODAyNzUzZWFmNjA1M2I2ZS5zZXRDb250ZW50KGh0bWxfMGM4NTQ5ZGEzYmU4NDY3NTgyNGRjZDQ4ZjRmNGM3MmEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82MjI2Y2Q0NmRiY2U0NzViYTBhMGU5ZmRkNzU1ZmNkNi5iaW5kUG9wdXAocG9wdXBfZTE5ODE1ZWFlM2YyNGQzYzgwMjc1M2VhZjYwNTNiNmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl83YWM0ZDIwZmY2ZDU0ZDJmOGM5ZDY5YzIzYTVhNzNlZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4ODUzMTEsLTEuMTMyNTIyN10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzE5YTkxMjFhZGZjNzQ4NDZiOGZkMjBjZmE5YmY4ZWI3ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzdhYzRkMjBmZjZkNTRkMmY4YzlkNjljMjNhNWE3M2VkLnNldEljb24oaWNvbl8xOWE5MTIxYWRmYzc0ODQ2YjhmZDIwY2ZhOWJmOGViNyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzczMDg0NjUxYjI2MjRiZmY5ZWQyYTI2NTBiNzE5OTgxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdmZTZlNjcyMzQ5OTQyOWY5ZjVjMzFmZjQ4ZTg0NzE3ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF83ZmU2ZTY3MjM0OTk0MjlmOWY1YzMxZmY0OGU4NDcxNyIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgY2FsbGUgQWxtdWRlbmEgKFpvbmEgMS0yLTMpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzczMDg0NjUxYjI2MjRiZmY5ZWQyYTI2NTBiNzE5OTgxLnNldENvbnRlbnQoaHRtbF83ZmU2ZTY3MjM0OTk0MjlmOWY1YzMxZmY0OGU4NDcxNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzdhYzRkMjBmZjZkNTRkMmY4YzlkNjljMjNhNWE3M2VkLmJpbmRQb3B1cChwb3B1cF83MzA4NDY1MWIyNjI0YmZmOWVkMmEyNjUwYjcxOTk4MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzA2NDBjY2M0ZjUzNzQ4YWZhYTQzNmNlZTNjMGI1YWFjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzguMDQwNDYyNiwtMS4xMDAzMDQzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fZTgwMmEwNmJlOGI5NDdiZTlmMTZmNjhjYzZjNThhZDggPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfMDY0MGNjYzRmNTM3NDhhZmFhNDM2Y2VlM2MwYjVhYWMuc2V0SWNvbihpY29uX2U4MDJhMDZiZThiOTQ3YmU5ZjE2ZjY4Y2M2YzU4YWQ4KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTI3ZmQ1MDIxMjQ4NGU5ZjhhYTllMjE1M2IyMThlNmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2NkN2VlOGIzM2QwNDFjOTg3M2MyM2Y4NzhjYjFmMzMgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2NjZDdlZThiMzNkMDQxYzk4NzNjMjNmODc4Y2IxZjMzIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBTaWVycmEgRXNwdW5hIChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lMjdmZDUwMjEyNDg0ZTlmOGFhOWUyMTUzYjIxOGU2ZS5zZXRDb250ZW50KGh0bWxfY2NkN2VlOGIzM2QwNDFjOTg3M2MyM2Y4NzhjYjFmMzMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wNjQwY2NjNGY1Mzc0OGFmYWE0MzZjZWUzYzBiNWFhYy5iaW5kUG9wdXAocG9wdXBfZTI3ZmQ1MDIxMjQ4NGU5ZjhhYTllMjE1M2IyMThlNmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl83MzEwYzFkMGI1NGM0NTI3OTA4ZDllMzk3OTEyNzkzOCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM4LjAxOTcxNjksLTEuMDczNjg0NF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzFlZjkxNjcwMWZiNzQ4NzBhMmQ5Zjk2MTUyMmZjYTMzID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzczMTBjMWQwYjU0YzQ1Mjc5MDhkOWUzOTc5MTI3OTM4LnNldEljb24oaWNvbl8xZWY5MTY3MDFmYjc0ODcwYTJkOWY5NjE1MjJmY2EzMyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVjYjU2ZjIxMDI0ZTQ5ODBiZWE1Yjk2OWFiYzRjNmIwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVhNjA0ZGI2M2MzMDQ4MTk5MTE3MWI3NzY1MWYxMTY4ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF81YTYwNGRiNjNjMzA0ODE5OTExNzFiNzc2NTFmMTE2OCIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FtaW5vIGRlIENhYmVjaWNvcyAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWNiNTZmMjEwMjRlNDk4MGJlYTViOTY5YWJjNGM2YjAuc2V0Q29udGVudChodG1sXzVhNjA0ZGI2M2MzMDQ4MTk5MTE3MWI3NzY1MWYxMTY4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNzMxMGMxZDBiNTRjNDUyNzkwOGQ5ZTM5NzkxMjc5MzguYmluZFBvcHVwKHBvcHVwXzVjYjU2ZjIxMDI0ZTQ5ODBiZWE1Yjk2OWFiYzRjNmIwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMWU4MzdlMGM5NGJkNGRiZTkyZDM2NjRjODQ2NDFmNTggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45ODY0MDgyLC0xLjEzMTY5MjNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl81MTQ1YTdkZDA1MTM0MTVlODVmMzY0NGZmNjMwNjA1MyA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl8xZTgzN2UwYzk0YmQ0ZGJlOTJkMzY2NGM4NDY0MWY1OC5zZXRJY29uKGljb25fNTE0NWE3ZGQwNTEzNDE1ZTg1ZjM2NDRmZjYzMDYwNTMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82OTJlZmFiMDQ4MjA0MzQ3YWQxMzhhODlkZjcxYjBjNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85NjNhM2IyMzM0NDY0NWYxYTBhMWRiYjRhZGI5OTc4ZiA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfOTYzYTNiMjMzNDQ2NDVmMWEwYTFkYmI0YWRiOTk3OGYiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIEFjdG9yIEZlcm5hbmRvIERpYXogZGUgTWVuZG96YSAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjkyZWZhYjA0ODIwNDM0N2FkMTM4YTg5ZGY3MWIwYzcuc2V0Q29udGVudChodG1sXzk2M2EzYjIzMzQ0NjQ1ZjFhMGExZGJiNGFkYjk5NzhmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMWU4MzdlMGM5NGJkNGRiZTkyZDM2NjRjODQ2NDFmNTguYmluZFBvcHVwKHBvcHVwXzY5MmVmYWIwNDgyMDQzNDdhZDEzOGE4OWRmNzFiMGM3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZDczYWVjYTA0ZjhhNDE4ZTg5NzU5ZWE2MDcxNGI1ZTQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45ODczNDA5LC0xLjEzMDIzMjhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl9iYzQyZTk5ZTYwOGU0MmE2OGNlNDVjZjE1MGIwYjA4MSA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl9kNzNhZWNhMDRmOGE0MThlODk3NTllYTYwNzE0YjVlNC5zZXRJY29uKGljb25fYmM0MmU5OWU2MDhlNDJhNjhjZTQ1Y2YxNTBiMGIwODEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83MTMzODVjOGU2ZTQ0YzY0ODEyOGFlMGU5NDVmMTIzYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hYWU2NzQxYjM3NzM0OTc1OGEwMmU2ODZkMDdjOWFmMCA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfYWFlNjc0MWIzNzczNDk3NThhMDJlNjg2ZDA3YzlhZjAiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIEVjaGVnYXJheSAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzEzMzg1YzhlNmU0NGM2NDgxMjhhZTBlOTQ1ZjEyM2Euc2V0Q29udGVudChodG1sX2FhZTY3NDFiMzc3MzQ5NzU4YTAyZTY4NmQwN2M5YWYwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZDczYWVjYTA0ZjhhNDE4ZTg5NzU5ZWE2MDcxNGI1ZTQuYmluZFBvcHVwKHBvcHVwXzcxMzM4NWM4ZTZlNDRjNjQ4MTI4YWUwZTk0NWYxMjNhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYWZlMDY3NjI0MTNmNGQxZjk5YzI0NjdmMjA2NmJhMjUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45ODcyOTQ1LC0xLjEzMTAxODhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl82ZGYwM2M3NTAyNmQ0YTYzYjIzMWIxMjdlNDBkOWI3NyA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl9hZmUwNjc2MjQxM2Y0ZDFmOTljMjQ2N2YyMDY2YmEyNS5zZXRJY29uKGljb25fNmRmMDNjNzUwMjZkNGE2M2IyMzFiMTI3ZTQwZDliNzcpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kZGQ3MDdiY2Y5MTg0ZmQ3ODQyZDlhNWIwM2M0ODdlNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xYjExZWJkNmMyMjA0NzlhYjJkMWRjZmMzYzM1OTRhZiA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfMWIxMWViZDZjMjIwNDc5YWIyZDFkY2ZjM2MzNTk0YWYiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIEFuZ2VsIEd1aXJhbyAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGRkNzA3YmNmOTE4NGZkNzg0MmQ5YTViMDNjNDg3ZTQuc2V0Q29udGVudChodG1sXzFiMTFlYmQ2YzIyMDQ3OWFiMmQxZGNmYzNjMzU5NGFmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYWZlMDY3NjI0MTNmNGQxZjk5YzI0NjdmMjA2NmJhMjUuYmluZFBvcHVwKHBvcHVwX2RkZDcwN2JjZjkxODRmZDc4NDJkOWE1YjAzYzQ4N2U0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfY2JlODY0MGI0YjFmNGI2OGJiNGU2MWZhZmJkN2E5MmYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszOC4wMTUwODE4LC0xLjEyMjMwNDNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl8yNzE2Yjk4MTcwYTU0MGIzYmViOTg0MjRjN2E1ODFjYiA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl9jYmU4NjQwYjRiMWY0YjY4YmI0ZTYxZmFmYmQ3YTkyZi5zZXRJY29uKGljb25fMjcxNmI5ODE3MGE1NDBiM2JlYjk4NDI0YzdhNTgxY2IpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80Njk3ZGZlMjM2OGY0MjRjODIwNjA5ZjliOGFkNmU3ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wY2M0NzdkYzA5NmQ0NmQzYTBmOTNkYmI4OTBjMTU2MiA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfMGNjNDc3ZGMwOTZkNDZkM2EwZjkzZGJiODkwYzE1NjIiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIFJpY2FyZG8gQ29kb3JuaXUgKFpvbmEgMS0yLTMpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ2OTdkZmUyMzY4ZjQyNGM4MjA2MDlmOWI4YWQ2ZTdkLnNldENvbnRlbnQoaHRtbF8wY2M0NzdkYzA5NmQ0NmQzYTBmOTNkYmI4OTBjMTU2Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2NiZTg2NDBiNGIxZjRiNjhiYjRlNjFmYWZiZDdhOTJmLmJpbmRQb3B1cChwb3B1cF80Njk3ZGZlMjM2OGY0MjRjODIwNjA5ZjliOGFkNmU3ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzU2YzZjZmQ4MjBjZTQ1OTk4M2IyZjIyOTNlMGYzNTdhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTkzNjI1NCwtMS4xMzg1MDcxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fNGQzZTcwNDg1MGFlNGZhYzhkNDliNmYyNDZhMzRkYjUgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfNTZjNmNmZDgyMGNlNDU5OTgzYjJmMjI5M2UwZjM1N2Euc2V0SWNvbihpY29uXzRkM2U3MDQ4NTBhZTRmYWM4ZDQ5YjZmMjQ2YTM0ZGI1KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODY4OTdhNTNiOTg1NDE0OWJiYjVlZTM4YTc4MjJlN2MgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWNjN2MxOWEzOTYyNGRmN2JkNWM3MmQwMDk0MWQyZTkgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzFjYzdjMTlhMzk2MjRkZjdiZDVjNzJkMDA5NDFkMmU5IiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBEYWxpYXMgKFpvbmEgMS0yLTMpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg2ODk3YTUzYjk4NTQxNDliYmI1ZWUzOGE3ODIyZTdjLnNldENvbnRlbnQoaHRtbF8xY2M3YzE5YTM5NjI0ZGY3YmQ1YzcyZDAwOTQxZDJlOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzU2YzZjZmQ4MjBjZTQ1OTk4M2IyZjIyOTNlMGYzNTdhLmJpbmRQb3B1cChwb3B1cF84Njg5N2E1M2I5ODU0MTQ5YmJiNWVlMzhhNzgyMmU3Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2M4MzVhMTQ3YjRhZjRhZmI4YTk0OGY4MjFjZTNjZjFhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTk0NjU3NywtMS4xNDAyMjc3XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fNjQ2NWZlZmY1NTA4NDliMDkzNzM4NzBmZGZhZmFjMmEgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfYzgzNWExNDdiNGFmNGFmYjhhOTQ4ZjgyMWNlM2NmMWEuc2V0SWNvbihpY29uXzY0NjVmZWZmNTUwODQ5YjA5MzczODcwZmRmYWZhYzJhKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTk2N2M3ZWQyOWIyNGY4NjhlNDNjMDhmNmIxMDQ4YTcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWM5NzBlN2IyYzEyNDQwM2IwNTczN2U5Yzc2MDZjNDkgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzVjOTcwZTdiMmMxMjQ0MDNiMDU3MzdlOWM3NjA2YzQ5IiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBNb25jYXlvIChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xOTY3YzdlZDI5YjI0Zjg2OGU0M2MwOGY2YjEwNDhhNy5zZXRDb250ZW50KGh0bWxfNWM5NzBlN2IyYzEyNDQwM2IwNTczN2U5Yzc2MDZjNDkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jODM1YTE0N2I0YWY0YWZiOGE5NDhmODIxY2UzY2YxYS5iaW5kUG9wdXAocG9wdXBfMTk2N2M3ZWQyOWIyNGY4NjhlNDNjMDhmNmIxMDQ4YTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8zMmY0YTY1ODZmYjM0Y2VlYmVhNjFjMTk1M2M2OWViOSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk5MDc3ODYsLTEuMTM0MDg1N10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzc2MmI3OGNmNWU3NDQ4MWNiNmNmMjJmYTA0NTI0MGM1ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzMyZjRhNjU4NmZiMzRjZWViZWE2MWMxOTUzYzY5ZWI5LnNldEljb24oaWNvbl83NjJiNzhjZjVlNzQ0ODFjYjZjZjIyZmEwNDUyNDBjNSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAwZDBmMGYwM2ZlNTQwNTg4YzhhNGRlMjY3Yjc0ZTgwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzllYWNlMGVjNmE2ODQ5Y2FiNzI5MDQ0MzZiZDk2MDBiID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF85ZWFjZTBlYzZhNjg0OWNhYjcyOTA0NDM2YmQ5NjAwYiIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgUGxhemEgVmlyZ2VuIGRlIGxhIEVzcGVyYW56YSAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDBkMGYwZjAzZmU1NDA1ODhjOGE0ZGUyNjdiNzRlODAuc2V0Q29udGVudChodG1sXzllYWNlMGVjNmE2ODQ5Y2FiNzI5MDQ0MzZiZDk2MDBiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMzJmNGE2NTg2ZmIzNGNlZWJlYTYxYzE5NTNjNjllYjkuYmluZFBvcHVwKHBvcHVwXzAwZDBmMGYwM2ZlNTQwNTg4YzhhNGRlMjY3Yjc0ZTgwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMzg5YzQ3ZTcxMGRkNGJhNmI5OThlZGQ2NGQzZjI4ZDYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45OTE5OTU1LC0xLjEzODAwNjhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl82ZWFlMDhkOTVhMmY0NjM1YjMzM2Q2ZTcwYTg3YzQ0MyA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl8zODljNDdlNzEwZGQ0YmE2Yjk5OGVkZDY0ZDNmMjhkNi5zZXRJY29uKGljb25fNmVhZTA4ZDk1YTJmNDYzNWIzMzNkNmU3MGE4N2M0NDMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80YTUzNDg4MTFkMjk0MDQxYjY0MjczZGU4NWM1Y2UzOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zNTE2ZTc1ZTYwODY0ODI5YTllNmFjNzVmYjk1MWY4YSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfMzUxNmU3NWU2MDg2NDgyOWE5ZTZhYzc1ZmI5NTFmOGEiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIEplcm9uaW1vIEd1aWphcnJvIChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80YTUzNDg4MTFkMjk0MDQxYjY0MjczZGU4NWM1Y2UzOC5zZXRDb250ZW50KGh0bWxfMzUxNmU3NWU2MDg2NDgyOWE5ZTZhYzc1ZmI5NTFmOGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8zODljNDdlNzEwZGQ0YmE2Yjk5OGVkZDY0ZDNmMjhkNi5iaW5kUG9wdXAocG9wdXBfNGE1MzQ4ODExZDI5NDA0MWI2NDI3M2RlODVjNWNlMzgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl83ZDMyNjEwYzIyZGQ0NGUzYjc1MjYzN2I3Yzc1MmE0MiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NDY2NCwtMC44NjgwNzQzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fYTk0YTUyNDhkZWUxNDllNTlkNjJiNWIxOGQ3N2NjMTkgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfN2QzMjYxMGMyMmRkNDRlM2I3NTI2MzdiN2M3NTJhNDIuc2V0SWNvbihpY29uX2E5NGE1MjQ4ZGVlMTQ5ZTU5ZDYyYjViMThkNzdjYzE5KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmYxYmQ0MmUzMTIyNGYwMjliNjNmYTNjOWM4NGRjNWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDE5YTc5OGY4Yzc4NGUwNmJiZGY1YzU0MTdkZmFhZDkgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2QxOWE3OThmOGM3ODRlMDZiYmRmNWM1NDE3ZGZhYWQ5IiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBBYmRlcnJhbWFuIChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZjFiZDQyZTMxMjI0ZjAyOWI2M2ZhM2M5Yzg0ZGM1YS5zZXRDb250ZW50KGh0bWxfZDE5YTc5OGY4Yzc4NGUwNmJiZGY1YzU0MTdkZmFhZDkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl83ZDMyNjEwYzIyZGQ0NGUzYjc1MjYzN2I3Yzc1MmE0Mi5iaW5kUG9wdXAocG9wdXBfMmYxYmQ0MmUzMTIyNGYwMjliNjNmYTNjOWM4NGRjNWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl81Y2I4Yzc4NTQ2MzE0MjJmYmRkYmFkMmE2YTdmM2FkNiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM4LjA0NDE0ODEsLTEuMDE4NTE1M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzgyYWRlNjJhNmVlNDRmZjZhMzJmY2JhMmQ5OWFjODRjID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzVjYjhjNzg1NDYzMTQyMmZiZGRiYWQyYTZhN2YzYWQ2LnNldEljb24oaWNvbl84MmFkZTYyYTZlZTQ0ZmY2YTMyZmNiYTJkOTlhYzg0Yyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZmNDY5NWQzNmQ2MzQ5M2M4MTZhMTg0YTM4MDgyMTUyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM5ZjE1OTlmY2QxNTQ2NDI4YWUyMThiODMyZGFkNDEwID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF8zOWYxNTk5ZmNkMTU0NjQyOGFlMjE4YjgzMmRhZDQxMCIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgQ29uc3RpdHVjaW9uIChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mZjQ2OTVkMzZkNjM0OTNjODE2YTE4NGEzODA4MjE1Mi5zZXRDb250ZW50KGh0bWxfMzlmMTU5OWZjZDE1NDY0MjhhZTIxOGI4MzJkYWQ0MTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl81Y2I4Yzc4NTQ2MzE0MjJmYmRkYmFkMmE2YTdmM2FkNi5iaW5kUG9wdXAocG9wdXBfZmY0Njk1ZDM2ZDYzNDkzYzgxNmExODRhMzgwODIxNTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl80NGQzODc3ZThkZWY0NWZhOWNjNWZkMjZmY2RkNmQ4NiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4NjExNiwtMS4xMzQyOTQxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fM2FiMTk2YmMxYTA1NDJmN2E2MTgxNGQ5MGZiYmM3NzIgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfNDRkMzg3N2U4ZGVmNDVmYTljYzVmZDI2ZmNkZDZkODYuc2V0SWNvbihpY29uXzNhYjE5NmJjMWEwNTQyZjdhNjE4MTRkOTBmYmJjNzcyKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDc1YmJlMTg1ODY2NGNlZmJkYzQ3MWRjMTAxOGVhZmEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzQ2MzdjYWNkZDBiNDEwYWJiZjc3NzlkZjhkZjNlYWUgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzM0NjM3Y2FjZGQwYjQxMGFiYmY3Nzc5ZGY4ZGYzZWFlIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDdWVzdGEgZGUgbGEgTWFnZGFsZW5hIChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80NzViYmUxODU4NjY0Y2VmYmRjNDcxZGMxMDE4ZWFmYS5zZXRDb250ZW50KGh0bWxfMzQ2MzdjYWNkZDBiNDEwYWJiZjc3NzlkZjhkZjNlYWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl80NGQzODc3ZThkZWY0NWZhOWNjNWZkMjZmY2RkNmQ4Ni5iaW5kUG9wdXAocG9wdXBfNDc1YmJlMTg1ODY2NGNlZmJkYzQ3MWRjMTAxOGVhZmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIG11bHRpX3BvbHlfbGluZV9iYjkwODgwNzQ5ODc0ZjE1ODhjMjBkNjg0YmM4ZThjYSA9IEwubXVsdGlQb2x5bGluZSgKICAgICAgICAgICAgICAgICAgICBbW1szOC4wNTMzOTc3LCAtMS42NjA4ODg3XSwgWzM3Ljc3NDY2NCwgLTAuODY4MDc0M11dLCBbWzM3Ljc3NDY2NCwgLTAuODY4MDc0M10sIFszOC4wNDQxNDgxLCAtMS4wMTg1MTUzXV0sIFtbMzguMDQ0MTQ4MSwgLTEuMDE4NTE1M10sIFszOC4wNTMzOTc3LCAtMS42NjA4ODg3XV1dLAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDUsCiAgICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmLmFkZExheWVyKG11bHRpX3BvbHlfbGluZV9iYjkwODgwNzQ5ODc0ZjE1ODhjMjBkNjg0YmM4ZThjYSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U2NzEzMWY3YjA2YTQ5NDBhOTFmMzUyNGQ5ZGQ2ZDk4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZhNTYzMTNhOWFkZTQ5MTg5NzA0ZDQ3NTZkZTY0MGM0ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9mYTU2MzEzYTlhZGU0OTE4OTcwNGQ0NzU2ZGU2NDBjNCIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgWm9uYSAxLTItMzwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lNjcxMzFmN2IwNmE0OTQwYTkxZjM1MjRkOWRkNmQ5OC5zZXRDb250ZW50KGh0bWxfZmE1NjMxM2E5YWRlNDkxODk3MDRkNDc1NmRlNjQwYzQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG11bHRpX3BvbHlfbGluZV9iYjkwODgwNzQ5ODc0ZjE1ODhjMjBkNjg0YmM4ZThjYS5iaW5kUG9wdXAocG9wdXBfZTY3MTMxZjdiMDZhNDk0MGE5MWYzNTI0ZDlkZDZkOTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9kYWFkNGVlNjNiZmQ0MDNhYTZmY2MzZGFlZDMyZjExZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4MzYwMzMsLTEuMTc3MzczNF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uX2JiZmVhOTIzM2UwMjQwZWQ4YTE5MmM3ZDZmN2Q3ZjYyID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAnYmx1ZScsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl9kYWFkNGVlNjNiZmQ0MDNhYTZmY2MzZGFlZDMyZjExZi5zZXRJY29uKGljb25fYmJmZWE5MjMzZTAyNDBlZDhhMTkyYzdkNmY3ZDdmNjIpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lZGU3ODFmMjc5MzE0Mjg1ODk3NzJmNjU1ZjcwZGM1YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82YzkzN2JlZDcwMjQ0M2I2YmJmOTNkYTFmMWNkNGY3MiA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfNmM5MzdiZWQ3MDI0NDNiNmJiZjkzZGExZjFjZDRmNzIiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIEF2ZW5pZGEgUmlvIFNlZ3VyYSAoWm9uYSA1KTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lZGU3ODFmMjc5MzE0Mjg1ODk3NzJmNjU1ZjcwZGM1Yy5zZXRDb250ZW50KGh0bWxfNmM5MzdiZWQ3MDI0NDNiNmJiZjkzZGExZjFjZDRmNzIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kYWFkNGVlNjNiZmQ0MDNhYTZmY2MzZGFlZDMyZjExZi5iaW5kUG9wdXAocG9wdXBfZWRlNzgxZjI3OTMxNDI4NTg5NzcyZjY1NWY3MGRjNWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8xYmQ1NjVjMjQyMTc0MThlOGQ1ZjJmMGI2ODY2ZWFjNCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjYxOTYzNzQsLTAuODgzNDYxMl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzNmYmIyMTBmNjk2MzQ0Zjc5NmFiMTliZmUwNjgwMjFmID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAnYmx1ZScsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl8xYmQ1NjVjMjQyMTc0MThlOGQ1ZjJmMGI2ODY2ZWFjNC5zZXRJY29uKGljb25fM2ZiYjIxMGY2OTYzNDRmNzk2YWIxOWJmZTA2ODAyMWYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83ZGQ0NzdlYjdkNGY0MDQxYWFiNDhhYjYyZGE5YTJiMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jNjJjMmQ3NjM2YmE0OTBkOWY1OTY3ZjkxY2IxM2Y3NCA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfYzYyYzJkNzYzNmJhNDkwZDlmNTk2N2Y5MWNiMTNmNzQiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIFBhc2VvIE1hcnF1ZXMgZGUgQ29ydmVyYSAoWm9uYSA1KTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83ZGQ0NzdlYjdkNGY0MDQxYWFiNDhhYjYyZGE5YTJiMi5zZXRDb250ZW50KGh0bWxfYzYyYzJkNzYzNmJhNDkwZDlmNTk2N2Y5MWNiMTNmNzQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8xYmQ1NjVjMjQyMTc0MThlOGQ1ZjJmMGI2ODY2ZWFjNC5iaW5kUG9wdXAocG9wdXBfN2RkNDc3ZWI3ZDRmNDA0MWFhYjQ4YWI2MmRhOWEyYjIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl83ZTZhYzVjODcxMWQ0NDRhOWY4MzI0NTM3ZjYyYzc1MiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4MTM5MzcsLTEuMTMwNjUwMl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uX2I3NjUyNmFiNjZiZTQ3NWJiZWRiNjVhOTNkMmRmYTQwID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAnYmx1ZScsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl83ZTZhYzVjODcxMWQ0NDRhOWY4MzI0NTM3ZjYyYzc1Mi5zZXRJY29uKGljb25fYjc2NTI2YWI2NmJlNDc1YmJlZGI2NWE5M2QyZGZhNDApOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81Y2Q3MmM2MzJhM2M0ODA2OTdkYjYzMzA5ZWEyZThiNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iMGEyZTUyMjUxZjg0ZmMwYTM2NTNhODUxN2JiYTZmOSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfYjBhMmU1MjI1MWY4NGZjMGEzNjUzYTg1MTdiYmE2ZjkiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIEp1YW4gQW50b25pbyBIZXJuYW5kZXogZGVsIEFndWlsYSAoWm9uYSA1KTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81Y2Q3MmM2MzJhM2M0ODA2OTdkYjYzMzA5ZWEyZThiNS5zZXRDb250ZW50KGh0bWxfYjBhMmU1MjI1MWY4NGZjMGEzNjUzYTg1MTdiYmE2ZjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl83ZTZhYzVjODcxMWQ0NDRhOWY4MzI0NTM3ZjYyYzc1Mi5iaW5kUG9wdXAocG9wdXBfNWNkNzJjNjMyYTNjNDgwNjk3ZGI2MzMwOWVhMmU4YjUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9hMDNkMmVlNmYyMDA0ZjA2OTVkZTkzYTA5ZGJiOWFkYSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk3NTA0MzMsLTEuMTMwMDQ0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fYzkwMDQ1NDgwYWUyNGI4YmI5Y2E1MmU3NjZjNDg0MTkgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdibHVlJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyX2EwM2QyZWU2ZjIwMDRmMDY5NWRlOTNhMDlkYmI5YWRhLnNldEljb24oaWNvbl9jOTAwNDU0ODBhZTI0YjhiYjljYTUyZTc2NmM0ODQxOSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U3ZjA2MDM2ZGIxYTQ5ZjY4ZmMwYjYyYWU2Zjk4YTFmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdjY2ZhZmRlNDEwMjRkMDhiMWQwMTYzYzBkMjNlNzgxID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF83Y2NmYWZkZTQxMDI0ZDA4YjFkMDE2M2MwZDIzZTc4MSIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgSW5kdXN0cmlhIChab25hIDUpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U3ZjA2MDM2ZGIxYTQ5ZjY4ZmMwYjYyYWU2Zjk4YTFmLnNldENvbnRlbnQoaHRtbF83Y2NmYWZkZTQxMDI0ZDA4YjFkMDE2M2MwZDIzZTc4MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2EwM2QyZWU2ZjIwMDRmMDY5NWRlOTNhMDlkYmI5YWRhLmJpbmRQb3B1cChwb3B1cF9lN2YwNjAzNmRiMWE0OWY2OGZjMGI2MmFlNmY5OGExZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzMyZjhkNGU0MGMxNjQyZmRiN2ExZTRlNDdlOWIxMTc1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTgxMzMxMSwtMS4xMjg4MjE5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fYTVkMmE0ZDIwZDk5NGNiZjk5OTFkZWJmNzU3Nzc1NWIgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdibHVlJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzMyZjhkNGU0MGMxNjQyZmRiN2ExZTRlNDdlOWIxMTc1LnNldEljb24oaWNvbl9hNWQyYTRkMjBkOTk0Y2JmOTk5MWRlYmY3NTc3NzU1Yik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M2MTA5NjQ0ODA1YjRhYmU4YmU0MzE2MzM0NTNkNzkyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZlMDA5MzM1YjQyZTRlYTdhN2E5NTZmMWY2MzMyYzFkID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9mZTAwOTMzNWI0MmU0ZWE3YTdhOTU2ZjFmNjMzMmMxZCIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgQW1icm9zaW8gU2FsYXphciAoWm9uYSA1KTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNjEwOTY0NDgwNWI0YWJlOGJlNDMxNjMzNDUzZDc5Mi5zZXRDb250ZW50KGh0bWxfZmUwMDkzMzViNDJlNGVhN2E3YTk1NmYxZjYzMzJjMWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8zMmY4ZDRlNDBjMTY0MmZkYjdhMWU0ZTQ3ZTliMTE3NS5iaW5kUG9wdXAocG9wdXBfYzYxMDk2NDQ4MDViNGFiZThiZTQzMTYzMzQ1M2Q3OTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8yZTBhMWRlODQ3MmM0NTQxOWZlYWI0M2U5ODNiZTEzMyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4MDg0MzIsLTEuMTI4NTk5Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uX2Q3MDU4M2JmYmI4MTRmNWY4Yzk1YTk1ODZiYjM4NzgyID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAnYmx1ZScsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl8yZTBhMWRlODQ3MmM0NTQxOWZlYWI0M2U5ODNiZTEzMy5zZXRJY29uKGljb25fZDcwNTgzYmZiYjgxNGY1ZjhjOTVhOTU4NmJiMzg3ODIpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84YmI4YmEzYmQxYzg0NjZjYjQ3N2U5YWJkYTE1NGQ5MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zNTRkMGUxM2RmY2I0MmUyYTdjOWI2Yjg5ZDIzZmRkMSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfMzU0ZDBlMTNkZmNiNDJlMmE3YzliNmI4OWQyM2ZkZDEiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIGRlIFJpY2FyZG8gR2lsIChab25hIDUpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhiYjhiYTNiZDFjODQ2NmNiNDc3ZTlhYmRhMTU0ZDkzLnNldENvbnRlbnQoaHRtbF8zNTRkMGUxM2RmY2I0MmUyYTdjOWI2Yjg5ZDIzZmRkMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzJlMGExZGU4NDcyYzQ1NDE5ZmVhYjQzZTk4M2JlMTMzLmJpbmRQb3B1cChwb3B1cF84YmI4YmEzYmQxYzg0NjZjYjQ3N2U5YWJkYTE1NGQ5Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzQxMGVlZjRjMDVjZDRiY2FiZjY4MGYzMzQ1MTM4MTk3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTgwNDEyNiwtMS4xMjk0MzE4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fODU4MjgzZTQwNWI4NDBiM2E3NGNkNjVjYWZhYWQ2NmQgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdibHVlJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzQxMGVlZjRjMDVjZDRiY2FiZjY4MGYzMzQ1MTM4MTk3LnNldEljb24oaWNvbl84NTgyODNlNDA1Yjg0MGIzYTc0Y2Q2NWNhZmFhZDY2ZCk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2UwYzlmOTM4OWVlYTQxMzZhYjBlNzZhZjlkM2E1NWMxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U1M2IwNDc0MGEzMTRkOTg5Yzg4YWMwMGE1NGZmZDQ3ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9lNTNiMDQ3NDBhMzE0ZDk4OWM4OGFjMDBhNTRmZmQ0NyIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgUHJvY2xhbWFjaW9uIChab25hIDUpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UwYzlmOTM4OWVlYTQxMzZhYjBlNzZhZjlkM2E1NWMxLnNldENvbnRlbnQoaHRtbF9lNTNiMDQ3NDBhMzE0ZDk4OWM4OGFjMDBhNTRmZmQ0Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzQxMGVlZjRjMDVjZDRiY2FiZjY4MGYzMzQ1MTM4MTk3LmJpbmRQb3B1cChwb3B1cF9lMGM5ZjkzODllZWE0MTM2YWIwZTc2YWY5ZDNhNTVjMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzI3ZWJjNjg1ZGNkMjQzZTNiODQyNjViYjA3MTgyZDVmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTc3MDk5MiwtMS4xMjc5NjU2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fZDdmZGI2ZmM5OWJmNDQzYWJlYTcyMjdhNTM0NGJiNDkgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdibHVlJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzI3ZWJjNjg1ZGNkMjQzZTNiODQyNjViYjA3MTgyZDVmLnNldEljb24oaWNvbl9kN2ZkYjZmYzk5YmY0NDNhYmVhNzIyN2E1MzQ0YmI0OSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFmZWVmNzNlYWU1NzQxODQ4ZmZkMTAwNWNjZWJjNzIzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFkY2VhNTk5YTc2MjQ3NjVhYTU2MTQ3MTUxYTNkZDFmID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF8xZGNlYTU5OWE3NjI0NzY1YWE1NjE0NzE1MWEzZGQxZiIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgSnVhbiBMb3BleiBTb21hbG8gKFpvbmEgNSk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWZlZWY3M2VhZTU3NDE4NDhmZmQxMDA1Y2NlYmM3MjMuc2V0Q29udGVudChodG1sXzFkY2VhNTk5YTc2MjQ3NjVhYTU2MTQ3MTUxYTNkZDFmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMjdlYmM2ODVkY2QyNDNlM2I4NDI2NWJiMDcxODJkNWYuYmluZFBvcHVwKHBvcHVwXzFmZWVmNzNlYWU1NzQxODQ4ZmZkMTAwNWNjZWJjNzIzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMzk2YmJmNThhMjIzNGFjZWFjZjc5NDE0MTYwYmNkMmQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45NzY0NzAyLC0xLjEyNzE2MzNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl9iZDkwZDMzOTZjYmQ0ZjNhYWYzZjg2YmUzYWViYThiZCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ2JsdWUnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfMzk2YmJmNThhMjIzNGFjZWFjZjc5NDE0MTYwYmNkMmQuc2V0SWNvbihpY29uX2JkOTBkMzM5NmNiZDRmM2FhZjNmODZiZTNhZWJhOGJkKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWZjYzM2OGMyN2RhNDE0Mjk3MzdmMDc3NmNjNjdhYzMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODg4YmNlMGZhYWM3NDRhZmI2NDkyN2EzODg4ZDEzNTAgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzg4OGJjZTBmYWFjNzQ0YWZiNjQ5MjdhMzg4OGQxMzUwIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBBcmNpcHJlc3RlIE1hcmlhbm8gQXJvY2EgKFpvbmEgNSk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWZjYzM2OGMyN2RhNDE0Mjk3MzdmMDc3NmNjNjdhYzMuc2V0Q29udGVudChodG1sXzg4OGJjZTBmYWFjNzQ0YWZiNjQ5MjdhMzg4OGQxMzUwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMzk2YmJmNThhMjIzNGFjZWFjZjc5NDE0MTYwYmNkMmQuYmluZFBvcHVwKHBvcHVwX2FmY2MzNjhjMjdkYTQxNDI5NzM3ZjA3NzZjYzY3YWMzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNzYyOTg2MTEyMDAyNDc0NjhmNjRmNDAxY2ZhZDg0NWQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45NzYxNTQ2LC0xLjEyODkxOF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uX2E4Zjk1MmM1MDU5NTQwZDNhMTRjMzZlMTA3YWJlYjlkID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAnYmx1ZScsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl83NjI5ODYxMTIwMDI0NzQ2OGY2NGY0MDFjZmFkODQ1ZC5zZXRJY29uKGljb25fYThmOTUyYzUwNTk1NDBkM2ExNGMzNmUxMDdhYmViOWQpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82NDFmMmJhYzUxOTY0MWVmYTM2NGY1NTM5NWEzMDcwNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83N2RmZDE4ZTAxODI0Y2YyYjdiMjFjMWE2ZDVlMjViZiA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfNzdkZmQxOGUwMTgyNGNmMmI3YjIxYzFhNmQ1ZTI1YmYiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIFJ1aXogSGlkYWxnbyAoWm9uYSA1KTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82NDFmMmJhYzUxOTY0MWVmYTM2NGY1NTM5NWEzMDcwNy5zZXRDb250ZW50KGh0bWxfNzdkZmQxOGUwMTgyNGNmMmI3YjIxYzFhNmQ1ZTI1YmYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl83NjI5ODYxMTIwMDI0NzQ2OGY2NGY0MDFjZmFkODQ1ZC5iaW5kUG9wdXAocG9wdXBfNjQxZjJiYWM1MTk2NDFlZmEzNjRmNTUzOTVhMzA3MDcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9mNGU1ZTkzZWZlNTc0ZWUxOTdlNmU3MzE1NTZmNTNlMCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk3NzEzMDMsLTEuMTI3NjE3Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzNhYTVkY2ZlYTE2YjQ3ZDlhMTQyZDgxZDMzYjIxYTZiID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAnYmx1ZScsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl9mNGU1ZTkzZWZlNTc0ZWUxOTdlNmU3MzE1NTZmNTNlMC5zZXRJY29uKGljb25fM2FhNWRjZmVhMTZiNDdkOWExNDJkODFkMzNiMjFhNmIpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iZDM0OTA4ZTJkMmI0NTJkYjBhNmVhNjNhMDA3YzlmZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hMTEyODE0NzU2NDg0ZDdkYjRlYzQ5MDZhNzA5NTQwMiA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfYTExMjgxNDc1NjQ4NGQ3ZGI0ZWM0OTA2YTcwOTU0MDIiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIENsZW1lbnRlcyAoWm9uYSA1KTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iZDM0OTA4ZTJkMmI0NTJkYjBhNmVhNjNhMDA3YzlmZi5zZXRDb250ZW50KGh0bWxfYTExMjgxNDc1NjQ4NGQ3ZGI0ZWM0OTA2YTcwOTU0MDIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9mNGU1ZTkzZWZlNTc0ZWUxOTdlNmU3MzE1NTZmNTNlMC5iaW5kUG9wdXAocG9wdXBfYmQzNDkwOGUyZDJiNDUyZGIwYTZlYTYzYTAwN2M5ZmYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9kZjg1ODMyZDI3ZTQ0NzhjYjU0ZTlmZGZiNjgyNGQ5YiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM4LjAzNDM4NiwtMS4xMzU1Mzg0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fOTljM2E3ZjY3NzA3NDU5Y2IzNTRkZGVmN2M5YzgyN2YgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdibHVlJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyX2RmODU4MzJkMjdlNDQ3OGNiNTRlOWZkZmI2ODI0ZDliLnNldEljb24oaWNvbl85OWMzYTdmNjc3MDc0NTljYjM1NGRkZWY3YzljODI3Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhmNDRlZDkyMzIzNDQ5OTU4OGY3Njc2MTdlZTY4MzcwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE3NTQwOTlhMThhZDRmMmVhZDRhMmQzYjM5NGRlNTI5ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF8xNzU0MDk5YTE4YWQ0ZjJlYWQ0YTJkM2IzOTRkZTUyOSIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgQWxtb2hhamFyIChab25hIDUpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhmNDRlZDkyMzIzNDQ5OTU4OGY3Njc2MTdlZTY4MzcwLnNldENvbnRlbnQoaHRtbF8xNzU0MDk5YTE4YWQ0ZjJlYWQ0YTJkM2IzOTRkZTUyOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2RmODU4MzJkMjdlNDQ3OGNiNTRlOWZkZmI2ODI0ZDliLmJpbmRQb3B1cChwb3B1cF84ZjQ0ZWQ5MjMyMzQ0OTk1ODhmNzY3NjE3ZWU2ODM3MCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzI3ZTFmNWQyZTBmMDQxOTU4NzBhNTU5ZWZhMzc0MTgzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTc5NTMyNiwtMS4xMzE5MzczXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fMzI2MzE0MzIwZDVlNGI4ZDk4MWE0YWRmNmE4YjdiZDMgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdibHVlJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzI3ZTFmNWQyZTBmMDQxOTU4NzBhNTU5ZWZhMzc0MTgzLnNldEljb24oaWNvbl8zMjYzMTQzMjBkNWU0YjhkOTgxYTRhZGY2YThiN2JkMyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRiM2Y3YTFhOWM3NjQwZDBhZWM2MGI0MTEyNzg4MzAyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ExNTIyNTNkZjU4MDQ0MzhiOTk4OGFlOTI5OGIyZDY4ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9hMTUyMjUzZGY1ODA0NDM4Yjk5ODhhZTkyOThiMmQ2OCIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGVqb24gQ2FyYXZhY2EgKFpvbmEgNSk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGIzZjdhMWE5Yzc2NDBkMGFlYzYwYjQxMTI3ODgzMDIuc2V0Q29udGVudChodG1sX2ExNTIyNTNkZjU4MDQ0MzhiOTk4OGFlOTI5OGIyZDY4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMjdlMWY1ZDJlMGYwNDE5NTg3MGE1NTllZmEzNzQxODMuYmluZFBvcHVwKHBvcHVwXzRiM2Y3YTFhOWM3NjQwZDBhZWM2MGI0MTEyNzg4MzAyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNzY2YjYwODYwMjBlNGJiZjljODc0Yjk1NDYyZDJhOTEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45NzY4MDMzLC0xLjEzMzM1NjRdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl80ODE3NjYwOWU0OTk0ZGZjYjliZjc5OTdkMTI3YzAxZSA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ2JsdWUnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfNzY2YjYwODYwMjBlNGJiZjljODc0Yjk1NDYyZDJhOTEuc2V0SWNvbihpY29uXzQ4MTc2NjA5ZTQ5OTRkZmNiOWJmNzk5N2QxMjdjMDFlKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGEzMzhhNDRjNzJkNDBhZjlmNTVmNTE2NWY3MmJkMTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWIxNWU0NjkxZWRjNDQxNmI5OGQxNDFkOWNlNTRjNGEgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2FiMTVlNDY5MWVkYzQ0MTZiOThkMTQxZDljZTU0YzRhIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBDdWFydGVsIGRlIEFydGlsbGVyaWEgKFpvbmEgNSk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGEzMzhhNDRjNzJkNDBhZjlmNTVmNTE2NWY3MmJkMTkuc2V0Q29udGVudChodG1sX2FiMTVlNDY5MWVkYzQ0MTZiOThkMTQxZDljZTU0YzRhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNzY2YjYwODYwMjBlNGJiZjljODc0Yjk1NDYyZDJhOTEuYmluZFBvcHVwKHBvcHVwXzRhMzM4YTQ0YzcyZDQwYWY5ZjU1ZjUxNjVmNzJiZDE5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMGVjOTFhN2ZkNDg3NDY5M2JlZjMxZDI3N2IwN2YwNDcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45ODA5NzQ0LC0xLjEzMjg4Ml0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uX2U0NTI4ZTg4YmY5YjRhODRiNTFiNTQ1ZjVmZmY3NjJhID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAnYmx1ZScsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl8wZWM5MWE3ZmQ0ODc0NjkzYmVmMzFkMjc3YjA3ZjA0Ny5zZXRJY29uKGljb25fZTQ1MjhlODhiZjliNGE4NGI1MWI1NDVmNWZmZjc2MmEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wOTlmOTZkMDYxN2U0NmM3ODdhMjRjNTkyZWI4MDhjZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lNGZjNzViNWZjMzg0ZTE4OTdjYzUxZDRmYTg4MzY3MiA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfZTRmYzc1YjVmYzM4NGUxODk3Y2M1MWQ0ZmE4ODM2NzIiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIEp1bWlsbGEgKFpvbmEgNSk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDk5Zjk2ZDA2MTdlNDZjNzg3YTI0YzU5MmViODA4Y2Yuc2V0Q29udGVudChodG1sX2U0ZmM3NWI1ZmMzODRlMTg5N2NjNTFkNGZhODgzNjcyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMGVjOTFhN2ZkNDg3NDY5M2JlZjMxZDI3N2IwN2YwNDcuYmluZFBvcHVwKHBvcHVwXzA5OWY5NmQwNjE3ZTQ2Yzc4N2EyNGM1OTJlYjgwOGNmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZjAzMjM3NWU0NDk3NGY3NmE5ZWE5ZGNlMDNmY2VjNzEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45ODA0MDE1LC0xLjEzMDQ2OTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl9iMGI0ZTE0NDVjM2M0NDMxOTJiNGMwMTMwODFjMjY0ZSA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ2JsdWUnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfZjAzMjM3NWU0NDk3NGY3NmE5ZWE5ZGNlMDNmY2VjNzEuc2V0SWNvbihpY29uX2IwYjRlMTQ0NWMzYzQ0MzE5MmI0YzAxMzA4MWMyNjRlKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODFhNWRlOThlOThhNDM4N2E4OTI4ZWZjOTg2NDFlZjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzM5NmU3NjdjN2ViNDEwN2I0NzM5OThlMTdjYWYwZTQgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2MzOTZlNzY3YzdlYjQxMDdiNDczOTk4ZTE3Y2FmMGU0IiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBBbGFtZWRhIGRlIENvbG9uIChab25hIDUpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzgxYTVkZTk4ZTk4YTQzODdhODkyOGVmYzk4NjQxZWY1LnNldENvbnRlbnQoaHRtbF9jMzk2ZTc2N2M3ZWI0MTA3YjQ3Mzk5OGUxN2NhZjBlNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2YwMzIzNzVlNDQ5NzRmNzZhOWVhOWRjZTAzZmNlYzcxLmJpbmRQb3B1cChwb3B1cF84MWE1ZGU5OGU5OGE0Mzg3YTg5MjhlZmM5ODY0MWVmNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzVmYzY0ZDU3MmZkZTQ2ZjY4MmY5NWUxZDExOWNlNjRlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTc4NTc5NiwtMS4xMzMxNTUyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fMDJlYTFhN2E1ZjlkNGFiZmIyYWFkMDI1NDIxYTg5MWQgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdibHVlJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzVmYzY0ZDU3MmZkZTQ2ZjY4MmY5NWUxZDExOWNlNjRlLnNldEljb24oaWNvbl8wMmVhMWE3YTVmOWQ0YWJmYjJhYWQwMjU0MjFhODkxZCk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzkzOWEyOTIyMGY1MTQ3NjM5OGI0MjI2N2ZiY2RiNTQyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RiOWUyMWY1MmE1NDQ0ZTZhYjJkZGFmYjM0YjY0YmE1ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9kYjllMjFmNTJhNTQ0NGU2YWIyZGRhZmIzNGI2NGJhNSIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgQ2FydGFnZW5hIChab25hIDUpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkzOWEyOTIyMGY1MTQ3NjM5OGI0MjI2N2ZiY2RiNTQyLnNldENvbnRlbnQoaHRtbF9kYjllMjFmNTJhNTQ0NGU2YWIyZGRhZmIzNGI2NGJhNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzVmYzY0ZDU3MmZkZTQ2ZjY4MmY5NWUxZDExOWNlNjRlLmJpbmRQb3B1cChwb3B1cF85MzlhMjkyMjBmNTE0NzYzOThiNDIyNjdmYmNkYjU0Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzhlMWU1NmQ5ZWI1MDQ0Yjk4YzA1NTYxM2QyNGI0ZDI1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTgxNTE5MSwtMS4xMzA5NTE2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fZWQ2NzM4ZjY1OGY0NGVkMWE3NjBhMDdiZDU3OTNlYzUgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdibHVlJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzhlMWU1NmQ5ZWI1MDQ0Yjk4YzA1NTYxM2QyNGI0ZDI1LnNldEljb24oaWNvbl9lZDY3MzhmNjU4ZjQ0ZWQxYTc2MGEwN2JkNTc5M2VjNSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M1YmUyMTEyYmMyZTQ0MjNiYmQ5MmM3OTg5ZjQ2MWE3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYzODcyM2UyOGQ3NTQxZDhiNjNkNzhkNzZmOThhMThiID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF82Mzg3MjNlMjhkNzU0MWQ4YjYzZDc4ZDc2Zjk4YTE4YiIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgUGxhemEgQ2FtYWNob3MgKFpvbmEgNSk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzViZTIxMTJiYzJlNDQyM2JiZDkyYzc5ODlmNDYxYTcuc2V0Q29udGVudChodG1sXzYzODcyM2UyOGQ3NTQxZDhiNjNkNzhkNzZmOThhMThiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOGUxZTU2ZDllYjUwNDRiOThjMDU1NjEzZDI0YjRkMjUuYmluZFBvcHVwKHBvcHVwX2M1YmUyMTEyYmMyZTQ0MjNiYmQ5MmM3OTg5ZjQ2MWE3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZTk5ZTY2NGU5YzYyNGZkYjlmMTg2NjlkZmY2MmRkMTYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45NzgxODA1LC0xLjEyOTM5MTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl84YjE3YmJlYjExNmY0YmM1YTNmMjFjNDcwNzRkNzkzNCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ2JsdWUnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfZTk5ZTY2NGU5YzYyNGZkYjlmMTg2NjlkZmY2MmRkMTYuc2V0SWNvbihpY29uXzhiMTdiYmViMTE2ZjRiYzVhM2YyMWM0NzA3NGQ3OTM0KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTdjYjc2ODgxMmQ5NDRhZWJmYzMyNDE5ZTRiY2E2MzggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDI2NmMxYTdlMGI5NDk5M2E0ZTNmYTExY2EyZTNhNzQgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzQyNjZjMWE3ZTBiOTQ5OTNhNGUzZmExMWNhMmUzYTc0IiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBOaWNhcmFndWEgKFpvbmEgNSk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTdjYjc2ODgxMmQ5NDRhZWJmYzMyNDE5ZTRiY2E2Mzguc2V0Q29udGVudChodG1sXzQyNjZjMWE3ZTBiOTQ5OTNhNGUzZmExMWNhMmUzYTc0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZTk5ZTY2NGU5YzYyNGZkYjlmMTg2NjlkZmY2MmRkMTYuYmluZFBvcHVwKHBvcHVwX2E3Y2I3Njg4MTJkOTQ0YWViZmMzMjQxOWU0YmNhNjM4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNDZjYTM0NDgyNGQ0NDhiMThkOTVlZGNmMTA1YWY2ZTMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45NzgxMTQyLC0xLjEyODIxMjhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl82OTliMDliNTYwYjU0ODI2OWUyODcwZTg4MTc2NzEwYiA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ2JsdWUnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfNDZjYTM0NDgyNGQ0NDhiMThkOTVlZGNmMTA1YWY2ZTMuc2V0SWNvbihpY29uXzY5OWIwOWI1NjBiNTQ4MjY5ZTI4NzBlODgxNzY3MTBiKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmYzOWNmMmNjNGQ3NGRiMjg5OTUzYzU4ODM0Nzg5Y2IgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWM5ZTAzM2RkYzNlNDcwOWIzZThmOGQyNWJiYzg2M2QgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzljOWUwMzNkZGMzZTQ3MDliM2U4ZjhkMjViYmM4NjNkIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBDYXB1Y2hpbm9zIChab25hIDUpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZmMzljZjJjYzRkNzRkYjI4OTk1M2M1ODgzNDc4OWNiLnNldENvbnRlbnQoaHRtbF85YzllMDMzZGRjM2U0NzA5YjNlOGY4ZDI1YmJjODYzZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzQ2Y2EzNDQ4MjRkNDQ4YjE4ZDk1ZWRjZjEwNWFmNmUzLmJpbmRQb3B1cChwb3B1cF82ZjM5Y2YyY2M0ZDc0ZGIyODk5NTNjNTg4MzQ3ODljYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzk0NjhiMWI4NjA5MTQyYTY5ZjQ4NWUzMzEwMmVkNzcwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTc3MjQzMiwtMS4xMzM2MDgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fNmEzYWNhNWI1MzE5NGQ5MmI4YjEzYjQ0MWJiYTM3NzUgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdibHVlJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzk0NjhiMWI4NjA5MTQyYTY5ZjQ4NWUzMzEwMmVkNzcwLnNldEljb24oaWNvbl82YTNhY2E1YjUzMTk0ZDkyYjhiMTNiNDQxYmJhMzc3NSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y5YTJlMjZjMjg3YzRmNjI5N2JhNDQ2ODkyYTIyNjQ0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q1NDc1OTZkOThkYjQwZjQ4NmYxODc5MGEyNDdmYjkwID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9kNTQ3NTk2ZDk4ZGI0MGY0ODZmMTg3OTBhMjQ3ZmI5MCIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgQWN0b3IgSm9zZSBDcmVzcG8gKFpvbmEgNSk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjlhMmUyNmMyODdjNGY2Mjk3YmE0NDY4OTJhMjI2NDQuc2V0Q29udGVudChodG1sX2Q1NDc1OTZkOThkYjQwZjQ4NmYxODc5MGEyNDdmYjkwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOTQ2OGIxYjg2MDkxNDJhNjlmNDg1ZTMzMTAyZWQ3NzAuYmluZFBvcHVwKHBvcHVwX2Y5YTJlMjZjMjg3YzRmNjI5N2JhNDQ2ODkyYTIyNjQ0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZTM3MzQwMmI0OWJjNGQ5NWIyMjEwMDRjOWMzNWU5ZjMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45NzU0OTM3LC0xLjEzMzAwMzVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl8yMzEyNjViZWIzMTM0N2YyYWViMmVhYzg5MGRjYTdhMyA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ2JsdWUnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfZTM3MzQwMmI0OWJjNGQ5NWIyMjEwMDRjOWMzNWU5ZjMuc2V0SWNvbihpY29uXzIzMTI2NWJlYjMxMzQ3ZjJhZWIyZWFjODkwZGNhN2EzKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzk1YTI5NWJmMTFkNGQwN2JkYWVkN2U4MjIyNjA4ZGQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzBkODE5YmI4MzUwNGJkZGJmODZlODA4MmU5OTUzYzcgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzcwZDgxOWJiODM1MDRiZGRiZjg2ZTgwODJlOTk1M2M3IiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBBdmVuaWRhIEp1YW4gQW50b25pbyBQZXJlYSAoWm9uYSA1KTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zOTVhMjk1YmYxMWQ0ZDA3YmRhZWQ3ZTgyMjI2MDhkZC5zZXRDb250ZW50KGh0bWxfNzBkODE5YmI4MzUwNGJkZGJmODZlODA4MmU5OTUzYzcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9lMzczNDAyYjQ5YmM0ZDk1YjIyMTAwNGM5YzM1ZTlmMy5iaW5kUG9wdXAocG9wdXBfMzk1YTI5NWJmMTFkNGQwN2JkYWVkN2U4MjIyNjA4ZGQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8yODVmNjMzNTZlNDQ0Mzc2YjhiMDc1OTA4NjA5OTJjNCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4MDQ1MSwtMS4xMzI0MzU3XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fNmE0NTRmOTBlZmY3NDFmODgyMzQ0YjkwOWM0NzEzMjEgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdibHVlJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzI4NWY2MzM1NmU0NDQzNzZiOGIwNzU5MDg2MDk5MmM0LnNldEljb24oaWNvbl82YTQ1NGY5MGVmZjc0MWY4ODIzNDRiOTA5YzQ3MTMyMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM1MjQ4Y2NhYTQ3ZjQ0NThhOGI3YWQ2YjJjNGY1MDE2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E2NzhjNTlmNjE0ZTQ4ZGE5MDdlNTJhMWQwZGViZjdmID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9hNjc4YzU5ZjYxNGU0OGRhOTA3ZTUyYTFkMGRlYmY3ZiIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgUm9zYWwgKFpvbmEgNSk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzUyNDhjY2FhNDdmNDQ1OGE4YjdhZDZiMmM0ZjUwMTYuc2V0Q29udGVudChodG1sX2E2NzhjNTlmNjE0ZTQ4ZGE5MDdlNTJhMWQwZGViZjdmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMjg1ZjYzMzU2ZTQ0NDM3NmI4YjA3NTkwODYwOTkyYzQuYmluZFBvcHVwKHBvcHVwXzM1MjQ4Y2NhYTQ3ZjQ0NThhOGI3YWQ2YjJjNGY1MDE2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMzIzYzk3ZjM5Y2M1NDc5M2JmYTZlZmRkNGFmNDM3MDggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45Nzk3NjYzLC0xLjEzMjQ4NzZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl84ZmM3NzA3ZWY2MTI0ZTUzOWQ5ZDkwNjI2ZjEzZDlmZiA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ2JsdWUnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfMzIzYzk3ZjM5Y2M1NDc5M2JmYTZlZmRkNGFmNDM3MDguc2V0SWNvbihpY29uXzhmYzc3MDdlZjYxMjRlNTM5ZDlkOTA2MjZmMTNkOWZmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTc0OGEyYWU5YzlhNGQ0NmI4YWQ0NjYzZDdmMDM4MDkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmYwNjIyZmU4Y2IxNDczMDk1NWEwYmE5MjA4YTYyM2IgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2ZmMDYyMmZlOGNiMTQ3MzA5NTVhMGJhOTIwOGE2MjNiIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBNYWRyZSBFbGlzZWEgT2xpdmVyIE1vbGluYSAoWm9uYSA1KTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NzQ4YTJhZTljOWE0ZDQ2YjhhZDQ2NjNkN2YwMzgwOS5zZXRDb250ZW50KGh0bWxfZmYwNjIyZmU4Y2IxNDczMDk1NWEwYmE5MjA4YTYyM2IpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8zMjNjOTdmMzljYzU0NzkzYmZhNmVmZGQ0YWY0MzcwOC5iaW5kUG9wdXAocG9wdXBfOTc0OGEyYWU5YzlhNGQ0NmI4YWQ0NjYzZDdmMDM4MDkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9kYjU4YTc4NDAzZDU0MDIxOTZkNDc4MWU5ZDJlMzMzZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk2NDk5NzgsLTEuMTY3OTExNV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uX2Y1NzhiMWFmNDJjOTQzODA5YjM0MGI3MWEyMjliZDM0ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAnYmx1ZScsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl9kYjU4YTc4NDAzZDU0MDIxOTZkNDc4MWU5ZDJlMzMzZC5zZXRJY29uKGljb25fZjU3OGIxYWY0MmM5NDM4MDliMzQwYjcxYTIyOWJkMzQpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kMTliY2IzODBlMTA0YThkYmQ3NTQzMTMxNjI3NzU4OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lYmExNGRiYmJjZjg0Y2U0YWIxODg4YTliZjg3MDM2NCA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfZWJhMTRkYmJiY2Y4NGNlNGFiMTg4OGE5YmY4NzAzNjQiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIENhcm1lbiAoWm9uYSA1KTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kMTliY2IzODBlMTA0YThkYmQ3NTQzMTMxNjI3NzU4OC5zZXRDb250ZW50KGh0bWxfZWJhMTRkYmJiY2Y4NGNlNGFiMTg4OGE5YmY4NzAzNjQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kYjU4YTc4NDAzZDU0MDIxOTZkNDc4MWU5ZDJlMzMzZC5iaW5kUG9wdXAocG9wdXBfZDE5YmNiMzgwZTEwNGE4ZGJkNzU0MzEzMTYyNzc1ODgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIG11bHRpX3BvbHlfbGluZV9iMDA1NDk1MjkzMGU0OGRkOWYwYmFmMTEyODkwNzYyYiA9IEwubXVsdGlQb2x5bGluZSgKICAgICAgICAgICAgICAgICAgICBbW1szNy45ODM2MDMzLCAtMS4xNzczNzM0XSwgWzM3Ljk2NDk5NzgsIC0xLjE2NzkxMTVdXSwgW1szNy45NjQ5OTc4LCAtMS4xNjc5MTE1XSwgWzM3LjYxOTYzNzQsIC0wLjg4MzQ2MTJdXSwgW1szNy42MTk2Mzc0LCAtMC44ODM0NjEyXSwgWzM4LjAzNDM4NiwgLTEuMTM1NTM4NF1dLCBbWzM4LjAzNDM4NiwgLTEuMTM1NTM4NF0sIFszNy45ODM2MDMzLCAtMS4xNzczNzM0XV1dLAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdibHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiA1LAogICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zi5hZGRMYXllcihtdWx0aV9wb2x5X2xpbmVfYjAwNTQ5NTI5MzBlNDhkZDlmMGJhZjExMjg5MDc2MmIpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85MGE3Njc5ZjUwZTE0NjdkYjc3ZWI4ZjZlNzc2MTU0MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83ODQxYTUxYjQ4MjQ0Mjk1OWUyMTRkNTM0YTQxZGFhYSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfNzg0MWE1MWI0ODI0NDI5NTllMjE0ZDUzNGE0MWRhYWEiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIFpvbmEgNTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85MGE3Njc5ZjUwZTE0NjdkYjc3ZWI4ZjZlNzc2MTU0MC5zZXRDb250ZW50KGh0bWxfNzg0MWE1MWI0ODI0NDI5NTllMjE0ZDUzNGE0MWRhYWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG11bHRpX3BvbHlfbGluZV9iMDA1NDk1MjkzMGU0OGRkOWYwYmFmMTEyODkwNzYyYi5iaW5kUG9wdXAocG9wdXBfOTBhNzY3OWY1MGUxNDY3ZGI3N2ViOGY2ZTc3NjE1NDApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8yNDUyNzEzOTNiZDM0ZjQ4OWM0ZWEyYTQ4OTJhNDQ0YiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4NzY5ODcsLTEuMTQxMjkxOV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uX2ZhY2UyMDliMzNmYjRhMTU5MDc5MmIyNzAwMzg2MTdhID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAnZ3JlZW4nLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfMjQ1MjcxMzkzYmQzNGY0ODljNGVhMmE0ODkyYTQ0NGIuc2V0SWNvbihpY29uX2ZhY2UyMDliMzNmYjRhMTU5MDc5MmIyNzAwMzg2MTdhKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTYwZjY5MzA5ODI4NDBmYzlkN2M5ZWZkMTg5MDUyYzkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTNkZGI5ODkxMzFiNDRlYWJmYjc1ZmI3NjcyZTkwZGQgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2EzZGRiOTg5MTMxYjQ0ZWFiZmI3NWZiNzY3MmU5MGRkIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBkZSBsYSBPbG1hIChab25hIDQpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk2MGY2OTMwOTgyODQwZmM5ZDdjOWVmZDE4OTA1MmM5LnNldENvbnRlbnQoaHRtbF9hM2RkYjk4OTEzMWI0NGVhYmZiNzVmYjc2NzJlOTBkZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzI0NTI3MTM5M2JkMzRmNDg5YzRlYTJhNDg5MmE0NDRiLmJpbmRQb3B1cChwb3B1cF85NjBmNjkzMDk4Mjg0MGZjOWQ3YzllZmQxODkwNTJjOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2RlNzkxOGIwZGRlMTQ4YjI4OTkzOGE0MGJhN2NhOGI2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTg1MTA0OCwtMS4xMzkzMjQ4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fMWRmNzVmNDkxN2M0NGMzYTk4YjJlOWMxOTQwY2M2M2UgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdncmVlbicsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl9kZTc5MThiMGRkZTE0OGIyODk5MzhhNDBiYTdjYThiNi5zZXRJY29uKGljb25fMWRmNzVmNDkxN2M0NGMzYTk4YjJlOWMxOTQwY2M2M2UpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xN2NhYWVkODlmNDY0YjM2OTI1ZTZhYTk5MzA4ZTA0OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hNzk3NjNiZjYxMmM0OGI3OWZlMjUxYWM1ZGFkMDZlOSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfYTc5NzYzYmY2MTJjNDhiNzlmZTI1MWFjNWRhZDA2ZTkiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIGRlIGxvcyBCb2xvcyAoWm9uYSA0KTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xN2NhYWVkODlmNDY0YjM2OTI1ZTZhYTk5MzA4ZTA0OC5zZXRDb250ZW50KGh0bWxfYTc5NzYzYmY2MTJjNDhiNzlmZTI1MWFjNWRhZDA2ZTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kZTc5MThiMGRkZTE0OGIyODk5MzhhNDBiYTdjYThiNi5iaW5kUG9wdXAocG9wdXBfMTdjYWFlZDg5ZjQ2NGIzNjkyNWU2YWE5OTMwOGUwNDgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl85NWQ5MTBlMDJjYmU0NDU1YWJlNjM0ZGM5NmZjNWY1ZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4NTAxNjIsLTEuMTM2MTQ4N10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uX2I3Njg2OGQ3NDE0YjQzZmJiYTNmZDY2NmEwNzdlNThhID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAnZ3JlZW4nLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfOTVkOTEwZTAyY2JlNDQ1NWFiZTYzNGRjOTZmYzVmNWYuc2V0SWNvbihpY29uX2I3Njg2OGQ3NDE0YjQzZmJiYTNmZDY2NmEwNzdlNThhKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDk1OGUxY2M3MzFkNDgxZDg5MmYyYjNmY2Y2NWVkYTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWVhZjM0NjVjY2M3NDNiMWI0YjEyOTBlZmI1N2Y1N2EgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2FlYWYzNDY1Y2NjNzQzYjFiNGIxMjkwZWZiNTdmNTdhIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBjYWxsZSBTYWdhc3RhIChab25hIDQpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ5NThlMWNjNzMxZDQ4MWQ4OTJmMmIzZmNmNjVlZGE0LnNldENvbnRlbnQoaHRtbF9hZWFmMzQ2NWNjYzc0M2IxYjRiMTI5MGVmYjU3ZjU3YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzk1ZDkxMGUwMmNiZTQ0NTVhYmU2MzRkYzk2ZmM1ZjVmLmJpbmRQb3B1cChwb3B1cF80OTU4ZTFjYzczMWQ0ODFkODkyZjJiM2ZjZjY1ZWRhNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzMzOTNmMmQxMDJmZTRiMzhiMDRmZGQ0OGEzYzdmYjc3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTg2NzcxOCwtMS4xMzkzMjRdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl9mODc3ZjE1NDhhZWI0ZTZhYTRmY2VjZmY3YWZhOWFhYiA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ2dyZWVuJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzMzOTNmMmQxMDJmZTRiMzhiMDRmZGQ0OGEzYzdmYjc3LnNldEljb24oaWNvbl9mODc3ZjE1NDhhZWI0ZTZhYTRmY2VjZmY3YWZhOWFhYik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JkNWEyOTBkMWFkMzQ4NGQ4NjdmY2FmNDQ0MjUwNWFkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIwMGI3NjM0MTZkYjRkMTA5MzkzM2ZhMzc3MGJjOWNmID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF8yMDBiNzYzNDE2ZGI0ZDEwOTM5MzNmYTM3NzBiYzljZiIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgZGVsIERvY3RvciBKZXN1cyBRdWVzYWRhIFNhbnogKFpvbmEgNCk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmQ1YTI5MGQxYWQzNDg0ZDg2N2ZjYWY0NDQyNTA1YWQuc2V0Q29udGVudChodG1sXzIwMGI3NjM0MTZkYjRkMTA5MzkzM2ZhMzc3MGJjOWNmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMzM5M2YyZDEwMmZlNGIzOGIwNGZkZDQ4YTNjN2ZiNzcuYmluZFBvcHVwKHBvcHVwX2JkNWEyOTBkMWFkMzQ4NGQ4NjdmY2FmNDQ0MjUwNWFkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNjZhMDU4ZGZlNmZkNGQxNTgxZGZmN2IyZTIxZWFhMjggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45Mzk0OTQzLC0xLjE1ODk4Ml0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uX2VkYTIxMDFhM2Y1MTQwZDNhMTYwNjZiZmNhZDNlZjcwID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAnZ3JlZW4nLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfNjZhMDU4ZGZlNmZkNGQxNTgxZGZmN2IyZTIxZWFhMjguc2V0SWNvbihpY29uX2VkYTIxMDFhM2Y1MTQwZDNhMTYwNjZiZmNhZDNlZjcwKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODk0OGFjZTdmOTExNGY1NWI0OWY5NTQwMTQ4ODMwNjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjA0MGY5MGFlMDZkNGNhYjk4NWM2YzYwYTJkYWNlYmUgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2YwNDBmOTBhZTA2ZDRjYWI5ODVjNmM2MGEyZGFjZWJlIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBOYXZhcnJhIChab25hIDQpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg5NDhhY2U3ZjkxMTRmNTViNDlmOTU0MDE0ODgzMDYxLnNldENvbnRlbnQoaHRtbF9mMDQwZjkwYWUwNmQ0Y2FiOTg1YzZjNjBhMmRhY2ViZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzY2YTA1OGRmZTZmZDRkMTU4MWRmZjdiMmUyMWVhYTI4LmJpbmRQb3B1cChwb3B1cF84OTQ4YWNlN2Y5MTE0ZjU1YjQ5Zjk1NDAxNDg4MzA2MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzg2YzRhY2ViM2ZlYTQ2NGU5ODdjMTk0ZmIwNjAxZGY4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTgyNzU4NiwtMS4xMzgyNzAzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fNGViMjY5N2E0YWQ3NDg5Nzk2ZWFmN2MyM2E1YzY5MjcgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdncmVlbicsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl84NmM0YWNlYjNmZWE0NjRlOTg3YzE5NGZiMDYwMWRmOC5zZXRJY29uKGljb25fNGViMjY5N2E0YWQ3NDg5Nzk2ZWFmN2MyM2E1YzY5MjcpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yZTFkNTM3ZmU5OGM0YjllYjRhNGIwMjMyN2I3ODA1NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zMTJkYThmMGMxZTg0YTZkYjY0ZTEwMDAzYjgzNDcwZCA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfMzEyZGE4ZjBjMWU4NGE2ZGI2NGUxMDAwM2I4MzQ3MGQiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIFBpbnRvciBTb2JlamFubyAoWm9uYSA0KTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZTFkNTM3ZmU5OGM0YjllYjRhNGIwMjMyN2I3ODA1Ni5zZXRDb250ZW50KGh0bWxfMzEyZGE4ZjBjMWU4NGE2ZGI2NGUxMDAwM2I4MzQ3MGQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84NmM0YWNlYjNmZWE0NjRlOTg3YzE5NGZiMDYwMWRmOC5iaW5kUG9wdXAocG9wdXBfMmUxZDUzN2ZlOThjNGI5ZWI0YTRiMDIzMjdiNzgwNTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl83OTUzNjY2ZmQ3ODE0OTAwODc5YjM1NDIwODRlMGFjMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjgzMTU3NTMsLTEuMTUzMzQ4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzlmNzA0ZjgxOWU1YjQ5MjA4NzFhZTFmZjE5ZTM4MDNmID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAnZ3JlZW4nLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfNzk1MzY2NmZkNzgxNDkwMDg3OWIzNTQyMDg0ZTBhYzEuc2V0SWNvbihpY29uXzlmNzA0ZjgxOWU1YjQ5MjA4NzFhZTFmZjE5ZTM4MDNmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmRjNDYzNDdkZDUzNGU2ZDg3YjBmZjk5NzI2MmQ3NjggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDliYjc4NzQ5MjQxNDE0OTg2OGVhODFhNzBkMjIzMWQgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzA5YmI3ODc0OTI0MTQxNDk4NjhlYTgxYTcwZDIyMzFkIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBkZWwgRXNjdWx0b3IgSm9zZSBTYW5jaGV6IExvemFubyAoWm9uYSA0KTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iZGM0NjM0N2RkNTM0ZTZkODdiMGZmOTk3MjYyZDc2OC5zZXRDb250ZW50KGh0bWxfMDliYjc4NzQ5MjQxNDE0OTg2OGVhODFhNzBkMjIzMWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl83OTUzNjY2ZmQ3ODE0OTAwODc5YjM1NDIwODRlMGFjMS5iaW5kUG9wdXAocG9wdXBfYmRjNDYzNDdkZDUzNGU2ZDg3YjBmZjk5NzI2MmQ3NjgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl82OWI0MzBhYTI2Y2M0ZmNlOTA3MGY4YmJlZWU0M2ZhZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM4LjA0MDQ0ODksLTEuMTAyMzMwOF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uX2RmYWY0N2RmZDdiMTRmZjJhODYyZGRlMWZhNmZmOThjID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAnZ3JlZW4nLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfNjliNDMwYWEyNmNjNGZjZTkwNzBmOGJiZWVlNDNmYWQuc2V0SWNvbihpY29uX2RmYWY0N2RmZDdiMTRmZjJhODYyZGRlMWZhNmZmOThjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjQzYTkyMjRjNmE3NDY4NDk5M2U3N2VjNmJlODlkNmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjZiMGJkMDlmYjk4NGIwYzgzYTZmNjNjYTY5ZDg1MmEgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2I2YjBiZDA5ZmI5ODRiMGM4M2E2ZjYzY2E2OWQ4NTJhIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBkZSBTaWVycmEgTmV2YWRhIChab25hIDQpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y0M2E5MjI0YzZhNzQ2ODQ5OTNlNzdlYzZiZTg5ZDZkLnNldENvbnRlbnQoaHRtbF9iNmIwYmQwOWZiOTg0YjBjODNhNmY2M2NhNjlkODUyYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzY5YjQzMGFhMjZjYzRmY2U5MDcwZjhiYmVlZTQzZmFkLmJpbmRQb3B1cChwb3B1cF9mNDNhOTIyNGM2YTc0Njg0OTkzZTc3ZWM2YmU4OWQ2ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzkyZDVmNmNlZDA4YjQxZjNhMGM4OWFhMjhiN2I4MjFmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTg3NTgwNiwtMS4xNDQ5MzU2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fMTEzZDgxMTQ5NmE4NDQyYmJkZWIyY2FiOTEzNjkwYTEgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdncmVlbicsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl85MmQ1ZjZjZWQwOGI0MWYzYTBjODlhYTI4YjdiODIxZi5zZXRJY29uKGljb25fMTEzZDgxMTQ5NmE4NDQyYmJkZWIyY2FiOTEzNjkwYTEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNjU4ZmU2MDg0NmE0ZmM3ODgxMmQ0NzdiNDMyYmJkYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iZTFjMTRjMjkwOTA0OGFkOGEyNDUzNzViZmViOWVjNCA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfYmUxYzE0YzI5MDkwNDhhZDhhMjQ1Mzc1YmZlYjllYzQiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbWlubyBkZSBFbm1lZGlvIChab25hIDQpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA2NThmZTYwODQ2YTRmYzc4ODEyZDQ3N2I0MzJiYmRhLnNldENvbnRlbnQoaHRtbF9iZTFjMTRjMjkwOTA0OGFkOGEyNDUzNzViZmViOWVjNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzkyZDVmNmNlZDA4YjQxZjNhMGM4OWFhMjhiN2I4MjFmLmJpbmRQb3B1cChwb3B1cF8wNjU4ZmU2MDg0NmE0ZmM3ODgxMmQ0NzdiNDMyYmJkYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2Y4OGNhYWU3ZWQ0YTQxMmViNjY5ZmMzN2UwOTFkNWZhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTg5NDkwOSwtMS4xNDIzNjM4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fYzM0ZDQ3MzQyYmVjNGFiMGI1ZGY5N2I0Nzc1M2VjOTcgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdncmVlbicsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl9mODhjYWFlN2VkNGE0MTJlYjY2OWZjMzdlMDkxZDVmYS5zZXRJY29uKGljb25fYzM0ZDQ3MzQyYmVjNGFiMGI1ZGY5N2I0Nzc1M2VjOTcpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hZTVhZWQyZjE0YTI0N2MzYTZlNWFjZTQzNjdmZGYyYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mNzgwMmQ1Y2M0MDE0ZDYxOWViYjQ2MmY5ZmUzMWJmYiA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfZjc4MDJkNWNjNDAxNGQ2MTllYmI0NjJmOWZlMzFiZmIiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIGRlIGxhcyBOb3JpYXMgKFpvbmEgNCk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWU1YWVkMmYxNGEyNDdjM2E2ZTVhY2U0MzY3ZmRmMmIuc2V0Q29udGVudChodG1sX2Y3ODAyZDVjYzQwMTRkNjE5ZWJiNDYyZjlmZTMxYmZiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZjg4Y2FhZTdlZDRhNDEyZWI2NjlmYzM3ZTA5MWQ1ZmEuYmluZFBvcHVwKHBvcHVwX2FlNWFlZDJmMTRhMjQ3YzNhNmU1YWNlNDM2N2ZkZjJiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYjIwYmVmNjc5ZGViNGJkNWIyY2M3MmRiZmFlY2Y3MDggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45ODk0OTA5LC0xLjE0MjM2MzhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl85Y2VhZjllOTc3NzI0MjJkYjU0ZmRlZmJhOTBkNzQ1ZCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ2dyZWVuJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyX2IyMGJlZjY3OWRlYjRiZDViMmNjNzJkYmZhZWNmNzA4LnNldEljb24oaWNvbl85Y2VhZjllOTc3NzI0MjJkYjU0ZmRlZmJhOTBkNzQ1ZCk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE3M2I1MDdmZGZkMTQ5ZmNiYjUyMjg3MjU2ZmQ3NDc4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2IwYjA5YzIzZjhiNjQ3Njc4NDFjN2ZmYjU2OGJkMzM2ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9iMGIwOWMyM2Y4YjY0NzY3ODQxYzdmZmI1NjhiZDMzNiIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgT2xvZiBQYWxtZSAoWm9uYSA0KTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xNzNiNTA3ZmRmZDE0OWZjYmI1MjI4NzI1NmZkNzQ3OC5zZXRDb250ZW50KGh0bWxfYjBiMDljMjNmOGI2NDc2Nzg0MWM3ZmZiNTY4YmQzMzYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9iMjBiZWY2NzlkZWI0YmQ1YjJjYzcyZGJmYWVjZjcwOC5iaW5kUG9wdXAocG9wdXBfMTczYjUwN2ZkZmQxNDlmY2JiNTIyODcyNTZmZDc0NzgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl82NzdmOTQ2MzljZjU0ZTFkOTZlMzI4N2Q4NTBlMzcyYyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4Mzg0MTIsLTEuMTMzNDQ2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fYTA0YmI3YjViMWNlNDM5ZWIwNzkxY2Y4NmU1NzY5YTUgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdncmVlbicsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl82NzdmOTQ2MzljZjU0ZTFkOTZlMzI4N2Q4NTBlMzcyYy5zZXRJY29uKGljb25fYTA0YmI3YjViMWNlNDM5ZWIwNzkxY2Y4NmU1NzY5YTUpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lNDNlNjgwZjEwOTk0NDFiYTEwMmVlMjA2ZWIyNmRlZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85MDMxNTNmYTE2NjA0Y2FmYmVhNzdkYTJlMDBkZTQ5OSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfOTAzMTUzZmExNjYwNGNhZmJlYTc3ZGEyZTAwZGU0OTkiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIEFyY28gVmVyb25pY2FzIChab25hIDQpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U0M2U2ODBmMTA5OTQ0MWJhMTAyZWUyMDZlYjI2ZGVmLnNldENvbnRlbnQoaHRtbF85MDMxNTNmYTE2NjA0Y2FmYmVhNzdkYTJlMDBkZTQ5OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzY3N2Y5NDYzOWNmNTRlMWQ5NmUzMjg3ZDg1MGUzNzJjLmJpbmRQb3B1cChwb3B1cF9lNDNlNjgwZjEwOTk0NDFiYTEwMmVlMjA2ZWIyNmRlZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzYzNTY1OWQ2NTdjNjRhZjQ4MTYxNzFhNGM2MzIzYWViID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTg5NjYyOSwtMS4xMzczMjY3XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fNWRiMjBjMmYyZmU0NDlkZmFkYzg4NzI3ODY3MjEyMzkgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdncmVlbicsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl82MzU2NTlkNjU3YzY0YWY0ODE2MTcxYTRjNjMyM2FlYi5zZXRJY29uKGljb25fNWRiMjBjMmYyZmU0NDlkZmFkYzg4NzI3ODY3MjEyMzkpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82NTM2NmMxYjMyOTI0ZjhiYTgxYWViMDVmOThlNWY3OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84YWEzYWFhNDhhYTM0ZmNiODRlOWJhNjk1NGMxZjFhOCA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfOGFhM2FhYTQ4YWEzNGZjYjg0ZTliYTY5NTRjMWYxYTgiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIEZyYW5jaXNjbyBSYWJhbCAoWm9uYSA0KTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82NTM2NmMxYjMyOTI0ZjhiYTgxYWViMDVmOThlNWY3OC5zZXRDb250ZW50KGh0bWxfOGFhM2FhYTQ4YWEzNGZjYjg0ZTliYTY5NTRjMWYxYTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82MzU2NTlkNjU3YzY0YWY0ODE2MTcxYTRjNjMyM2FlYi5iaW5kUG9wdXAocG9wdXBfNjUzNjZjMWIzMjkyNGY4YmE4MWFlYjA1Zjk4ZTVmNzgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9kYmMxMjkwOTZkNzU0ZTBiYTY2NDVhODE5NGU0MTMxMiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4NDI2NzUsLTEuMTMxNjI4NF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uX2Q0MGE4Yzk5YzQ0ZTQ0ZDdiYzk3ZGVmNDU5OWYzNzU3ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAnZ3JlZW4nLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfZGJjMTI5MDk2ZDc1NGUwYmE2NjQ1YTgxOTRlNDEzMTIuc2V0SWNvbihpY29uX2Q0MGE4Yzk5YzQ0ZTQ0ZDdiYzk3ZGVmNDU5OWYzNzU3KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWRjYWU5MDVkNzhmNDdhMzhkZmI3NTIzNjRkMjg0N2YgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTRmYzdkMWY4YWZkNDQ1Yzk4ZjExNTQ0ZWY5MDA0ZTYgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzk0ZmM3ZDFmOGFmZDQ0NWM5OGYxMTU0NGVmOTAwNGU2IiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBNYWRyZSBkZSBEaW9zIChab25hIDQpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzVkY2FlOTA1ZDc4ZjQ3YTM4ZGZiNzUyMzY0ZDI4NDdmLnNldENvbnRlbnQoaHRtbF85NGZjN2QxZjhhZmQ0NDVjOThmMTE1NDRlZjkwMDRlNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2RiYzEyOTA5NmQ3NTRlMGJhNjY0NWE4MTk0ZTQxMzEyLmJpbmRQb3B1cChwb3B1cF81ZGNhZTkwNWQ3OGY0N2EzOGRmYjc1MjM2NGQyODQ3Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzc3YWY2YmZmOTE1MTRhMWNhMGM2YTgyZWZmZjIyZDc4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTg1OTIzNiwtMS4xMzgzMzY4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fNjNhZDU1ZjNiYWIzNGY0YzkzYmQwYzM3NjhhMmFhZTEgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdncmVlbicsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl83N2FmNmJmZjkxNTE0YTFjYTBjNmE4MmVmZmYyMmQ3OC5zZXRJY29uKGljb25fNjNhZDU1ZjNiYWIzNGY0YzkzYmQwYzM3NjhhMmFhZTEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kZjc2ZWQxNmRkYzg0M2VkYjUzODE1ZTU2N2RhMzU2NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xMzY4ODU3M2RkOTc0NGQ3YjBmYTFkMWU3ZWU0YTE0NiA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfMTM2ODg1NzNkZDk3NDRkN2IwZmExZDFlN2VlNGExNDYiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIE51ZXZhcyBUZWNub2xvZ2lhcyAoWm9uYSA0KTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kZjc2ZWQxNmRkYzg0M2VkYjUzODE1ZTU2N2RhMzU2Ny5zZXRDb250ZW50KGh0bWxfMTM2ODg1NzNkZDk3NDRkN2IwZmExZDFlN2VlNGExNDYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl83N2FmNmJmZjkxNTE0YTFjYTBjNmE4MmVmZmYyMmQ3OC5iaW5kUG9wdXAocG9wdXBfZGY3NmVkMTZkZGM4NDNlZGI1MzgxNWU1NjdkYTM1NjcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9kMzM5YzM5N2EyMmQ0NzhiOTViYTA0ZTZkYmFlMTMzNiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4NzE5MjYsLTEuMTM5Mzk2MV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzI2YjFhOTFiZWVkNTRiZTA4NzVlODIxMTNhZDIxNDNkID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAnZ3JlZW4nLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfZDMzOWMzOTdhMjJkNDc4Yjk1YmEwNGU2ZGJhZTEzMzYuc2V0SWNvbihpY29uXzI2YjFhOTFiZWVkNTRiZTA4NzVlODIxMTNhZDIxNDNkKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDNiMzAxN2VmN2VjNDM3ZGJhMTc3OGI0YWUyMmFkOWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTUzM2EzYzE5NzZlNGQzYTgxN2FjYmQ1OTJmODE5OTUgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzU1MzNhM2MxOTc2ZTRkM2E4MTdhY2JkNTkyZjgxOTk1IiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBTaWVycmEgZGUgR3JlZG9zIChab25hIDQpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAzYjMwMTdlZjdlYzQzN2RiYTE3NzhiNGFlMjJhZDlkLnNldENvbnRlbnQoaHRtbF81NTMzYTNjMTk3NmU0ZDNhODE3YWNiZDU5MmY4MTk5NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2QzMzljMzk3YTIyZDQ3OGI5NWJhMDRlNmRiYWUxMzM2LmJpbmRQb3B1cChwb3B1cF8wM2IzMDE3ZWY3ZWM0MzdkYmExNzc4YjRhZTIyYWQ5ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2JmZTlmM2MwOTgzMjRmMWFhYTA5NzYwZjk5Mzc5Mzc0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTg4MTg4OSwtMS4xMzk2NTddLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl82NGZlZTQxM2VmZTA0ZWNkODI4NTRmZjc1OGUyOGI3NCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ2dyZWVuJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyX2JmZTlmM2MwOTgzMjRmMWFhYTA5NzYwZjk5Mzc5Mzc0LnNldEljb24oaWNvbl82NGZlZTQxM2VmZTA0ZWNkODI4NTRmZjc1OGUyOGI3NCk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U5YjY4ZDI3MzI4NDRmMjQ4Y2MxYzRmMTM3OTY4MmQyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM2NmZlZGRmMWY1MTQ0NjY4NjgzOTA0NDkyNGY2MmQ2ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF8zNjZmZWRkZjFmNTE0NDY2ODY4MzkwNDQ5MjRmNjJkNiIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgU2llcnJhIENhcmJvbmVyYSAoWm9uYSA0KTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lOWI2OGQyNzMyODQ0ZjI0OGNjMWM0ZjEzNzk2ODJkMi5zZXRDb250ZW50KGh0bWxfMzY2ZmVkZGYxZjUxNDQ2Njg2ODM5MDQ0OTI0ZjYyZDYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9iZmU5ZjNjMDk4MzI0ZjFhYWEwOTc2MGY5OTM3OTM3NC5iaW5kUG9wdXAocG9wdXBfZTliNjhkMjczMjg0NGYyNDhjYzFjNGYxMzc5NjgyZDIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl83NDAyNDQyYTYwNDQ0MDFjYmQ1MTZkNWFjZDkzYmU0NCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4NjQ0MjQsLTEuMTM3NjgxMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzgxZWEwMGFmYzYyMDQ1MThiZjk3Njk3MmU1YjM0NzliID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAnZ3JlZW4nLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfNzQwMjQ0MmE2MDQ0NDAxY2JkNTE2ZDVhY2Q5M2JlNDQuc2V0SWNvbihpY29uXzgxZWEwMGFmYzYyMDQ1MThiZjk3Njk3MmU1YjM0NzliKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmViMmZiYzhhYjU1NDIxNzk5MWFkNGJkMzViOWU0ZGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDNmZjhlZDdiMGIzNDAxZGE5MTI2NzJiZjlkMGY1ZmQgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzAzZmY4ZWQ3YjBiMzQwMWRhOTEyNjcyYmY5ZDBmNWZkIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBBcnJpeGFjYSAoWm9uYSA0KTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZWIyZmJjOGFiNTU0MjE3OTkxYWQ0YmQzNWI5ZTRkYS5zZXRDb250ZW50KGh0bWxfMDNmZjhlZDdiMGIzNDAxZGE5MTI2NzJiZjlkMGY1ZmQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl83NDAyNDQyYTYwNDQ0MDFjYmQ1MTZkNWFjZDkzYmU0NC5iaW5kUG9wdXAocG9wdXBfMmViMmZiYzhhYjU1NDIxNzk5MWFkNGJkMzViOWU0ZGEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8wOTI0YTMwMDE3OGM0NGFhOTYzYThjMmFiYmIwOWFhYiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4Mzg1MDYsLTEuMTMyNTUzM10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzcxNzRkODA1YmE1MDQ1ODdiNjU2YWI0MDQzYjBhYTI2ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAnZ3JlZW4nLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfMDkyNGEzMDAxNzhjNDRhYTk2M2E4YzJhYmJiMDlhYWIuc2V0SWNvbihpY29uXzcxNzRkODA1YmE1MDQ1ODdiNjU2YWI0MDQzYjBhYTI2KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDkyNTQzZGRiNzEzNDQ5NWI2YmIzMDNjOTNlODNjYTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDk3MWY1ZTAzZDFjNDNlMjg1Y2MyNzhkZDhiZThhZTMgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2Q5NzFmNWUwM2QxYzQzZTI4NWNjMjc4ZGQ4YmU4YWUzIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBQYXNjdWFsIChab25hIDQpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA5MjU0M2RkYjcxMzQ0OTViNmJiMzAzYzkzZTgzY2E1LnNldENvbnRlbnQoaHRtbF9kOTcxZjVlMDNkMWM0M2UyODVjYzI3OGRkOGJlOGFlMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzA5MjRhMzAwMTc4YzQ0YWE5NjNhOGMyYWJiYjA5YWFiLmJpbmRQb3B1cChwb3B1cF8wOTI1NDNkZGI3MTM0NDk1YjZiYjMwM2M5M2U4M2NhNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzlkYzU4M2RhNWVhODRmZGQ4YzU1ODFhYzdkZjhkYzkzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTM4NzQxOSwtMS4xNjYzOTY2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fOTU2Zjk3YzQ0Y2IwNDUyY2E0NzAyYmJmNTNmZTBhZjcgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdncmVlbicsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl85ZGM1ODNkYTVlYTg0ZmRkOGM1NTgxYWM3ZGY4ZGM5My5zZXRJY29uKGljb25fOTU2Zjk3YzQ0Y2IwNDUyY2E0NzAyYmJmNTNmZTBhZjcpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hOGVkZmE1YjA1NjY0M2VlYjNhYmYzNmE3ZjVkMDFjMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xYmY0NDQxMTY3YWY0ODk3YWY3ZGViOTcwOTBmNGMwZiA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfMWJmNDQ0MTE2N2FmNDg5N2FmN2RlYjk3MDkwZjRjMGYiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIEphcmEgQ2FycmlsbG8gKFpvbmEgNCk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYThlZGZhNWIwNTY2NDNlZWIzYWJmMzZhN2Y1ZDAxYzMuc2V0Q29udGVudChodG1sXzFiZjQ0NDExNjdhZjQ4OTdhZjdkZWI5NzA5MGY0YzBmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOWRjNTgzZGE1ZWE4NGZkZDhjNTU4MWFjN2RmOGRjOTMuYmluZFBvcHVwKHBvcHVwX2E4ZWRmYTViMDU2NjQzZWViM2FiZjM2YTdmNWQwMWMzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZTEwYWMwZGZhNzViNDYyNWEyYjIzNGFjM2YwMzk3ZjUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45ODY1NjQ2LC0xLjEzNzcwNzFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl8zOTJlM2Y2MWUzMDE0YTI3OGY5YzA2NmM4YjU2MmFmMSA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ2dyZWVuJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyX2UxMGFjMGRmYTc1YjQ2MjVhMmIyMzRhYzNmMDM5N2Y1LnNldEljb24oaWNvbl8zOTJlM2Y2MWUzMDE0YTI3OGY5YzA2NmM4YjU2MmFmMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQyZGMxOGZiYmE5MzQ3ZGY4ZDY3ZWJiMGZhZTlmOTlmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzUzMGE3Yzg1YjhhZTQ4ZmFhNDNhYjNkNjg5YjdmNjYxID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF81MzBhN2M4NWI4YWU0OGZhYTQzYWIzZDY4OWI3ZjY2MSIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgUGxhemEgZGUgU2FuIEFndXN0aW4gKFpvbmEgNCk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDJkYzE4ZmJiYTkzNDdkZjhkNjdlYmIwZmFlOWY5OWYuc2V0Q29udGVudChodG1sXzUzMGE3Yzg1YjhhZTQ4ZmFhNDNhYjNkNjg5YjdmNjYxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZTEwYWMwZGZhNzViNDYyNWEyYjIzNGFjM2YwMzk3ZjUuYmluZFBvcHVwKHBvcHVwXzQyZGMxOGZiYmE5MzQ3ZGY4ZDY3ZWJiMGZhZTlmOTlmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYWY2ZTMxMzYzNTk4NGU2MzhiNjJjYTNiNzZmZGIyMGEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45ODYyNzIzLC0xLjE0MDAzNV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzZkOWFjMGZlZjcyZjQ0N2JiOTQwOTE0NGFmYzAwMzc4ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAnZ3JlZW4nLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfYWY2ZTMxMzYzNTk4NGU2MzhiNjJjYTNiNzZmZGIyMGEuc2V0SWNvbihpY29uXzZkOWFjMGZlZjcyZjQ0N2JiOTQwOTE0NGFmYzAwMzc4KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzkyODIzNTBjZTdhNGVhMWE5ZmYxNzMxMWU4N2Q1OGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmE4N2I1OTY3NjdiNDIyMmE1YzM5YmFhYzJlYTc4NDAgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2ZhODdiNTk2NzY3YjQyMjJhNWMzOWJhYWMyZWE3ODQwIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBNYXJpYW5vIE1vbnRlc2lub3MgKFpvbmEgNCk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzkyODIzNTBjZTdhNGVhMWE5ZmYxNzMxMWU4N2Q1OGMuc2V0Q29udGVudChodG1sX2ZhODdiNTk2NzY3YjQyMjJhNWMzOWJhYWMyZWE3ODQwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYWY2ZTMxMzYzNTk4NGU2MzhiNjJjYTNiNzZmZGIyMGEuYmluZFBvcHVwKHBvcHVwXzM5MjgyMzUwY2U3YTRlYTFhOWZmMTczMTFlODdkNThjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYWE2OThiMGJiZTQ3NGNhZjhmMTU5OGVlZDIzYjdhMTkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszOC4yMDU2NTg3LC0xLjAzODYxMTRdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl81N2UwNDI3MTNhY2E0MDNmYTJjNDQ0YzZhNTM1YTY5NyA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ2dyZWVuJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyX2FhNjk4YjBiYmU0NzRjYWY4ZjE1OThlZWQyM2I3YTE5LnNldEljb24oaWNvbl81N2UwNDI3MTNhY2E0MDNmYTJjNDQ0YzZhNTM1YTY5Nyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBkNzMyMGFhNzNmYzQ1MDI5NjI5NWViYTNkMmQxNWVjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRiODJiNDkxYzFiNTRkZDU5ZDg1ZmEzMjE0MmQxNWU1ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF80YjgyYjQ5MWMxYjU0ZGQ1OWQ4NWZhMzIxNDJkMTVlNSIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsZSBBbGZhbmRlIChab25hIDQpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBkNzMyMGFhNzNmYzQ1MDI5NjI5NWViYTNkMmQxNWVjLnNldENvbnRlbnQoaHRtbF80YjgyYjQ5MWMxYjU0ZGQ1OWQ4NWZhMzIxNDJkMTVlNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2FhNjk4YjBiYmU0NzRjYWY4ZjE1OThlZWQyM2I3YTE5LmJpbmRQb3B1cChwb3B1cF8wZDczMjBhYTczZmM0NTAyOTYyOTVlYmEzZDJkMTVlYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgbXVsdGlfcG9seV9saW5lXzM2NWJkNmE0NTVhYjQxZDU5NWNjODIyZmM4MDUxNjNhID0gTC5tdWx0aVBvbHlsaW5lKAogICAgICAgICAgICAgICAgICAgIFtbWzM3LjkzODc0MTksIC0xLjE2NjM5NjZdLCBbMzcuODMxNTc1MywgLTEuMTUzMzQ4M11dLCBbWzM3LjgzMTU3NTMsIC0xLjE1MzM0ODNdLCBbMzguMjA1NjU4NywgLTEuMDM4NjExNF1dLCBbWzM4LjIwNTY1ODcsIC0xLjAzODYxMTRdLCBbMzcuOTg3NTgwNiwgLTEuMTQ0OTM1Nl1dLCBbWzM3Ljk4NzU4MDYsIC0xLjE0NDkzNTZdLCBbMzcuOTM4NzQxOSwgLTEuMTY2Mzk2Nl1dXSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnZ3JlZW4nLAogICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDUsCiAgICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmLmFkZExheWVyKG11bHRpX3BvbHlfbGluZV8zNjViZDZhNDU1YWI0MWQ1OTVjYzgyMmZjODA1MTYzYSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgwMDdlZWRhOTNhODQ4Yzg5N2Q5Yzk3ZmJiOGFiMzYwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NlOWNhNTA3YWQwMDRlN2Y4NjNhYzU1ZmQ3MDlmYmZmID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9jZTljYTUwN2FkMDA0ZTdmODYzYWM1NWZkNzA5ZmJmZiIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgWm9uYSA0PC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzgwMDdlZWRhOTNhODQ4Yzg5N2Q5Yzk3ZmJiOGFiMzYwLnNldENvbnRlbnQoaHRtbF9jZTljYTUwN2FkMDA0ZTdmODYzYWM1NWZkNzA5ZmJmZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbXVsdGlfcG9seV9saW5lXzM2NWJkNmE0NTVhYjQxZDU5NWNjODIyZmM4MDUxNjNhLmJpbmRQb3B1cChwb3B1cF84MDA3ZWVkYTkzYTg0OGM4OTdkOWM5N2ZiYjhhYjM2MCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzQ5NDAzYjRkMmY3MjQ5YWI4OGVlYWQ1YzMyMTIzZWQ5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTg1MTM5NCwtMS4xMjMyNDk4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fNzFmOWM1YThjNDNhNGVkOTg4ZDk3NzI2NjE4MjBhM2UgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdvcmFuZ2UnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfNDk0MDNiNGQyZjcyNDlhYjg4ZWVhZDVjMzIxMjNlZDkuc2V0SWNvbihpY29uXzcxZjljNWE4YzQzYTRlZDk4OGQ5NzcyNjYxODIwYTNlKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmM2MGZkMTlmMDIyNGM2YzgzZjFjZjhmYjY0ZjIzNmIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTZmMWJkNGFmOTdmNDQ0ZmIyZjc3YTY5ZjVmOGQ3YjUgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzE2ZjFiZDRhZjk3ZjQ0NGZiMmY3N2E2OWY1ZjhkN2I1IiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBSb25kYSBkZSBHYXJheSAoWm9uYSA2KTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82YzYwZmQxOWYwMjI0YzZjODNmMWNmOGZiNjRmMjM2Yi5zZXRDb250ZW50KGh0bWxfMTZmMWJkNGFmOTdmNDQ0ZmIyZjc3YTY5ZjVmOGQ3YjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl80OTQwM2I0ZDJmNzI0OWFiODhlZWFkNWMzMjEyM2VkOS5iaW5kUG9wdXAocG9wdXBfNmM2MGZkMTlmMDIyNGM2YzgzZjFjZjhmYjY0ZjIzNmIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8zZDQ4YWUyYTEyYjY0YzJiODlmOTA1N2NmNDBjYTY2YyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4NDE4ODcsLTEuMTI0OTkwNl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzFhNTAwYTAwOTE2YzRkYTQ5ZGM3YjY3MWNjYmQ3ODFjID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAnb3JhbmdlJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzNkNDhhZTJhMTJiNjRjMmI4OWY5MDU3Y2Y0MGNhNjZjLnNldEljb24oaWNvbl8xYTUwMGEwMDkxNmM0ZGE0OWRjN2I2NzFjY2JkNzgxYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E5ZWVkMGM0MDQ0MTQ1MDU4NmI1MGU2MWM2YjQ2NmNhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NkYzQzNTcwY2Q5ZDRkYWQ5MjkxZDkwNWVmMDU5NGUzID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9jZGM0MzU3MGNkOWQ0ZGFkOTI5MWQ5MDVlZjA1OTRlMyIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgU2ltb24gR2FyY2lhIChab25hIDYpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E5ZWVkMGM0MDQ0MTQ1MDU4NmI1MGU2MWM2YjQ2NmNhLnNldENvbnRlbnQoaHRtbF9jZGM0MzU3MGNkOWQ0ZGFkOTI5MWQ5MDVlZjA1OTRlMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzNkNDhhZTJhMTJiNjRjMmI4OWY5MDU3Y2Y0MGNhNjZjLmJpbmRQb3B1cChwb3B1cF9hOWVlZDBjNDA0NDE0NTA1ODZiNTBlNjFjNmI0NjZjYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2EzYjVhNDAyYzBmZTRmYjQ4MWFmNWYwMGIzMzc3OTVhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTg0MTY0NCwtMS4xMjE5NjQ2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fYTMxMmU0ODY2MzYyNGI0MmFkNmE4ZTYzZTVlMTZmODcgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdvcmFuZ2UnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfYTNiNWE0MDJjMGZlNGZiNDgxYWY1ZjAwYjMzNzc5NWEuc2V0SWNvbihpY29uX2EzMTJlNDg2NjM2MjRiNDJhZDZhOGU2M2U1ZTE2Zjg3KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzYxZTNkN2VjOGIzNDc5YWIzYTJmYjAzN2ZmZmMzZWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDQzMDdhOGM0N2E5NDJiYmIzODFlZTEwNDEyYzAwMWMgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzQ0MzA3YThjNDdhOTQyYmJiMzgxZWUxMDQxMmMwMDFjIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBTYW4gTGVhbmRybyAoWm9uYSA2KTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zNjFlM2Q3ZWM4YjM0NzlhYjNhMmZiMDM3ZmZmYzNlZS5zZXRDb250ZW50KGh0bWxfNDQzMDdhOGM0N2E5NDJiYmIzODFlZTEwNDEyYzAwMWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9hM2I1YTQwMmMwZmU0ZmI0ODFhZjVmMDBiMzM3Nzk1YS5iaW5kUG9wdXAocG9wdXBfMzYxZTNkN2VjOGIzNDc5YWIzYTJmYjAzN2ZmZmMzZWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8zMWRjYmUxNzg0ZWU0MmJjYTMxODE1ZjFlNjllM2U1YiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4MjQ0MDcsLTEuMTI0NzI4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fNDI0OTczZTFjNTg1NGZiYTk2MmVkM2JkYzkxMmM4ZTggPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdvcmFuZ2UnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfMzFkY2JlMTc4NGVlNDJiY2EzMTgxNWYxZTY5ZTNlNWIuc2V0SWNvbihpY29uXzQyNDk3M2UxYzU4NTRmYmE5NjJlZDNiZGM5MTJjOGU4KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzIyNjI3MzNjMDM2NGZmZGI5Yzg0ODdkNTE3OTg2MjMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjNhOGM2MTgwMGQ2NDE4YThiODljMTJiNTZjNzk5ZDcgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzYzYThjNjE4MDBkNjQxOGE4Yjg5YzEyYjU2Yzc5OWQ3IiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBHZW5lcmFsIFNhbm1hcnRpbiAoWm9uYSA2KTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zMjI2MjczM2MwMzY0ZmZkYjljODQ4N2Q1MTc5ODYyMy5zZXRDb250ZW50KGh0bWxfNjNhOGM2MTgwMGQ2NDE4YThiODljMTJiNTZjNzk5ZDcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8zMWRjYmUxNzg0ZWU0MmJjYTMxODE1ZjFlNjllM2U1Yi5iaW5kUG9wdXAocG9wdXBfMzIyNjI3MzNjMDM2NGZmZGI5Yzg0ODdkNTE3OTg2MjMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9jZmMyODdiYzllMjU0YjNiYTE1Y2NlMDRmN2YwMjBhNyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4NDczNjgsLTEuMTIyMzA4Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzY3YjYwOWQ1NTYyNjRhZTdhNTlmMzA0NmY1NjI0MjUxID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAnb3JhbmdlJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyX2NmYzI4N2JjOWUyNTRiM2JhMTVjY2UwNGY3ZjAyMGE3LnNldEljb24oaWNvbl82N2I2MDlkNTU2MjY0YWU3YTU5ZjMwNDZmNTYyNDI1MSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRhZWVjYjhkYTZlMTRkODdhNzQwYWI2ZGU4ZTBjNmQ3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2YwNGUxN2VhZTBkOTQ4MzZiNzViMGJjNDMzNzA5ZmQwID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9mMDRlMTdlYWUwZDk0ODM2Yjc1YjBiYzQzMzcwOWZkMCIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgSm9zZWxpdG8gKFpvbmEgNik8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGFlZWNiOGRhNmUxNGQ4N2E3NDBhYjZkZThlMGM2ZDcuc2V0Q29udGVudChodG1sX2YwNGUxN2VhZTBkOTQ4MzZiNzViMGJjNDMzNzA5ZmQwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfY2ZjMjg3YmM5ZTI1NGIzYmExNWNjZTA0ZjdmMDIwYTcuYmluZFBvcHVwKHBvcHVwXzRhZWVjYjhkYTZlMTRkODdhNzQwYWI2ZGU4ZTBjNmQ3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNjQ1MDZjNDQwZWEyNGE1MjlmNjc1MGRlMTgwOGU1MjAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45ODYwODE4LC0xLjEyNDA4OTZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl8xMDZiMjgzZGRmYTk0ODFmODgzMTkyNzVkZDZmNmRhZCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ29yYW5nZScsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl82NDUwNmM0NDBlYTI0YTUyOWY2NzUwZGUxODA4ZTUyMC5zZXRJY29uKGljb25fMTA2YjI4M2RkZmE5NDgxZjg4MzE5Mjc1ZGQ2ZjZkYWQpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMWVlMzFiNTBlNmQ0NzZiODdhOWFlYjI5ZTlkYjUyYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMTY5NjJlMWJkZGY0ZDFiOTJlZDE5YTM4YzhkYzZmYiA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfZjE2OTYyZTFiZGRmNGQxYjkyZWQxOWEzOGM4ZGM2ZmIiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIE1hcmlhbm8gVmVyZ2FyYSAoWm9uYSA2KTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hMWVlMzFiNTBlNmQ0NzZiODdhOWFlYjI5ZTlkYjUyYy5zZXRDb250ZW50KGh0bWxfZjE2OTYyZTFiZGRmNGQxYjkyZWQxOWEzOGM4ZGM2ZmIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82NDUwNmM0NDBlYTI0YTUyOWY2NzUwZGUxODA4ZTUyMC5iaW5kUG9wdXAocG9wdXBfYTFlZTMxYjUwZTZkNDc2Yjg3YTlhZWIyOWU5ZGI1MmMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9iODYwYWEzNGE0YjM0NWE4YTMzYzFiYzdkMmFkYzI4YSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4NjQ5NTIsLTEuMTI0MDIxNF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzVmMzNlZTRiMGVlODQ4OGJiZjJhZmFkY2U3NzYyNDFhID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAnb3JhbmdlJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyX2I4NjBhYTM0YTRiMzQ1YThhMzNjMWJjN2QyYWRjMjhhLnNldEljb24oaWNvbl81ZjMzZWU0YjBlZTg0ODhiYmYyYWZhZGNlNzc2MjQxYSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E2MmIxMzg1NDdhMTQ4ZmNhOTliNDM4N2E2MGI5ZWM2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVmZTEwOTk5Yjk5ZTQ1MzY4YTFjYTYwNzdiMWRiMTIwID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF81ZmUxMDk5OWI5OWU0NTM2OGExY2E2MDc3YjFkYjEyMCIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgT2Jpc3BvIEZydXRvcyAoWm9uYSA2KTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hNjJiMTM4NTQ3YTE0OGZjYTk5YjQzODdhNjBiOWVjNi5zZXRDb250ZW50KGh0bWxfNWZlMTA5OTliOTllNDUzNjhhMWNhNjA3N2IxZGIxMjApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9iODYwYWEzNGE0YjM0NWE4YTMzYzFiYzdkMmFkYzI4YS5iaW5kUG9wdXAocG9wdXBfYTYyYjEzODU0N2ExNDhmY2E5OWI0Mzg3YTYwYjllYzYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8wYTZjYWZlZDgzMTE0M2UxOGQ1ZWExNTE1YTM5MDRiZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4NzQ3ODEsLTEuMTIzNjY1Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzE4MWY3NGMxNzk3YjQ1NGQ5ZTEwMGVmNTY3MDQ0MDk4ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAnb3JhbmdlJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzBhNmNhZmVkODMxMTQzZTE4ZDVlYTE1MTVhMzkwNGJkLnNldEljb24oaWNvbl8xODFmNzRjMTc5N2I0NTRkOWUxMDBlZjU2NzA0NDA5OCk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMyMzA5ZmUwOTI3NjQzODRhMjM1ZTFkMDVhMzhjZTYzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzcxMDMxMGQxNjM5MDRlZjdiY2M2NjE2NDY3YmU1Y2Q0ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF83MTAzMTBkMTYzOTA0ZWY3YmNjNjYxNjQ2N2JlNWNkNCIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgQ2lnYXJyYWwgKFpvbmEgNik8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzIzMDlmZTA5Mjc2NDM4NGEyMzVlMWQwNWEzOGNlNjMuc2V0Q29udGVudChodG1sXzcxMDMxMGQxNjM5MDRlZjdiY2M2NjE2NDY3YmU1Y2Q0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMGE2Y2FmZWQ4MzExNDNlMThkNWVhMTUxNWEzOTA0YmQuYmluZFBvcHVwKHBvcHVwXzMyMzA5ZmUwOTI3NjQzODRhMjM1ZTFkMDVhMzhjZTYzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfODE4NDJhYjk3ZTE1NDNiMDg5YzJhMzY5ZGM0MTE4NmQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45Mzg0NDMxLC0xLjE0NTQ1NjhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl9lOWMzYmZhY2RhYTI0N2E0OTlhMjYzZmYzMTUyMjQ1ZSA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ29yYW5nZScsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl84MTg0MmFiOTdlMTU0M2IwODljMmEzNjlkYzQxMTg2ZC5zZXRJY29uKGljb25fZTljM2JmYWNkYWEyNDdhNDk5YTI2M2ZmMzE1MjI0NWUpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85N2MxMDdlMDgwNGU0N2FmOTc3MzMzOGRkMzYxYmY5MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85Mzc2YTExMzI0N2E0NDczODg0YWUxMmJhNTEwZGEwNiA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfOTM3NmExMTMyNDdhNDQ3Mzg4NGFlMTJiYTUxMGRhMDYiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIERvY3RvciBGbGVtaW5nIChab25hIDYpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk3YzEwN2UwODA0ZTQ3YWY5NzczMzM4ZGQzNjFiZjkwLnNldENvbnRlbnQoaHRtbF85Mzc2YTExMzI0N2E0NDczODg0YWUxMmJhNTEwZGEwNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzgxODQyYWI5N2UxNTQzYjA4OWMyYTM2OWRjNDExODZkLmJpbmRQb3B1cChwb3B1cF85N2MxMDdlMDgwNGU0N2FmOTc3MzMzOGRkMzYxYmY5MCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzgzYmJiYWFhMWMzMzQ3Y2Y4ZWRjOGM1ZTA1ZjgzZjlkID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTg1MjEwOSwtMS4xMjM5NzY5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fZjkxZDQ4MzJiOWZhNDRlMWEyODgzYzcyNjcxMTA3NzAgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdvcmFuZ2UnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfODNiYmJhYWExYzMzNDdjZjhlZGM4YzVlMDVmODNmOWQuc2V0SWNvbihpY29uX2Y5MWQ0ODMyYjlmYTQ0ZTFhMjg4M2M3MjY3MTEwNzcwKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2U0ODhiNGQ0MzI2NDg4YjhjMWRlOWM4M2Q5NjYyYTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2IxOWJlMDhhNDczNDZmYjkwZDk5MDhkYTI4MGJjYTUgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzdiMTliZTA4YTQ3MzQ2ZmI5MGQ5OTA4ZGEyODBiY2E1IiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBQZXJpb2Rpc3RhIE5pY29sYXMgT3J0ZWdhIFBhZ2FuIChab25hIDYpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdlNDg4YjRkNDMyNjQ4OGI4YzFkZTljODNkOTY2MmE0LnNldENvbnRlbnQoaHRtbF83YjE5YmUwOGE0NzM0NmZiOTBkOTkwOGRhMjgwYmNhNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzgzYmJiYWFhMWMzMzQ3Y2Y4ZWRjOGM1ZTA1ZjgzZjlkLmJpbmRQb3B1cChwb3B1cF83ZTQ4OGI0ZDQzMjY0ODhiOGMxZGU5YzgzZDk2NjJhNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzI2ZTZlODliM2EzMDQxMzU5OTdiNDExOTRkNWYyN2M2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTg3ODY1NSwtMS4xMjMxNjk4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fYTA5NGE5M2M1YzhiNDAzMWJiNzgxZmYyY2ZmYmM1ODYgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdvcmFuZ2UnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfMjZlNmU4OWIzYTMwNDEzNTk5N2I0MTE5NGQ1ZjI3YzYuc2V0SWNvbihpY29uX2EwOTRhOTNjNWM4YjQwMzFiYjc4MWZmMmNmZmJjNTg2KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODgyNzQ3MTYwNjkwNDNiNTgwZTdkNjI4YTUyNTg2NDQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWIzYThkYWE5MGNiNDJjZTg4MDQwOWY3ZTFiOWEwZTggPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2FiM2E4ZGFhOTBjYjQyY2U4ODA0MDlmN2UxYjlhMGU4IiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBkZSBDZXV0YSAoWm9uYSA2KTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84ODI3NDcxNjA2OTA0M2I1ODBlN2Q2MjhhNTI1ODY0NC5zZXRDb250ZW50KGh0bWxfYWIzYThkYWE5MGNiNDJjZTg4MDQwOWY3ZTFiOWEwZTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8yNmU2ZTg5YjNhMzA0MTM1OTk3YjQxMTk0ZDVmMjdjNi5iaW5kUG9wdXAocG9wdXBfODgyNzQ3MTYwNjkwNDNiNTgwZTdkNjI4YTUyNTg2NDQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl80ZmJmMDgzODBjMTM0N2E4YTI1OWIwNzAyMjNlNzhjMiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4MjkyNTMsLTEuMTIyOTU4N10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzlkNzBmZGNmNmVlODQ1ZDZhMDU1YjM3Mzc4NzU4ZTRmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzNhMDlmMTAwNTAyNDRiYzE4ZDZhOGJlOGMxOGU5N2IwID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAnb3JhbmdlJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzRmYmYwODM4MGMxMzQ3YThhMjU5YjA3MDIyM2U3OGMyLnNldEljb24oaWNvbl8zYTA5ZjEwMDUwMjQ0YmMxOGQ2YThiZThjMThlOTdiMCk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q4MDc1NDJiMmExNDRmMmJhZjdiNDlhMjNlNDEwOTBiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYxZTM3YTU0NDdhODRmNWU5MGQwNzZmNDVjMmM1Y2ExID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF82MWUzN2E1NDQ3YTg0ZjVlOTBkMDc2ZjQ1YzJjNWNhMSIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgQ29tdW5lcm9zIChab25hIDYpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q4MDc1NDJiMmExNDRmMmJhZjdiNDlhMjNlNDEwOTBiLnNldENvbnRlbnQoaHRtbF82MWUzN2E1NDQ3YTg0ZjVlOTBkMDc2ZjQ1YzJjNWNhMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzRmYmYwODM4MGMxMzQ3YThhMjU5YjA3MDIyM2U3OGMyLmJpbmRQb3B1cChwb3B1cF9kODA3NTQyYjJhMTQ0ZjJiYWY3YjQ5YTIzZTQxMDkwYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzQyYzFiYmIyMmU4ODRlMTU5NWVmMzg5ZGVhMDNjNmE2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTg3NDYyNSwtMS4xMjQ1MDc4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fOGI5OTA1MTZmMDlkNGY2ZjgzMTU1YzFjZjU3ZmFmYTAgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdvcmFuZ2UnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfNDJjMWJiYjIyZTg4NGUxNTk1ZWYzODlkZWEwM2M2YTYuc2V0SWNvbihpY29uXzhiOTkwNTE2ZjA5ZDRmNmY4MzE1NWMxY2Y1N2ZhZmEwKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWNmMDMxYjA5MzkwNGU5NWE5ZTVkMjAzZWM4N2YzYzUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWE0NzY1Y2JkYmNmNDhiZGIzZDAwYjNjNTIxNmJlNjMgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzFhNDc2NWNiZGJjZjQ4YmRiM2QwMGIzYzUyMTZiZTYzIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBNYWRyaWQgKFpvbmEgNik8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWNmMDMxYjA5MzkwNGU5NWE5ZTVkMjAzZWM4N2YzYzUuc2V0Q29udGVudChodG1sXzFhNDc2NWNiZGJjZjQ4YmRiM2QwMGIzYzUyMTZiZTYzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNDJjMWJiYjIyZTg4NGUxNTk1ZWYzODlkZWEwM2M2YTYuYmluZFBvcHVwKHBvcHVwXzFjZjAzMWIwOTM5MDRlOTVhOWU1ZDIwM2VjODdmM2M1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNmNiMjc3M2NjZDhjNDVjOGEwOTljYTI1MDdhMDgyZjggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45NTIwNTQxLC0xLjE3NTI2NDddLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85ZDcwZmRjZjZlZTg0NWQ2YTA1NWIzNzM3ODc1OGU0Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl9hMzRlNjZhNjJmNWU0ODRlOTRhMTk1NmQ5YmJlZTMzNCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ29yYW5nZScsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl82Y2IyNzczY2NkOGM0NWM4YTA5OWNhMjUwN2EwODJmOC5zZXRJY29uKGljb25fYTM0ZTY2YTYyZjVlNDg0ZTk0YTE5NTZkOWJiZWUzMzQpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yZWI2YWNiZDFiOTk0MTQ1ODU2NjRmNmYxOWE2YWI1YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80OWQzMmFjMGFlYTA0NzE3ODBmYTVjOTc1ZmU3YzRhZSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfNDlkMzJhYzBhZWEwNDcxNzgwZmE1Yzk3NWZlN2M0YWUiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIExhIEdsb3JpYSAoWm9uYSA2KTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZWI2YWNiZDFiOTk0MTQ1ODU2NjRmNmYxOWE2YWI1YS5zZXRDb250ZW50KGh0bWxfNDlkMzJhYzBhZWEwNDcxNzgwZmE1Yzk3NWZlN2M0YWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82Y2IyNzczY2NkOGM0NWM4YTA5OWNhMjUwN2EwODJmOC5iaW5kUG9wdXAocG9wdXBfMmViNmFjYmQxYjk5NDE0NTg1NjY0ZjZmMTlhNmFiNWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIG11bHRpX3BvbHlfbGluZV8yN2M5NWViNDU2MDU0MjZjODk5MTFhMDU3ZTYzNTlmNyA9IEwubXVsdGlQb2x5bGluZSgKICAgICAgICAgICAgICAgICAgICBbW1szNy45NTIwNTQxLCAtMS4xNzUyNjQ3XSwgWzM3LjkzODQ0MzEsIC0xLjE0NTQ1NjhdXSwgW1szNy45Mzg0NDMxLCAtMS4xNDU0NTY4XSwgWzM3Ljk4NDE2NDQsIC0xLjEyMTk2NDZdXSwgW1szNy45ODQxNjQ0LCAtMS4xMjE5NjQ2XSwgWzM3Ljk4Nzg2NTUsIC0xLjEyMzE2OThdXSwgW1szNy45ODc4NjU1LCAtMS4xMjMxNjk4XSwgWzM3Ljk4NzQ2MjUsIC0xLjEyNDUwNzhdXSwgW1szNy45ODc0NjI1LCAtMS4xMjQ1MDc4XSwgWzM3Ljk1MjA1NDEsIC0xLjE3NTI2NDddXV0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ29yYW5nZScsCiAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodDogNSwKICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMSwKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXBfOWQ3MGZkY2Y2ZWU4NDVkNmEwNTViMzczNzg3NThlNGYuYWRkTGF5ZXIobXVsdGlfcG9seV9saW5lXzI3Yzk1ZWI0NTYwNTQyNmM4OTkxMWEwNTdlNjM1OWY3KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTE0OTQ2Yjc1NGEyNDA1OWI3ZDVkYTNhMWJiYmNkMTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2ZiNTYwYjE4NDE4NDVkNGI1OWRkMzFkMDFjYzIyNzAgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzdmYjU2MGIxODQxODQ1ZDRiNTlkZDMxZDAxY2MyMjcwIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBab25hIDY8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTE0OTQ2Yjc1NGEyNDA1OWI3ZDVkYTNhMWJiYmNkMTYuc2V0Q29udGVudChodG1sXzdmYjU2MGIxODQxODQ1ZDRiNTlkZDMxZDAxY2MyMjcwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtdWx0aV9wb2x5X2xpbmVfMjdjOTVlYjQ1NjA1NDI2Yzg5OTExYTA1N2U2MzU5ZjcuYmluZFBvcHVwKHBvcHVwX2UxNDk0NmI3NTRhMjQwNTliN2Q1ZGEzYTFiYmJjZDE2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgIDwvc2NyaXB0PgogICAgICAgIA==\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;\"></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x7f8723068410>"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mapa = folium.Map(location=[37.9829272,-1.1251948], zoom_start=14,\n",
" tiles='Cartodb Positron')\n",
"\n",
"zones_colors = {'1-2-3':'red','4':'green','5':'blue','6':'orange'}\n",
"\n",
"zones_labels = ['6']\n",
"for zone in zones_colors.keys():\n",
" zone_slice = zones_osm[['latlon','name']][(zones_osm.zone==zone)]\n",
" zone_slice = zone_slice.drop_duplicates(subset=['name'])\n",
" for point in zone_slice.values:\n",
" mapa.simple_marker(point[0], popup='{} (Zona {})'.format(unicodedata.normalize('NFKD', point[1]).encode('ascii','ignore'), zone), marker_icon=None,marker_color=zones_colors[zone])\n",
" zone_boundary = MultiPoint(zone_slice.latlon.tolist()).convex_hull \n",
" locations = list(zip(zone_boundary.exterior.coords.xy[0],zone_boundary.exterior.coords.xy[1]))\n",
" locations = [[locations[i],locations[i+1]] for i in range( len(locations) -1)]\n",
" zone_border = folium.MultiPolyLine(locations=locations,popup='Zona {}'.format(zone), color=zones_colors[zone], weight=5, opacity=1) \n",
" mapa.add_children(zone_border) \n",
"\n",
"mapa"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### We see that many points are mislabeled. This is because in the region many streets in different areas share the same name.\n",
"### We get the bounding box of Murcia by getting a sensible square around the city and writing down the minimum and maximum latitude and longitude"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"zones_osm['lat'] = zones_osm.latlon.apply(lambda x:x[0])\n",
"zones_osm['lon'] = zones_osm.latlon.apply(lambda x:x[1])"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"max_lat=37.996859\n",
"min_lat=37.974663\n",
"max_lon=-1.121954\n",
"min_lon=-1.144947"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"murcia_bbox = zones_osm[\n",
" (zones_osm.lat>=min_lat)&\n",
" (zones_osm.lat<=max_lat)&\n",
" (zones_osm.lon>=min_lon)&\n",
" (zones_osm.lon<=max_lon)\n",
"]"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/manuel/anaconda3/lib/python2.7/site-packages/ipykernel/__main__.py:11: FutureWarning: simple_marker is deprecated. Use add_children(Marker) instead\n"
]
},
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;base64,CiAgICAgICAgPCFET0NUWVBFIGh0bWw+CiAgICAgICAgPGhlYWQ+CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICA8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgLz4KICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9sZWFmbGV0LzAuNy4zL2xlYWZsZXQuanMiPjwvc2NyaXB0PgogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vYWpheC5nb29nbGVhcGlzLmNvbS9hamF4L2xpYnMvanF1ZXJ5LzEuMTEuMS9qcXVlcnkubWluLmpzIj48L3NjcmlwdD4KICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIDxzY3JpcHQgc3JjPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9qcy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIDxzY3JpcHQgc3JjPSJodHRwczovL3Jhd2dpdGh1Yi5jb20vbHZvb2dkdC9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAvZGV2ZWxvcC9kaXN0L2xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLmpzIj48L3NjcmlwdD4KICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9sZWFmbGV0Lm1hcmtlcmNsdXN0ZXIvMC40LjAvbGVhZmxldC5tYXJrZXJjbHVzdGVyLXNyYy5qcyI+PC9zY3JpcHQ+CiAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvbGVhZmxldC5tYXJrZXJjbHVzdGVyLzAuNC4wL2xlYWZsZXQubWFya2VyY2x1c3Rlci5qcyI+PC9zY3JpcHQ+CiAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2xlYWZsZXQvMC43LjMvbGVhZmxldC5jc3MiIC8+CiAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMi4wL2Nzcy9ib290c3RyYXAubWluLmNzcyIgLz4KICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIiAvPgogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2ZvbnQtYXdlc29tZS80LjEuMC9jc3MvZm9udC1hd2Vzb21lLm1pbi5jc3MiIC8+CiAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vcmF3Z2l0LmNvbS9sdm9vZ2R0L0xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLzIuMC9kZXZlbG9wL2Rpc3QvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuY3NzIiAvPgogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9sZWFmbGV0Lm1hcmtlcmNsdXN0ZXIvMC40LjAvTWFya2VyQ2x1c3Rlci5EZWZhdWx0LmNzcyIgLz4KICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvbGVhZmxldC5tYXJrZXJjbHVzdGVyLzAuNC4wL01hcmtlckNsdXN0ZXIuY3NzIiAvPgogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcHl0aG9uLXZpc3VhbGl6YXRpb24vZm9saXVtL21hc3Rlci9mb2xpdW0vdGVtcGxhdGVzL2xlYWZsZXQuYXdlc29tZS5yb3RhdGUuY3NzIiAvPgogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgPHN0eWxlPgoKICAgICAgICAgICAgaHRtbCwgYm9keSB7CiAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICAgICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICAgICAgICAgIG1hcmdpbjogMDsKICAgICAgICAgICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAjbWFwIHsKICAgICAgICAgICAgICAgIHBvc2l0aW9uOmFic29sdXRlOwogICAgICAgICAgICAgICAgdG9wOjA7CiAgICAgICAgICAgICAgICBib3R0b206MDsKICAgICAgICAgICAgICAgIHJpZ2h0OjA7CiAgICAgICAgICAgICAgICBsZWZ0OjA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIDwvc3R5bGU+CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgPHN0eWxlPiAjbWFwXzY5NzdmMTQ4ODhhNzQyNTY4NTdlZTZmZWE5MGFjZmUxIHsKICAgICAgICAgICAgICAgIHBvc2l0aW9uIDogcmVsYXRpdmU7CiAgICAgICAgICAgICAgICB3aWR0aCA6IDEwMC4wJTsKICAgICAgICAgICAgICAgIGhlaWdodDogMTAwLjAlOwogICAgICAgICAgICAgICAgbGVmdDogMC4wJTsKICAgICAgICAgICAgICAgIHRvcDogMC4wJTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgPC9zdHlsZT4KICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICA8L2hlYWQ+CiAgICAgICAgPGJvZHk+CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9saXVtLW1hcCIgaWQ9Im1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSIgPjwvZGl2PgogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgIDwvYm9keT4KICAgICAgICA8c2NyaXB0PgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgc291dGhXZXN0ID0gTC5sYXRMbmcoLTkwLCAtMTgwKTsKICAgICAgICAgICAgdmFyIG5vcnRoRWFzdCA9IEwubGF0TG5nKDkwLCAxODApOwogICAgICAgICAgICB2YXIgYm91bmRzID0gTC5sYXRMbmdCb3VuZHMoc291dGhXZXN0LCBub3J0aEVhc3QpOwoKICAgICAgICAgICAgdmFyIG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSA9IEwubWFwKCdtYXBfNjk3N2YxNDg4OGE3NDI1Njg1N2VlNmZlYTkwYWNmZTEnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXI6WzM3Ljk4MjkyNzIsLTEuMTI1MTk0OF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiAxNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgdGlsZV9sYXllcl9iODI5ZTdiOTFmNzQ0ZDliYmQwZTJhM2Q4MGQ3MTlkZiA9IEwudGlsZUxheWVyKAogICAgICAgICAgICAgICAgJ2h0dHBzOi8vY2FydG9kYi1iYXNlbWFwcy17c30uZ2xvYmFsLnNzbC5mYXN0bHkubmV0L2xpZ2h0X2FsbC97en0ve3h9L3t5fS5wbmcnLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1heFpvb206IDE4LAogICAgICAgICAgICAgICAgICAgIG1pblpvb206IDEsCiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRpb246ICcoYykgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuc3RyZWV0bWFwLm9yZy9jb3B5cmlnaHQiPk9wZW5TdHJlZXRNYXA8L2E+IGNvbnRyaWJ1dG9ycyAoYykgPGEgaHJlZj0iaHR0cDovL2NhcnRvZGIuY29tL2F0dHJpYnV0aW9ucyI+Q2FydG9EQjwvYT4sIENhcnRvREIgPGEgaHJlZiA9Imh0dHA6Ly9jYXJ0b2RiLmNvbS9hdHRyaWJ1dGlvbnMiPmF0dHJpYnV0aW9uczwvYT4nLAogICAgICAgICAgICAgICAgICAgIGRldGVjdFJldGluYTogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CgogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYWFhMzQ4MTYxMmNjNDZmZGJjMDNjMmVmMjFiM2I1YjUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45OTE1Mzg5LC0xLjEyNDQ5MjNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl9jZjk2ZWRmNjI0ZWY0MDQyOTAzMzMwYjJhYTI1ZGVkYyA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl9hYWEzNDgxNjEyY2M0NmZkYmMwM2MyZWYyMWIzYjViNS5zZXRJY29uKGljb25fY2Y5NmVkZjYyNGVmNDA0MjkwMzMzMGIyYWEyNWRlZGMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83NTVlYmY4ZmM2ZmQ0MWQ1OTE0OWU0MjI2MmU5NmFhYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wNWFkOTcyM2FkOGY0YzQzYWYzYzRlYWEwMWEyMGE2YiA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfMDVhZDk3MjNhZDhmNGM0M2FmM2M0ZWFhMDFhMjBhNmIiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIFJvbmRhIGRlIExldmFudGUgKFpvbmEgMS0yLTMpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc1NWViZjhmYzZmZDQxZDU5MTQ5ZTQyMjYyZTk2YWFjLnNldENvbnRlbnQoaHRtbF8wNWFkOTcyM2FkOGY0YzQzYWYzYzRlYWEwMWEyMGE2Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2FhYTM0ODE2MTJjYzQ2ZmRiYzAzYzJlZjIxYjNiNWI1LmJpbmRQb3B1cChwb3B1cF83NTVlYmY4ZmM2ZmQ0MWQ1OTE0OWU0MjI2MmU5NmFhYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzM4ZWVmOTRjOWVjZDQ0YTM4MjNhZWY2MDEwNzE1ZmQ4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTkxMDM5NiwtMS4xMzQwMTA4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNjk3N2YxNDg4OGE3NDI1Njg1N2VlNmZlYTkwYWNmZTEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fNmM5MTcxMGJlYzI4NDQ1OThiN2I0MWIxYWRjZWFmMTYgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfMzhlZWY5NGM5ZWNkNDRhMzgyM2FlZjYwMTA3MTVmZDguc2V0SWNvbihpY29uXzZjOTE3MTBiZWMyODQ0NTk4YjdiNDFiMWFkY2VhZjE2KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzg3ZjgzZTgyMDU1NDg2ODg5NTA5ZmFlMDI0ZGQxNDEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTFlN2QzNDhhZWMxNDJmMTk1MGRjY2RkMDU5N2MxMzIgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2UxZTdkMzQ4YWVjMTQyZjE5NTBkY2NkZDA1OTdjMTMyIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBBdmVuaWRhIEdlbmVyYWwgUHJpbW8gZGUgUml2ZXJhIChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83ODdmODNlODIwNTU0ODY4ODk1MDlmYWUwMjRkZDE0MS5zZXRDb250ZW50KGh0bWxfZTFlN2QzNDhhZWMxNDJmMTk1MGRjY2RkMDU5N2MxMzIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8zOGVlZjk0YzllY2Q0NGEzODIzYWVmNjAxMDcxNWZkOC5iaW5kUG9wdXAocG9wdXBfNzg3ZjgzZTgyMDU1NDg2ODg5NTA5ZmFlMDI0ZGQxNDEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl84OWZiMWRmYzFiMjE0MDJjYTExNzNkN2FkOTEzODliZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk5MjU5MjcsLTEuMTM5NTYzOV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzY5NzdmMTQ4ODhhNzQyNTY4NTdlZTZmZWE5MGFjZmUxKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzQyZTIxZDU4YTY2NDQwOGZiZmRmNjA4NGNkODU2ZDU5ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzg5ZmIxZGZjMWIyMTQwMmNhMTE3M2Q3YWQ5MTM4OWJmLnNldEljb24oaWNvbl80MmUyMWQ1OGE2NjQ0MDhmYmZkZjYwODRjZDg1NmQ1OSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I4N2ViNDU2ZTNhODQ3YTJhN2Y4ODdkNzA4MmM0MmQzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc5NWE4MjQ2MWFhODQ5NjA4Y2FmNGRhMWZiODZiMmY5ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF83OTVhODI0NjFhYTg0OTYwOGNhZjRkYTFmYjg2YjJmOSIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgUm9uZGEgTm9ydGUgKFpvbmEgMS0yLTMpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I4N2ViNDU2ZTNhODQ3YTJhN2Y4ODdkNzA4MmM0MmQzLnNldENvbnRlbnQoaHRtbF83OTVhODI0NjFhYTg0OTYwOGNhZjRkYTFmYjg2YjJmOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzg5ZmIxZGZjMWIyMTQwMmNhMTE3M2Q3YWQ5MTM4OWJmLmJpbmRQb3B1cChwb3B1cF9iODdlYjQ1NmUzYTg0N2EyYTdmODg3ZDcwODJjNDJkMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzhmZGM4ZjUzNDVjYTQ0N2FhMTA4MGI3OWRkMDQwOTZiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTg5Mzc3NiwtMS4xMzE1NDYxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNjk3N2YxNDg4OGE3NDI1Njg1N2VlNmZlYTkwYWNmZTEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fYmQxZTQ5NGNmMGM5NDcxODk2ZTEwMTNiZDdjNWE0MmYgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfOGZkYzhmNTM0NWNhNDQ3YWExMDgwYjc5ZGQwNDA5NmIuc2V0SWNvbihpY29uX2JkMWU0OTRjZjBjOTQ3MTg5NmUxMDEzYmQ3YzVhNDJmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDdhMDUyMTEzYjAwNDU0ZjlmODY2MTdhYTE0YTU0MWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzYxYjQyMTE1NDc4NDdiNTg2ZjMxYjMwNjUyOTlhOGYgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzc2MWI0MjExNTQ3ODQ3YjU4NmYzMWIzMDY1Mjk5YThmIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBKYWltZSBJIGVsIENvbnF1aXN0YWRvciAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDdhMDUyMTEzYjAwNDU0ZjlmODY2MTdhYTE0YTU0MWYuc2V0Q29udGVudChodG1sXzc2MWI0MjExNTQ3ODQ3YjU4NmYzMWIzMDY1Mjk5YThmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOGZkYzhmNTM0NWNhNDQ3YWExMDgwYjc5ZGQwNDA5NmIuYmluZFBvcHVwKHBvcHVwXzA3YTA1MjExM2IwMDQ1NGY5Zjg2NjE3YWExNGE1NDFmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZDE1ZWI1MTkzOThhNGY4YmI0Y2IyMWIzNTI3OTQxZmIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45ODc3NTU2LC0xLjEyOTA5NDNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl8yMzk0OTVkMTM5Y2U0M2NhYTJiMmQ0NWNkN2ZhYWRjZSA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl9kMTVlYjUxOTM5OGE0ZjhiYjRjYjIxYjM1Mjc5NDFmYi5zZXRJY29uKGljb25fMjM5NDk1ZDEzOWNlNDNjYWEyYjJkNDVjZDdmYWFkY2UpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wODM3OTE5ZmRjNzQ0ZjcxYTMwYjU4MWViZTdmN2U5ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hNmY3NmQzMGVmYTU0NDcxOWQ3MmExNjk4NzE1MTRmMSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfYTZmNzZkMzBlZmE1NDQ3MTlkNzJhMTY5ODcxNTE0ZjEiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIGNhbGxlIEVucmlxdWUgVmlsbGFyIChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wODM3OTE5ZmRjNzQ0ZjcxYTMwYjU4MWViZTdmN2U5ZC5zZXRDb250ZW50KGh0bWxfYTZmNzZkMzBlZmE1NDQ3MTlkNzJhMTY5ODcxNTE0ZjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kMTVlYjUxOTM5OGE0ZjhiYjRjYjIxYjM1Mjc5NDFmYi5iaW5kUG9wdXAocG9wdXBfMDgzNzkxOWZkYzc0NGY3MWEzMGI1ODFlYmU3ZjdlOWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl85MzZjNTdmNjcwODU0NTZlYTAzZDRlYjc3MGE4NGQyMyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk5MjEsLTEuMTI5MDNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl9kNjk1NWMyNTRlZDA0MGViYmE3OTc3MTkwYmRiOWNjNSA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl85MzZjNTdmNjcwODU0NTZlYTAzZDRlYjc3MGE4NGQyMy5zZXRJY29uKGljb25fZDY5NTVjMjU0ZWQwNDBlYmJhNzk3NzE5MGJkYjljYzUpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zOTYzMzM1NzM3N2I0YWIwYjk2ZDFmM2ZmNGYxYmViMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jMjcxYWU3ZTA1Yjc0YTRmOTdhOTE3ZmMxNGYyNjNkZiA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfYzI3MWFlN2UwNWI3NGE0Zjk3YTkxN2ZjMTRmMjYzZGYiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIFBsYXphIENpcmN1bGFyIChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zOTYzMzM1NzM3N2I0YWIwYjk2ZDFmM2ZmNGYxYmViMi5zZXRDb250ZW50KGh0bWxfYzI3MWFlN2UwNWI3NGE0Zjk3YTkxN2ZjMTRmMjYzZGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85MzZjNTdmNjcwODU0NTZlYTAzZDRlYjc3MGE4NGQyMy5iaW5kUG9wdXAocG9wdXBfMzk2MzMzNTczNzdiNGFiMGI5NmQxZjNmZjRmMWJlYjIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9jOGFjOTlhMjM2NjA0NjJkOGNlZDIyNmY3ZDM2OGNjYyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4NzEwNTQsLTEuMTM0OTYwMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzY5NzdmMTQ4ODhhNzQyNTY4NTdlZTZmZWE5MGFjZmUxKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzhlNDFiYTkwZjE0YTQ3ZDA4MDhlNjkxYzQ1MzNjZDUzID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyX2M4YWM5OWEyMzY2MDQ2MmQ4Y2VkMjI2ZjdkMzY4Y2NjLnNldEljb24oaWNvbl84ZTQxYmE5MGYxNGE0N2QwODA4ZTY5MWM0NTMzY2Q1Myk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU4N2NmMTY3ZTY0NTRmMzViYjYwMzVlNzM3NzBjYWQ5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc1Mzk3NGRkNzBlYjQ0ZWQ5NTVkOWZhNzIzOWY4YTY5ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF83NTM5NzRkZDcwZWI0NGVkOTU1ZDlmYTcyMzlmOGE2OSIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgU2FudGEgVGVyZXNhIChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81ODdjZjE2N2U2NDU0ZjM1YmI2MDM1ZTczNzcwY2FkOS5zZXRDb250ZW50KGh0bWxfNzUzOTc0ZGQ3MGViNDRlZDk1NWQ5ZmE3MjM5ZjhhNjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jOGFjOTlhMjM2NjA0NjJkOGNlZDIyNmY3ZDM2OGNjYy5iaW5kUG9wdXAocG9wdXBfNTg3Y2YxNjdlNjQ1NGYzNWJiNjAzNWU3Mzc3MGNhZDkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9mN2U1Y2E2YzFjMTU0MjNjOWJlNDg1ZTQ1NDNiODFiNCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4OTg5OTUsLTEuMTM0OTU0M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzY5NzdmMTQ4ODhhNzQyNTY4NTdlZTZmZWE5MGFjZmUxKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uX2FmNDk0Yjg3NzNmNDRmYzhiMDY2MDIyZDVhNDk0YmExID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyX2Y3ZTVjYTZjMWMxNTQyM2M5YmU0ODVlNDU0M2I4MWI0LnNldEljb24oaWNvbl9hZjQ5NGI4NzczZjQ0ZmM4YjA2NjAyMmQ1YTQ5NGJhMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg1ZGY5NTA0ZTJiMDQyYjk5MWVhMzE0NDdjMjZjYWM4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y4NDA3MWUzMWNkZTQ0OGE5MjY5M2Y3ZTJlNTE4NmVlID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9mODQwNzFlMzFjZGU0NDhhOTI2OTNmN2UyZTUxODZlZSIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgQ29uZGVzdGFibGUgKFpvbmEgMS0yLTMpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg1ZGY5NTA0ZTJiMDQyYjk5MWVhMzE0NDdjMjZjYWM4LnNldENvbnRlbnQoaHRtbF9mODQwNzFlMzFjZGU0NDhhOTI2OTNmN2UyZTUxODZlZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2Y3ZTVjYTZjMWMxNTQyM2M5YmU0ODVlNDU0M2I4MWI0LmJpbmRQb3B1cChwb3B1cF84NWRmOTUwNGUyYjA0MmI5OTFlYTMxNDQ3YzI2Y2FjOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzEwZTA5NzIxOTRmODRjYTA4NjlmODc5Nzk3ZDg5ZTQ3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTkwNTE1LC0xLjEzNTEyODVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl9iMzQ3MzY0MGQ5M2Y0ZTdiOWZjNTg0NTliN2I1MGE3ZSA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl8xMGUwOTcyMTk0Zjg0Y2EwODY5Zjg3OTc5N2Q4OWU0Ny5zZXRJY29uKGljb25fYjM0NzM2NDBkOTNmNGU3YjlmYzU4NDU5YjdiNTBhN2UpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mNTFlODYwMzcwYjU0M2YyYjBiMTI2YTI5NmY3YmRiMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kNzVjNTRiODg1ZmU0OGRiYTRiMTI3YWJlZjYyYzEzMiA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfZDc1YzU0Yjg4NWZlNDhkYmE0YjEyN2FiZWY2MmMxMzIiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIGNhbGxlIHBvZXRhIENhbm8gUGF0byAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjUxZTg2MDM3MGI1NDNmMmIwYjEyNmEyOTZmN2JkYjEuc2V0Q29udGVudChodG1sX2Q3NWM1NGI4ODVmZTQ4ZGJhNGIxMjdhYmVmNjJjMTMyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMTBlMDk3MjE5NGY4NGNhMDg2OWY4Nzk3OTdkODllNDcuYmluZFBvcHVwKHBvcHVwX2Y1MWU4NjAzNzBiNTQzZjJiMGIxMjZhMjk2ZjdiZGIxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfY2JlOWI2Mzg4MWVlNDA1MmI0YTVmNzQ4MTBiYmQ5NDUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45ODc0MTgyLC0xLjEzMzYzNzVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl8xYzVhNGFjZWNiYzQ0MjY3OWVkZDllODhjNzgwZTM3MCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl9jYmU5YjYzODgxZWU0MDUyYjRhNWY3NDgxMGJiZDk0NS5zZXRJY29uKGljb25fMWM1YTRhY2VjYmM0NDI2NzllZGQ5ZTg4Yzc4MGUzNzApOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zZjI3MTZkNTAzYjY0NWQwOGE2OGUwY2UwNTEwYTI3YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81N2E3NDNjMGI5YWY0ZjNkYWMwZTUyNGExMTdmMDRmOSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfNTdhNzQzYzBiOWFmNGYzZGFjMGU1MjRhMTE3ZjA0ZjkiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIEF5bGxvbiAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2YyNzE2ZDUwM2I2NDVkMDhhNjhlMGNlMDUxMGEyN2Euc2V0Q29udGVudChodG1sXzU3YTc0M2MwYjlhZjRmM2RhYzBlNTI0YTExN2YwNGY5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfY2JlOWI2Mzg4MWVlNDA1MmI0YTVmNzQ4MTBiYmQ5NDUuYmluZFBvcHVwKHBvcHVwXzNmMjcxNmQ1MDNiNjQ1ZDA4YTY4ZTBjZTA1MTBhMjdhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZDBiODRhYzljZWFlNDk1Yzk4NmFmYTc1MTJjOTY0ZmYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45OTIyMzk5LC0xLjEzMDY1NDRdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl80OTY2ODg1NDM4N2E0NjFkOTdlYzNjMjc2YzRiN2U2ZCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl9kMGI4NGFjOWNlYWU0OTVjOTg2YWZhNzUxMmM5NjRmZi5zZXRJY29uKGljb25fNDk2Njg4NTQzODdhNDYxZDk3ZWMzYzI3NmM0YjdlNmQpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zYjFiMWY3YzMyYmI0MmI4ODhlYzYxMGYxZWRiYjNmZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yYmZjOGZmYjEzMWQ0ZjA0YTkwYWI5ZDRmNzEzNzhkMyA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfMmJmYzhmZmIxMzFkNGYwNGE5MGFiOWQ0ZjcxMzc4ZDMiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIGNhbGxlam9uIGRlIEJ1cnJ1ZXpvIChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zYjFiMWY3YzMyYmI0MmI4ODhlYzYxMGYxZWRiYjNmZi5zZXRDb250ZW50KGh0bWxfMmJmYzhmZmIxMzFkNGYwNGE5MGFiOWQ0ZjcxMzc4ZDMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kMGI4NGFjOWNlYWU0OTVjOTg2YWZhNzUxMmM5NjRmZi5iaW5kUG9wdXAocG9wdXBfM2IxYjFmN2MzMmJiNDJiODg4ZWM2MTBmMWVkYmIzZmYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8xMzA3MDhhMjI2ODA0ZGYxYmJjNWM1NjM1YzY5YjQ2ZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk5MDAzMywtMS4xMzg2MjQ2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNjk3N2YxNDg4OGE3NDI1Njg1N2VlNmZlYTkwYWNmZTEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fNGI1ZWMyMzhkN2JjNDI4ZWExODZkZTg4M2Y4MGQzNmQgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfMTMwNzA4YTIyNjgwNGRmMWJiYzVjNTYzNWM2OWI0NmQuc2V0SWNvbihpY29uXzRiNWVjMjM4ZDdiYzQyOGVhMTg2ZGU4ODNmODBkMzZkKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDY5MTBhZTg2ZDUzNDAzYmI2ZGE1NmQwNjFjMzg1ZmMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2VlM2VhYTliY2FiNDUwOGE4YzY3MjBiZmY5NDYxZDEgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzdlZTNlYWE5YmNhYjQ1MDhhOGM2NzIwYmZmOTQ2MWQxIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBJc2FhYyBBbGJlbml6IChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kNjkxMGFlODZkNTM0MDNiYjZkYTU2ZDA2MWMzODVmYy5zZXRDb250ZW50KGh0bWxfN2VlM2VhYTliY2FiNDUwOGE4YzY3MjBiZmY5NDYxZDEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8xMzA3MDhhMjI2ODA0ZGYxYmJjNWM1NjM1YzY5YjQ2ZC5iaW5kUG9wdXAocG9wdXBfZDY5MTBhZTg2ZDUzNDAzYmI2ZGE1NmQwNjFjMzg1ZmMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl82NGY3NTlmOTFkNzc0NTJlOWM5ZDc2MDMyOGZmZWRlYiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk5MzU2NjIsLTEuMTM2MDM1N10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzY5NzdmMTQ4ODhhNzQyNTY4NTdlZTZmZWE5MGFjZmUxKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uX2Y5MzJhOTlkM2JjNzQ4YTI4MWZjZDAyZjhkZWNlYjkxID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzY0Zjc1OWY5MWQ3NzQ1MmU5YzlkNzYwMzI4ZmZlZGViLnNldEljb24oaWNvbl9mOTMyYTk5ZDNiYzc0OGEyODFmY2QwMmY4ZGVjZWI5MSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM2N2E3MzI2YjVjYjQ3ZjJiMWZhNWIxMjg0ZDM5MDg4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZjNGFlNGMxMWJmMTQyYTRhOGQwZWYzYzRhM2M3ZGIwID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9mYzRhZTRjMTFiZjE0MmE0YThkMGVmM2M0YTNjN2RiMCIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgY2FsbGUgTWFyIE1lbm9yIChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zNjdhNzMyNmI1Y2I0N2YyYjFmYTViMTI4NGQzOTA4OC5zZXRDb250ZW50KGh0bWxfZmM0YWU0YzExYmYxNDJhNGE4ZDBlZjNjNGEzYzdkYjApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82NGY3NTlmOTFkNzc0NTJlOWM5ZDc2MDMyOGZmZWRlYi5iaW5kUG9wdXAocG9wdXBfMzY3YTczMjZiNWNiNDdmMmIxZmE1YjEyODRkMzkwODgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8zYjI1MDBjYWY1OGU0MzllOWVkMWIzZTc5YWUzMDI1MCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk5NDEzMjUsLTEuMTM0MDE4NF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzY5NzdmMTQ4ODhhNzQyNTY4NTdlZTZmZWE5MGFjZmUxKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzAyZDQxZTY1NTc3NjQ2ZDNiYzExYjYwZDY0NjIyNmE3ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzNiMjUwMGNhZjU4ZTQzOWU5ZWQxYjNlNzlhZTMwMjUwLnNldEljb24oaWNvbl8wMmQ0MWU2NTU3NzY0NmQzYmMxMWI2MGQ2NDYyMjZhNyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFhNzZlM2YwMmI0ODQ3MWFhYWQzMjM3ZTY5OTRhZWFmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E0ZDI1YTBkNGZmZTRjZmRiYmMzYjM1NzQ3YmI5MWY4ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9hNGQyNWEwZDRmZmU0Y2ZkYmJjM2IzNTc0N2JiOTFmOCIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgY2FsbGUgQXVkaXRvcml1bSAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWE3NmUzZjAyYjQ4NDcxYWFhZDMyMzdlNjk5NGFlYWYuc2V0Q29udGVudChodG1sX2E0ZDI1YTBkNGZmZTRjZmRiYmMzYjM1NzQ3YmI5MWY4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfM2IyNTAwY2FmNThlNDM5ZTllZDFiM2U3OWFlMzAyNTAuYmluZFBvcHVwKHBvcHVwXzFhNzZlM2YwMmI0ODQ3MWFhYWQzMjM3ZTY5OTRhZWFmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNjU1YTYxMDQ0ZmYwNDE2NDlkOTJlOGUzNzZmYTAzODggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45OTM5Nzg5LC0xLjEzMzMxMjNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl9iOGM3ZDk1OGUwMDI0MjViOGQ1ZWMzODgzZDI4ZDM5YiA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl82NTVhNjEwNDRmZjA0MTY0OWQ5MmU4ZTM3NmZhMDM4OC5zZXRJY29uKGljb25fYjhjN2Q5NThlMDAyNDI1YjhkNWVjMzg4M2QyOGQzOWIpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zNjU5ZjA5M2I1NDU0Y2RiOWIzMGEzMTYzMmNjMjQxNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mNmViYTk4MjgxZDM0ZTE0YTQ4YTI3NDE3ZGIwMTI5MiA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfZjZlYmE5ODI4MWQzNGUxNGE0OGEyNzQxN2RiMDEyOTIiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIGNhbGxlIFRvcnJlIGRlIGxhIE1hcnF1ZXNhIChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zNjU5ZjA5M2I1NDU0Y2RiOWIzMGEzMTYzMmNjMjQxNS5zZXRDb250ZW50KGh0bWxfZjZlYmE5ODI4MWQzNGUxNGE0OGEyNzQxN2RiMDEyOTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82NTVhNjEwNDRmZjA0MTY0OWQ5MmU4ZTM3NmZhMDM4OC5iaW5kUG9wdXAocG9wdXBfMzY1OWYwOTNiNTQ1NGNkYjliMzBhMzE2MzJjYzI0MTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8yOTMwMjU0MzcxNzg0NTM2OGJlZWE3NzdmNDJjY2ZhZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk5NTUxMDIsLTEuMTI5OTIyOF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzY5NzdmMTQ4ODhhNzQyNTY4NTdlZTZmZWE5MGFjZmUxKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uX2NiMGNmNmNiMjIxNDQxNTQ5MDNiNmYxNWFmOGJhNjljID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzI5MzAyNTQzNzE3ODQ1MzY4YmVlYTc3N2Y0MmNjZmFmLnNldEljb24oaWNvbl9jYjBjZjZjYjIyMTQ0MTU0OTAzYjZmMTVhZjhiYTY5Yyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ2OTk5NGU3NWNmNjQ1NzdhZWRiNGRkMjQxYzI5OWEyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E0NjQxOTFkNGJkMDQxOTQ5NzZlNjY2Mzc1ZWQwN2I2ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9hNDY0MTkxZDRiZDA0MTk0OTc2ZTY2NjM3NWVkMDdiNiIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgRHIuIEp1bGlvIExvcGV6IEFtYml0IChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80Njk5OTRlNzVjZjY0NTc3YWVkYjRkZDI0MWMyOTlhMi5zZXRDb250ZW50KGh0bWxfYTQ2NDE5MWQ0YmQwNDE5NDk3NmU2NjYzNzVlZDA3YjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8yOTMwMjU0MzcxNzg0NTM2OGJlZWE3NzdmNDJjY2ZhZi5iaW5kUG9wdXAocG9wdXBfNDY5OTk0ZTc1Y2Y2NDU3N2FlZGI0ZGQyNDFjMjk5YTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9iNzk3YmYwNWMxMjI0YjZmOTZjOTBmNDY1OTI2ZTI3MSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk5NjMxMzYsLTEuMTMwOTIxM10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzY5NzdmMTQ4ODhhNzQyNTY4NTdlZTZmZWE5MGFjZmUxKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uX2YwODU0MzU2OTNiYzQ1MTVhYWEwMjRlMWEwMTY1MWEwID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyX2I3OTdiZjA1YzEyMjRiNmY5NmM5MGY0NjU5MjZlMjcxLnNldEljb24oaWNvbl9mMDg1NDM1NjkzYmM0NTE1YWFhMDI0ZTFhMDE2NTFhMCk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhkOWZlMWM1YzMyMDQyMTU5ZTc5ZGJmY2U2NTgwZDFmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIxODdkY2QyNDA4MzQ2OTA4NjgxOTFkOGFlYjVhZGU3ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF8yMTg3ZGNkMjQwODM0NjkwODY4MTkxZDhhZWI1YWRlNyIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQXZlbmlkYSBNYXJxdWVzIGRlIExvcyBWZWxleiAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOGQ5ZmUxYzVjMzIwNDIxNTllNzlkYmZjZTY1ODBkMWYuc2V0Q29udGVudChodG1sXzIxODdkY2QyNDA4MzQ2OTA4NjgxOTFkOGFlYjVhZGU3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYjc5N2JmMDVjMTIyNGI2Zjk2YzkwZjQ2NTkyNmUyNzEuYmluZFBvcHVwKHBvcHVwXzhkOWZlMWM1YzMyMDQyMTU5ZTc5ZGJmY2U2NTgwZDFmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMWNiOTJjMzIxMjVhNGU1Nzk0ZGNjZjk3MTA0MGExNTQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45OTY0Nzg3LC0xLjEyOTEyMDldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl9hN2NiYjZlOGVmZmM0MDMyOThmMTg0NmQ0MjY4MDdmNSA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl8xY2I5MmMzMjEyNWE0ZTU3OTRkY2NmOTcxMDQwYTE1NC5zZXRJY29uKGljb25fYTdjYmI2ZThlZmZjNDAzMjk4ZjE4NDZkNDI2ODA3ZjUpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82OWFlY2RmNjAyYmY0MDk2OGJmYzBjYjA1MjA1NmNkNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kNzExYmFkMWE3Y2E0ODJjODAxYTIzMTQ2NmZmMDdmMSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfZDcxMWJhZDFhN2NhNDgyYzgwMWEyMzE0NjZmZjA3ZjEiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIERvY3RvciBBbG9uc28gZGUgRXNwZWpvIChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82OWFlY2RmNjAyYmY0MDk2OGJmYzBjYjA1MjA1NmNkNy5zZXRDb250ZW50KGh0bWxfZDcxMWJhZDFhN2NhNDgyYzgwMWEyMzE0NjZmZjA3ZjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8xY2I5MmMzMjEyNWE0ZTU3OTRkY2NmOTcxMDQwYTE1NC5iaW5kUG9wdXAocG9wdXBfNjlhZWNkZjYwMmJmNDA5NjhiZmMwY2IwNTIwNTZjZDcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl85OTgwNjU2YWNkZjE0NWMxOWVjZDBiZTEzMDU2ZTM5OSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk5MjIzOTksLTEuMTMwNjU0NF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzY5NzdmMTQ4ODhhNzQyNTY4NTdlZTZmZWE5MGFjZmUxKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzM3NDBiMzA4ZmZmYTRjMDdiMzcxYWI1OWI3YzkxOTEyID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzk5ODA2NTZhY2RmMTQ1YzE5ZWNkMGJlMTMwNTZlMzk5LnNldEljb24oaWNvbl8zNzQwYjMwOGZmZmE0YzA3YjM3MWFiNTliN2M5MTkxMik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE0OWVlOWI2OWIyNDRjZWQ4ODc5Nzc4MzExYjUzOTY3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzcxOTJhMzFmOTI4ODRlNjZhNDQ0M2QzZTY5NjQ0NzRmID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF83MTkyYTMxZjkyODg0ZTY2YTQ0NDNkM2U2OTY0NDc0ZiIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgRG9jdG9yIEpvc2UgVGFwaWEgU2FueiAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTQ5ZWU5YjY5YjI0NGNlZDg4Nzk3NzgzMTFiNTM5Njcuc2V0Q29udGVudChodG1sXzcxOTJhMzFmOTI4ODRlNjZhNDQ0M2QzZTY5NjQ0NzRmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOTk4MDY1NmFjZGYxNDVjMTllY2QwYmUxMzA1NmUzOTkuYmluZFBvcHVwKHBvcHVwXzE0OWVlOWI2OWIyNDRjZWQ4ODc5Nzc4MzExYjUzOTY3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYWYzNjVkYjFmNjgzNGY3YTljMjE3Y2YyNzMyNzgxZjEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45ODY5MzIyLC0xLjEzMjcyOTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl9iYTYzODE5YjI3YzI0ZTgwOTc4ZjU1YjJiOWQxMjI4ZCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl9hZjM2NWRiMWY2ODM0ZjdhOWMyMTdjZjI3MzI3ODFmMS5zZXRJY29uKGljb25fYmE2MzgxOWIyN2MyNGU4MDk3OGY1NWIyYjlkMTIyOGQpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMTU2NWY1NTVhNDQ0NmI1OGM4OTIyMTRkYTBiNzJkOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMTk5ZGIyZjAxZTg0NzgzYmVhMjUxMzE5YzE3MDRkZiA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfZDE5OWRiMmYwMWU4NDc4M2JlYTI1MTMxOWMxNzA0ZGYiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhcnJpbCBNYW5yZXNhIChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iMTU2NWY1NTVhNDQ0NmI1OGM4OTIyMTRkYTBiNzJkOS5zZXRDb250ZW50KGh0bWxfZDE5OWRiMmYwMWU4NDc4M2JlYTI1MTMxOWMxNzA0ZGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9hZjM2NWRiMWY2ODM0ZjdhOWMyMTdjZjI3MzI3ODFmMS5iaW5kUG9wdXAocG9wdXBfYjE1NjVmNTU1YTQ0NDZiNThjODkyMjE0ZGEwYjcyZDkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9hZjM2ODc5MTVkZDQ0MWY3YmQyN2U5NmQ4ZTE0YzFlYyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4ODkyMDcsLTEuMTI2NDg5Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzY5NzdmMTQ4ODhhNzQyNTY4NTdlZTZmZWE5MGFjZmUxKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uX2RlZjZmMjA4ODMyMDRhMzNiM2MwMTk5ZTEwMjQwZWE3ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyX2FmMzY4NzkxNWRkNDQxZjdiZDI3ZTk2ZDhlMTRjMWVjLnNldEljb24oaWNvbl9kZWY2ZjIwODgzMjA0YTMzYjNjMDE5OWUxMDI0MGVhNyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBiZTQ5MDcwMjk0NzQzNzI5ODdhOGEyNGVhM2E4MjZlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I0ZTdiNDM4MWQ4NTQwNTk5ODVkYmU0NTg5MTE2MDJlID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9iNGU3YjQzODFkODU0MDU5OTg1ZGJlNDU4OTExNjAyZSIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgQW50b25pbyBQdWlnIChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wYmU0OTA3MDI5NDc0MzcyOTg3YThhMjRlYTNhODI2ZS5zZXRDb250ZW50KGh0bWxfYjRlN2I0MzgxZDg1NDA1OTk4NWRiZTQ1ODkxMTYwMmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9hZjM2ODc5MTVkZDQ0MWY3YmQyN2U5NmQ4ZTE0YzFlYy5iaW5kUG9wdXAocG9wdXBfMGJlNDkwNzAyOTQ3NDM3Mjk4N2E4YTI0ZWEzYTgyNmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8yNWM0ZjQyNTQwODE0NzdjYjc2MDdiMWVlNWM2NDEzNCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4ODIwMSwtMS4xMjc4MzMzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNjk3N2YxNDg4OGE3NDI1Njg1N2VlNmZlYTkwYWNmZTEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fOGFlYWExODlhMDk4NDhjZDkzYWVmMzcyYWMxMDlmM2YgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfMjVjNGY0MjU0MDgxNDc3Y2I3NjA3YjFlZTVjNjQxMzQuc2V0SWNvbihpY29uXzhhZWFhMTg5YTA5ODQ4Y2Q5M2FlZjM3MmFjMTA5ZjNmKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWUwMTI3NzJjZjU3NDk1NGE5NDNjNTAyNGQzYTc0NDIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmMyYWY5YmVlMDcwNDZhODk5NmY0ZGYxNzM4NDUxMWYgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2JjMmFmOWJlZTA3MDQ2YTg5OTZmNGRmMTczODQ1MTFmIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBTYW4gSWduYWNpbyBkZSBMb3lvbGEgKFpvbmEgMS0yLTMpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzllMDEyNzcyY2Y1NzQ5NTRhOTQzYzUwMjRkM2E3NDQyLnNldENvbnRlbnQoaHRtbF9iYzJhZjliZWUwNzA0NmE4OTk2ZjRkZjE3Mzg0NTExZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzI1YzRmNDI1NDA4MTQ3N2NiNzYwN2IxZWU1YzY0MTM0LmJpbmRQb3B1cChwb3B1cF85ZTAxMjc3MmNmNTc0OTU0YTk0M2M1MDI0ZDNhNzQ0Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzVkY2FmMTIyZTFhNjRhZjY4N2Y3Y2FjNmE1Zjg5MTdhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTg5NTkzMywtMS4xMjYxNjc1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNjk3N2YxNDg4OGE3NDI1Njg1N2VlNmZlYTkwYWNmZTEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fZjA1YWI2MDllODNhNDUwMWI3YTYxOTM2ODhlMTMxNzEgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfNWRjYWYxMjJlMWE2NGFmNjg3ZjdjYWM2YTVmODkxN2Euc2V0SWNvbihpY29uX2YwNWFiNjA5ZTgzYTQ1MDFiN2E2MTkzNjg4ZTEzMTcxKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTkyZDgyNjNlZTJiNDQ5OGIwZjZhNjc1MzY5MjM3MGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2VmZTljN2MzZjMwNDRhNTkyYmJlODQxMDFmZmVmOWIgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzdlZmU5YzdjM2YzMDQ0YTU5MmJiZTg0MTAxZmZlZjliIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBTYW4gTWFydGluIGRlIFBvcnJlcyAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTkyZDgyNjNlZTJiNDQ5OGIwZjZhNjc1MzY5MjM3MGYuc2V0Q29udGVudChodG1sXzdlZmU5YzdjM2YzMDQ0YTU5MmJiZTg0MTAxZmZlZjliKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNWRjYWYxMjJlMWE2NGFmNjg3ZjdjYWM2YTVmODkxN2EuYmluZFBvcHVwKHBvcHVwX2U5MmQ4MjYzZWUyYjQ0OThiMGY2YTY3NTM2OTIzNzBmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNDMxZTgwYjc1MDUyNGY0OTk5OTczYjMyNjliYjlkZTMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45ODkzODI2LC0xLjEyNjY1NjFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl85NmFiOGM3YWE3NTg0ZmY4OGYxNzk3NzFiMmNjMDQwMSA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl80MzFlODBiNzUwNTI0ZjQ5OTk5NzNiMzI2OWJiOWRlMy5zZXRJY29uKGljb25fOTZhYjhjN2FhNzU4NGZmODhmMTc5NzcxYjJjYzA0MDEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yNzBjNTc3NDgwYzU0MzQ0OTI0N2QxNmEwMjNiYWVhNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zYzc4OTk0ZjYyMTY0NTY2YjkyNzQ3OWZmNzFmNDdkZSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfM2M3ODk5NGY2MjE2NDU2NmI5Mjc0NzlmZjcxZjQ3ZGUiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIEphY29ibyBkZSBsYXMgTGV5ZXMgKFpvbmEgMS0yLTMpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI3MGM1Nzc0ODBjNTQzNDQ5MjQ3ZDE2YTAyM2JhZWE1LnNldENvbnRlbnQoaHRtbF8zYzc4OTk0ZjYyMTY0NTY2YjkyNzQ3OWZmNzFmNDdkZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzQzMWU4MGI3NTA1MjRmNDk5OTk3M2IzMjY5YmI5ZGUzLmJpbmRQb3B1cChwb3B1cF8yNzBjNTc3NDgwYzU0MzQ0OTI0N2QxNmEwMjNiYWVhNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzZiY2U5NjdjMGE0MzRlNmI5ZWEyNjNmY2UzYjdkMWFjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTg3NTIzNSwtMS4xMjc1NDk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNjk3N2YxNDg4OGE3NDI1Njg1N2VlNmZlYTkwYWNmZTEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fNjQzYTUyMWM3MGVmNGNlMjhmZGI5MGI3YWMyNjY5ZjIgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfNmJjZTk2N2MwYTQzNGU2YjllYTI2M2ZjZTNiN2QxYWMuc2V0SWNvbihpY29uXzY0M2E1MjFjNzBlZjRjZTI4ZmRiOTBiN2FjMjY2OWYyKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODExN2UxZTgyYjk4NGFlZDg3MjdkOTgwYTY4ZTM1YzcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjQwOWZkYWM0MzZmNDljN2EzMmQxOTMyZDFkNzI3ZDEgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2Y0MDlmZGFjNDM2ZjQ5YzdhMzJkMTkzMmQxZDcyN2QxIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBkZSBsYSBNZXJjZWQgKFpvbmEgMS0yLTMpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzgxMTdlMWU4MmI5ODRhZWQ4NzI3ZDk4MGE2OGUzNWM3LnNldENvbnRlbnQoaHRtbF9mNDA5ZmRhYzQzNmY0OWM3YTMyZDE5MzJkMWQ3MjdkMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzZiY2U5NjdjMGE0MzRlNmI5ZWEyNjNmY2UzYjdkMWFjLmJpbmRQb3B1cChwb3B1cF84MTE3ZTFlODJiOTg0YWVkODcyN2Q5ODBhNjhlMzVjNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzBmNjAwNGVkNzViYzQxMWNiMTU3MGVhODk5NDUwYTBiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTkyNTUzOSwtMS4xMzMzNzddLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl9lZjU0M2U2ZGUzNjY0YWU1OWYxNmI0YTlmYzkzMjY1ZSA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl8wZjYwMDRlZDc1YmM0MTFjYjE1NzBlYTg5OTQ1MGEwYi5zZXRJY29uKGljb25fZWY1NDNlNmRlMzY2NGFlNTlmMTZiNGE5ZmM5MzI2NWUpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jNDZiMmNlZDc4MGU0ZjE0YWEyYjlhMGRiNDc5MWMyYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80ODAwYWFmZjdhNGY0NGZjOWFhNGU2MzRmYmQ3ZjJkZCA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfNDgwMGFhZmY3YTRmNDRmYzlhYTRlNjM0ZmJkN2YyZGQiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIGNhbGxlIGRvY3RvciBSb21hbiBBbGJlcmNhIChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNDZiMmNlZDc4MGU0ZjE0YWEyYjlhMGRiNDc5MWMyYS5zZXRDb250ZW50KGh0bWxfNDgwMGFhZmY3YTRmNDRmYzlhYTRlNjM0ZmJkN2YyZGQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wZjYwMDRlZDc1YmM0MTFjYjE1NzBlYTg5OTQ1MGEwYi5iaW5kUG9wdXAocG9wdXBfYzQ2YjJjZWQ3ODBlNGYxNGFhMmI5YTBkYjQ3OTFjMmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl81OTYxOTM4ODY3ZDA0MmQwYWY1MGYwMWViOWU5MjllOCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk5MjA1ODIsLTEuMTM1NjIwMl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzY5NzdmMTQ4ODhhNzQyNTY4NTdlZTZmZWE5MGFjZmUxKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzc4N2JhODk0OWRkMzRlMjE4YWYyZjBmZTNjMjhmNGY1ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzU5NjE5Mzg4NjdkMDQyZDBhZjUwZjAxZWI5ZTkyOWU4LnNldEljb24oaWNvbl83ODdiYTg5NDlkZDM0ZTIxOGFmMmYwZmUzYzI4ZjRmNSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBlYjVkZTJiYTE2MDQ4NjE4NDZmYzc5NWM1MmI3MTc0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VjMmRlMzU5ZTkwNDRmMDc4ZDQyZTYyOGM0YmM3ZGIyID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9lYzJkZTM1OWU5MDQ0ZjA3OGQ0MmU2MjhjNGJjN2RiMiIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgY2FsbGUgSm9hcXVpbiBCbHVtZSAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGViNWRlMmJhMTYwNDg2MTg0NmZjNzk1YzUyYjcxNzQuc2V0Q29udGVudChodG1sX2VjMmRlMzU5ZTkwNDRmMDc4ZDQyZTYyOGM0YmM3ZGIyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNTk2MTkzODg2N2QwNDJkMGFmNTBmMDFlYjllOTI5ZTguYmluZFBvcHVwKHBvcHVwXzBlYjVkZTJiYTE2MDQ4NjE4NDZmYzc5NWM1MmI3MTc0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNmFkOWMxNWVmZWYwNGUxN2FjODgwNzhiYzRjNTM2ZjYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45ODg1MjgyLC0xLjEzMjc1NjVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl9mYzYxMzJlNDYwY2I0ZThiYWJkOGVkZTI1ZjMxYzM2NyA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl82YWQ5YzE1ZWZlZjA0ZTE3YWM4ODA3OGJjNGM1MzZmNi5zZXRJY29uKGljb25fZmM2MTMyZTQ2MGNiNGU4YmFiZDhlZGUyNWYzMWMzNjcpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83ZjVhZjE1NDNkMGU0MDNmODEzNDMyODAyNWU2MTczZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hYzU3NzNlODQxMTI0ZjMwOWM4MjJjMjQ0NmUxMDlmMiA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfYWM1NzczZTg0MTEyNGYzMDljODIyYzI0NDZlMTA5ZjIiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIGNhbGxlIFBvcnRpbGxvIGRlIFNhbiBBbnRvbmlvIChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83ZjVhZjE1NDNkMGU0MDNmODEzNDMyODAyNWU2MTczZi5zZXRDb250ZW50KGh0bWxfYWM1NzczZTg0MTEyNGYzMDljODIyYzI0NDZlMTA5ZjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82YWQ5YzE1ZWZlZjA0ZTE3YWM4ODA3OGJjNGM1MzZmNi5iaW5kUG9wdXAocG9wdXBfN2Y1YWYxNTQzZDBlNDAzZjgxMzQzMjgwMjVlNjE3M2YpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl82MDZiNGY0YzUxNmE0NTVjYWEzYWJjOGVmZGY2Mzg3NiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk5MTkzOTYsLTEuMTM0NDQ5N10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzY5NzdmMTQ4ODhhNzQyNTY4NTdlZTZmZWE5MGFjZmUxKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uX2U3OWFhMzY3NjgyMjRiZmViZDE4ZGFiMzQ2ZTZiNmE1ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzYwNmI0ZjRjNTE2YTQ1NWNhYTNhYmM4ZWZkZjYzODc2LnNldEljb24oaWNvbl9lNzlhYTM2NzY4MjI0YmZlYmQxOGRhYjM0NmU2YjZhNSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2UzNzE3YTJkOWY5YzQyZjViNGNkYjNmMjViYmIwZDEwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RkMjZlNWI1OGIzMTQ2N2E4OGVjMzE2ZTkzNmMzMzhmID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9kZDI2ZTViNThiMzE0NjdhODhlYzMxNmU5MzZjMzM4ZiIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgY2FsbGUgU2llcnJhIGRlIEFzY295IChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lMzcxN2EyZDlmOWM0MmY1YjRjZGIzZjI1YmJiMGQxMC5zZXRDb250ZW50KGh0bWxfZGQyNmU1YjU4YjMxNDY3YTg4ZWMzMTZlOTM2YzMzOGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82MDZiNGY0YzUxNmE0NTVjYWEzYWJjOGVmZGY2Mzg3Ni5iaW5kUG9wdXAocG9wdXBfZTM3MTdhMmQ5ZjljNDJmNWI0Y2RiM2YyNWJiYjBkMTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl81MzUzZjAwYTUxOTY0MjQ4YTc5NDNkNDIwZGE2YTM3NiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4OTM1MTksLTEuMTMxMDI4Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzY5NzdmMTQ4ODhhNzQyNTY4NTdlZTZmZWE5MGFjZmUxKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzUzZmEzYjAwZWI0YTRjNTY4YWVmOTUwZWE4ODdlNTIyID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzUzNTNmMDBhNTE5NjQyNDhhNzk0M2Q0MjBkYTZhMzc2LnNldEljb24oaWNvbl81M2ZhM2IwMGViNGE0YzU2OGFlZjk1MGVhODg3ZTUyMik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NlZmZmZTI4Y2ExZTQ0NDM4YmI4MTZkZjNmMDdhMDY1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZhODRjMTg5YjYxNTQ1Y2RhOWE0YTIxZGIyNzYyNTY4ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF82YTg0YzE4OWI2MTU0NWNkYTlhNGEyMWRiMjc2MjU2OCIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgQ2FybG9zIElJSSAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2VmZmZlMjhjYTFlNDQ0MzhiYjgxNmRmM2YwN2EwNjUuc2V0Q29udGVudChodG1sXzZhODRjMTg5YjYxNTQ1Y2RhOWE0YTIxZGIyNzYyNTY4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNTM1M2YwMGE1MTk2NDI0OGE3OTQzZDQyMGRhNmEzNzYuYmluZFBvcHVwKHBvcHVwX2NlZmZmZTI4Y2ExZTQ0NDM4YmI4MTZkZjNmMDdhMDY1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfN2I4YWRhNWIzNjBkNDIyYThlMDEzZWU0YmNhMThlMGEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45OTE4OTAxLC0xLjEzNDcyMl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzY5NzdmMTQ4ODhhNzQyNTY4NTdlZTZmZWE5MGFjZmUxKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzViMDQ2YzdmOGZhNTQwOGE4YTA3ZjMwOWRjYWVlNTQwID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzdiOGFkYTViMzYwZDQyMmE4ZTAxM2VlNGJjYTE4ZTBhLnNldEljb24oaWNvbl81YjA0NmM3ZjhmYTU0MDhhOGEwN2YzMDlkY2FlZTU0MCk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NhMmVlOGYzNjIzYzQ3ZmFiZjVjMTNlZDk1MWU3MDYyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk5MmQyODRkNWJhYTQ1NjQ5YWFmNTc1YWU2MjJiMjZmID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF85OTJkMjg0ZDViYWE0NTY0OWFhZjU3NWFlNjIyYjI2ZiIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgY2FsbGUgU2FudGEgTWFydGEgKFpvbmEgMS0yLTMpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NhMmVlOGYzNjIzYzQ3ZmFiZjVjMTNlZDk1MWU3MDYyLnNldENvbnRlbnQoaHRtbF85OTJkMjg0ZDViYWE0NTY0OWFhZjU3NWFlNjIyYjI2Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzdiOGFkYTViMzYwZDQyMmE4ZTAxM2VlNGJjYTE4ZTBhLmJpbmRQb3B1cChwb3B1cF9jYTJlZThmMzYyM2M0N2ZhYmY1YzEzZWQ5NTFlNzA2Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzY2MmZlZDhlYzFkYTQ5YmM5OWQ5ZWNkNjdhMjU4ZDE1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTkxMzE4NCwtMS4xMzI4NjVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl9jN2Q0ZmFkOGIwODk0YzE5YWMyYzliYmVjODU3YTc5YyA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl82NjJmZWQ4ZWMxZGE0OWJjOTlkOWVjZDY3YTI1OGQxNS5zZXRJY29uKGljb25fYzdkNGZhZDhiMDg5NGMxOWFjMmM5YmJlYzg1N2E3OWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jNjJiMjBlYmRjY2M0ODY2YTlmOGVkODY1MDcxYzRhMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80Y2ZlZTI5YzcyODc0MjNkYTk1YzNlYTU5MWI4M2QyMSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfNGNmZWUyOWM3Mjg3NDIzZGE5NWMzZWE1OTFiODNkMjEiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIEJhdGFsbGEgZGUgbGFzIEZsb3JlcyAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzYyYjIwZWJkY2NjNDg2NmE5ZjhlZDg2NTA3MWM0YTAuc2V0Q29udGVudChodG1sXzRjZmVlMjljNzI4NzQyM2RhOTVjM2VhNTkxYjgzZDIxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNjYyZmVkOGVjMWRhNDliYzk5ZDllY2Q2N2EyNThkMTUuYmluZFBvcHVwKHBvcHVwX2M2MmIyMGViZGNjYzQ4NjZhOWY4ZWQ4NjUwNzFjNGEwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOTJjMDZjZTBhMjliNDM0MTlhYjUxYzdmYzhiZTA4NjUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45OTA3Mzc3LC0xLjEzMDY3NzFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl8zOWE3NzAyNDE5NTI0ZGFjYjg0MjYzZGEwMDk2MGU5MyA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl85MmMwNmNlMGEyOWI0MzQxOWFiNTFjN2ZjOGJlMDg2NS5zZXRJY29uKGljb25fMzlhNzcwMjQxOTUyNGRhY2I4NDI2M2RhMDA5NjBlOTMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iZmZlMWIyNzI1NzQ0YjNlOWVmZTAxNjk2MGUzZTFjYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85ZmUxZGYzMDUxMjM0YmViODJhMzAyYjc1YjczYjg2ZiA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfOWZlMWRmMzA1MTIzNGJlYjgyYTMwMmI3NWI3M2I4NmYiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIGNhbGxlIExlcGFudG8gKFpvbmEgMS0yLTMpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JmZmUxYjI3MjU3NDRiM2U5ZWZlMDE2OTYwZTNlMWNhLnNldENvbnRlbnQoaHRtbF85ZmUxZGYzMDUxMjM0YmViODJhMzAyYjc1YjczYjg2Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzkyYzA2Y2UwYTI5YjQzNDE5YWI1MWM3ZmM4YmUwODY1LmJpbmRQb3B1cChwb3B1cF9iZmZlMWIyNzI1NzQ0YjNlOWVmZTAxNjk2MGUzZTFjYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzhiMzA1NTBmNzhmYjRiMGI4OTg3NjNmYmRkYzUwYjQwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTkzOTg0MSwtMS4xMzI4MjE5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNjk3N2YxNDg4OGE3NDI1Njg1N2VlNmZlYTkwYWNmZTEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fOWVkODQ5ZDViNmRkNGY0MTlhNGU1NDgxMThjYWZjYjMgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfOGIzMDU1MGY3OGZiNGIwYjg5ODc2M2ZiZGRjNTBiNDAuc2V0SWNvbihpY29uXzllZDg0OWQ1YjZkZDRmNDE5YTRlNTQ4MTE4Y2FmY2IzKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjhmZGE2NmIyMWNhNDQwOGE2NWJhYzkxZTc4N2Y3NzMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2EwZmViMjM2ZjVjNDRhYjlmYTAzOGIzZWM2MTFlMTYgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzNhMGZlYjIzNmY1YzQ0YWI5ZmEwMzhiM2VjNjExZTE2IiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBjYWxsZSBKb3NlIEJhbGxlc3RlciAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjhmZGE2NmIyMWNhNDQwOGE2NWJhYzkxZTc4N2Y3NzMuc2V0Q29udGVudChodG1sXzNhMGZlYjIzNmY1YzQ0YWI5ZmEwMzhiM2VjNjExZTE2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOGIzMDU1MGY3OGZiNGIwYjg5ODc2M2ZiZGRjNTBiNDAuYmluZFBvcHVwKHBvcHVwXzY4ZmRhNjZiMjFjYTQ0MDhhNjViYWM5MWU3ODdmNzczKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZjVhZDgyNTcwZmY4NDY5YTkyYjVlYTg3ZDkzOTYxZjcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45OTMwMjAzLC0xLjEzMjk3OTFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl81MGZjNzJlZTI5Mzg0YzNiOWYxNGY4MWM4ODVjZDA4YSA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl9mNWFkODI1NzBmZjg0NjlhOTJiNWVhODdkOTM5NjFmNy5zZXRJY29uKGljb25fNTBmYzcyZWUyOTM4NGMzYjlmMTRmODFjODg1Y2QwOGEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNDFhNjYwYTc5MTI0ODMyYjYxYjBlZmJiNjlkOTU3ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83MzU2MDVmYTZjNmM0N2VhYWFlMDk3NjMwYzUyODI5YyA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfNzM1NjA1ZmE2YzZjNDdlYWFhZTA5NzYzMGM1MjgyOWMiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIGNhbGxlIFJpbyBBcmdvcyAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDQxYTY2MGE3OTEyNDgzMmI2MWIwZWZiYjY5ZDk1N2Quc2V0Q29udGVudChodG1sXzczNTYwNWZhNmM2YzQ3ZWFhYWUwOTc2MzBjNTI4MjljKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZjVhZDgyNTcwZmY4NDY5YTkyYjVlYTg3ZDkzOTYxZjcuYmluZFBvcHVwKHBvcHVwXzA0MWE2NjBhNzkxMjQ4MzJiNjFiMGVmYmI2OWQ5NTdkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYjA2Y2FlNTYwODI3NDcxOWI5YmMxMTlhODMzZWYxYTEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45OTEwMTE3LC0xLjEzMTkyNzFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl82NjM0MGI2MzdhYjU0MTMzOGE4YTNiM2YzZmMwMDBhYSA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl9iMDZjYWU1NjA4Mjc0NzE5YjliYzExOWE4MzNlZjFhMS5zZXRJY29uKGljb25fNjYzNDBiNjM3YWI1NDEzMzhhOGEzYjNmM2ZjMDAwYWEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yYmEzNmUwNDRhOWQ0ZTVmOGMxZTU4YzA0M2E2NjdjYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81ZGE1ODk4OWFmMDU0ODdkYmM4YTc5NWQzOGExNDQwMSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfNWRhNTg5ODlhZjA1NDg3ZGJjOGE3OTVkMzhhMTQ0MDEiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIGNhbGxlIEp1bnRlcm9uZXMgKFpvbmEgMS0yLTMpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJiYTM2ZTA0NGE5ZDRlNWY4YzFlNThjMDQzYTY2N2NhLnNldENvbnRlbnQoaHRtbF81ZGE1ODk4OWFmMDU0ODdkYmM4YTc5NWQzOGExNDQwMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2IwNmNhZTU2MDgyNzQ3MTliOWJjMTE5YTgzM2VmMWExLmJpbmRQb3B1cChwb3B1cF8yYmEzNmUwNDRhOWQ0ZTVmOGMxZTU4YzA0M2E2NjdjYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzAwZTJlMTdiOTQ3NTRkNmU5YTZlMjE2N2NjODgxYjI4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTkwMjE2MywtMS4xMjc1MTE3XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNjk3N2YxNDg4OGE3NDI1Njg1N2VlNmZlYTkwYWNmZTEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fYTg5YmNlOWM3MjQzNDA3MmFkYTQ5ZjMzZGI2ZmVmNjUgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfMDBlMmUxN2I5NDc1NGQ2ZTlhNmUyMTY3Y2M4ODFiMjguc2V0SWNvbihpY29uX2E4OWJjZTljNzI0MzQwNzJhZGE0OWYzM2RiNmZlZjY1KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDAzMWY5OGE4YjM2NDRlNmJkZDUwODExY2ZiZjAxNGQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDE5Yzk4Y2M1OWQ2NDNhYmFiNWE5ZTdhMmNkMWMzNDEgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzQxOWM5OGNjNTlkNjQzYWJhYjVhOWU3YTJjZDFjMzQxIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBjYWxsZSBQdWVydGEgTnVldmEgKFpvbmEgMS0yLTMpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQwMzFmOThhOGIzNjQ0ZTZiZGQ1MDgxMWNmYmYwMTRkLnNldENvbnRlbnQoaHRtbF80MTljOThjYzU5ZDY0M2FiYWI1YTllN2EyY2QxYzM0MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzAwZTJlMTdiOTQ3NTRkNmU5YTZlMjE2N2NjODgxYjI4LmJpbmRQb3B1cChwb3B1cF80MDMxZjk4YThiMzY0NGU2YmRkNTA4MTFjZmJmMDE0ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2NlNTY2Y2FiMjRkNTQ4ZDFhOWQyMTk4N2IwNWIyZDU4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTg4OTI3MiwtMS4xMzQ2MTU4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNjk3N2YxNDg4OGE3NDI1Njg1N2VlNmZlYTkwYWNmZTEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fNWFlNDdkMTExZThiNDVjZGJlZTk2ZmEwNGIxODM4YTMgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfY2U1NjZjYWIyNGQ1NDhkMWE5ZDIxOTg3YjA1YjJkNTguc2V0SWNvbihpY29uXzVhZTQ3ZDExMWU4YjQ1Y2RiZWU5NmZhMDRiMTgzOGEzKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzA1OTBlZGEwYmVlNDQyY2IzYTZlYzNhMjU5OWFjNjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzM2NWMyOWI1NDk4NDRjZDg5NTg5NjQzMzY5NmViMjIgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2MzNjVjMjliNTQ5ODQ0Y2Q4OTU4OTY0MzM2OTZlYjIyIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBKZXJvbmltbyBkZSBSb2RhIChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zMDU5MGVkYTBiZWU0NDJjYjNhNmVjM2EyNTk5YWM2MS5zZXRDb250ZW50KGh0bWxfYzM2NWMyOWI1NDk4NDRjZDg5NTg5NjQzMzY5NmViMjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jZTU2NmNhYjI0ZDU0OGQxYTlkMjE5ODdiMDViMmQ1OC5iaW5kUG9wdXAocG9wdXBfMzA1OTBlZGEwYmVlNDQyY2IzYTZlYzNhMjU5OWFjNjEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl82MmRmYjBlYmYxZDg0NDA3OTY2ZTQyNDM3M2YyODFhZSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk5Mjk1OTgsLTEuMTMzOTc4Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzY5NzdmMTQ4ODhhNzQyNTY4NTdlZTZmZWE5MGFjZmUxKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uX2Q1MGZlMTNjMzk0MzQ5ODM5M2JmY2ZhMDVjZjkwODg4ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzYyZGZiMGViZjFkODQ0MDc5NjZlNDI0MzczZjI4MWFlLnNldEljb24oaWNvbl9kNTBmZTEzYzM5NDM0OTgzOTNiZmNmYTA1Y2Y5MDg4OCk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU4MTE0M2Q5NGFjYjQ3ZWFhZTI3ZTMzMjhhZGYwZjI3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzlhYWUzMmU3ZjU0ZDQ4NjJhYjBmM2RiZWM0NTUzYWI3ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF85YWFlMzJlN2Y1NGQ0ODYyYWIwZjNkYmVjNDU1M2FiNyIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgY2FsbGUgQ3JvbmlzdGEgQ2FybG9zIFZhbGNhcmNlbCAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTgxMTQzZDk0YWNiNDdlYWFlMjdlMzMyOGFkZjBmMjcuc2V0Q29udGVudChodG1sXzlhYWUzMmU3ZjU0ZDQ4NjJhYjBmM2RiZWM0NTUzYWI3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNjJkZmIwZWJmMWQ4NDQwNzk2NmU0MjQzNzNmMjgxYWUuYmluZFBvcHVwKHBvcHVwXzU4MTE0M2Q5NGFjYjQ3ZWFhZTI3ZTMzMjhhZGYwZjI3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYzY1YTUyMjdhYTllNGNkZTg4NGE3MDYwNjRlMjA5MzggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45ODk0MDI0LC0xLjEzNTY4OTddLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl9iNjc4ZjJmYjJiODA0ZmFkYmY1MTUyYmIwMDBlNjAzNyA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl9jNjVhNTIyN2FhOWU0Y2RlODg0YTcwNjA2NGUyMDkzOC5zZXRJY29uKGljb25fYjY3OGYyZmIyYjgwNGZhZGJmNTE1MmJiMDAwZTYwMzcpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hNzdhYmJlYmIwZDM0ZjlmYTIwNTljZjNmMGNmYjVkNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wOGY2YWQ2YWJiODQ0YzcwOWMxYTVlYzNjYmY2OGU3NSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfMDhmNmFkNmFiYjg0NGM3MDljMWE1ZWMzY2JmNjhlNzUiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIFBhc29zIGRlIFNhbnRpYWdvIChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hNzdhYmJlYmIwZDM0ZjlmYTIwNTljZjNmMGNmYjVkNS5zZXRDb250ZW50KGh0bWxfMDhmNmFkNmFiYjg0NGM3MDljMWE1ZWMzY2JmNjhlNzUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jNjVhNTIyN2FhOWU0Y2RlODg0YTcwNjA2NGUyMDkzOC5iaW5kUG9wdXAocG9wdXBfYTc3YWJiZWJiMGQzNGY5ZmEyMDU5Y2YzZjBjZmI1ZDUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl82NGY4ZTRhNzliZDM0ZjVlYTZjNmYzMGI4ODc4YWRkNSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk5MTk5MTIsLTEuMTM2MDIwMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzY5NzdmMTQ4ODhhNzQyNTY4NTdlZTZmZWE5MGFjZmUxKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzI2NWUyYjAzOTUwNzQ1MGY4MzYzNTk5Njc3YjU0ZDU5ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzY0ZjhlNGE3OWJkMzRmNWVhNmM2ZjMwYjg4NzhhZGQ1LnNldEljb24oaWNvbl8yNjVlMmIwMzk1MDc0NTBmODM2MzU5OTY3N2I1NGQ1OSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZjNWNiMzhkYzNkNDQ0MzM5OTBlYWMzYzAyMzlhMDc4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FjMDYwYTQyNWNjMjQ4OTFhZjk0ZTg0ZTQ2MzI2MjAyID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9hYzA2MGE0MjVjYzI0ODkxYWY5NGU4NGU0NjMyNjIwMiIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgU2VuZGEgUGljYXpvIChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mYzVjYjM4ZGMzZDQ0NDMzOTkwZWFjM2MwMjM5YTA3OC5zZXRDb250ZW50KGh0bWxfYWMwNjBhNDI1Y2MyNDg5MWFmOTRlODRlNDYzMjYyMDIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82NGY4ZTRhNzliZDM0ZjVlYTZjNmYzMGI4ODc4YWRkNS5iaW5kUG9wdXAocG9wdXBfZmM1Y2IzOGRjM2Q0NDQzMzk5MGVhYzNjMDIzOWEwNzgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl85NDYzOGIyMjBjYmY0NWFiOWMyOTZiM2IxNzY5YTMyOCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk5MTg2NzIsLTEuMTM5NjI0N10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzY5NzdmMTQ4ODhhNzQyNTY4NTdlZTZmZWE5MGFjZmUxKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzI2NDEzMDc1YTM0ZjRhODY5YzFkZjA5ZWIzYzFjZGNhID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzk0NjM4YjIyMGNiZjQ1YWI5YzI5NmIzYjE3NjlhMzI4LnNldEljb24oaWNvbl8yNjQxMzA3NWEzNGY0YTg2OWMxZGYwOWViM2MxY2RjYSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2YwZjc5Y2RhYjIyODQ0YmU4OTgwMmZlMzM2NmE2Mzc2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M3OTI5NTk1ZjY3NjRkNWY5NjhlM2U5OWQxM2JkZjMwID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9jNzkyOTU5NWY2NzY0ZDVmOTY4ZTNlOTlkMTNiZGYzMCIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgZGVsIEVtaWdyYW50ZSAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjBmNzljZGFiMjI4NDRiZTg5ODAyZmUzMzY2YTYzNzYuc2V0Q29udGVudChodG1sX2M3OTI5NTk1ZjY3NjRkNWY5NjhlM2U5OWQxM2JkZjMwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOTQ2MzhiMjIwY2JmNDVhYjljMjk2YjNiMTc2OWEzMjguYmluZFBvcHVwKHBvcHVwX2YwZjc5Y2RhYjIyODQ0YmU4OTgwMmZlMzM2NmE2Mzc2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYmUyODY3MjRiZTVhNDFiNzk0NTg1NWRkMWQwZTM4MTUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45OTIzNzUzLC0xLjEzNjUzMDFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl9jMmRkNGE0MGRlOTM0NmMxYjAwNTZiNjM0ZmZkYTZmOSA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl9iZTI4NjcyNGJlNWE0MWI3OTQ1ODU1ZGQxZDBlMzgxNS5zZXRJY29uKGljb25fYzJkZDRhNDBkZTkzNDZjMWIwMDU2YjYzNGZmZGE2ZjkpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mZDE1NWRhZjZkNzc0MWIxOTVkZDdlZWY5NjM5OWQwNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xNjM3OGZiYWZhZmM0ZmE0YTAzMDcwODQwNDVjNTk4YyA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfMTYzNzhmYmFmYWZjNGZhNGEwMzA3MDg0MDQ1YzU5OGMiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIFBsYXphIFNhbnRhIE1hcmlhIGRlIEdyYWNpYSAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmQxNTVkYWY2ZDc3NDFiMTk1ZGQ3ZWVmOTYzOTlkMDQuc2V0Q29udGVudChodG1sXzE2Mzc4ZmJhZmFmYzRmYTRhMDMwNzA4NDA0NWM1OThjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYmUyODY3MjRiZTVhNDFiNzk0NTg1NWRkMWQwZTM4MTUuYmluZFBvcHVwKHBvcHVwX2ZkMTU1ZGFmNmQ3NzQxYjE5NWRkN2VlZjk2Mzk5ZDA0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNjA4YWU0ZmRiNTYwNDExNGIyNmZhNDRlNDk4NThjZTEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45OTM0MzMsLTEuMTM5MTQzNF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzY5NzdmMTQ4ODhhNzQyNTY4NTdlZTZmZWE5MGFjZmUxKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uX2ExZmM2MjhkNjcxYzRmOTVhYTgxNGNlM2QzZjM4NmZhID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzYwOGFlNGZkYjU2MDQxMTRiMjZmYTQ0ZTQ5ODU4Y2UxLnNldEljb24oaWNvbl9hMWZjNjI4ZDY3MWM0Zjk1YWE4MTRjZTNkM2YzODZmYSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY3ZTA0MmJjYzk1ODRmOTc4ODBjYmJhNjIxODYyY2Y5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2EzYmM3ZjA3MjFhODRlYmZiMGIzYzc2MTE1ZGMxNGE3ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9hM2JjN2YwNzIxYTg0ZWJmYjBiM2M3NjExNWRjMTRhNyIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgQXpvcmluIChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82N2UwNDJiY2M5NTg0Zjk3ODgwY2JiYTYyMTg2MmNmOS5zZXRDb250ZW50KGh0bWxfYTNiYzdmMDcyMWE4NGViZmIwYjNjNzYxMTVkYzE0YTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82MDhhZTRmZGI1NjA0MTE0YjI2ZmE0NGU0OTg1OGNlMS5iaW5kUG9wdXAocG9wdXBfNjdlMDQyYmNjOTU4NGY5Nzg4MGNiYmE2MjE4NjJjZjkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8zZDYwNzkxZmIwMjM0NjM4YWQ4ZjUwY2JhMGYzNmYwOSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk5MzkyMDYsLTEuMTM2NjUwN10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzY5NzdmMTQ4ODhhNzQyNTY4NTdlZTZmZWE5MGFjZmUxKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uX2UyYjYyYzMzMDFjYjQ2ZGJiODA4YTQ4Y2I4N2U3NWNkID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzNkNjA3OTFmYjAyMzQ2MzhhZDhmNTBjYmEwZjM2ZjA5LnNldEljb24oaWNvbl9lMmI2MmMzMzAxY2I0NmRiYjgwOGE0OGNiODdlNzVjZCk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ4MjQ5MGRjODc1NjRiOWFiNWU2MDEwODFkOGE0N2YxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE5NTQzYWFhOTU3NjQwYmQ4NGNiNDE5YjIzOGEwMzgzID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF8xOTU0M2FhYTk1NzY0MGJkODRjYjQxOWIyMzhhMDM4MyIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgUGljbyBkZWwgTW9ycm9uIChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80ODI0OTBkYzg3NTY0YjlhYjVlNjAxMDgxZDhhNDdmMS5zZXRDb250ZW50KGh0bWxfMTk1NDNhYWE5NTc2NDBiZDg0Y2I0MTliMjM4YTAzODMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8zZDYwNzkxZmIwMjM0NjM4YWQ4ZjUwY2JhMGYzNmYwOS5iaW5kUG9wdXAocG9wdXBfNDgyNDkwZGM4NzU2NGI5YWI1ZTYwMTA4MWQ4YTQ3ZjEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9iY2E3ODM1YmEzZmU0OGE3OTJiNTFhNGFiMmU3M2Y2YiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk5MjgwMSwtMS4xMzc0NTg1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNjk3N2YxNDg4OGE3NDI1Njg1N2VlNmZlYTkwYWNmZTEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fY2M3YTJkNDllOWIzNDdmM2ExZWI2ODgyYWIwZWFjMmMgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfYmNhNzgzNWJhM2ZlNDhhNzkyYjUxYTRhYjJlNzNmNmIuc2V0SWNvbihpY29uX2NjN2EyZDQ5ZTliMzQ3ZjNhMWViNjg4MmFiMGVhYzJjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzc1ZWIyNWEwZmQ1NGVlM2FjZWNhNGUzOTVkYmU2ODQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWRlNTlkODQ0NTRlNDVhNDkyYjkxMWU0MTIwNWYwMGMgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2FkZTU5ZDg0NDU0ZTQ1YTQ5MmI5MTFlNDEyMDVmMDBjIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBFc2NyaXRvciBTYW5jaGV6IE1vcmVubyAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzc1ZWIyNWEwZmQ1NGVlM2FjZWNhNGUzOTVkYmU2ODQuc2V0Q29udGVudChodG1sX2FkZTU5ZDg0NDU0ZTQ1YTQ5MmI5MTFlNDEyMDVmMDBjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYmNhNzgzNWJhM2ZlNDhhNzkyYjUxYTRhYjJlNzNmNmIuYmluZFBvcHVwKHBvcHVwXzc3NWViMjVhMGZkNTRlZTNhY2VjYTRlMzk1ZGJlNjg0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNDNiOTE0Nzg5Y2ZiNDMwMmJiMzZlYjk1ZWIxYTQxNDMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45OTI1Mjc3LC0xLjEzNjc5NTVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl80YWI0ZWFlMWFmZGE0NzEyYjNiYjU2OWMxNmMwOGEzMyA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl80M2I5MTQ3ODljZmI0MzAyYmIzNmViOTVlYjFhNDE0My5zZXRJY29uKGljb25fNGFiNGVhZTFhZmRhNDcxMmIzYmI1NjljMTZjMDhhMzMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zYTNiNDcyZjkwMTg0MTZhODI3YWUzMzMyMDRkMDQwNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83Y2EwOGNjMzg0MjE0NGYxYTZkM2ZhNjljMjQ1N2MzZCA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfN2NhMDhjYzM4NDIxNDRmMWE2ZDNmYTY5YzI0NTdjM2QiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIFNpZXJyYSBkZSBDYXJyYXNjb3kgKFpvbmEgMS0yLTMpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNhM2I0NzJmOTAxODQxNmE4MjdhZTMzMzIwNGQwNDA0LnNldENvbnRlbnQoaHRtbF83Y2EwOGNjMzg0MjE0NGYxYTZkM2ZhNjljMjQ1N2MzZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzQzYjkxNDc4OWNmYjQzMDJiYjM2ZWI5NWViMWE0MTQzLmJpbmRQb3B1cChwb3B1cF8zYTNiNDcyZjkwMTg0MTZhODI3YWUzMzMyMDRkMDQwNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2ZiMDA5ZTQyNzQwNzQ3MTRhNzE0M2Q4N2U4NmIzMDYzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTkyNDY5NSwtMS4xMjc0Mjk0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNjk3N2YxNDg4OGE3NDI1Njg1N2VlNmZlYTkwYWNmZTEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fYjNlNTFmYjJlM2NiNDYzY2IzMGExNjA3OGFjZGZlNDEgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfZmIwMDllNDI3NDA3NDcxNGE3MTQzZDg3ZTg2YjMwNjMuc2V0SWNvbihpY29uX2IzZTUxZmIyZTNjYjQ2M2NiMzBhMTYwNzhhY2RmZTQxKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTE0N2MyMzY3ZTYyNGY1ZWE3Nzc1ODZlMjBjMTJjOTcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGU2MDA3M2IzYjRlNGQ5MDhlMGMwZjFmNDg5MjY2ODMgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzhlNjAwNzNiM2I0ZTRkOTA4ZTBjMGYxZjQ4OTI2NjgzIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBDb3JyZWdpZG9yIFB1ZXlvIChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MTQ3YzIzNjdlNjI0ZjVlYTc3NzU4NmUyMGMxMmM5Ny5zZXRDb250ZW50KGh0bWxfOGU2MDA3M2IzYjRlNGQ5MDhlMGMwZjFmNDg5MjY2ODMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9mYjAwOWU0Mjc0MDc0NzE0YTcxNDNkODdlODZiMzA2My5iaW5kUG9wdXAocG9wdXBfNTE0N2MyMzY3ZTYyNGY1ZWE3Nzc1ODZlMjBjMTJjOTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9mYWI2NzJjZjE3NWY0NGYwYTc5ZWUxMjQyNGYyOGVjMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk5MjUzNDYsLTEuMTI0ODE1OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzY5NzdmMTQ4ODhhNzQyNTY4NTdlZTZmZWE5MGFjZmUxKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzlhODAwNGUxYjQ1NzRhNzY4Mjc3ODk4NzQyOTcwNjFlID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyX2ZhYjY3MmNmMTc1ZjQ0ZjBhNzllZTEyNDI0ZjI4ZWMxLnNldEljb24oaWNvbl85YTgwMDRlMWI0NTc0YTc2ODI3Nzg5ODc0Mjk3MDYxZSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhiMzg2OTg5ZTllOTQ3ZjliMzhhNTE1NGZjNDJjYzRlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2QyNGVjNTk4MDM1NTQ5NzNiMDQwYmUxNGQwYmMzN2E3ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9kMjRlYzU5ODAzNTU0OTczYjA0MGJlMTRkMGJjMzdhNyIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgZGUgbGEgRmxvdGEgKFpvbmEgMS0yLTMpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhiMzg2OTg5ZTllOTQ3ZjliMzhhNTE1NGZjNDJjYzRlLnNldENvbnRlbnQoaHRtbF9kMjRlYzU5ODAzNTU0OTczYjA0MGJlMTRkMGJjMzdhNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2ZhYjY3MmNmMTc1ZjQ0ZjBhNzllZTEyNDI0ZjI4ZWMxLmJpbmRQb3B1cChwb3B1cF84YjM4Njk4OWU5ZTk0N2Y5YjM4YTUxNTRmYzQyY2M0ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2FiNWZjNjkzMzkzMjQzYmViMTEwYjlmZTVhZDVhNTg3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTg2ODM1NSwtMS4xMzMzODYxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNjk3N2YxNDg4OGE3NDI1Njg1N2VlNmZlYTkwYWNmZTEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fNjY5MWY2MjUxZjE4NDRjZjgxZTgxMzA1YmNjNjIxMDMgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfYWI1ZmM2OTMzOTMyNDNiZWIxMTBiOWZlNWFkNWE1ODcuc2V0SWNvbihpY29uXzY2OTFmNjI1MWYxODQ0Y2Y4MWU4MTMwNWJjYzYyMTAzKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTg4ODFiNGEzNGRhNGVlYWI0N2U4NDY0NzUyY2IxZTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2Q3NWIzYzNhN2RkNDcwMjgzNTI3ZTI3MDg2NWE3NTQgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2NkNzViM2MzYTdkZDQ3MDI4MzUyN2UyNzA4NjVhNzU0IiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBDb25kZSBkZSBSb2NoZSAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTg4ODFiNGEzNGRhNGVlYWI0N2U4NDY0NzUyY2IxZTguc2V0Q29udGVudChodG1sX2NkNzViM2MzYTdkZDQ3MDI4MzUyN2UyNzA4NjVhNzU0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYWI1ZmM2OTMzOTMyNDNiZWIxMTBiOWZlNWFkNWE1ODcuYmluZFBvcHVwKHBvcHVwXzU4ODgxYjRhMzRkYTRlZWFiNDdlODQ2NDc1MmNiMWU4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMjE5MGZjODliY2QzNGM1MTlkNWM3N2MwN2Q1ODlkOTUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45OTIyMzk5LC0xLjEzMDY1NDRdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl82YjhmNjNlNGRhMmI0MDUwOTZiNzQ5N2RiYmRlMGY5MyA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl8yMTkwZmM4OWJjZDM0YzUxOWQ1Yzc3YzA3ZDU4OWQ5NS5zZXRJY29uKGljb25fNmI4ZjYzZTRkYTJiNDA1MDk2Yjc0OTdkYmJkZTBmOTMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80MzY5ZDdhZjg2MjQ0MTk2ODJjMjg4NTg3ZmQxNjI5YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hYjgyNTQwNDA5Mzg0MGFmOTY5Y2M3ODMzMTBkNGVlMCA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfYWI4MjU0MDQwOTM4NDBhZjk2OWNjNzgzMzEwZDRlZTAiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIGNhbGxlIEp1YW4gR3VlcnJlcm8gUnVpeiAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDM2OWQ3YWY4NjI0NDE5NjgyYzI4ODU4N2ZkMTYyOWEuc2V0Q29udGVudChodG1sX2FiODI1NDA0MDkzODQwYWY5NjljYzc4MzMxMGQ0ZWUwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMjE5MGZjODliY2QzNGM1MTlkNWM3N2MwN2Q1ODlkOTUuYmluZFBvcHVwKHBvcHVwXzQzNjlkN2FmODYyNDQxOTY4MmMyODg1ODdmZDE2MjlhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYTRmZjcyNGMzNWM0NGZiNTk4NWMwNmI2N2EyZTVmMjggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45ODY4MjA0LC0xLjEzNDAyNThdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl83ODU2ZDczNjdmNjU0ZjY1OTM2YTgxZWM0ZjUyMTJlYSA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl9hNGZmNzI0YzM1YzQ0ZmI1OTg1YzA2YjY3YTJlNWYyOC5zZXRJY29uKGljb25fNzg1NmQ3MzY3ZjY1NGY2NTkzNmE4MWVjNGY1MjEyZWEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMjAwZmQwOTFhNTI0ZmEwYTNlOGY0ZjY4OGMzZjM3OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80MTVhMjdiY2EzZGM0N2ExYjJmMTk0MWM1YjYyM2MxOCA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfNDE1YTI3YmNhM2RjNDdhMWIyZjE5NDFjNWI2MjNjMTgiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIExhcmVkbyAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjIwMGZkMDkxYTUyNGZhMGEzZThmNGY2ODhjM2YzNzkuc2V0Q29udGVudChodG1sXzQxNWEyN2JjYTNkYzQ3YTFiMmYxOTQxYzViNjIzYzE4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYTRmZjcyNGMzNWM0NGZiNTk4NWMwNmI2N2EyZTVmMjguYmluZFBvcHVwKHBvcHVwX2IyMDBmZDA5MWE1MjRmYTBhM2U4ZjRmNjg4YzNmMzc5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNDM3MDU0MDE1OTIwNDNlY2JiMGE1OTBhYWI2YjA5MDAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45ODg1MzExLC0xLjEzMjUyMjddLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl81MDk3ZjdmMjVlNTI0ZWJjODFlZGM1N2IwZjZiNTVlYyA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl80MzcwNTQwMTU5MjA0M2VjYmIwYTU5MGFhYjZiMDkwMC5zZXRJY29uKGljb25fNTA5N2Y3ZjI1ZTUyNGViYzgxZWRjNTdiMGY2YjU1ZWMpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zNTg5MWExMTIzZjk0NTIxOGJmZmNlYWEyZDIwMTdjZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kZjlkMGQxMjk2OTc0MTIwODYxZTIxZDA2YTgzODVmNSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfZGY5ZDBkMTI5Njk3NDEyMDg2MWUyMWQwNmE4Mzg1ZjUiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIGNhbGxlIEFsbXVkZW5hIChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zNTg5MWExMTIzZjk0NTIxOGJmZmNlYWEyZDIwMTdjZC5zZXRDb250ZW50KGh0bWxfZGY5ZDBkMTI5Njk3NDEyMDg2MWUyMWQwNmE4Mzg1ZjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl80MzcwNTQwMTU5MjA0M2VjYmIwYTU5MGFhYjZiMDkwMC5iaW5kUG9wdXAocG9wdXBfMzU4OTFhMTEyM2Y5NDUyMThiZmZjZWFhMmQyMDE3Y2QpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9iOWFmODQ1NjBlNzQ0NGMxYmJiNWZjZDE2MGUzNWZlNSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4NjQwODIsLTEuMTMxNjkyM10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzY5NzdmMTQ4ODhhNzQyNTY4NTdlZTZmZWE5MGFjZmUxKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzk0MjVmMWRhNmQ3NzRhNDc4ZTBiNzZlMjc3MTcwYzg4ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyX2I5YWY4NDU2MGU3NDQ0YzFiYmI1ZmNkMTYwZTM1ZmU1LnNldEljb24oaWNvbl85NDI1ZjFkYTZkNzc0YTQ3OGUwYjc2ZTI3NzE3MGM4OCk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQyZDA5Y2Q5ZmRjYjQzNWU4MzFhYmRlMDdmZGU0YTFiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzkzMmM5MTI0MzE4YTRiMGI5ZjQ4ZmNiYjUzY2RhODFmID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF85MzJjOTEyNDMxOGE0YjBiOWY0OGZjYmI1M2NkYTgxZiIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgQWN0b3IgRmVybmFuZG8gRGlheiBkZSBNZW5kb3phIChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MmQwOWNkOWZkY2I0MzVlODMxYWJkZTA3ZmRlNGExYi5zZXRDb250ZW50KGh0bWxfOTMyYzkxMjQzMThhNGIwYjlmNDhmY2JiNTNjZGE4MWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9iOWFmODQ1NjBlNzQ0NGMxYmJiNWZjZDE2MGUzNWZlNS5iaW5kUG9wdXAocG9wdXBfNDJkMDljZDlmZGNiNDM1ZTgzMWFiZGUwN2ZkZTRhMWIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9hZTA3NTQzNTE2YjA0OTNkYWQ1OWMwMmJkMTY5MWUxYSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4NzM0MDksLTEuMTMwMjMyOF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzY5NzdmMTQ4ODhhNzQyNTY4NTdlZTZmZWE5MGFjZmUxKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uX2UzYTMzZDg1YjVlMTQwMmM5YjVmMjg3MmU1YTc0YjVlID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyX2FlMDc1NDM1MTZiMDQ5M2RhZDU5YzAyYmQxNjkxZTFhLnNldEljb24oaWNvbl9lM2EzM2Q4NWI1ZTE0MDJjOWI1ZjI4NzJlNWE3NGI1ZSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNhY2MzMjUzZmFlNDQ3ZDZiYWRiNzkwMWE3YjI0MGI5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M1N2Y0Nzc4ODhlNTRlMzM4NThhZDg2NDcwY2E4YmJmID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9jNTdmNDc3ODg4ZTU0ZTMzODU4YWQ4NjQ3MGNhOGJiZiIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgRWNoZWdhcmF5IChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zYWNjMzI1M2ZhZTQ0N2Q2YmFkYjc5MDFhN2IyNDBiOS5zZXRDb250ZW50KGh0bWxfYzU3ZjQ3Nzg4OGU1NGUzMzg1OGFkODY0NzBjYThiYmYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9hZTA3NTQzNTE2YjA0OTNkYWQ1OWMwMmJkMTY5MWUxYS5iaW5kUG9wdXAocG9wdXBfM2FjYzMyNTNmYWU0NDdkNmJhZGI3OTAxYTdiMjQwYjkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9jYzViZTE1ZWQ3YzU0NzZkODRmZTVhYTdhZTFkMmJkZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4NzI5NDUsLTEuMTMxMDE4OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzY5NzdmMTQ4ODhhNzQyNTY4NTdlZTZmZWE5MGFjZmUxKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uX2I0MzA4YThjYjg2MjQ4ZGVhZDcwNTg5NWRlZDI3MTZkID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyX2NjNWJlMTVlZDdjNTQ3NmQ4NGZlNWFhN2FlMWQyYmRmLnNldEljb24oaWNvbl9iNDMwOGE4Y2I4NjI0OGRlYWQ3MDU4OTVkZWQyNzE2ZCk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzkyZjIxNGE1NDUwYzRkNTM4YTQxN2M5ZWQ4NTVhY2JiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzcwNGQyYzgxNGExNjQ4MWM4YjdlZTMwNzRmNWViMTEwID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF83MDRkMmM4MTRhMTY0ODFjOGI3ZWUzMDc0ZjVlYjExMCIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgQW5nZWwgR3VpcmFvIChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85MmYyMTRhNTQ1MGM0ZDUzOGE0MTdjOWVkODU1YWNiYi5zZXRDb250ZW50KGh0bWxfNzA0ZDJjODE0YTE2NDgxYzhiN2VlMzA3NGY1ZWIxMTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jYzViZTE1ZWQ3YzU0NzZkODRmZTVhYTdhZTFkMmJkZi5iaW5kUG9wdXAocG9wdXBfOTJmMjE0YTU0NTBjNGQ1MzhhNDE3YzllZDg1NWFjYmIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl85MjVlMDVlNTdlZjM0YmRlYjkyM2JjMGFlNDFhYTFhMCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk5MzYyNTQsLTEuMTM4NTA3MV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzY5NzdmMTQ4ODhhNzQyNTY4NTdlZTZmZWE5MGFjZmUxKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzg0ZDE1YWIzNTc0OTRmOTg4MWJhMTcwZGU0NDRlYmIzID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzkyNWUwNWU1N2VmMzRiZGViOTIzYmMwYWU0MWFhMWEwLnNldEljb24oaWNvbl84NGQxNWFiMzU3NDk0Zjk4ODFiYTE3MGRlNDQ0ZWJiMyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M2Yjk2OWYxZjgwZjQwYTFhYjIyY2I3NmNhZjIxYzU3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQzOTk4MzI3Mzc5MjRkODA4YWY0ODYzOTUzMGI3ZjQ2ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF80Mzk5ODMyNzM3OTI0ZDgwOGFmNDg2Mzk1MzBiN2Y0NiIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgRGFsaWFzIChab25hIDEtMi0zKTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNmI5NjlmMWY4MGY0MGExYWIyMmNiNzZjYWYyMWM1Ny5zZXRDb250ZW50KGh0bWxfNDM5OTgzMjczNzkyNGQ4MDhhZjQ4NjM5NTMwYjdmNDYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85MjVlMDVlNTdlZjM0YmRlYjkyM2JjMGFlNDFhYTFhMC5iaW5kUG9wdXAocG9wdXBfYzZiOTY5ZjFmODBmNDBhMWFiMjJjYjc2Y2FmMjFjNTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl80MGEwMjBjZmYyMzI0MGY1YTYyMTA0ODYxZjQxZTUxOSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk5NDY1NzcsLTEuMTQwMjI3N10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzY5NzdmMTQ4ODhhNzQyNTY4NTdlZTZmZWE5MGFjZmUxKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzk0MGY3NzMyYTA1NTQzOWNiZjNlZDNjNjNiNmI4NGEzID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzQwYTAyMGNmZjIzMjQwZjVhNjIxMDQ4NjFmNDFlNTE5LnNldEljb24oaWNvbl85NDBmNzczMmEwNTU0MzljYmYzZWQzYzYzYjZiODRhMyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhjYTY4ZjQxNDJkOTQxNjM4Y2Q2NzZkZTBiZTMxNWRjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RmNzhkMDQ0MWUxYTQ1NTRiNDdjMmViMTZjZDFkZmE1ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9kZjc4ZDA0NDFlMWE0NTU0YjQ3YzJlYjE2Y2QxZGZhNSIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgTW9uY2F5byAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOGNhNjhmNDE0MmQ5NDE2MzhjZDY3NmRlMGJlMzE1ZGMuc2V0Q29udGVudChodG1sX2RmNzhkMDQ0MWUxYTQ1NTRiNDdjMmViMTZjZDFkZmE1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNDBhMDIwY2ZmMjMyNDBmNWE2MjEwNDg2MWY0MWU1MTkuYmluZFBvcHVwKHBvcHVwXzhjYTY4ZjQxNDJkOTQxNjM4Y2Q2NzZkZTBiZTMxNWRjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMDIwOWJlMGRlZTlhNGFlMGFkNmJiYTIwNzgyMDI2N2MgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45OTA3Nzg2LC0xLjEzNDA4NTddLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl9iMzFlYWI4ZDljZWQ0NjliOWU2ZDA2ZDZiYmIzYzI1MCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl8wMjA5YmUwZGVlOWE0YWUwYWQ2YmJhMjA3ODIwMjY3Yy5zZXRJY29uKGljb25fYjMxZWFiOGQ5Y2VkNDY5YjllNmQwNmQ2YmJiM2MyNTApOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jNzNiOTRlZWE2ZWQ0MjE4YWI1Y2EzZDZmNGExNmI1MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85ZjA5YzNhMjYwOGI0ODI2OTEwNjZmNTAwOWY1ZDdkNSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfOWYwOWMzYTI2MDhiNDgyNjkxMDY2ZjUwMDlmNWQ3ZDUiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIFBsYXphIFZpcmdlbiBkZSBsYSBFc3BlcmFuemEgKFpvbmEgMS0yLTMpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M3M2I5NGVlYTZlZDQyMThhYjVjYTNkNmY0YTE2YjUyLnNldENvbnRlbnQoaHRtbF85ZjA5YzNhMjYwOGI0ODI2OTEwNjZmNTAwOWY1ZDdkNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzAyMDliZTBkZWU5YTRhZTBhZDZiYmEyMDc4MjAyNjdjLmJpbmRQb3B1cChwb3B1cF9jNzNiOTRlZWE2ZWQ0MjE4YWI1Y2EzZDZmNGExNmI1Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2NmOTRjZGY5YTlkYzQ5ZjBhZDFlZmZmOTMyNzc4M2NiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTkxOTk1NSwtMS4xMzgwMDY4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNjk3N2YxNDg4OGE3NDI1Njg1N2VlNmZlYTkwYWNmZTEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fODcyYjkyNmNiZWE1NGJiN2I5ZjFjYTczNmI0NWVkZGMgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfY2Y5NGNkZjlhOWRjNDlmMGFkMWVmZmY5MzI3NzgzY2Iuc2V0SWNvbihpY29uXzg3MmI5MjZjYmVhNTRiYjdiOWYxY2E3MzZiNDVlZGRjKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmRhZDNjMTMwOWJiNDEzYzk5YzFjODk1ODAyMjI3ZWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTVlZTJlZTdhODMxNDAyYjhkOWNmZDQyOWJkYjJiZWQgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2E1ZWUyZWU3YTgzMTQwMmI4ZDljZmQ0MjliZGIyYmVkIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBKZXJvbmltbyBHdWlqYXJybyAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmRhZDNjMTMwOWJiNDEzYzk5YzFjODk1ODAyMjI3ZWEuc2V0Q29udGVudChodG1sX2E1ZWUyZWU3YTgzMTQwMmI4ZDljZmQ0MjliZGIyYmVkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfY2Y5NGNkZjlhOWRjNDlmMGFkMWVmZmY5MzI3NzgzY2IuYmluZFBvcHVwKHBvcHVwXzZkYWQzYzEzMDliYjQxM2M5OWMxYzg5NTgwMjIyN2VhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfODZlNDQzNjYwNzEzNDIyOTg1YzYxMzczMzY1ZmUzMjcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45ODYxMTYsLTEuMTM0Mjk0MV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzY5NzdmMTQ4ODhhNzQyNTY4NTdlZTZmZWE5MGFjZmUxKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uX2JlOWI1Nzc5MjUwZjQ3YTE4YTI5NzVhMzMzYzgxNjMyID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzg2ZTQ0MzY2MDcxMzQyMjk4NWM2MTM3MzM2NWZlMzI3LnNldEljb24oaWNvbl9iZTliNTc3OTI1MGY0N2ExOGEyOTc1YTMzM2M4MTYzMik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQzMGI2MzAwODNjNDQyNGM4YzU4ZDIzZmYwYTNmNWMzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I4YjkwMjhkN2I2NDRiZjNiZTAyYTE2ZTQ3NTI3YWE1ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9iOGI5MDI4ZDdiNjQ0YmYzYmUwMmExNmU0NzUyN2FhNSIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ3Vlc3RhIGRlIGxhIE1hZ2RhbGVuYSAoWm9uYSAxLTItMyk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDMwYjYzMDA4M2M0NDI0YzhjNThkMjNmZjBhM2Y1YzMuc2V0Q29udGVudChodG1sX2I4YjkwMjhkN2I2NDRiZjNiZTAyYTE2ZTQ3NTI3YWE1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfODZlNDQzNjYwNzEzNDIyOTg1YzYxMzczMzY1ZmUzMjcuYmluZFBvcHVwKHBvcHVwXzQzMGI2MzAwODNjNDQyNGM4YzU4ZDIzZmYwYTNmNWMzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBtdWx0aV9wb2x5X2xpbmVfNTQ3YzliYWY3YTdmNGRjN2E0YjBlN2JlODBiMmZhMGEgPSBMLm11bHRpUG9seWxpbmUoCiAgICAgICAgICAgICAgICAgICAgW1tbMzcuOTk0NjU3NywgLTEuMTQwMjI3N10sIFszNy45OTE4NjcyLCAtMS4xMzk2MjQ3XV0sIFtbMzcuOTkxODY3MiwgLTEuMTM5NjI0N10sIFszNy45OTAwMzMsIC0xLjEzODYyNDZdXSwgW1szNy45OTAwMzMsIC0xLjEzODYyNDZdLCBbMzcuOTg2MTE2LCAtMS4xMzQyOTQxXV0sIFtbMzcuOTg2MTE2LCAtMS4xMzQyOTQxXSwgWzM3Ljk4NjQwODIsIC0xLjEzMTY5MjNdXSwgW1szNy45ODY0MDgyLCAtMS4xMzE2OTIzXSwgWzM3Ljk4NzUyMzUsIC0xLjEyNzU0OTldXSwgW1szNy45ODc1MjM1LCAtMS4xMjc1NDk5XSwgWzM3Ljk5MTUzODksIC0xLjEyNDQ5MjNdXSwgW1szNy45OTE1Mzg5LCAtMS4xMjQ0OTIzXSwgWzM3Ljk5MjUzNDYsIC0xLjEyNDgxNTldXSwgW1szNy45OTI1MzQ2LCAtMS4xMjQ4MTU5XSwgWzM3Ljk5NjQ3ODcsIC0xLjEyOTEyMDldXSwgW1szNy45OTY0Nzg3LCAtMS4xMjkxMjA5XSwgWzM3Ljk5NjMxMzYsIC0xLjEzMDkyMTNdXSwgW1szNy45OTYzMTM2LCAtMS4xMzA5MjEzXSwgWzM3Ljk5NDY1NzcsIC0xLjE0MDIyNzddXV0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodDogNSwKICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMSwKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXBfNjk3N2YxNDg4OGE3NDI1Njg1N2VlNmZlYTkwYWNmZTEuYWRkTGF5ZXIobXVsdGlfcG9seV9saW5lXzU0N2M5YmFmN2E3ZjRkYzdhNGIwZTdiZTgwYjJmYTBhKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2E5MmYyYmUyZDQ4NDgxZDkxZDU5YTZkY2VkMmY1NTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTNiMTVkZGJjMjliNGI0YjgwMTExOWM5Y2Y5ZGM0ZDEgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzUzYjE1ZGRiYzI5YjRiNGI4MDExMTljOWNmOWRjNGQxIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBab25hIDEtMi0zPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNhOTJmMmJlMmQ0ODQ4MWQ5MWQ1OWE2ZGNlZDJmNTU5LnNldENvbnRlbnQoaHRtbF81M2IxNWRkYmMyOWI0YjRiODAxMTE5YzljZjlkYzRkMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbXVsdGlfcG9seV9saW5lXzU0N2M5YmFmN2E3ZjRkYzdhNGIwZTdiZTgwYjJmYTBhLmJpbmRQb3B1cChwb3B1cF8zYTkyZjJiZTJkNDg0ODFkOTFkNTlhNmRjZWQyZjU1OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2M0ODZkYTljOTdhMTQzNTE4MGJiY2E0OWU0ZjFkZDVhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTgxMzkzNywtMS4xMzA2NTAyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNjk3N2YxNDg4OGE3NDI1Njg1N2VlNmZlYTkwYWNmZTEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fZDNhMjdlZGRhNzhjNDliZjgyYTE2NTY2YjkyMWFjMjAgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdibHVlJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyX2M0ODZkYTljOTdhMTQzNTE4MGJiY2E0OWU0ZjFkZDVhLnNldEljb24oaWNvbl9kM2EyN2VkZGE3OGM0OWJmODJhMTY1NjZiOTIxYWMyMCk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FjYmJiMWE4Y2Q1ZDRlNWJhZmJjODY5N2Q5MzczYTg5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdmMGZiN2Y4YzkwMTQyOTI4YzcwMDNiZTlhZjkyNzZjID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF83ZjBmYjdmOGM5MDE0MjkyOGM3MDAzYmU5YWY5Mjc2YyIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgSnVhbiBBbnRvbmlvIEhlcm5hbmRleiBkZWwgQWd1aWxhIChab25hIDUpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FjYmJiMWE4Y2Q1ZDRlNWJhZmJjODY5N2Q5MzczYTg5LnNldENvbnRlbnQoaHRtbF83ZjBmYjdmOGM5MDE0MjkyOGM3MDAzYmU5YWY5Mjc2Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2M0ODZkYTljOTdhMTQzNTE4MGJiY2E0OWU0ZjFkZDVhLmJpbmRQb3B1cChwb3B1cF9hY2JiYjFhOGNkNWQ0ZTViYWZiYzg2OTdkOTM3M2E4OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzYwNzUwNmExZmQyZjRhZGQ4MDE1MWJhZmMyZWU1NzYzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTc1MDQzMywtMS4xMzAwNDRdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl85Yzg2MzM4YzZkNjY0Zjc5YTZiMzg2MGVmODU4NDhiMCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ2JsdWUnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfNjA3NTA2YTFmZDJmNGFkZDgwMTUxYmFmYzJlZTU3NjMuc2V0SWNvbihpY29uXzljODYzMzhjNmQ2NjRmNzlhNmIzODYwZWY4NTg0OGIwKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmExOGRlMTZhM2I4NGZkOWFlM2Q1NzMzNGI1Yjg4MmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzRmNmQ1ZWQzMDE5NDVjYmIzZmEzNWFlMjUyMWQzMWYgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzc0ZjZkNWVkMzAxOTQ1Y2JiM2ZhMzVhZTI1MjFkMzFmIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBJbmR1c3RyaWEgKFpvbmEgNSk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmExOGRlMTZhM2I4NGZkOWFlM2Q1NzMzNGI1Yjg4MmUuc2V0Q29udGVudChodG1sXzc0ZjZkNWVkMzAxOTQ1Y2JiM2ZhMzVhZTI1MjFkMzFmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNjA3NTA2YTFmZDJmNGFkZDgwMTUxYmFmYzJlZTU3NjMuYmluZFBvcHVwKHBvcHVwXzJhMThkZTE2YTNiODRmZDlhZTNkNTczMzRiNWI4ODJlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOTFmNzQ2ZmM1YjkzNDNmZGFjYTAwNTdjM2MwMWEzNDUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45ODEzMzExLC0xLjEyODgyMTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl9jMDE5ZjA4ODA0OGE0MzRiYTZkMjQyZmQyYWViZjFlMiA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ2JsdWUnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfOTFmNzQ2ZmM1YjkzNDNmZGFjYTAwNTdjM2MwMWEzNDUuc2V0SWNvbihpY29uX2MwMTlmMDg4MDQ4YTQzNGJhNmQyNDJmZDJhZWJmMWUyKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzhjYTYxYmY4MjIxNGMwNWI1OTVmN2Q2OTUwMDY0NjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjcxMDdkY2VmM2Y2NGZlNzk3YzIyZGNlNzg2YjE5YjcgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzY3MTA3ZGNlZjNmNjRmZTc5N2MyMmRjZTc4NmIxOWI3IiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBBbWJyb3NpbyBTYWxhemFyIChab25hIDUpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M4Y2E2MWJmODIyMTRjMDViNTk1ZjdkNjk1MDA2NDY3LnNldENvbnRlbnQoaHRtbF82NzEwN2RjZWYzZjY0ZmU3OTdjMjJkY2U3ODZiMTliNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzkxZjc0NmZjNWI5MzQzZmRhY2EwMDU3YzNjMDFhMzQ1LmJpbmRQb3B1cChwb3B1cF9jOGNhNjFiZjgyMjE0YzA1YjU5NWY3ZDY5NTAwNjQ2Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzA1NDVkN2E2NDU4YzQ0MzJiYjFjZTAyMTRlOWNjOTliID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTgwODQzMiwtMS4xMjg1OTk2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNjk3N2YxNDg4OGE3NDI1Njg1N2VlNmZlYTkwYWNmZTEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fYjc4NDlmZWU3NWIxNDZkZmI5ZjcxN2Q1OThmZTQ1OGIgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdibHVlJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzA1NDVkN2E2NDU4YzQ0MzJiYjFjZTAyMTRlOWNjOTliLnNldEljb24oaWNvbl9iNzg0OWZlZTc1YjE0NmRmYjlmNzE3ZDU5OGZlNDU4Yik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdhODFkZDJmZDU0NTRiZDBhODJmYTI3MmE5N2E1ZjhjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAyMjQyMjYzYWVlNTQyYjRhYTQ3ZWZiZjQwZDczZTRjID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF8wMjI0MjI2M2FlZTU0MmI0YWE0N2VmYmY0MGQ3M2U0YyIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgZGUgUmljYXJkbyBHaWwgKFpvbmEgNSk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2E4MWRkMmZkNTQ1NGJkMGE4MmZhMjcyYTk3YTVmOGMuc2V0Q29udGVudChodG1sXzAyMjQyMjYzYWVlNTQyYjRhYTQ3ZWZiZjQwZDczZTRjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMDU0NWQ3YTY0NThjNDQzMmJiMWNlMDIxNGU5Y2M5OWIuYmluZFBvcHVwKHBvcHVwXzdhODFkZDJmZDU0NTRiZDBhODJmYTI3MmE5N2E1ZjhjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOWNiOTdhNzAyNWNlNDhkMTlhYjE5MDM1ZDllNTUwZTggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45ODA0MTI2LC0xLjEyOTQzMThdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl9iOThlM2ViYjc2YTg0M2IzODI4MjE1OWIzZDk2OTE2ZSA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ2JsdWUnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfOWNiOTdhNzAyNWNlNDhkMTlhYjE5MDM1ZDllNTUwZTguc2V0SWNvbihpY29uX2I5OGUzZWJiNzZhODQzYjM4MjgyMTU5YjNkOTY5MTZlKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTExNTgzYWY2YmNjNGJhYTg3MjExYWY5ZGU2OTM0ZjYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzI1NzQ0OWQ2MWZmNGU3NmIwMjQ0ZjE3MzAxM2FmOWQgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzcyNTc0NDlkNjFmZjRlNzZiMDI0NGYxNzMwMTNhZjlkIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBQcm9jbGFtYWNpb24gKFpvbmEgNSk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTExNTgzYWY2YmNjNGJhYTg3MjExYWY5ZGU2OTM0ZjYuc2V0Q29udGVudChodG1sXzcyNTc0NDlkNjFmZjRlNzZiMDI0NGYxNzMwMTNhZjlkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOWNiOTdhNzAyNWNlNDhkMTlhYjE5MDM1ZDllNTUwZTguYmluZFBvcHVwKHBvcHVwX2ExMTU4M2FmNmJjYzRiYWE4NzIxMWFmOWRlNjkzNGY2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOTc3NTJjZWFlNGI2NGM5Y2I1MTVjZDcyYmJhNjVlZjggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45NzcwOTkyLC0xLjEyNzk2NTZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl9jZGJiYWFlMDA0MzM0NGZiODY3ZTg0MjIwOTE2MjRkNyA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ2JsdWUnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfOTc3NTJjZWFlNGI2NGM5Y2I1MTVjZDcyYmJhNjVlZjguc2V0SWNvbihpY29uX2NkYmJhYWUwMDQzMzQ0ZmI4NjdlODQyMjA5MTYyNGQ3KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzViYjcxMTIzZDU4NDZlNDlhY2NjYzhmYjEyNmIwODggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzQxZDM4MWFmYzQ0NDcyNThlYzFlMGNmM2U2Nzg4YjEgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2M0MWQzODFhZmM0NDQ3MjU4ZWMxZTBjZjNlNjc4OGIxIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBKdWFuIExvcGV6IFNvbWFsbyAoWm9uYSA1KTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NWJiNzExMjNkNTg0NmU0OWFjY2NjOGZiMTI2YjA4OC5zZXRDb250ZW50KGh0bWxfYzQxZDM4MWFmYzQ0NDcyNThlYzFlMGNmM2U2Nzg4YjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85Nzc1MmNlYWU0YjY0YzljYjUxNWNkNzJiYmE2NWVmOC5iaW5kUG9wdXAocG9wdXBfNzViYjcxMTIzZDU4NDZlNDlhY2NjYzhmYjEyNmIwODgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl85Yjc4Y2FlNGI1MzI0ZmQ3OWVlNDg1NTczNjUwMDk0OCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk3NjQ3MDIsLTEuMTI3MTYzM10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzY5NzdmMTQ4ODhhNzQyNTY4NTdlZTZmZWE5MGFjZmUxKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzRlYTRmNmFmZTc3OTRkMTVhNTA1NDVlMTQ0YmRkYTA2ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAnYmx1ZScsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl85Yjc4Y2FlNGI1MzI0ZmQ3OWVlNDg1NTczNjUwMDk0OC5zZXRJY29uKGljb25fNGVhNGY2YWZlNzc5NGQxNWE1MDU0NWUxNDRiZGRhMDYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81ZjQxZmM0NTJhMTk0NTg3ODk3MGVhZDMzYjQzMjk3ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hNjkwY2Q1Y2M2MTY0OGFkYWM0ZTk2M2ZjMjc0NGFiNCA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfYTY5MGNkNWNjNjE2NDhhZGFjNGU5NjNmYzI3NDRhYjQiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIEFyY2lwcmVzdGUgTWFyaWFubyBBcm9jYSAoWm9uYSA1KTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81ZjQxZmM0NTJhMTk0NTg3ODk3MGVhZDMzYjQzMjk3ZC5zZXRDb250ZW50KGh0bWxfYTY5MGNkNWNjNjE2NDhhZGFjNGU5NjNmYzI3NDRhYjQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85Yjc4Y2FlNGI1MzI0ZmQ3OWVlNDg1NTczNjUwMDk0OC5iaW5kUG9wdXAocG9wdXBfNWY0MWZjNDUyYTE5NDU4Nzg5NzBlYWQzM2I0MzI5N2QpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8wZjQxODM3NTdiODY0ZmVlYmE5ZTQ4ZDgxMTdmMDBmNyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk3NjE1NDYsLTEuMTI4OTE4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNjk3N2YxNDg4OGE3NDI1Njg1N2VlNmZlYTkwYWNmZTEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fMzIzNjVjMzE3MGEzNDU5NGJiZjcxMjBjNjU3MzE4ZDkgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdibHVlJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzBmNDE4Mzc1N2I4NjRmZWViYTllNDhkODExN2YwMGY3LnNldEljb24oaWNvbl8zMjM2NWMzMTcwYTM0NTk0YmJmNzEyMGM2NTczMThkOSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNlMzgwNDkwNzYxMDRmYjc5NWY2YTdhYjA5M2ZiM2QzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU0MTY5NDc4OWViYzRmODI5NmE2MmE3YmI2OTE2MDE2ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF81NDE2OTQ3ODllYmM0ZjgyOTZhNjJhN2JiNjkxNjAxNiIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgUnVpeiBIaWRhbGdvIChab25hIDUpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNlMzgwNDkwNzYxMDRmYjc5NWY2YTdhYjA5M2ZiM2QzLnNldENvbnRlbnQoaHRtbF81NDE2OTQ3ODllYmM0ZjgyOTZhNjJhN2JiNjkxNjAxNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzBmNDE4Mzc1N2I4NjRmZWViYTllNDhkODExN2YwMGY3LmJpbmRQb3B1cChwb3B1cF8zZTM4MDQ5MDc2MTA0ZmI3OTVmNmE3YWIwOTNmYjNkMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzI4ZTI4ZTJjYmQxZjQyMjU5YTk2YTA1OGYxMGUzYTdmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTc3MTMwMywtMS4xMjc2MTc2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNjk3N2YxNDg4OGE3NDI1Njg1N2VlNmZlYTkwYWNmZTEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fYzA2YjZkMTE4ZDI0NDI0NTllNWZiYzA2MmEwYjAxM2EgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdibHVlJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzI4ZTI4ZTJjYmQxZjQyMjU5YTk2YTA1OGYxMGUzYTdmLnNldEljb24oaWNvbl9jMDZiNmQxMThkMjQ0MjQ1OWU1ZmJjMDYyYTBiMDEzYSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJkNTE0NmNkNzYxNzRhMjM5ZjIxMTVlZGQ4NjU3NjhjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJhNjY0NjEzNWY3MTQ3Y2I5MjJjNzU3MTQyMTMxMTAzID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF8yYTY2NDYxMzVmNzE0N2NiOTIyYzc1NzE0MjEzMTEwMyIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgQ2xlbWVudGVzIChab25hIDUpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJkNTE0NmNkNzYxNzRhMjM5ZjIxMTVlZGQ4NjU3NjhjLnNldENvbnRlbnQoaHRtbF8yYTY2NDYxMzVmNzE0N2NiOTIyYzc1NzE0MjEzMTEwMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzI4ZTI4ZTJjYmQxZjQyMjU5YTk2YTA1OGYxMGUzYTdmLmJpbmRQb3B1cChwb3B1cF8yZDUxNDZjZDc2MTc0YTIzOWYyMTE1ZWRkODY1NzY4Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzRkY2ZkMjhkMDYyYTQ3N2Q5ZmVlNzU5ZTE2OGRkMGNmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTc5NTMyNiwtMS4xMzE5MzczXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNjk3N2YxNDg4OGE3NDI1Njg1N2VlNmZlYTkwYWNmZTEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fMmVjYjI1ODRhMmJmNGJkNzhiZTI2YmNjOTQyNDEwOGIgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdibHVlJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzRkY2ZkMjhkMDYyYTQ3N2Q5ZmVlNzU5ZTE2OGRkMGNmLnNldEljb24oaWNvbl8yZWNiMjU4NGEyYmY0YmQ3OGJlMjZiY2M5NDI0MTA4Yik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRmZjI5MGUyNzg1NzRhNmNhMzZhYjgwZTg5NThjY2RlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE5MzMzOTVhNTk2ZjQzMDFiNzRjZTQyZmNlMmY4MjViID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF8xOTMzMzk1YTU5NmY0MzAxYjc0Y2U0MmZjZTJmODI1YiIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGVqb24gQ2FyYXZhY2EgKFpvbmEgNSk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGZmMjkwZTI3ODU3NGE2Y2EzNmFiODBlODk1OGNjZGUuc2V0Q29udGVudChodG1sXzE5MzMzOTVhNTk2ZjQzMDFiNzRjZTQyZmNlMmY4MjViKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNGRjZmQyOGQwNjJhNDc3ZDlmZWU3NTllMTY4ZGQwY2YuYmluZFBvcHVwKHBvcHVwXzRmZjI5MGUyNzg1NzRhNmNhMzZhYjgwZTg5NThjY2RlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMTIxMmZkMjFiMmQxNDllYWEzNWVmY2YwNTM4YzQ3ZTMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45NzY4MDMzLC0xLjEzMzM1NjRdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl81Y2Q4MzM2ZTJkOWQ0NzhiOTQwY2M2ZDlhOThjZWU5OSA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ2JsdWUnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfMTIxMmZkMjFiMmQxNDllYWEzNWVmY2YwNTM4YzQ3ZTMuc2V0SWNvbihpY29uXzVjZDgzMzZlMmQ5ZDQ3OGI5NDBjYzZkOWE5OGNlZTk5KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmM1YTFmOGRmM2IwNDQ4ZWEzNzViMDczZGE3YWFiNzYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWU2MTYwNTliOTNjNDJmNDgwZjYyYTE5YWFjM2VlYWYgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzllNjE2MDU5YjkzYzQyZjQ4MGY2MmExOWFhYzNlZWFmIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBDdWFydGVsIGRlIEFydGlsbGVyaWEgKFpvbmEgNSk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmM1YTFmOGRmM2IwNDQ4ZWEzNzViMDczZGE3YWFiNzYuc2V0Q29udGVudChodG1sXzllNjE2MDU5YjkzYzQyZjQ4MGY2MmExOWFhYzNlZWFmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMTIxMmZkMjFiMmQxNDllYWEzNWVmY2YwNTM4YzQ3ZTMuYmluZFBvcHVwKHBvcHVwX2ZjNWExZjhkZjNiMDQ0OGVhMzc1YjA3M2RhN2FhYjc2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZTFlYzMwM2NjNjNkNDVjNmE4NzQ1NGM3N2IwNDMyYWIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45ODA5NzQ0LC0xLjEzMjg4Ml0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzY5NzdmMTQ4ODhhNzQyNTY4NTdlZTZmZWE5MGFjZmUxKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uX2Y5ODk5Zjk2N2EzODQxZjBiN2UxNDgxMTRlZjk0MTgwID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAnYmx1ZScsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl9lMWVjMzAzY2M2M2Q0NWM2YTg3NDU0Yzc3YjA0MzJhYi5zZXRJY29uKGljb25fZjk4OTlmOTY3YTM4NDFmMGI3ZTE0ODExNGVmOTQxODApOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jZDRlMzI4ZTM4MzM0NDhkYTRiYTI4NDdiYmIzOWY3NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83MTJmYzVmNGIzZGY0NWQ5YjExNWQ5NmY3OWE0NWRiYyA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfNzEyZmM1ZjRiM2RmNDVkOWIxMTVkOTZmNzlhNDVkYmMiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIEp1bWlsbGEgKFpvbmEgNSk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2Q0ZTMyOGUzODMzNDQ4ZGE0YmEyODQ3YmJiMzlmNzQuc2V0Q29udGVudChodG1sXzcxMmZjNWY0YjNkZjQ1ZDliMTE1ZDk2Zjc5YTQ1ZGJjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZTFlYzMwM2NjNjNkNDVjNmE4NzQ1NGM3N2IwNDMyYWIuYmluZFBvcHVwKHBvcHVwX2NkNGUzMjhlMzgzMzQ0OGRhNGJhMjg0N2JiYjM5Zjc0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZGMyYzg3OTAwYTA1NDBjZGE2NTQ1YmQ1NDU3YmQ2NTMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45ODA0MDE1LC0xLjEzMDQ2OTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl82Yjg4ZTZmNzNhNzk0YjUzYWQ1NWRhYTQ4OWU1ZjJkYiA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ2JsdWUnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfZGMyYzg3OTAwYTA1NDBjZGE2NTQ1YmQ1NDU3YmQ2NTMuc2V0SWNvbihpY29uXzZiODhlNmY3M2E3OTRiNTNhZDU1ZGFhNDg5ZTVmMmRiKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGMyNTdiNmRhNmZhNDRlZDljNGEwZjAxMTgyOWZkODQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWQ2ZWJkNDhlZjMwNDFkMGIyOWVkYTFmOGY1YjVkMmQgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzFkNmViZDQ4ZWYzMDQxZDBiMjllZGExZjhmNWI1ZDJkIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBBbGFtZWRhIGRlIENvbG9uIChab25hIDUpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhjMjU3YjZkYTZmYTQ0ZWQ5YzRhMGYwMTE4MjlmZDg0LnNldENvbnRlbnQoaHRtbF8xZDZlYmQ0OGVmMzA0MWQwYjI5ZWRhMWY4ZjViNWQyZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2RjMmM4NzkwMGEwNTQwY2RhNjU0NWJkNTQ1N2JkNjUzLmJpbmRQb3B1cChwb3B1cF84YzI1N2I2ZGE2ZmE0NGVkOWM0YTBmMDExODI5ZmQ4NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzUwYTJiMzBmZjYzMzRmMWRiYjM5NGRjMzI5MGI5ZTRhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTc4NTc5NiwtMS4xMzMxNTUyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNjk3N2YxNDg4OGE3NDI1Njg1N2VlNmZlYTkwYWNmZTEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fYjNhNjg4OGRkODAxNDkwOWIzNTNkMGI0MzU3MGFjNTcgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdibHVlJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzUwYTJiMzBmZjYzMzRmMWRiYjM5NGRjMzI5MGI5ZTRhLnNldEljb24oaWNvbl9iM2E2ODg4ZGQ4MDE0OTA5YjM1M2QwYjQzNTcwYWM1Nyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA1NzY0ZDlhNjYwNTQzZmU4OTViODQ4ZWIyYzI5Y2VmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU0YjEzMDU3MWM1YzRlNDRhMmJlNWY0ODkwZmQ2M2M1ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF81NGIxMzA1NzFjNWM0ZTQ0YTJiZTVmNDg5MGZkNjNjNSIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgQ2FydGFnZW5hIChab25hIDUpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA1NzY0ZDlhNjYwNTQzZmU4OTViODQ4ZWIyYzI5Y2VmLnNldENvbnRlbnQoaHRtbF81NGIxMzA1NzFjNWM0ZTQ0YTJiZTVmNDg5MGZkNjNjNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzUwYTJiMzBmZjYzMzRmMWRiYjM5NGRjMzI5MGI5ZTRhLmJpbmRQb3B1cChwb3B1cF8wNTc2NGQ5YTY2MDU0M2ZlODk1Yjg0OGViMmMyOWNlZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzA5MTExNWU2YmE3ZTQ5OGZhMWZjYjQ0NTFkZWJkNjc2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTgxNTE5MSwtMS4xMzA5NTE2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNjk3N2YxNDg4OGE3NDI1Njg1N2VlNmZlYTkwYWNmZTEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fODEwNjlhNWRlOGU1NDk5YmE0NmQyMGIxMmM3YjE0MWYgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdibHVlJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzA5MTExNWU2YmE3ZTQ5OGZhMWZjYjQ0NTFkZWJkNjc2LnNldEljb24oaWNvbl84MTA2OWE1ZGU4ZTU0OTliYTQ2ZDIwYjEyYzdiMTQxZik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q4ZDM3NmQ5YjE4MjQ4YjA5M2M2M2Y4NTE2OGViOWZiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI2ZmE3MjZjMmM5YjQyOGI4YmFhZjJiZmZmYzcyMGZhID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF8yNmZhNzI2YzJjOWI0MjhiOGJhYWYyYmZmZmM3MjBmYSIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgUGxhemEgQ2FtYWNob3MgKFpvbmEgNSk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDhkMzc2ZDliMTgyNDhiMDkzYzYzZjg1MTY4ZWI5ZmIuc2V0Q29udGVudChodG1sXzI2ZmE3MjZjMmM5YjQyOGI4YmFhZjJiZmZmYzcyMGZhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMDkxMTE1ZTZiYTdlNDk4ZmExZmNiNDQ1MWRlYmQ2NzYuYmluZFBvcHVwKHBvcHVwX2Q4ZDM3NmQ5YjE4MjQ4YjA5M2M2M2Y4NTE2OGViOWZiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOGEyYWQwN2I0M2MyNGYxNGJiZTBlY2I3ZmJkMjA4YzYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45NzgxODA1LC0xLjEyOTM5MTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl9lM2U1NjYwNGRiODk0YTJjOWM1ZDAzOWEzYTIxMWEyZCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ2JsdWUnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfOGEyYWQwN2I0M2MyNGYxNGJiZTBlY2I3ZmJkMjA4YzYuc2V0SWNvbihpY29uX2UzZTU2NjA0ZGI4OTRhMmM5YzVkMDM5YTNhMjExYTJkKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjc0ZTk2NzVmMGQ3NDMxN2E0Njk3YTUxMzI5ZWI3NGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjM4OWEyMGQ2YTliNDM2OTkzMThkMzI0NzYyNDI4NjIgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzIzODlhMjBkNmE5YjQzNjk5MzE4ZDMyNDc2MjQyODYyIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBOaWNhcmFndWEgKFpvbmEgNSk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjc0ZTk2NzVmMGQ3NDMxN2E0Njk3YTUxMzI5ZWI3NGYuc2V0Q29udGVudChodG1sXzIzODlhMjBkNmE5YjQzNjk5MzE4ZDMyNDc2MjQyODYyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOGEyYWQwN2I0M2MyNGYxNGJiZTBlY2I3ZmJkMjA4YzYuYmluZFBvcHVwKHBvcHVwXzI3NGU5Njc1ZjBkNzQzMTdhNDY5N2E1MTMyOWViNzRmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMWE2N2IxYjQyMDUxNDg5ZmIwZTk4ZTU4NDE1Mzg5YWMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45NzgxMTQyLC0xLjEyODIxMjhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl83MTBiMmU4ODlkZjc0MzFlYjk1ZTg0NGJkYWQwM2ZlNCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ2JsdWUnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfMWE2N2IxYjQyMDUxNDg5ZmIwZTk4ZTU4NDE1Mzg5YWMuc2V0SWNvbihpY29uXzcxMGIyZTg4OWRmNzQzMWViOTVlODQ0YmRhZDAzZmU0KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmQzM2Q0Njc3Y2ZhNDdhNDg0Mzg2ZTMzNGQwODg0ODYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGJjZmRhYWUzYjE1NDVmM2IwZmZkZDZjZWMzNGMwMmEgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzRiY2ZkYWFlM2IxNTQ1ZjNiMGZmZGQ2Y2VjMzRjMDJhIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBDYXB1Y2hpbm9zIChab25hIDUpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZkMzNkNDY3N2NmYTQ3YTQ4NDM4NmUzMzRkMDg4NDg2LnNldENvbnRlbnQoaHRtbF80YmNmZGFhZTNiMTU0NWYzYjBmZmRkNmNlYzM0YzAyYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzFhNjdiMWI0MjA1MTQ4OWZiMGU5OGU1ODQxNTM4OWFjLmJpbmRQb3B1cChwb3B1cF82ZDMzZDQ2NzdjZmE0N2E0ODQzODZlMzM0ZDA4ODQ4Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzA3NzZlZjc2Mzk1NDRkZmZhODhiMTZkMWNkN2QyMjE2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTc3MjQzMiwtMS4xMzM2MDgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNjk3N2YxNDg4OGE3NDI1Njg1N2VlNmZlYTkwYWNmZTEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fNjI2NDk4MTgwNmI5NDI4NjgxNmY4ZGEyNzVlZGJlYjUgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdibHVlJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzA3NzZlZjc2Mzk1NDRkZmZhODhiMTZkMWNkN2QyMjE2LnNldEljb24oaWNvbl82MjY0OTgxODA2Yjk0Mjg2ODE2ZjhkYTI3NWVkYmViNSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZlZjFiMjRhMmEyODQ1NmE4ZTM0ZTU1MDVmODBkZTkwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y4YTI4YzAwM2NlNDQxNGJhMGUzMjkxNWE0OTEwNDk0ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9mOGEyOGMwMDNjZTQ0MTRiYTBlMzI5MTVhNDkxMDQ5NCIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgQWN0b3IgSm9zZSBDcmVzcG8gKFpvbmEgNSk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmVmMWIyNGEyYTI4NDU2YThlMzRlNTUwNWY4MGRlOTAuc2V0Q29udGVudChodG1sX2Y4YTI4YzAwM2NlNDQxNGJhMGUzMjkxNWE0OTEwNDk0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMDc3NmVmNzYzOTU0NGRmZmE4OGIxNmQxY2Q3ZDIyMTYuYmluZFBvcHVwKHBvcHVwXzZlZjFiMjRhMmEyODQ1NmE4ZTM0ZTU1MDVmODBkZTkwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYzM0OTc5MzM0OWFlNDFhZDlhMGQ2MjA3M2Y5Y2QwYjkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45NzU0OTM3LC0xLjEzMzAwMzVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl9kYTJiYzQ2NGU3ZjU0OTk3OWExYzg2ZTY2NDc2MjZkYiA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ2JsdWUnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfYzM0OTc5MzM0OWFlNDFhZDlhMGQ2MjA3M2Y5Y2QwYjkuc2V0SWNvbihpY29uX2RhMmJjNDY0ZTdmNTQ5OTc5YTFjODZlNjY0NzYyNmRiKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTIwNDdmOWFjMmU1NDYwNGExN2E5ODYzOGJkN2U3ZmMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGQzZDdmNGQyZmZhNGVmODkyOWU0YzFjZDVjZTIzYzQgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzBkM2Q3ZjRkMmZmYTRlZjg5MjllNGMxY2Q1Y2UyM2M0IiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBBdmVuaWRhIEp1YW4gQW50b25pbyBQZXJlYSAoWm9uYSA1KTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MjA0N2Y5YWMyZTU0NjA0YTE3YTk4NjM4YmQ3ZTdmYy5zZXRDb250ZW50KGh0bWxfMGQzZDdmNGQyZmZhNGVmODkyOWU0YzFjZDVjZTIzYzQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jMzQ5NzkzMzQ5YWU0MWFkOWEwZDYyMDczZjljZDBiOS5iaW5kUG9wdXAocG9wdXBfNTIwNDdmOWFjMmU1NDYwNGExN2E5ODYzOGJkN2U3ZmMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8xMTdhOWM0Y2YxNTU0MDk5YTUwOWU5NTIwZTM4M2RlMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4MDQ1MSwtMS4xMzI0MzU3XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNjk3N2YxNDg4OGE3NDI1Njg1N2VlNmZlYTkwYWNmZTEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fMDQzYzhiNzNmYmU4NDUwMjk4MjZkODhlYjgzMGMyZjAgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdibHVlJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzExN2E5YzRjZjE1NTQwOTlhNTA5ZTk1MjBlMzgzZGUxLnNldEljb24oaWNvbl8wNDNjOGI3M2ZiZTg0NTAyOTgyNmQ4OGViODMwYzJmMCk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q3NmNiZTEwZTQyYzQzYzc5OTljNDJkNzAzM2UxMThmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UyYWI1NzUxNzE5MTRkYzRiZDc1ZTI1NjM0OTdhNGZlID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9lMmFiNTc1MTcxOTE0ZGM0YmQ3NWUyNTYzNDk3YTRmZSIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgUm9zYWwgKFpvbmEgNSk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDc2Y2JlMTBlNDJjNDNjNzk5OWM0MmQ3MDMzZTExOGYuc2V0Q29udGVudChodG1sX2UyYWI1NzUxNzE5MTRkYzRiZDc1ZTI1NjM0OTdhNGZlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMTE3YTljNGNmMTU1NDA5OWE1MDllOTUyMGUzODNkZTEuYmluZFBvcHVwKHBvcHVwX2Q3NmNiZTEwZTQyYzQzYzc5OTljNDJkNzAzM2UxMThmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNWFiOTliMTFmYzU5NDUwNDgzMmUwY2UzZDBjZDg1NjggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45Nzk3NjYzLC0xLjEzMjQ4NzZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl9lNGY4MjkxYTYwZjk0MjFlOTc4OTIwZjc3MmNkZWUwZCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ2JsdWUnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfNWFiOTliMTFmYzU5NDUwNDgzMmUwY2UzZDBjZDg1Njguc2V0SWNvbihpY29uX2U0ZjgyOTFhNjBmOTQyMWU5Nzg5MjBmNzcyY2RlZTBkKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjdlN2ExZDI4NjNmNDBjYjhmODUzYjdlNWMyY2UxZTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzVmNWFlMDg4MjZjNDY0MGIwOWQ2Y2FiNWNkYjgyN2YgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2M1ZjVhZTA4ODI2YzQ2NDBiMDlkNmNhYjVjZGI4MjdmIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBNYWRyZSBFbGlzZWEgT2xpdmVyIE1vbGluYSAoWm9uYSA1KTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mN2U3YTFkMjg2M2Y0MGNiOGY4NTNiN2U1YzJjZTFlMC5zZXRDb250ZW50KGh0bWxfYzVmNWFlMDg4MjZjNDY0MGIwOWQ2Y2FiNWNkYjgyN2YpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl81YWI5OWIxMWZjNTk0NTA0ODMyZTBjZTNkMGNkODU2OC5iaW5kUG9wdXAocG9wdXBfZjdlN2ExZDI4NjNmNDBjYjhmODUzYjdlNWMyY2UxZTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIG11bHRpX3BvbHlfbGluZV9kMGJiMzYxZDU2OTU0ZDcwYmFhYTY5ZDZkNThiODcyYiA9IEwubXVsdGlQb2x5bGluZSgKICAgICAgICAgICAgICAgICAgICBbW1szNy45NzcyNDMyLCAtMS4xMzM2MDgzXSwgWzM3Ljk3NTQ5MzcsIC0xLjEzMzAwMzVdXSwgW1szNy45NzU0OTM3LCAtMS4xMzMwMDM1XSwgWzM3Ljk3NTA0MzMsIC0xLjEzMDA0NF1dLCBbWzM3Ljk3NTA0MzMsIC0xLjEzMDA0NF0sIFszNy45NzY0NzAyLCAtMS4xMjcxNjMzXV0sIFtbMzcuOTc2NDcwMiwgLTEuMTI3MTYzM10sIFszNy45ODA4NDMyLCAtMS4xMjg1OTk2XV0sIFtbMzcuOTgwODQzMiwgLTEuMTI4NTk5Nl0sIFszNy45ODEzMzExLCAtMS4xMjg4MjE5XV0sIFtbMzcuOTgxMzMxMSwgLTEuMTI4ODIxOV0sIFszNy45ODE1MTkxLCAtMS4xMzA5NTE2XV0sIFtbMzcuOTgxNTE5MSwgLTEuMTMwOTUxNl0sIFszNy45ODA5NzQ0LCAtMS4xMzI4ODJdXSwgW1szNy45ODA5NzQ0LCAtMS4xMzI4ODJdLCBbMzcuOTc3MjQzMiwgLTEuMTMzNjA4M11dXSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnYmx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodDogNSwKICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMSwKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXBfNjk3N2YxNDg4OGE3NDI1Njg1N2VlNmZlYTkwYWNmZTEuYWRkTGF5ZXIobXVsdGlfcG9seV9saW5lX2QwYmIzNjFkNTY5NTRkNzBiYWFhNjlkNmQ1OGI4NzJiKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWE0ZjRmMWViZTUxNGZkOGI0Yzg4NzM4MmVjMGYwNmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTJlODUzNjAyODFmNDljMWE1MjhjODVmYTUyMGQwYjMgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzkyZTg1MzYwMjgxZjQ5YzFhNTI4Yzg1ZmE1MjBkMGIzIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBab25hIDU8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWE0ZjRmMWViZTUxNGZkOGI0Yzg4NzM4MmVjMGYwNmQuc2V0Q29udGVudChodG1sXzkyZTg1MzYwMjgxZjQ5YzFhNTI4Yzg1ZmE1MjBkMGIzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtdWx0aV9wb2x5X2xpbmVfZDBiYjM2MWQ1Njk1NGQ3MGJhYWE2OWQ2ZDU4Yjg3MmIuYmluZFBvcHVwKHBvcHVwX2VhNGY0ZjFlYmU1MTRmZDhiNGM4ODczODJlYzBmMDZkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNzdiNjlkOGI5YmUyNDRlYTg0YzRjMTU5ZmI1ZjM2YjggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45ODc2OTg3LC0xLjE0MTI5MTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl81NDMzMzg2Zjc5ZmU0MzRkYmY2MDJhNzIyZjQzNGZkNSA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ2dyZWVuJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzc3YjY5ZDhiOWJlMjQ0ZWE4NGM0YzE1OWZiNWYzNmI4LnNldEljb24oaWNvbl81NDMzMzg2Zjc5ZmU0MzRkYmY2MDJhNzIyZjQzNGZkNSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRhNmRkYTdiYTVmZjQxY2Q4NjdjMzg4MTM1YjdjNjUxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzlmOGUzNDQ0Njc4MzQwYmU5OTJmN2FhZDQ3OGNiYzhmID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF85ZjhlMzQ0NDY3ODM0MGJlOTkyZjdhYWQ0NzhjYmM4ZiIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgZGUgbGEgT2xtYSAoWm9uYSA0KTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80YTZkZGE3YmE1ZmY0MWNkODY3YzM4ODEzNWI3YzY1MS5zZXRDb250ZW50KGh0bWxfOWY4ZTM0NDQ2NzgzNDBiZTk5MmY3YWFkNDc4Y2JjOGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl83N2I2OWQ4YjliZTI0NGVhODRjNGMxNTlmYjVmMzZiOC5iaW5kUG9wdXAocG9wdXBfNGE2ZGRhN2JhNWZmNDFjZDg2N2MzODgxMzViN2M2NTEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl85ZjljZWE1YmI3ZmI0YjBhOTRlMjc0MDhlY2I0ODNjMiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4NTEwNDgsLTEuMTM5MzI0OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzY5NzdmMTQ4ODhhNzQyNTY4NTdlZTZmZWE5MGFjZmUxKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uX2U4Y2Y4MGMyZWUxYjQ1NTZiZmQwM2M0NjFlNGM2MjczID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAnZ3JlZW4nLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfOWY5Y2VhNWJiN2ZiNGIwYTk0ZTI3NDA4ZWNiNDgzYzIuc2V0SWNvbihpY29uX2U4Y2Y4MGMyZWUxYjQ1NTZiZmQwM2M0NjFlNGM2MjczKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzYyOGQyYTRlZDljNDRlZGI4M2M3NjY1OWE4N2VlYjQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWExNTQxZmQyNGJhNDQ0YzgxZjgxNTZmZWE2ODFiMGYgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2VhMTU0MWZkMjRiYTQ0NGM4MWY4MTU2ZmVhNjgxYjBmIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBkZSBsb3MgQm9sb3MgKFpvbmEgNCk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzYyOGQyYTRlZDljNDRlZGI4M2M3NjY1OWE4N2VlYjQuc2V0Q29udGVudChodG1sX2VhMTU0MWZkMjRiYTQ0NGM4MWY4MTU2ZmVhNjgxYjBmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOWY5Y2VhNWJiN2ZiNGIwYTk0ZTI3NDA4ZWNiNDgzYzIuYmluZFBvcHVwKHBvcHVwXzc2MjhkMmE0ZWQ5YzQ0ZWRiODNjNzY2NTlhODdlZWI0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfY2Y4OWU0YzE3M2ZhNGVlOWEzZjMxYzUyNWVhMDZmNWQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45ODUwMTYyLC0xLjEzNjE0ODddLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl8zYmQ0ZmExZGM2Nzg0ODZkOWI5NDcyMGY3ODQyMzliMCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ2dyZWVuJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyX2NmODllNGMxNzNmYTRlZTlhM2YzMWM1MjVlYTA2ZjVkLnNldEljb24oaWNvbl8zYmQ0ZmExZGM2Nzg0ODZkOWI5NDcyMGY3ODQyMzliMCk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM0MjcxYzQ0YjQ1MjQ2Y2RiMThhMGM2YTdkMDJkYzFkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M4MzBiZjM2NmZkYjRiMTI4NzZkZGFlZWI0MmY3ZDFlID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9jODMwYmYzNjZmZGI0YjEyODc2ZGRhZWViNDJmN2QxZSIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgY2FsbGUgU2FnYXN0YSAoWm9uYSA0KTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zNDI3MWM0NGI0NTI0NmNkYjE4YTBjNmE3ZDAyZGMxZC5zZXRDb250ZW50KGh0bWxfYzgzMGJmMzY2ZmRiNGIxMjg3NmRkYWVlYjQyZjdkMWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jZjg5ZTRjMTczZmE0ZWU5YTNmMzFjNTI1ZWEwNmY1ZC5iaW5kUG9wdXAocG9wdXBfMzQyNzFjNDRiNDUyNDZjZGIxOGEwYzZhN2QwMmRjMWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl82Y2UzMzRmNjk2MWQ0NmI3YTBmNWIwOTBiNWY3MjM0ZSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4Njc3MTgsLTEuMTM5MzI0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNjk3N2YxNDg4OGE3NDI1Njg1N2VlNmZlYTkwYWNmZTEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fMjIxYjYzZWMxYmI4NDA1MzhlNjM3MGQwNmQzMWFhODUgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdncmVlbicsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl82Y2UzMzRmNjk2MWQ0NmI3YTBmNWIwOTBiNWY3MjM0ZS5zZXRJY29uKGljb25fMjIxYjYzZWMxYmI4NDA1MzhlNjM3MGQwNmQzMWFhODUpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iNzg3MjI3YzVjNTk0ZWJjYWU5N2JmYzU2ZDg1MjQyZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83ZTE0ODU2YzEzMjc0ZGU3OWYzMGFlYWZmNWU5NDBiMCA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfN2UxNDg1NmMxMzI3NGRlNzlmMzBhZWFmZjVlOTQwYjAiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIGRlbCBEb2N0b3IgSmVzdXMgUXVlc2FkYSBTYW56IChab25hIDQpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I3ODcyMjdjNWM1OTRlYmNhZTk3YmZjNTZkODUyNDJmLnNldENvbnRlbnQoaHRtbF83ZTE0ODU2YzEzMjc0ZGU3OWYzMGFlYWZmNWU5NDBiMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzZjZTMzNGY2OTYxZDQ2YjdhMGY1YjA5MGI1ZjcyMzRlLmJpbmRQb3B1cChwb3B1cF9iNzg3MjI3YzVjNTk0ZWJjYWU5N2JmYzU2ZDg1MjQyZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2NlNmVlOTVlMDE2ZTQ5MThiY2ZkOWNlN2Q2NjUyNGZjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTgyNzU4NiwtMS4xMzgyNzAzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNjk3N2YxNDg4OGE3NDI1Njg1N2VlNmZlYTkwYWNmZTEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fZmJlNDUwNGJjOTlhNDFjY2FmMjdiMGQ4MjliZDAxOWQgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdncmVlbicsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl9jZTZlZTk1ZTAxNmU0OTE4YmNmZDljZTdkNjY1MjRmYy5zZXRJY29uKGljb25fZmJlNDUwNGJjOTlhNDFjY2FmMjdiMGQ4MjliZDAxOWQpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zODU0ZjRhM2NlNTI0ZTJhODA1NWI1ZDg4ODU1ZDk1YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jNmM5ZjFmODVmZTk0YjdlOTI0ZTc4NjE5YjM1NzY2MSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfYzZjOWYxZjg1ZmU5NGI3ZTkyNGU3ODYxOWIzNTc2NjEiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIFBpbnRvciBTb2JlamFubyAoWm9uYSA0KTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zODU0ZjRhM2NlNTI0ZTJhODA1NWI1ZDg4ODU1ZDk1Yy5zZXRDb250ZW50KGh0bWxfYzZjOWYxZjg1ZmU5NGI3ZTkyNGU3ODYxOWIzNTc2NjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jZTZlZTk1ZTAxNmU0OTE4YmNmZDljZTdkNjY1MjRmYy5iaW5kUG9wdXAocG9wdXBfMzg1NGY0YTNjZTUyNGUyYTgwNTViNWQ4ODg1NWQ5NWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9lMzE5YWU0NWNjN2Y0MDlmYTU0MmE3NzE2ZTQ1ZTY4ZSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4NzU4MDYsLTEuMTQ0OTM1Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzY5NzdmMTQ4ODhhNzQyNTY4NTdlZTZmZWE5MGFjZmUxKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uX2QxNTIxZTI1ZTRmMDRmZGE5MTdhMWNhMTI3ZGIwNDI3ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAnZ3JlZW4nLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfZTMxOWFlNDVjYzdmNDA5ZmE1NDJhNzcxNmU0NWU2OGUuc2V0SWNvbihpY29uX2QxNTIxZTI1ZTRmMDRmZGE5MTdhMWNhMTI3ZGIwNDI3KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGMwZDFiMjkxYjI0NGRlZTllYmM5NTcxNmM5NjFhMTcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjhkYjVjYTM0MmEyNGE5MGFhNzE5YzNhNjI4NDlhYmIgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzI4ZGI1Y2EzNDJhMjRhOTBhYTcxOWMzYTYyODQ5YWJiIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYW1pbm8gZGUgRW5tZWRpbyAoWm9uYSA0KTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84YzBkMWIyOTFiMjQ0ZGVlOWViYzk1NzE2Yzk2MWExNy5zZXRDb250ZW50KGh0bWxfMjhkYjVjYTM0MmEyNGE5MGFhNzE5YzNhNjI4NDlhYmIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9lMzE5YWU0NWNjN2Y0MDlmYTU0MmE3NzE2ZTQ1ZTY4ZS5iaW5kUG9wdXAocG9wdXBfOGMwZDFiMjkxYjI0NGRlZTllYmM5NTcxNmM5NjFhMTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9jYTllMDY3NTg3NjI0MmU5YmQyOWFjYTlmMjE1M2YwYiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4OTQ5MDksLTEuMTQyMzYzOF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzY5NzdmMTQ4ODhhNzQyNTY4NTdlZTZmZWE5MGFjZmUxKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzlkYzcwZTkyYTRjZTQ4MDU4Y2NiYWZlNjM1OGRjZjYwID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAnZ3JlZW4nLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfY2E5ZTA2NzU4NzYyNDJlOWJkMjlhY2E5ZjIxNTNmMGIuc2V0SWNvbihpY29uXzlkYzcwZTkyYTRjZTQ4MDU4Y2NiYWZlNjM1OGRjZjYwKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWEzZTVmOTM0ZWU1NDNlZGEyMTJjNjFiNDU1MThiMTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTVjZDU4MTIwMzQ0NDJjNGEzYmE2YjRhNjExMDIxZGEgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2U1Y2Q1ODEyMDM0NDQyYzRhM2JhNmI0YTYxMTAyMWRhIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBkZSBsYXMgTm9yaWFzIChab25hIDQpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FhM2U1ZjkzNGVlNTQzZWRhMjEyYzYxYjQ1NTE4YjEyLnNldENvbnRlbnQoaHRtbF9lNWNkNTgxMjAzNDQ0MmM0YTNiYTZiNGE2MTEwMjFkYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2NhOWUwNjc1ODc2MjQyZTliZDI5YWNhOWYyMTUzZjBiLmJpbmRQb3B1cChwb3B1cF9hYTNlNWY5MzRlZTU0M2VkYTIxMmM2MWI0NTUxOGIxMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2JjYzQwYjMzY2I0NzQxNzBhY2Q4ZGQwNTA5MDc5MzIxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTg5NDkwOSwtMS4xNDIzNjM4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNjk3N2YxNDg4OGE3NDI1Njg1N2VlNmZlYTkwYWNmZTEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fNzE5NzQxMjc0ODgzNDRiM2I4Njk3NTIzMjU4NGJjMjUgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdncmVlbicsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl9iY2M0MGIzM2NiNDc0MTcwYWNkOGRkMDUwOTA3OTMyMS5zZXRJY29uKGljb25fNzE5NzQxMjc0ODgzNDRiM2I4Njk3NTIzMjU4NGJjMjUpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81MDE1MWI0NDk2NzQ0ZWEzYjY5ZGNkNzVkZDdkMTM3MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80MDlmYTJmNzVmMTg0ZGY3Yjk1ODE0Njc4NWQzZmViZSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfNDA5ZmEyZjc1ZjE4NGRmN2I5NTgxNDY3ODVkM2ZlYmUiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIE9sb2YgUGFsbWUgKFpvbmEgNCk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTAxNTFiNDQ5Njc0NGVhM2I2OWRjZDc1ZGQ3ZDEzNzMuc2V0Q29udGVudChodG1sXzQwOWZhMmY3NWYxODRkZjdiOTU4MTQ2Nzg1ZDNmZWJlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYmNjNDBiMzNjYjQ3NDE3MGFjZDhkZDA1MDkwNzkzMjEuYmluZFBvcHVwKHBvcHVwXzUwMTUxYjQ0OTY3NDRlYTNiNjlkY2Q3NWRkN2QxMzczKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYTFlZmMxYWEyYzAzNGViOGJjNTExYzk2OGVhNjU0M2IgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45ODM4NDEyLC0xLjEzMzQ0Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzY5NzdmMTQ4ODhhNzQyNTY4NTdlZTZmZWE5MGFjZmUxKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uX2NlYWRiM2FkMzcwNDQwZjViNDM2NmZkM2FjODYzNjZkID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAnZ3JlZW4nLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfYTFlZmMxYWEyYzAzNGViOGJjNTExYzk2OGVhNjU0M2Iuc2V0SWNvbihpY29uX2NlYWRiM2FkMzcwNDQwZjViNDM2NmZkM2FjODYzNjZkKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjA5YzljMzVmM2QwNDRjNDg1OTUyZWMyMDU0NzQ5MTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjVkYmU5MzEzZjMyNDYzOWIyM2VjZGQxMzlkNGNkYzggPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2I1ZGJlOTMxM2YzMjQ2MzliMjNlY2RkMTM5ZDRjZGM4IiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBBcmNvIFZlcm9uaWNhcyAoWm9uYSA0KTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yMDljOWMzNWYzZDA0NGM0ODU5NTJlYzIwNTQ3NDkxMC5zZXRDb250ZW50KGh0bWxfYjVkYmU5MzEzZjMyNDYzOWIyM2VjZGQxMzlkNGNkYzgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9hMWVmYzFhYTJjMDM0ZWI4YmM1MTFjOTY4ZWE2NTQzYi5iaW5kUG9wdXAocG9wdXBfMjA5YzljMzVmM2QwNDRjNDg1OTUyZWMyMDU0NzQ5MTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9kZDc4MWU0MTM0ZGM0ZmRmOTc2NDk0OGMxMTk0ZDE1MCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4OTY2MjksLTEuMTM3MzI2N10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzY5NzdmMTQ4ODhhNzQyNTY4NTdlZTZmZWE5MGFjZmUxKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzM5OTk2NDlmZTFkZDQzZDFhYWE4MWZkMDEzODQ2MWM2ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAnZ3JlZW4nLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfZGQ3ODFlNDEzNGRjNGZkZjk3NjQ5NDhjMTE5NGQxNTAuc2V0SWNvbihpY29uXzM5OTk2NDlmZTFkZDQzZDFhYWE4MWZkMDEzODQ2MWM2KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGYwZjRjMmFlZjgwNGVmZWE1YzJjNmY3NDhiNmNlZGQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzRiZDU1ZWQxMWUwNGNjMjgxOTdjYmFkYTYxOTJiZjMgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2M0YmQ1NWVkMTFlMDRjYzI4MTk3Y2JhZGE2MTkyYmYzIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBGcmFuY2lzY28gUmFiYWwgKFpvbmEgNCk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOGYwZjRjMmFlZjgwNGVmZWE1YzJjNmY3NDhiNmNlZGQuc2V0Q29udGVudChodG1sX2M0YmQ1NWVkMTFlMDRjYzI4MTk3Y2JhZGE2MTkyYmYzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZGQ3ODFlNDEzNGRjNGZkZjk3NjQ5NDhjMTE5NGQxNTAuYmluZFBvcHVwKHBvcHVwXzhmMGY0YzJhZWY4MDRlZmVhNWMyYzZmNzQ4YjZjZWRkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOTdkZTM4ODY3ZDBiNDMwOGFiYWQyMjFkOTZmMTQ2YjggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45ODQyNjc1LC0xLjEzMTYyODRdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl85MDRkMTZlN2U4YzU0MzVlYjcxYmJiMTBkNzFhYmYzYyA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ2dyZWVuJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzk3ZGUzODg2N2QwYjQzMDhhYmFkMjIxZDk2ZjE0NmI4LnNldEljb24oaWNvbl85MDRkMTZlN2U4YzU0MzVlYjcxYmJiMTBkNzFhYmYzYyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2YzYzdiZjdhZjdkYzQ0ZGFiZTcxODc5MzY0YjExNGMxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q0OGJiMTgzM2RmZTRmM2U4N2ZjNzUyZmE1ZWZmMWUzID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9kNDhiYjE4MzNkZmU0ZjNlODdmYzc1MmZhNWVmZjFlMyIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgTWFkcmUgZGUgRGlvcyAoWm9uYSA0KTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mM2M3YmY3YWY3ZGM0NGRhYmU3MTg3OTM2NGIxMTRjMS5zZXRDb250ZW50KGh0bWxfZDQ4YmIxODMzZGZlNGYzZTg3ZmM3NTJmYTVlZmYxZTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85N2RlMzg4NjdkMGI0MzA4YWJhZDIyMWQ5NmYxNDZiOC5iaW5kUG9wdXAocG9wdXBfZjNjN2JmN2FmN2RjNDRkYWJlNzE4NzkzNjRiMTE0YzEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9jODUwNDU1MTA5YTY0NmYwYWVjNWVmNDVjOTNjMDQ2NSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4NTkyMzYsLTEuMTM4MzM2OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzY5NzdmMTQ4ODhhNzQyNTY4NTdlZTZmZWE5MGFjZmUxKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzQ3YmZjOGJlYTQwNzRkYmRhMTZlN2MyMDI2Y2UxYTEwID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAnZ3JlZW4nLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfYzg1MDQ1NTEwOWE2NDZmMGFlYzVlZjQ1YzkzYzA0NjUuc2V0SWNvbihpY29uXzQ3YmZjOGJlYTQwNzRkYmRhMTZlN2MyMDI2Y2UxYTEwKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTIwNzlkOTYwMzlhNGZlMzg2YmYxMGY4ZDhmZWQ5ZmIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWI3ZmVjZDViNjExNDkwNGIwZWFjMThlZmI4MzZiZjcgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2FiN2ZlY2Q1YjYxMTQ5MDRiMGVhYzE4ZWZiODM2YmY3IiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBOdWV2YXMgVGVjbm9sb2dpYXMgKFpvbmEgNCk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTIwNzlkOTYwMzlhNGZlMzg2YmYxMGY4ZDhmZWQ5ZmIuc2V0Q29udGVudChodG1sX2FiN2ZlY2Q1YjYxMTQ5MDRiMGVhYzE4ZWZiODM2YmY3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYzg1MDQ1NTEwOWE2NDZmMGFlYzVlZjQ1YzkzYzA0NjUuYmluZFBvcHVwKHBvcHVwX2EyMDc5ZDk2MDM5YTRmZTM4NmJmMTBmOGQ4ZmVkOWZiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfY2Y4NjQ3NjU0NmNjNGNjNTgwYjY0Mjc2NzJkZWNjOTcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45ODcxOTI2LC0xLjEzOTM5NjFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl80NjFhMWIyYTU5MzY0NTFkYThkNTdmZTVmMTJhOTY3OCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ2dyZWVuJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyX2NmODY0NzY1NDZjYzRjYzU4MGI2NDI3NjcyZGVjYzk3LnNldEljb24oaWNvbl80NjFhMWIyYTU5MzY0NTFkYThkNTdmZTVmMTJhOTY3OCk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJjNDkyZWVhMzVhYjRmODI5MDI4OWRiMGYwNTU2MzBjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UyY2Y4MjZkOWEyNzQyNDZiYjc5MTdjNDJhYTRkZWQxID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9lMmNmODI2ZDlhMjc0MjQ2YmI3OTE3YzQyYWE0ZGVkMSIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgU2llcnJhIGRlIEdyZWRvcyAoWm9uYSA0KTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yYzQ5MmVlYTM1YWI0ZjgyOTAyODlkYjBmMDU1NjMwYy5zZXRDb250ZW50KGh0bWxfZTJjZjgyNmQ5YTI3NDI0NmJiNzkxN2M0MmFhNGRlZDEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jZjg2NDc2NTQ2Y2M0Y2M1ODBiNjQyNzY3MmRlY2M5Ny5iaW5kUG9wdXAocG9wdXBfMmM0OTJlZWEzNWFiNGY4MjkwMjg5ZGIwZjA1NTYzMGMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl81OWNiZDlkMTBlNTI0OGE4YWE2N2U4MjdkYTVkYjc0NiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4ODE4ODksLTEuMTM5NjU3XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNjk3N2YxNDg4OGE3NDI1Njg1N2VlNmZlYTkwYWNmZTEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fZTk0ZDhmMWE1NjYyNGZlZmExMTdlYjM5NzVlZDcwNDEgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdncmVlbicsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl81OWNiZDlkMTBlNTI0OGE4YWE2N2U4MjdkYTVkYjc0Ni5zZXRJY29uKGljb25fZTk0ZDhmMWE1NjYyNGZlZmExMTdlYjM5NzVlZDcwNDEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zNjQ3YzA2ZWJmOWU0Y2ZlYmUyZTkzNzkzMWYwMmQ1YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jOTgxNzE5N2ZhZGI0MTE3OTI2NGY4YTQxYjRjZTQ1YyA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfYzk4MTcxOTdmYWRiNDExNzkyNjRmOGE0MWI0Y2U0NWMiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIFNpZXJyYSBDYXJib25lcmEgKFpvbmEgNCk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzY0N2MwNmViZjllNGNmZWJlMmU5Mzc5MzFmMDJkNWMuc2V0Q29udGVudChodG1sX2M5ODE3MTk3ZmFkYjQxMTc5MjY0ZjhhNDFiNGNlNDVjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNTljYmQ5ZDEwZTUyNDhhOGFhNjdlODI3ZGE1ZGI3NDYuYmluZFBvcHVwKHBvcHVwXzM2NDdjMDZlYmY5ZTRjZmViZTJlOTM3OTMxZjAyZDVjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOTFlMGE4MDNkZTJiNDkxN2IyYWYzZDE5MTA0NzQ0ZTcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45ODY0NDI0LC0xLjEzNzY4MTFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl80MTQwZDRhZmI3NTQ0MTU0YWEwODFlOGY0OGQ4OTJkNyA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ2dyZWVuJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzkxZTBhODAzZGUyYjQ5MTdiMmFmM2QxOTEwNDc0NGU3LnNldEljb24oaWNvbl80MTQwZDRhZmI3NTQ0MTU0YWEwODFlOGY0OGQ4OTJkNyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JhYmVlZTJkYmQ3ZTQwZTY4Yzc2NjNhOGZkZmRkOTY2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJmZDllNGNkNzRmOTRjODc5NzgwNzA5N2FjNDNjMDAwID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF8yZmQ5ZTRjZDc0Zjk0Yzg3OTc4MDcwOTdhYzQzYzAwMCIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgQXJyaXhhY2EgKFpvbmEgNCk8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmFiZWVlMmRiZDdlNDBlNjhjNzY2M2E4ZmRmZGQ5NjYuc2V0Q29udGVudChodG1sXzJmZDllNGNkNzRmOTRjODc5NzgwNzA5N2FjNDNjMDAwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOTFlMGE4MDNkZTJiNDkxN2IyYWYzZDE5MTA0NzQ0ZTcuYmluZFBvcHVwKHBvcHVwX2JhYmVlZTJkYmQ3ZTQwZTY4Yzc2NjNhOGZkZmRkOTY2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMDhiNDljY2Q5OTYzNDMyM2FkMzM0N2ZjNDUzZGQxYTYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45ODM4NTA2LC0xLjEzMjU1MzNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl83NTZmMmVmZmRjMzg0ZjRlOWE5ZjA3ZGM1NGE0YWI1ZiA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ2dyZWVuJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzA4YjQ5Y2NkOTk2MzQzMjNhZDMzNDdmYzQ1M2RkMWE2LnNldEljb24oaWNvbl83NTZmMmVmZmRjMzg0ZjRlOWE5ZjA3ZGM1NGE0YWI1Zik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUyMDYyMzJjMDkwMjRhY2JiYjUyZGE1ZDNhZTY4ZjI5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzMwNTdiYmUyZmQ3MTRiNjQ5NTIwMjhlNDI1MjQyMThiID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF8zMDU3YmJlMmZkNzE0YjY0OTUyMDI4ZTQyNTI0MjE4YiIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgUGFzY3VhbCAoWm9uYSA0KTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MjA2MjMyYzA5MDI0YWNiYmI1MmRhNWQzYWU2OGYyOS5zZXRDb250ZW50KGh0bWxfMzA1N2JiZTJmZDcxNGI2NDk1MjAyOGU0MjUyNDIxOGIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wOGI0OWNjZDk5NjM0MzIzYWQzMzQ3ZmM0NTNkZDFhNi5iaW5kUG9wdXAocG9wdXBfNTIwNjIzMmMwOTAyNGFjYmJiNTJkYTVkM2FlNjhmMjkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9jZTAxZjgwMTkwMzg0YTQ4YTUxYTM4ZWQ0ZjlmNmE5NyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4NjU2NDYsLTEuMTM3NzA3MV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzY5NzdmMTQ4ODhhNzQyNTY4NTdlZTZmZWE5MGFjZmUxKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uX2MwMDVhMmY0MjgyYTRjMGViZjJkNTJlYzA1ODg3ZTRhID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAnZ3JlZW4nLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfY2UwMWY4MDE5MDM4NGE0OGE1MWEzOGVkNGY5ZjZhOTcuc2V0SWNvbihpY29uX2MwMDVhMmY0MjgyYTRjMGViZjJkNTJlYzA1ODg3ZTRhKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWRjODgxNDRlYzljNGZiMGFiODJkNWJmMTBhZjg4ZGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjk2NTMxYTA3OWY5NDlhNGI0NGYyOWQ4MDU1NGIxNTggPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzY5NjUzMWEwNzlmOTQ5YTRiNDRmMjlkODA1NTRiMTU4IiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBQbGF6YSBkZSBTYW4gQWd1c3RpbiAoWm9uYSA0KTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lZGM4ODE0NGVjOWM0ZmIwYWI4MmQ1YmYxMGFmODhkYS5zZXRDb250ZW50KGh0bWxfNjk2NTMxYTA3OWY5NDlhNGI0NGYyOWQ4MDU1NGIxNTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jZTAxZjgwMTkwMzg0YTQ4YTUxYTM4ZWQ0ZjlmNmE5Ny5iaW5kUG9wdXAocG9wdXBfZWRjODgxNDRlYzljNGZiMGFiODJkNWJmMTBhZjg4ZGEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9hMjFiZGY4NzMxYmE0Yjc0YWFlZGQyNGUwM2FiZjM4MCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4NjI3MjMsLTEuMTQwMDM1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNjk3N2YxNDg4OGE3NDI1Njg1N2VlNmZlYTkwYWNmZTEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fNjgxMzUwM2Y2ZmM5NDBjODhlYWIxMWI2NmMwYjc5NGQgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdncmVlbicsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl9hMjFiZGY4NzMxYmE0Yjc0YWFlZGQyNGUwM2FiZjM4MC5zZXRJY29uKGljb25fNjgxMzUwM2Y2ZmM5NDBjODhlYWIxMWI2NmMwYjc5NGQpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82ZjBmMTdhNjAxOWM0YzkwYmQwMDc4MTcxNDhjMmJlNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jMmYzZmJiYWZmMDg0YzVlYWUxYTM3NzliMmY5MDM3MCA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfYzJmM2ZiYmFmZjA4NGM1ZWFlMWEzNzc5YjJmOTAzNzAiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIE1hcmlhbm8gTW9udGVzaW5vcyAoWm9uYSA0KTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ZjBmMTdhNjAxOWM0YzkwYmQwMDc4MTcxNDhjMmJlNy5zZXRDb250ZW50KGh0bWxfYzJmM2ZiYmFmZjA4NGM1ZWFlMWEzNzc5YjJmOTAzNzApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9hMjFiZGY4NzMxYmE0Yjc0YWFlZGQyNGUwM2FiZjM4MC5iaW5kUG9wdXAocG9wdXBfNmYwZjE3YTYwMTljNGM5MGJkMDA3ODE3MTQ4YzJiZTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIG11bHRpX3BvbHlfbGluZV9jZTI4NTg4ZGUwNDQ0ZTUzOTEwMDk1NTBjZGZiODBjZCA9IEwubXVsdGlQb2x5bGluZSgKICAgICAgICAgICAgICAgICAgICBbW1szNy45ODc1ODA2LCAtMS4xNDQ5MzU2XSwgWzM3Ljk4Mjc1ODYsIC0xLjEzODI3MDNdXSwgW1szNy45ODI3NTg2LCAtMS4xMzgyNzAzXSwgWzM3Ljk4Mzg1MDYsIC0xLjEzMjU1MzNdXSwgW1szNy45ODM4NTA2LCAtMS4xMzI1NTMzXSwgWzM3Ljk4NDI2NzUsIC0xLjEzMTYyODRdXSwgW1szNy45ODQyNjc1LCAtMS4xMzE2Mjg0XSwgWzM3Ljk4OTY2MjksIC0xLjEzNzMyNjddXSwgW1szNy45ODk2NjI5LCAtMS4xMzczMjY3XSwgWzM3Ljk4OTQ5MDksIC0xLjE0MjM2MzhdXSwgW1szNy45ODk0OTA5LCAtMS4xNDIzNjM4XSwgWzM3Ljk4NzU4MDYsIC0xLjE0NDkzNTZdXV0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ2dyZWVuJywKICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiA1LAogICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMS5hZGRMYXllcihtdWx0aV9wb2x5X2xpbmVfY2UyODU4OGRlMDQ0NGU1MzkxMDA5NTUwY2RmYjgwY2QpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81MjZjMGM5NzE0ZTY0Yjc1ODIwYzdjOTIxOTI4OWFjMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xMTNlMTViN2JhOGQ0NDhjOTJmNTdlYjQ3Y2JkODM1ZiA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfMTEzZTE1YjdiYThkNDQ4YzkyZjU3ZWI0N2NiZDgzNWYiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIFpvbmEgNDwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MjZjMGM5NzE0ZTY0Yjc1ODIwYzdjOTIxOTI4OWFjMC5zZXRDb250ZW50KGh0bWxfMTEzZTE1YjdiYThkNDQ4YzkyZjU3ZWI0N2NiZDgzNWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG11bHRpX3BvbHlfbGluZV9jZTI4NTg4ZGUwNDQ0ZTUzOTEwMDk1NTBjZGZiODBjZC5iaW5kUG9wdXAocG9wdXBfNTI2YzBjOTcxNGU2NGI3NTgyMGM3YzkyMTkyODlhYzApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9jYjVmNGY2M2RhOGU0MTgxODNiYmVlMzllZDEwNGUyNiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4NTEzOTQsLTEuMTIzMjQ5OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzY5NzdmMTQ4ODhhNzQyNTY4NTdlZTZmZWE5MGFjZmUxKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzFjYjlkMGIwMGE5YzQ1ODdiYTRiMjBjYWEzOGExYWI2ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAnb3JhbmdlJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyX2NiNWY0ZjYzZGE4ZTQxODE4M2JiZWUzOWVkMTA0ZTI2LnNldEljb24oaWNvbl8xY2I5ZDBiMDBhOWM0NTg3YmE0YjIwY2FhMzhhMWFiNik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFkNzFkYjY4ZWYwNjQxMDU4OWQyOGIzYzU2NmNmYzkyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk3NGZmNzA1ZDIyYjQxNTQ5YmVkYzVjMDM2MTVmZjk2ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF85NzRmZjcwNWQyMmI0MTU0OWJlZGM1YzAzNjE1ZmY5NiIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgUm9uZGEgZGUgR2FyYXkgKFpvbmEgNik8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWQ3MWRiNjhlZjA2NDEwNTg5ZDI4YjNjNTY2Y2ZjOTIuc2V0Q29udGVudChodG1sXzk3NGZmNzA1ZDIyYjQxNTQ5YmVkYzVjMDM2MTVmZjk2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfY2I1ZjRmNjNkYThlNDE4MTgzYmJlZTM5ZWQxMDRlMjYuYmluZFBvcHVwKHBvcHVwXzFkNzFkYjY4ZWYwNjQxMDU4OWQyOGIzYzU2NmNmYzkyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZGE0ZTcxOTQ5M2FmNDc0ZWFiY2JhNTY3ODgxYTMxOTkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45ODQxODg3LC0xLjEyNDk5MDZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl9mOTMwNTAyYTkzODM0ZTkzYjQ4MTgyNjEyNjg3YTVhMiA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ29yYW5nZScsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl9kYTRlNzE5NDkzYWY0NzRlYWJjYmE1Njc4ODFhMzE5OS5zZXRJY29uKGljb25fZjkzMDUwMmE5MzgzNGU5M2I0ODE4MjYxMjY4N2E1YTIpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81MTU5M2U3YzRhNTA0MzljYjk2MTVlMjNlYzM2ZWZmMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82NjFmNTlhMGNlZmY0MWExOGZhOWI1YTJlMTFjOTMwYSA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfNjYxZjU5YTBjZWZmNDFhMThmYTliNWEyZTExYzkzMGEiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIFNpbW9uIEdhcmNpYSAoWm9uYSA2KTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MTU5M2U3YzRhNTA0MzljYjk2MTVlMjNlYzM2ZWZmMS5zZXRDb250ZW50KGh0bWxfNjYxZjU5YTBjZWZmNDFhMThmYTliNWEyZTExYzkzMGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kYTRlNzE5NDkzYWY0NzRlYWJjYmE1Njc4ODFhMzE5OS5iaW5kUG9wdXAocG9wdXBfNTE1OTNlN2M0YTUwNDM5Y2I5NjE1ZTIzZWMzNmVmZjEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8wZjZiN2I4NTgzNzI0ZmM5ODU5MmM5NzAzMjRlMzg4OCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4NDE2NDQsLTEuMTIxOTY0Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzY5NzdmMTQ4ODhhNzQyNTY4NTdlZTZmZWE5MGFjZmUxKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uX2VmNTg5MjNkN2UzMzQ5ZGZiZmY3Nzk3MGI3MWIxMTcyID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAnb3JhbmdlJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzBmNmI3Yjg1ODM3MjRmYzk4NTkyYzk3MDMyNGUzODg4LnNldEljb24oaWNvbl9lZjU4OTIzZDdlMzM0OWRmYmZmNzc5NzBiNzFiMTE3Mik7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU3ZGI0NmZlMTQxODQwMjFhNWE1MjMyODYwYWU4ZmMzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2IxZTkyMTU2OTIwNDQ2MmM5NmFiYTkwMjhjNGJmMGU0ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF9iMWU5MjE1NjkyMDQ0NjJjOTZhYmE5MDI4YzRiZjBlNCIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgU2FuIExlYW5kcm8gKFpvbmEgNik8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTdkYjQ2ZmUxNDE4NDAyMWE1YTUyMzI4NjBhZThmYzMuc2V0Q29udGVudChodG1sX2IxZTkyMTU2OTIwNDQ2MmM5NmFiYTkwMjhjNGJmMGU0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMGY2YjdiODU4MzcyNGZjOTg1OTJjOTcwMzI0ZTM4ODguYmluZFBvcHVwKHBvcHVwXzU3ZGI0NmZlMTQxODQwMjFhNWE1MjMyODYwYWU4ZmMzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZTJlNzE3NTlhMmRlNGI3MzhmZDhiNTQ2MjkxM2M3MjAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45ODI0NDA3LC0xLjEyNDcyOF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzY5NzdmMTQ4ODhhNzQyNTY4NTdlZTZmZWE5MGFjZmUxKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzAzMGNhZGFmYTUxNTQ5OWI4MzFjMDJiZGYzYWRmN2I3ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAnb3JhbmdlJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyX2UyZTcxNzU5YTJkZTRiNzM4ZmQ4YjU0NjI5MTNjNzIwLnNldEljb24oaWNvbl8wMzBjYWRhZmE1MTU0OTliODMxYzAyYmRmM2FkZjdiNyk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE1NTQzZGI0NGI0ZTQ2Y2Q4MGQwMmJhZGU3YzE0ZmQ3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzkzNWI4NTlkMDg1MTRhOTU4OWVjN2FhY2M5ZmViNWViID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF85MzViODU5ZDA4NTE0YTk1ODllYzdhYWNjOWZlYjVlYiIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgR2VuZXJhbCBTYW5tYXJ0aW4gKFpvbmEgNik8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTU1NDNkYjQ0YjRlNDZjZDgwZDAyYmFkZTdjMTRmZDcuc2V0Q29udGVudChodG1sXzkzNWI4NTlkMDg1MTRhOTU4OWVjN2FhY2M5ZmViNWViKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZTJlNzE3NTlhMmRlNGI3MzhmZDhiNTQ2MjkxM2M3MjAuYmluZFBvcHVwKHBvcHVwXzE1NTQzZGI0NGI0ZTQ2Y2Q4MGQwMmJhZGU3YzE0ZmQ3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZTY5NThkMmQ0NDE0NGVjMWI3MDQ1OGViN2E3MTM2NWEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45ODQ3MzY4LC0xLjEyMjMwODZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl9hYWIwZGExYWYzY2Y0NjM1ODc1YmVmNmE4OWRiNzA1ZiA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ29yYW5nZScsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl9lNjk1OGQyZDQ0MTQ0ZWMxYjcwNDU4ZWI3YTcxMzY1YS5zZXRJY29uKGljb25fYWFiMGRhMWFmM2NmNDYzNTg3NWJlZjZhODlkYjcwNWYpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hYTYyODUzYTA3ZWY0YzAyODFhOTJlMTdjZDE3NzEyMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hNzhlNGMwZjhhNGE0YzRmOWMyZWZhYmZkODcyYWQ3MyA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfYTc4ZTRjMGY4YTRhNGM0ZjljMmVmYWJmZDg3MmFkNzMiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIEpvc2VsaXRvIChab25hIDYpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FhNjI4NTNhMDdlZjRjMDI4MWE5MmUxN2NkMTc3MTIzLnNldENvbnRlbnQoaHRtbF9hNzhlNGMwZjhhNGE0YzRmOWMyZWZhYmZkODcyYWQ3Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2U2OTU4ZDJkNDQxNDRlYzFiNzA0NThlYjdhNzEzNjVhLmJpbmRQb3B1cChwb3B1cF9hYTYyODUzYTA3ZWY0YzAyODFhOTJlMTdjZDE3NzEyMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2M0NTZhMDc4MmJhYzQ1ZTViYjRmZjgzMzVmODBjODZhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTg2MDgxOCwtMS4xMjQwODk2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNjk3N2YxNDg4OGE3NDI1Njg1N2VlNmZlYTkwYWNmZTEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fZGRiODgwOWJmYTNiNDNjNTk1MTY1ZDNiNDJlOGU0ZDIgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdvcmFuZ2UnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfYzQ1NmEwNzgyYmFjNDVlNWJiNGZmODMzNWY4MGM4NmEuc2V0SWNvbihpY29uX2RkYjg4MDliZmEzYjQzYzU5NTE2NWQzYjQyZThlNGQyKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWRkZjljM2E3YjZhNDgwMjlkOTMzYTBkMmY1YTdlYTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmI3YmE5YzEwNDE5NGUyYjhkYjQ3YmVhY2FiZmYxOTcgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2JiN2JhOWMxMDQxOTRlMmI4ZGI0N2JlYWNhYmZmMTk3IiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBNYXJpYW5vIFZlcmdhcmEgKFpvbmEgNik8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWRkZjljM2E3YjZhNDgwMjlkOTMzYTBkMmY1YTdlYTUuc2V0Q29udGVudChodG1sX2JiN2JhOWMxMDQxOTRlMmI4ZGI0N2JlYWNhYmZmMTk3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYzQ1NmEwNzgyYmFjNDVlNWJiNGZmODMzNWY4MGM4NmEuYmluZFBvcHVwKHBvcHVwX2FkZGY5YzNhN2I2YTQ4MDI5ZDkzM2EwZDJmNWE3ZWE1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYjljMmY1ZGI1NmM0NGY0YWFjZmM0YjJmNzEyMThmODYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45ODY0OTUyLC0xLjEyNDAyMTRdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl83YjQ4MjA1YzFhOWQ0MWQ1ODZkMGUwYmY4ZWMxZTcwOSA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ29yYW5nZScsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl9iOWMyZjVkYjU2YzQ0ZjRhYWNmYzRiMmY3MTIxOGY4Ni5zZXRJY29uKGljb25fN2I0ODIwNWMxYTlkNDFkNTg2ZDBlMGJmOGVjMWU3MDkpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jOTFkMWE4NmI3Mzc0MjVmODhiMzQxOTkwZTc2ZmQzZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jY2EwZDMyYTkwNjE0NWQ3YmIxM2I3MmM5YzcxNWQ0YyA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfY2NhMGQzMmE5MDYxNDVkN2JiMTNiNzJjOWM3MTVkNGMiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIE9iaXNwbyBGcnV0b3MgKFpvbmEgNik8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzkxZDFhODZiNzM3NDI1Zjg4YjM0MTk5MGU3NmZkM2Yuc2V0Q29udGVudChodG1sX2NjYTBkMzJhOTA2MTQ1ZDdiYjEzYjcyYzljNzE1ZDRjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYjljMmY1ZGI1NmM0NGY0YWFjZmM0YjJmNzEyMThmODYuYmluZFBvcHVwKHBvcHVwX2M5MWQxYTg2YjczNzQyNWY4OGIzNDE5OTBlNzZmZDNmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYjYxNzcxMjRkZGEwNGE3ZTgyY2JkMzgyMjRiYjc1ZDYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45ODc0NzgxLC0xLjEyMzY2NTZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl8xMzkwODk1NzgyYjA0MjczYjY5ZmQ3YTkzYWRkNGQ3NyA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ05vbmUnLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ29yYW5nZScsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl9iNjE3NzEyNGRkYTA0YTdlODJjYmQzODIyNGJiNzVkNi5zZXRJY29uKGljb25fMTM5MDg5NTc4MmIwNDI3M2I2OWZkN2E5M2FkZDRkNzcpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83ZmM5ODQwNjVkYWI0NmZhOGZlYTAyNDQ2MDY4ZGQzYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hY2IxN2I2YjEyYjA0YzIwOGQ2NDUwMzY5OGU2MzFmMyA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfYWNiMTdiNmIxMmIwNGMyMDhkNjQ1MDM2OThlNjMxZjMiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIENhbGxlIENpZ2FycmFsIChab25hIDYpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdmYzk4NDA2NWRhYjQ2ZmE4ZmVhMDI0NDYwNjhkZDNjLnNldENvbnRlbnQoaHRtbF9hY2IxN2I2YjEyYjA0YzIwOGQ2NDUwMzY5OGU2MzFmMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2I2MTc3MTI0ZGRhMDRhN2U4MmNiZDM4MjI0YmI3NWQ2LmJpbmRQb3B1cChwb3B1cF83ZmM5ODQwNjVkYWI0NmZhOGZlYTAyNDQ2MDY4ZGQzYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2JjMjlmMjI0NmYzZjQ3Mjg5YzZmOTNhM2U3OTJkMzIyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTg1MjEwOSwtMS4xMjM5NzY5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNjk3N2YxNDg4OGE3NDI1Njg1N2VlNmZlYTkwYWNmZTEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fMjc5ZjdkODFhMjMyNDM4ZTk4YTNjMGNmNDYzMzkwMTEgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdvcmFuZ2UnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfYmMyOWYyMjQ2ZjNmNDcyODljNmY5M2EzZTc5MmQzMjIuc2V0SWNvbihpY29uXzI3OWY3ZDgxYTIzMjQzOGU5OGEzYzBjZjQ2MzM5MDExKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWZjYTE4ZmQzYTk4NDgwM2E3YTViY2M2YjZmMjUyZTcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGM2NzEwOTBlNzAwNDBkYTk2YzQ0NzUxNDcwYjc3MzEgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzRjNjcxMDkwZTcwMDQwZGE5NmM0NDc1MTQ3MGI3NzMxIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBQZXJpb2Rpc3RhIE5pY29sYXMgT3J0ZWdhIFBhZ2FuIChab25hIDYpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FmY2ExOGZkM2E5ODQ4MDNhN2E1YmNjNmI2ZjI1MmU3LnNldENvbnRlbnQoaHRtbF80YzY3MTA5MGU3MDA0MGRhOTZjNDQ3NTE0NzBiNzczMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2JjMjlmMjI0NmYzZjQ3Mjg5YzZmOTNhM2U3OTJkMzIyLmJpbmRQb3B1cChwb3B1cF9hZmNhMThmZDNhOTg0ODAzYTdhNWJjYzZiNmYyNTJlNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2ZkMGVjZmFhNTI0NTRkZDU4YWNiMDZjODdiNmFiODU3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTg3ODY1NSwtMS4xMjMxNjk4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNjk3N2YxNDg4OGE3NDI1Njg1N2VlNmZlYTkwYWNmZTEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fYjY4MWQ0MzhkZDQ0NDdhYWFmYTVlOWJhMGRkODBlZTAgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdvcmFuZ2UnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfZmQwZWNmYWE1MjQ1NGRkNThhY2IwNmM4N2I2YWI4NTcuc2V0SWNvbihpY29uX2I2ODFkNDM4ZGQ0NDQ3YWFhZmE1ZTliYTBkZDgwZWUwKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTI0Nzg2NDdmZTcyNGFjNmJjMTI4YjgzZjg1YWQzZWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYThmNTkwOTY4YjYxNDQxODliMGVhOTlhZWEzYzliYjMgPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sX2E4ZjU5MDk2OGI2MTQ0MTg5YjBlYTk5YWVhM2M5YmIzIiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBkZSBDZXV0YSAoWm9uYSA2KTwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MjQ3ODY0N2ZlNzI0YWM2YmMxMjhiODNmODVhZDNlZS5zZXRDb250ZW50KGh0bWxfYThmNTkwOTY4YjYxNDQxODliMGVhOTlhZWEzYzliYjMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9mZDBlY2ZhYTUyNDU0ZGQ1OGFjYjA2Yzg3YjZhYjg1Ny5iaW5kUG9wdXAocG9wdXBfNTI0Nzg2NDdmZTcyNGFjNmJjMTI4YjgzZjg1YWQzZWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8wN2ZhZTJkMWRkODM0ZjU3OWNlZWE0NTAxYzYxMTMwZSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk4MjkyNTMsLTEuMTIyOTU4N10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzY5NzdmMTQ4ODhhNzQyNTY4NTdlZTZmZWE5MGFjZmUxKTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzdlODk0Yjk2Yzk5MjRmM2ViYzE3NjIyZmZlZGM4ZTlhID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnTm9uZScsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAnb3JhbmdlJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzA3ZmFlMmQxZGQ4MzRmNTc5Y2VlYTQ1MDFjNjExMzBlLnNldEljb24oaWNvbl83ZTg5NGI5NmM5OTI0ZjNlYmMxNzYyMmZmZWRjOGU5YSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI1YmFkOGU1OTNjMzQ5YWE4ZDk4OTgxZTYxZjExMTk0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzExMjg1MjdjYTdmOTRkZWZhZjI3NzJhYWNjYTViNzM5ID0gJCgnICAgICAgICAgPGRpdiBpZD0iaHRtbF8xMTI4NTI3Y2E3Zjk0ZGVmYWYyNzcyYWFjY2E1YjczOSIgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPiAgICAgICAgICAgICAgICAgQ2FsbGUgQ29tdW5lcm9zIChab25hIDYpPC9kaXY+ICAgICAgICAgICAgICAgICAnKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI1YmFkOGU1OTNjMzQ5YWE4ZDk4OTgxZTYxZjExMTk0LnNldENvbnRlbnQoaHRtbF8xMTI4NTI3Y2E3Zjk0ZGVmYWYyNzcyYWFjY2E1YjczOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzA3ZmFlMmQxZGQ4MzRmNTc5Y2VlYTQ1MDFjNjExMzBlLmJpbmRQb3B1cChwb3B1cF8yNWJhZDhlNTkzYzM0OWFhOGQ5ODk4MWU2MWYxMTE5NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzNjMzVhZDAyZjQ5ZTQ1NDlhNjYzYmZlM2ZlZDIyYmY2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTg3NDYyNSwtMS4xMjQ1MDc4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNjk3N2YxNDg4OGE3NDI1Njg1N2VlNmZlYTkwYWNmZTEpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fNzIzODZlMGQ1MTgxNGIzZDk1ZGRjMzM2N2FhNWUyNTggPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdOb25lJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdvcmFuZ2UnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfM2MzNWFkMDJmNDllNDU0OWE2NjNiZmUzZmVkMjJiZjYuc2V0SWNvbihpY29uXzcyMzg2ZTBkNTE4MTRiM2Q5NWRkYzMzNjdhYTVlMjU4KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODNmMjNhMzg5MWY2NGFhMzkxMDkyYjRjMjZiNGRmODUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDNkZDlmYjkyYTY4NDRmMWI3MDY2NGZmMTRhNmRhNjggPSAkKCcgICAgICAgICA8ZGl2IGlkPSJodG1sXzAzZGQ5ZmI5MmE2ODQ0ZjFiNzA2NjRmZjE0YTZkYTY4IiAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ICAgICAgICAgICAgICAgICBDYWxsZSBNYWRyaWQgKFpvbmEgNik8L2Rpdj4gICAgICAgICAgICAgICAgICcpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODNmMjNhMzg5MWY2NGFhMzkxMDkyYjRjMjZiNGRmODUuc2V0Q29udGVudChodG1sXzAzZGQ5ZmI5MmE2ODQ0ZjFiNzA2NjRmZjE0YTZkYTY4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfM2MzNWFkMDJmNDllNDU0OWE2NjNiZmUzZmVkMjJiZjYuYmluZFBvcHVwKHBvcHVwXzgzZjIzYTM4OTFmNjRhYTM5MTA5MmI0YzI2YjRkZjg1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBtdWx0aV9wb2x5X2xpbmVfYTM5ZWQ1ZDQ2Mjg5NGRjZDliZWVhMGZmOTRjZWYzZmIgPSBMLm11bHRpUG9seWxpbmUoCiAgICAgICAgICAgICAgICAgICAgW1tbMzcuOTg0MTg4NywgLTEuMTI0OTkwNl0sIFszNy45ODI0NDA3LCAtMS4xMjQ3MjhdXSwgW1szNy45ODI0NDA3LCAtMS4xMjQ3MjhdLCBbMzcuOTgyOTI1MywgLTEuMTIyOTU4N11dLCBbWzM3Ljk4MjkyNTMsIC0xLjEyMjk1ODddLCBbMzcuOTg0MTY0NCwgLTEuMTIxOTY0Nl1dLCBbWzM3Ljk4NDE2NDQsIC0xLjEyMTk2NDZdLCBbMzcuOTg3ODY1NSwgLTEuMTIzMTY5OF1dLCBbWzM3Ljk4Nzg2NTUsIC0xLjEyMzE2OThdLCBbMzcuOTg3NDYyNSwgLTEuMTI0NTA3OF1dLCBbWzM3Ljk4NzQ2MjUsIC0xLjEyNDUwNzhdLCBbMzcuOTg0MTg4NywgLTEuMTI0OTkwNl1dXSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnb3JhbmdlJywKICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiA1LAogICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcF82OTc3ZjE0ODg4YTc0MjU2ODU3ZWU2ZmVhOTBhY2ZlMS5hZGRMYXllcihtdWx0aV9wb2x5X2xpbmVfYTM5ZWQ1ZDQ2Mjg5NGRjZDliZWVhMGZmOTRjZWYzZmIpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xODEwYTYxZmI5OTM0MTJmOTg3ZjM5NGE0ZGNmYjdlYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kZmZkZDc3ZTcyMzk0MzVmYjRhNDdjZWMwYjMzMmJkMiA9ICQoJyAgICAgICAgIDxkaXYgaWQ9Imh0bWxfZGZmZGQ3N2U3MjM5NDM1ZmI0YTQ3Y2VjMGIzMzJiZDIiICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4gICAgICAgICAgICAgICAgIFpvbmEgNjwvZGl2PiAgICAgICAgICAgICAgICAgJylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xODEwYTYxZmI5OTM0MTJmOTg3ZjM5NGE0ZGNmYjdlYS5zZXRDb250ZW50KGh0bWxfZGZmZGQ3N2U3MjM5NDM1ZmI0YTQ3Y2VjMGIzMzJiZDIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG11bHRpX3BvbHlfbGluZV9hMzllZDVkNDYyODk0ZGNkOWJlZWEwZmY5NGNlZjNmYi5iaW5kUG9wdXAocG9wdXBfMTgxMGE2MWZiOTkzNDEyZjk4N2YzOTRhNGRjZmI3ZWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgPC9zY3JpcHQ+CiAgICAgICAg\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;\"></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x7f8723202910>"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mapa = folium.Map(location=[37.9829272,-1.1251948], zoom_start=14,\n",
" tiles='Cartodb Positron')\n",
"\n",
"zones_colors = {'1-2-3':'red','4':'green','5':'blue','6':'orange'}\n",
"\n",
"zones_labels = ['6']\n",
"for zone in zones_colors.keys():\n",
" zone_slice = murcia_bbox[['latlon','name']][(zones_osm.zone==zone)]\n",
" zone_slice = zone_slice.drop_duplicates(subset=['name'])\n",
" for point in zone_slice.values:\n",
" mapa.simple_marker(point[0], popup='{} (Zona {})'.format(unicodedata.normalize('NFKD', point[1]).encode('ascii','ignore'), zone), marker_icon=None,marker_color=zones_colors[zone])\n",
" zone_boundary = MultiPoint(zone_slice.latlon.tolist()).convex_hull \n",
" locations = list(zip(zone_boundary.exterior.coords.xy[0],zone_boundary.exterior.coords.xy[1]))\n",
" locations = [[locations[i],locations[i+1]] for i in range( len(locations) -1)]\n",
" zone_border = folium.MultiPolyLine(locations=locations,popup='Zona {}'.format(zone), color=zones_colors[zone], weight=5, opacity=1) \n",
" mapa.add_children(zone_border) \n",
"\n",
"mapa"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We want to also plot the street geometries as well, so we filter also those mislabeled geometries"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"(103, 7)"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"murcia_bbox = murcia_bbox[\n",
" (murcia_bbox.bounds.miny>=min_lat)&\n",
" (murcia_bbox.bounds.maxy<=max_lat)&\n",
" (murcia_bbox.bounds.minx>=min_lon)&\n",
" (murcia_bbox.bounds.maxx<=max_lon)\n",
"]\n",
"murcia_bbox.shape"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now, for each zone, we calculate the zone boundary including the geocoded points, as well as the streets' geometries"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/manuel/anaconda3/lib/python2.7/site-packages/ipykernel/__main__.py:14: FutureWarning: simple_marker is deprecated. Use add_children(Marker) instead\n"
]
},
{
"data": {
"text/html": [
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment