Skip to content

Instantly share code, notes, and snippets.

@thinhha
Last active June 28, 2019 13:00
Show Gist options
  • Save thinhha/6cb0d76bba1adb9d80871cd47576d440 to your computer and use it in GitHub Desktop.
Save thinhha/6cb0d76bba1adb9d80871cd47576d440 to your computer and use it in GitHub Desktop.
BQ-GIS-LondonCycle-Demo
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"/usr/bin/python3\n",
"3.5.3 (default, Sep 27 2018, 17:25:39) \n",
"[GCC 6.3.0 20170516]\n"
]
}
],
"source": [
"import sys\n",
"print(sys.executable)\n",
"print(sys.version)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import os\n",
"import geojson\n",
"import pandas as pd\n",
"\n",
"from google.cloud import bigquery\n",
"from IPython.display import GeoJSON"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'0.8.3'"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import folium\n",
"from folium import plugins\n",
"\n",
"folium.__version__"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'0.4.1'"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import geopandas as gpd\n",
"\n",
"gpd.__version__"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"pd.set_option('max_rows', 12)\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>rental_id</th>\n",
" <th>start_date</th>\n",
" <th>start_station_name</th>\n",
" <th>start_station_latitude</th>\n",
" <th>start_station_longitude</th>\n",
" <th>start_station_docks_count</th>\n",
" <th>end_date</th>\n",
" <th>end_station_name</th>\n",
" <th>end_station_latitude</th>\n",
" <th>end_station_longitude</th>\n",
" <th>end_station_docks_count</th>\n",
" <th>duration</th>\n",
" <th>is_same_station</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>62475502</td>\n",
" <td>2017-02-18 16:15:00+00:00</td>\n",
" <td>Broomhouse Lane, Parsons Green</td>\n",
" <td>51.468419</td>\n",
" <td>-0.199136</td>\n",
" <td>29</td>\n",
" <td>2017-02-18 16:22:00+00:00</td>\n",
" <td>Aintree Street, Fulham</td>\n",
" <td>51.481021</td>\n",
" <td>-0.209973</td>\n",
" <td>24</td>\n",
" <td>420</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>62474522</td>\n",
" <td>2017-02-18 15:52:00+00:00</td>\n",
" <td>Ranelagh Gardens, Fulham</td>\n",
" <td>51.467601</td>\n",
" <td>-0.206827</td>\n",
" <td>39</td>\n",
" <td>2017-02-18 16:02:00+00:00</td>\n",
" <td>Aintree Street, Fulham</td>\n",
" <td>51.481021</td>\n",
" <td>-0.209973</td>\n",
" <td>24</td>\n",
" <td>600</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>62477580</td>\n",
" <td>2017-02-18 17:06:00+00:00</td>\n",
" <td>Michael Road, Walham Green</td>\n",
" <td>51.477276</td>\n",
" <td>-0.189210</td>\n",
" <td>37</td>\n",
" <td>2017-02-18 17:21:00+00:00</td>\n",
" <td>Aintree Street, Fulham</td>\n",
" <td>51.481021</td>\n",
" <td>-0.209973</td>\n",
" <td>24</td>\n",
" <td>900</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>62477618</td>\n",
" <td>2017-02-18 17:07:00+00:00</td>\n",
" <td>Michael Road, Walham Green</td>\n",
" <td>51.477276</td>\n",
" <td>-0.189210</td>\n",
" <td>37</td>\n",
" <td>2017-02-18 17:19:00+00:00</td>\n",
" <td>Aintree Street, Fulham</td>\n",
" <td>51.481021</td>\n",
" <td>-0.209973</td>\n",
" <td>24</td>\n",
" <td>720</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>62481482</td>\n",
" <td>2017-02-18 19:50:00+00:00</td>\n",
" <td>Alderney Street, Pimlico</td>\n",
" <td>51.488058</td>\n",
" <td>-0.140741</td>\n",
" <td>14</td>\n",
" <td>2017-02-18 20:15:00+00:00</td>\n",
" <td>Aintree Street, Fulham</td>\n",
" <td>51.481021</td>\n",
" <td>-0.209973</td>\n",
" <td>24</td>\n",
" <td>1500</td>\n",
" <td>False</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" rental_id start_date start_station_name \\\n",
"0 62475502 2017-02-18 16:15:00+00:00 Broomhouse Lane, Parsons Green \n",
"1 62474522 2017-02-18 15:52:00+00:00 Ranelagh Gardens, Fulham \n",
"2 62477580 2017-02-18 17:06:00+00:00 Michael Road, Walham Green \n",
"3 62477618 2017-02-18 17:07:00+00:00 Michael Road, Walham Green \n",
"4 62481482 2017-02-18 19:50:00+00:00 Alderney Street, Pimlico \n",
"\n",
" start_station_latitude start_station_longitude start_station_docks_count \\\n",
"0 51.468419 -0.199136 29 \n",
"1 51.467601 -0.206827 39 \n",
"2 51.477276 -0.189210 37 \n",
"3 51.477276 -0.189210 37 \n",
"4 51.488058 -0.140741 14 \n",
"\n",
" end_date end_station_name end_station_latitude \\\n",
"0 2017-02-18 16:22:00+00:00 Aintree Street, Fulham 51.481021 \n",
"1 2017-02-18 16:02:00+00:00 Aintree Street, Fulham 51.481021 \n",
"2 2017-02-18 17:21:00+00:00 Aintree Street, Fulham 51.481021 \n",
"3 2017-02-18 17:19:00+00:00 Aintree Street, Fulham 51.481021 \n",
"4 2017-02-18 20:15:00+00:00 Aintree Street, Fulham 51.481021 \n",
"\n",
" end_station_longitude end_station_docks_count duration is_same_station \n",
"0 -0.209973 24 420 False \n",
"1 -0.209973 24 600 False \n",
"2 -0.209973 24 900 False \n",
"3 -0.209973 24 720 False \n",
"4 -0.209973 24 1500 False "
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%bigquery\n",
"SELECT\n",
" *\n",
"FROM\n",
" `google.com:pso-bq-gis-demo.gis_demo.london_cycle`\n",
"LIMIT 5"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>install_date</th>\n",
" <th>installed</th>\n",
" <th>latitude</th>\n",
" <th>locked</th>\n",
" <th>longitude</th>\n",
" <th>name</th>\n",
" <th>bikes_count</th>\n",
" <th>docks_count</th>\n",
" <th>nbEmptyDocks</th>\n",
" <th>removal_date</th>\n",
" <th>temporary</th>\n",
" <th>terminal_name</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>39</td>\n",
" <td>2010-07-08</td>\n",
" <td>True</td>\n",
" <td>51.526378</td>\n",
" <td>false</td>\n",
" <td>-0.078131</td>\n",
" <td>Shoreditch High Street, Shoreditch</td>\n",
" <td>41</td>\n",
" <td>41</td>\n",
" <td>0</td>\n",
" <td>None</td>\n",
" <td>False</td>\n",
" <td>003445</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>566</td>\n",
" <td>2012-03-05</td>\n",
" <td>True</td>\n",
" <td>51.509158</td>\n",
" <td>false</td>\n",
" <td>-0.224103</td>\n",
" <td>Westfield Ariel Way, White City</td>\n",
" <td>42</td>\n",
" <td>42</td>\n",
" <td>0</td>\n",
" <td>None</td>\n",
" <td>False</td>\n",
" <td>200141</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>601</td>\n",
" <td>None</td>\n",
" <td>True</td>\n",
" <td>51.514767</td>\n",
" <td>false</td>\n",
" <td>-0.225787</td>\n",
" <td>BBC White City, White City</td>\n",
" <td>34</td>\n",
" <td>36</td>\n",
" <td>0</td>\n",
" <td>None</td>\n",
" <td>False</td>\n",
" <td>200136</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>718</td>\n",
" <td>2013-11-20</td>\n",
" <td>True</td>\n",
" <td>51.535717</td>\n",
" <td>false</td>\n",
" <td>-0.060292</td>\n",
" <td>Ada Street, Hackney Central</td>\n",
" <td>45</td>\n",
" <td>45</td>\n",
" <td>0</td>\n",
" <td>None</td>\n",
" <td>False</td>\n",
" <td>300040</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>811</td>\n",
" <td>2016-07-26</td>\n",
" <td>True</td>\n",
" <td>51.505703</td>\n",
" <td>false</td>\n",
" <td>-0.027773</td>\n",
" <td>Westferry Circus, Canary Wharf</td>\n",
" <td>35</td>\n",
" <td>35</td>\n",
" <td>0</td>\n",
" <td>None</td>\n",
" <td>False</td>\n",
" <td>300228</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" id install_date installed latitude locked longitude \\\n",
"0 39 2010-07-08 True 51.526378 false -0.078131 \n",
"1 566 2012-03-05 True 51.509158 false -0.224103 \n",
"2 601 None True 51.514767 false -0.225787 \n",
"3 718 2013-11-20 True 51.535717 false -0.060292 \n",
"4 811 2016-07-26 True 51.505703 false -0.027773 \n",
"\n",
" name bikes_count docks_count nbEmptyDocks \\\n",
"0 Shoreditch High Street, Shoreditch 41 41 0 \n",
"1 Westfield Ariel Way, White City 42 42 0 \n",
"2 BBC White City, White City 34 36 0 \n",
"3 Ada Street, Hackney Central 45 45 0 \n",
"4 Westferry Circus, Canary Wharf 35 35 0 \n",
"\n",
" removal_date temporary terminal_name \n",
"0 None False 003445 \n",
"1 None False 200141 \n",
"2 None False 200136 \n",
"3 None False 300040 \n",
"4 None False 300228 "
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%bigquery\n",
"SELECT\n",
" *\n",
"FROM\n",
" `google.com:pso-bq-gis-demo.gis_demo.cycle_stations`\n",
"LIMIT 5"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>start_station_name</th>\n",
" <th>end_station_name</th>\n",
" <th>cnt</th>\n",
" <th>min_duration</th>\n",
" <th>avg_duration</th>\n",
" <th>max_duration</th>\n",
" <th>docks_count</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Hyde Park Corner, Hyde Park</td>\n",
" <td>Triangle Car Park, Hyde Park</td>\n",
" <td>2426</td>\n",
" <td>240</td>\n",
" <td>1804.105523</td>\n",
" <td>60540</td>\n",
" <td>27</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Triangle Car Park, Hyde Park</td>\n",
" <td>Hyde Park Corner, Hyde Park</td>\n",
" <td>2236</td>\n",
" <td>240</td>\n",
" <td>1716.144902</td>\n",
" <td>19920</td>\n",
" <td>28</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Black Lion Gate, Kensington Gardens</td>\n",
" <td>Hyde Park Corner, Hyde Park</td>\n",
" <td>2189</td>\n",
" <td>480</td>\n",
" <td>2091.585199</td>\n",
" <td>80520</td>\n",
" <td>28</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Black Lion Gate, Kensington Gardens</td>\n",
" <td>Palace Gate, Kensington Gardens</td>\n",
" <td>2175</td>\n",
" <td>60</td>\n",
" <td>1348.937931</td>\n",
" <td>226800</td>\n",
" <td>13</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Hyde Park Corner, Hyde Park</td>\n",
" <td>Albert Gate, Hyde Park</td>\n",
" <td>2168</td>\n",
" <td>60</td>\n",
" <td>2574.990775</td>\n",
" <td>15060</td>\n",
" <td>28</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>Albert Gate, Hyde Park</td>\n",
" <td>Hyde Park Corner, Hyde Park</td>\n",
" <td>1957</td>\n",
" <td>60</td>\n",
" <td>2600.602964</td>\n",
" <td>22440</td>\n",
" <td>28</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>94</th>\n",
" <td>Hop Exchange, The Borough</td>\n",
" <td>Bankside Mix, Bankside</td>\n",
" <td>653</td>\n",
" <td>60</td>\n",
" <td>242.388974</td>\n",
" <td>7680</td>\n",
" <td>60</td>\n",
" </tr>\n",
" <tr>\n",
" <th>95</th>\n",
" <td>Waterloo Station 3, Waterloo</td>\n",
" <td>Wormwood Street, Liverpool Street</td>\n",
" <td>651</td>\n",
" <td>480</td>\n",
" <td>1027.926267</td>\n",
" <td>14700</td>\n",
" <td>16</td>\n",
" </tr>\n",
" <tr>\n",
" <th>96</th>\n",
" <td>Queen's Gate, Kensington Gardens</td>\n",
" <td>Park Lane , Hyde Park</td>\n",
" <td>650</td>\n",
" <td>600</td>\n",
" <td>2130.738462</td>\n",
" <td>16440</td>\n",
" <td>28</td>\n",
" </tr>\n",
" <tr>\n",
" <th>97</th>\n",
" <td>Waterloo Station 3, Waterloo</td>\n",
" <td>Cheapside, Bank</td>\n",
" <td>649</td>\n",
" <td>480</td>\n",
" <td>779.722650</td>\n",
" <td>2040</td>\n",
" <td>43</td>\n",
" </tr>\n",
" <tr>\n",
" <th>98</th>\n",
" <td>Great Marlborough Street, Soho</td>\n",
" <td>Belgrove Street , King's Cross</td>\n",
" <td>647</td>\n",
" <td>480</td>\n",
" <td>713.508501</td>\n",
" <td>10740</td>\n",
" <td>48</td>\n",
" </tr>\n",
" <tr>\n",
" <th>99</th>\n",
" <td>Serpentine Car Park, Hyde Park</td>\n",
" <td>Park Lane , Hyde Park</td>\n",
" <td>640</td>\n",
" <td>420</td>\n",
" <td>1803.937500</td>\n",
" <td>13980</td>\n",
" <td>28</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>100 rows × 7 columns</p>\n",
"</div>"
],
"text/plain": [
" start_station_name end_station_name \\\n",
"0 Hyde Park Corner, Hyde Park Triangle Car Park, Hyde Park \n",
"1 Triangle Car Park, Hyde Park Hyde Park Corner, Hyde Park \n",
"2 Black Lion Gate, Kensington Gardens Hyde Park Corner, Hyde Park \n",
"3 Black Lion Gate, Kensington Gardens Palace Gate, Kensington Gardens \n",
"4 Hyde Park Corner, Hyde Park Albert Gate, Hyde Park \n",
"5 Albert Gate, Hyde Park Hyde Park Corner, Hyde Park \n",
".. ... ... \n",
"94 Hop Exchange, The Borough Bankside Mix, Bankside \n",
"95 Waterloo Station 3, Waterloo Wormwood Street, Liverpool Street \n",
"96 Queen's Gate, Kensington Gardens Park Lane , Hyde Park \n",
"97 Waterloo Station 3, Waterloo Cheapside, Bank \n",
"98 Great Marlborough Street, Soho Belgrove Street , King's Cross \n",
"99 Serpentine Car Park, Hyde Park Park Lane , Hyde Park \n",
"\n",
" cnt min_duration avg_duration max_duration docks_count \n",
"0 2426 240 1804.105523 60540 27 \n",
"1 2236 240 1716.144902 19920 28 \n",
"2 2189 480 2091.585199 80520 28 \n",
"3 2175 60 1348.937931 226800 13 \n",
"4 2168 60 2574.990775 15060 28 \n",
"5 1957 60 2600.602964 22440 28 \n",
".. ... ... ... ... ... \n",
"94 653 60 242.388974 7680 60 \n",
"95 651 480 1027.926267 14700 16 \n",
"96 650 600 2130.738462 16440 28 \n",
"97 649 480 779.722650 2040 43 \n",
"98 647 480 713.508501 10740 48 \n",
"99 640 420 1803.937500 13980 28 \n",
"\n",
"[100 rows x 7 columns]"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%bigquery\n",
"SELECT\n",
" start_station_name,\n",
" end_station_name,\n",
" count(1) cnt,\n",
" MIN(duration) as min_duration,\n",
" AVG(duration) as avg_duration,\n",
" MAX(duration) as max_duration,\n",
" MAX(end_station_docks_count) as docks_count\n",
"FROM\n",
" `google.com:pso-bq-gis-demo.gis_demo.london_cycle`\n",
"WHERE\n",
" is_same_station IS false\n",
"GROUP BY 1, 2\n",
"ORDER BY 3 desc\n",
"LIMIT 100"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"%%bigquery most_popular_paths\n",
"WITH \n",
" most_popular_paths AS (\n",
" SELECT\n",
" start_station_name,\n",
" end_station_name,\n",
" count(1) cnt,\n",
" AVG(duration) as avg_duration,\n",
" MAX(duration) as max_duration,\n",
" MAX(end_station_docks_count) as docks_count\n",
" FROM\n",
" `google.com:pso-bq-gis-demo.gis_demo.london_cycle`\n",
" WHERE\n",
" is_same_station IS false\n",
" GROUP BY 1, 2\n",
" ORDER BY 3 desc\n",
" LIMIT 100\n",
" ),\n",
" stations AS (\n",
" SELECT\n",
" name,\n",
" ST_GEOGPOINT(longitude,latitude) as geometry\n",
" FROM\n",
" `google.com:pso-bq-gis-demo.gis_demo.cycle_stations`\n",
" )\n",
"SELECT\n",
" ST_ASGEOJSON(ST_MAKELINE(b.geometry,c.geometry)) line,\n",
" ST_ASGEOJSON(c.geometry) as end_geog,\n",
" a.*\n",
"FROM\n",
" most_popular_paths a\n",
"JOIN\n",
" stations b\n",
"ON\n",
" a.start_station_name = b.name\n",
"JOIN\n",
" stations c\n",
"ON\n",
" a.end_station_name = c.name"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>line</th>\n",
" <th>end_geog</th>\n",
" <th>start_station_name</th>\n",
" <th>end_station_name</th>\n",
" <th>cnt</th>\n",
" <th>avg_duration</th>\n",
" <th>max_duration</th>\n",
" <th>docks_count</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>{ \"type\": \"LineString\", \"coordinates\": [ [-0.1...</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.17027955...</td>\n",
" <td>Hyde Park Corner, Hyde Park</td>\n",
" <td>Triangle Car Park, Hyde Park</td>\n",
" <td>2426</td>\n",
" <td>1804.105523</td>\n",
" <td>60540</td>\n",
" <td>27</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>{ \"type\": \"LineString\", \"coordinates\": [ [-0.1...</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.15352093...</td>\n",
" <td>Triangle Car Park, Hyde Park</td>\n",
" <td>Hyde Park Corner, Hyde Park</td>\n",
" <td>2236</td>\n",
" <td>1716.144902</td>\n",
" <td>19920</td>\n",
" <td>28</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>{ \"type\": \"LineString\", \"coordinates\": [ [-0.1...</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.15352093...</td>\n",
" <td>Black Lion Gate, Kensington Gardens</td>\n",
" <td>Hyde Park Corner, Hyde Park</td>\n",
" <td>2189</td>\n",
" <td>2091.585199</td>\n",
" <td>80520</td>\n",
" <td>28</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>{ \"type\": \"LineString\", \"coordinates\": [ [-0.1...</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.18440022...</td>\n",
" <td>Black Lion Gate, Kensington Gardens</td>\n",
" <td>Palace Gate, Kensington Gardens</td>\n",
" <td>2175</td>\n",
" <td>1348.937931</td>\n",
" <td>226800</td>\n",
" <td>13</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>{ \"type\": \"LineString\", \"coordinates\": [ [-0.1...</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.15845608...</td>\n",
" <td>Hyde Park Corner, Hyde Park</td>\n",
" <td>Albert Gate, Hyde Park</td>\n",
" <td>2168</td>\n",
" <td>2574.990775</td>\n",
" <td>15060</td>\n",
" <td>28</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" line \\\n",
"0 { \"type\": \"LineString\", \"coordinates\": [ [-0.1... \n",
"1 { \"type\": \"LineString\", \"coordinates\": [ [-0.1... \n",
"2 { \"type\": \"LineString\", \"coordinates\": [ [-0.1... \n",
"3 { \"type\": \"LineString\", \"coordinates\": [ [-0.1... \n",
"4 { \"type\": \"LineString\", \"coordinates\": [ [-0.1... \n",
"\n",
" end_geog \\\n",
"0 { \"type\": \"Point\", \"coordinates\": [-0.17027955... \n",
"1 { \"type\": \"Point\", \"coordinates\": [-0.15352093... \n",
"2 { \"type\": \"Point\", \"coordinates\": [-0.15352093... \n",
"3 { \"type\": \"Point\", \"coordinates\": [-0.18440022... \n",
"4 { \"type\": \"Point\", \"coordinates\": [-0.15845608... \n",
"\n",
" start_station_name end_station_name cnt \\\n",
"0 Hyde Park Corner, Hyde Park Triangle Car Park, Hyde Park 2426 \n",
"1 Triangle Car Park, Hyde Park Hyde Park Corner, Hyde Park 2236 \n",
"2 Black Lion Gate, Kensington Gardens Hyde Park Corner, Hyde Park 2189 \n",
"3 Black Lion Gate, Kensington Gardens Palace Gate, Kensington Gardens 2175 \n",
"4 Hyde Park Corner, Hyde Park Albert Gate, Hyde Park 2168 \n",
"\n",
" avg_duration max_duration docks_count \n",
"0 1804.105523 60540 27 \n",
"1 1716.144902 19920 28 \n",
"2 2091.585199 80520 28 \n",
"3 1348.937931 226800 13 \n",
"4 2574.990775 15060 28 "
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"most_popular_paths.head()"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"jupyter": {
"source_hidden": true
}
},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVM9ZmFsc2U7IExfTk9fVE9VQ0g9ZmFsc2U7IExfRElTQUJMRV8zRD1mYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS40LjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NvZGUuanF1ZXJ5LmNvbS9qcXVlcnktMS4xMi40Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS40LjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdjZG4uZ2l0aGFjay5jb20vcHl0aG9uLXZpc3VhbGl6YXRpb24vZm9saXVtL21hc3Rlci9mb2xpdW0vdGVtcGxhdGVzL2xlYWZsZXQuYXdlc29tZS5yb3RhdGUuY3NzIi8+CiAgICA8c3R5bGU+aHRtbCwgYm9keSB7d2lkdGg6IDEwMCU7aGVpZ2h0OiAxMDAlO21hcmdpbjogMDtwYWRkaW5nOiAwO308L3N0eWxlPgogICAgPHN0eWxlPiNtYXAge3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO3JpZ2h0OjA7bGVmdDowO308L3N0eWxlPgogICAgCiAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLAogICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgIDxzdHlsZT4jbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDEwMC4wJTsKICAgICAgICBoZWlnaHQ6IDEwMC4wJTsKICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgIHRvcDogMC4wJTsKICAgICAgICB9CiAgICA8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgPGRpdiBjbGFzcz0iZm9saXVtLW1hcCIgaWQ9Im1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYyIgPjwvZGl2Pgo8L2JvZHk+CjxzY3JpcHQ+ICAgIAogICAgCiAgICAKICAgICAgICB2YXIgYm91bmRzID0gbnVsbDsKICAgIAoKICAgIHZhciBtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMgPSBMLm1hcCgKICAgICAgICAnbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjJywgewogICAgICAgIGNlbnRlcjogWzUxLjUwNjAzMzgxOTYyMDQsIC0wLjEyODM0NTM2MTQ0NTk0OV0sCiAgICAgICAgem9vbTogMTIsCiAgICAgICAgbWF4Qm91bmRzOiBib3VuZHMsCiAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3LAogICAgICAgIHpvb21Db250cm9sOiB0cnVlLAogICAgICAgIH0pOwoKCiAgICAKICAgIHZhciB0aWxlX2xheWVyX2FiNmQwM2E5MmViNzRlMTI4OGIyOTVhMzNjZmM3NDAxID0gTC50aWxlTGF5ZXIoCiAgICAgICAgJ2h0dHBzOi8vY2FydG9kYi1iYXNlbWFwcy17c30uZ2xvYmFsLnNzbC5mYXN0bHkubmV0L2xpZ2h0X2FsbC97en0ve3h9L3t5fS5wbmcnLAogICAgICAgIHsKICAgICAgICAiYXR0cmlidXRpb24iOiBudWxsLAogICAgICAgICJkZXRlY3RSZXRpbmEiOiBmYWxzZSwKICAgICAgICAibWF4TmF0aXZlWm9vbSI6IDE4LAogICAgICAgICJtYXhab29tIjogMTgsCiAgICAgICAgIm1pblpvb20iOiAwLAogICAgICAgICJub1dyYXAiOiBmYWxzZSwKICAgICAgICAib3BhY2l0eSI6IDEsCiAgICAgICAgInN1YmRvbWFpbnMiOiAiYWJjIiwKICAgICAgICAidG1zIjogZmFsc2UKfSkuYWRkVG8obWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjKTsKICAgIAogICAgICAgICAgICB2YXIgZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSA9IEwuZmVhdHVyZUdyb3VwKAogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uXzJhNmI4M2Y0ZjU2MTRkN2Q5MmVmNmFhNGIwNmZkNDkyX29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl8yYTZiODNmNGY1NjE0ZDdkOTJlZjZhYTRiMDZmZDQ5MiA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMTUzNTIwOTM1LCA1MS41MDMxMTc5OV0sIFstMC4xNzAyNzk1NTUsIDUxLjUwNjQ1MTc5XV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgInByb3BlcnRpZXMiOiB7ImNudCI6IDI0MjYsICJlbmRfc3RhdGlvbl9uYW1lIjogIlRyaWFuZ2xlIENhciBQYXJrLCBIeWRlIFBhcmsiLCAiaGlnaGxpZ2h0IjogeyJjb2xvciI6ICJncmVlbiIsICJkYXNoQXJyYXkiOiAiNSwgNSIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiA0fSwgInN0YXJ0X3N0YXRpb25fbmFtZSI6ICJIeWRlIFBhcmsgQ29ybmVyLCBIeWRlIFBhcmsiLCAic3R5bGUiOiB7ImNvbG9yIjogImJsdWUiLCAiZGFzaEFycmF5IjogIjcsIDciLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogMn19LCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl8yYTZiODNmNGY1NjE0ZDdkOTJlZjZhYTRiMDZmZDQ5Ml9vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICB9CiAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2I4MDcyMDQwYTJkODQ1NmQ5ODlkZGI1MDNiYjQ3YjE5ICk7CiAgICAgICAgZ2VvX2pzb25fMmE2YjgzZjRmNTYxNGQ3ZDkyZWY2YWE0YjA2ZmQ0OTIuc2V0U3R5bGUoZnVuY3Rpb24oZmVhdHVyZSkge3JldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGU7fSk7CiAgICAgICAgCiAgICAKICAgICAgICBnZW9fanNvbl8yYTZiODNmNGY1NjE0ZDdkOTJlZjZhYTRiMDZmZDQ5Mi5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgZnVuY3Rpb24obGF5ZXIpewogICAgICAgICAgICAvLyBDb252ZXJ0IG5vbi1wcmltaXRpdmUgdG8gU3RyaW5nLgogICAgICAgICAgICBsZXQgaGFuZGxlT2JqZWN0ID0gKGZlYXR1cmUpPT50eXBlb2YoZmVhdHVyZSk9PSdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgOiBmZWF0dXJlOwogICAgICAgICAgICBsZXQgZmllbGRzID0gWydzdGFydF9zdGF0aW9uX25hbWUnLCAnZW5kX3N0YXRpb25fbmFtZScsICdjbnQnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAnPHRhYmxlPicgKwogICAgICAgICAgICBTdHJpbmcoCiAgICAgICAgICAgICAgICBmaWVsZHMubWFwKAogICAgICAgICAgICAgICAgY29sdW1ubmFtZT0+CiAgICAgICAgICAgICAgICAgICAgYDx0ciBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPgogICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0icGFkZGluZzogNHB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgJHsgY29sdW1ubmFtZS50b0xvY2FsZVN0cmluZygpfQogICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiA0cHg7Ij4ke2hhbmRsZU9iamVjdChsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbY29sdW1ubmFtZV0pCiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlU3RyaW5nKCl9PC90ZD48L3RyPmAKICAgICAgICAgICAgICAgICkuam9pbignJykpCiAgICAgICAgICAgICAgICArJzwvdGFibGU+JwogICAgICAgICAgICB9LCB7InN0aWNreSI6IHRydWV9KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBnZW9fanNvbl80MDc1NzQwNThmNDc0NjBlYjhkZGQ5NzJiMzJlZGY4M19vbkVhY2hGZWF0dXJlID0gZnVuY3Rpb24gb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICAgICAgbGF5ZXIub24oewogICAgICAgICAgICAgICAgICAgIG1vdXNlb3V0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5zdHlsZSk7fSwKICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXI6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLmhpZ2hsaWdodCk7fSwKICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMuZml0Qm91bmRzKGUudGFyZ2V0LmdldEJvdW5kcygpKTt9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICB2YXIgZ2VvX2pzb25fNDA3NTc0MDU4ZjQ3NDYwZWI4ZGRkOTcyYjMyZWRmODMgPSBMLmdlb0pzb24oCiAgICAgICAgICAgIHsiZmVhdHVyZXMiOiBbeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy0wLjE3MDI3OTU1NSwgNTEuNTA2NDUxNzldLCBbLTAuMTUzNTIwOTM1LCA1MS41MDMxMTc5OV1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiAyMjM2LCAiZW5kX3N0YXRpb25fbmFtZSI6ICJIeWRlIFBhcmsgQ29ybmVyLCBIeWRlIFBhcmsiLCAiaGlnaGxpZ2h0IjogeyJjb2xvciI6ICJncmVlbiIsICJkYXNoQXJyYXkiOiAiNSwgNSIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiA0fSwgInN0YXJ0X3N0YXRpb25fbmFtZSI6ICJUcmlhbmdsZSBDYXIgUGFyaywgSHlkZSBQYXJrIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fNDA3NTc0MDU4ZjQ3NDYwZWI4ZGRkOTcyYjMyZWRmODNfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uXzQwNzU3NDA1OGY0NzQ2MGViOGRkZDk3MmIzMmVkZjgzLnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fNDA3NTc0MDU4ZjQ3NDYwZWI4ZGRkOTcyYjMyZWRmODMuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fNWU3MGE2MjcwMzExNGM0MjhhNjU1YTljYThjZGVkYjVfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uXzVlNzBhNjI3MDMxMTRjNDI4YTY1NWE5Y2E4Y2RlZGI1ID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4xODc4NDI3MTcsIDUxLjUwOTkwODM3XSwgWy0wLjE1MzUyMDkzNSwgNTEuNTAzMTE3OTldXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogMjE4OSwgImVuZF9zdGF0aW9uX25hbWUiOiAiSHlkZSBQYXJrIENvcm5lciwgSHlkZSBQYXJrIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiQmxhY2sgTGlvbiBHYXRlLCBLZW5zaW5ndG9uIEdhcmRlbnMiLCAic3R5bGUiOiB7ImNvbG9yIjogImJsdWUiLCAiZGFzaEFycmF5IjogIjcsIDciLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogMn19LCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl81ZTcwYTYyNzAzMTE0YzQyOGE2NTVhOWNhOGNkZWRiNV9vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICB9CiAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2I4MDcyMDQwYTJkODQ1NmQ5ODlkZGI1MDNiYjQ3YjE5ICk7CiAgICAgICAgZ2VvX2pzb25fNWU3MGE2MjcwMzExNGM0MjhhNjU1YTljYThjZGVkYjUuc2V0U3R5bGUoZnVuY3Rpb24oZmVhdHVyZSkge3JldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGU7fSk7CiAgICAgICAgCiAgICAKICAgICAgICBnZW9fanNvbl81ZTcwYTYyNzAzMTE0YzQyOGE2NTVhOWNhOGNkZWRiNS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgZnVuY3Rpb24obGF5ZXIpewogICAgICAgICAgICAvLyBDb252ZXJ0IG5vbi1wcmltaXRpdmUgdG8gU3RyaW5nLgogICAgICAgICAgICBsZXQgaGFuZGxlT2JqZWN0ID0gKGZlYXR1cmUpPT50eXBlb2YoZmVhdHVyZSk9PSdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgOiBmZWF0dXJlOwogICAgICAgICAgICBsZXQgZmllbGRzID0gWydzdGFydF9zdGF0aW9uX25hbWUnLCAnZW5kX3N0YXRpb25fbmFtZScsICdjbnQnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAnPHRhYmxlPicgKwogICAgICAgICAgICBTdHJpbmcoCiAgICAgICAgICAgICAgICBmaWVsZHMubWFwKAogICAgICAgICAgICAgICAgY29sdW1ubmFtZT0+CiAgICAgICAgICAgICAgICAgICAgYDx0ciBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPgogICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0icGFkZGluZzogNHB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgJHsgY29sdW1ubmFtZS50b0xvY2FsZVN0cmluZygpfQogICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiA0cHg7Ij4ke2hhbmRsZU9iamVjdChsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbY29sdW1ubmFtZV0pCiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlU3RyaW5nKCl9PC90ZD48L3RyPmAKICAgICAgICAgICAgICAgICkuam9pbignJykpCiAgICAgICAgICAgICAgICArJzwvdGFibGU+JwogICAgICAgICAgICB9LCB7InN0aWNreSI6IHRydWV9KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBnZW9fanNvbl8zNDYwOTRmYzFkYWI0NDRhOWFiMTQ0ZDk0YzA0N2NjOF9vbkVhY2hGZWF0dXJlID0gZnVuY3Rpb24gb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICAgICAgbGF5ZXIub24oewogICAgICAgICAgICAgICAgICAgIG1vdXNlb3V0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5zdHlsZSk7fSwKICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXI6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLmhpZ2hsaWdodCk7fSwKICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMuZml0Qm91bmRzKGUudGFyZ2V0LmdldEJvdW5kcygpKTt9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICB2YXIgZ2VvX2pzb25fMzQ2MDk0ZmMxZGFiNDQ0YTlhYjE0NGQ5NGMwNDdjYzggPSBMLmdlb0pzb24oCiAgICAgICAgICAgIHsiZmVhdHVyZXMiOiBbeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy0wLjE4Nzg0MjcxNywgNTEuNTA5OTA4MzddLCBbLTAuMTg0NDAwMjIxLCA1MS41MDIwNDIzOF1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiAyMTc1LCAiZW5kX3N0YXRpb25fbmFtZSI6ICJQYWxhY2UgR2F0ZSwgS2Vuc2luZ3RvbiBHYXJkZW5zIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiQmxhY2sgTGlvbiBHYXRlLCBLZW5zaW5ndG9uIEdhcmRlbnMiLCAic3R5bGUiOiB7ImNvbG9yIjogImJsdWUiLCAiZGFzaEFycmF5IjogIjcsIDciLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogMn19LCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl8zNDYwOTRmYzFkYWI0NDRhOWFiMTQ0ZDk0YzA0N2NjOF9vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICB9CiAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2I4MDcyMDQwYTJkODQ1NmQ5ODlkZGI1MDNiYjQ3YjE5ICk7CiAgICAgICAgZ2VvX2pzb25fMzQ2MDk0ZmMxZGFiNDQ0YTlhYjE0NGQ5NGMwNDdjYzguc2V0U3R5bGUoZnVuY3Rpb24oZmVhdHVyZSkge3JldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGU7fSk7CiAgICAgICAgCiAgICAKICAgICAgICBnZW9fanNvbl8zNDYwOTRmYzFkYWI0NDRhOWFiMTQ0ZDk0YzA0N2NjOC5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgZnVuY3Rpb24obGF5ZXIpewogICAgICAgICAgICAvLyBDb252ZXJ0IG5vbi1wcmltaXRpdmUgdG8gU3RyaW5nLgogICAgICAgICAgICBsZXQgaGFuZGxlT2JqZWN0ID0gKGZlYXR1cmUpPT50eXBlb2YoZmVhdHVyZSk9PSdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgOiBmZWF0dXJlOwogICAgICAgICAgICBsZXQgZmllbGRzID0gWydzdGFydF9zdGF0aW9uX25hbWUnLCAnZW5kX3N0YXRpb25fbmFtZScsICdjbnQnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAnPHRhYmxlPicgKwogICAgICAgICAgICBTdHJpbmcoCiAgICAgICAgICAgICAgICBmaWVsZHMubWFwKAogICAgICAgICAgICAgICAgY29sdW1ubmFtZT0+CiAgICAgICAgICAgICAgICAgICAgYDx0ciBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPgogICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0icGFkZGluZzogNHB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgJHsgY29sdW1ubmFtZS50b0xvY2FsZVN0cmluZygpfQogICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiA0cHg7Ij4ke2hhbmRsZU9iamVjdChsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbY29sdW1ubmFtZV0pCiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlU3RyaW5nKCl9PC90ZD48L3RyPmAKICAgICAgICAgICAgICAgICkuam9pbignJykpCiAgICAgICAgICAgICAgICArJzwvdGFibGU+JwogICAgICAgICAgICB9LCB7InN0aWNreSI6IHRydWV9KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBnZW9fanNvbl9jZjBhMmI3YzJiNzM0MjRjYmMyODk1NDg2NjAwZjcyMF9vbkVhY2hGZWF0dXJlID0gZnVuY3Rpb24gb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICAgICAgbGF5ZXIub24oewogICAgICAgICAgICAgICAgICAgIG1vdXNlb3V0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5zdHlsZSk7fSwKICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXI6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLmhpZ2hsaWdodCk7fSwKICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMuZml0Qm91bmRzKGUudGFyZ2V0LmdldEJvdW5kcygpKTt9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICB2YXIgZ2VvX2pzb25fY2YwYTJiN2MyYjczNDI0Y2JjMjg5NTQ4NjYwMGY3MjAgPSBMLmdlb0pzb24oCiAgICAgICAgICAgIHsiZmVhdHVyZXMiOiBbeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy0wLjE1MzUyMDkzNSwgNTEuNTAzMTE3OTldLCBbLTAuMTU4NDU2MDg5LCA1MS41MDI5NTM3OV1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiAyMTY4LCAiZW5kX3N0YXRpb25fbmFtZSI6ICJBbGJlcnQgR2F0ZSwgSHlkZSBQYXJrIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiSHlkZSBQYXJrIENvcm5lciwgSHlkZSBQYXJrIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fY2YwYTJiN2MyYjczNDI0Y2JjMjg5NTQ4NjYwMGY3MjBfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uX2NmMGEyYjdjMmI3MzQyNGNiYzI4OTU0ODY2MDBmNzIwLnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fY2YwYTJiN2MyYjczNDI0Y2JjMjg5NTQ4NjYwMGY3MjAuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fYTNmZTk4NjJhZWVhNGYwMmJkYzg0NjUyNjllZTdiNmVfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uX2EzZmU5ODYyYWVlYTRmMDJiZGM4NDY1MjY5ZWU3YjZlID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4xNTg0NTYwODksIDUxLjUwMjk1Mzc5XSwgWy0wLjE1MzUyMDkzNSwgNTEuNTAzMTE3OTldXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogMTk1NywgImVuZF9zdGF0aW9uX25hbWUiOiAiSHlkZSBQYXJrIENvcm5lciwgSHlkZSBQYXJrIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiQWxiZXJ0IEdhdGUsIEh5ZGUgUGFyayIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uX2EzZmU5ODYyYWVlYTRmMDJiZGM4NDY1MjY5ZWU3YjZlX29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl9hM2ZlOTg2MmFlZWE0ZjAyYmRjODQ2NTI2OWVlN2I2ZS5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uX2EzZmU5ODYyYWVlYTRmMDJiZGM4NDY1MjY5ZWU3YjZlLmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uXzBmZjRhMDIyNGIwYjQ4ZGNhMjI0OWI1MWY0MGFlYThmX29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl8wZmY0YTAyMjRiMGI0OGRjYTIyNDliNTFmNDBhZWE4ZiA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMTUzNTIwOTM1LCA1MS41MDMxMTc5OV0sIFstMC4xODc4NDI3MTcsIDUxLjUwOTkwODM3XV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgInByb3BlcnRpZXMiOiB7ImNudCI6IDE4OTEsICJlbmRfc3RhdGlvbl9uYW1lIjogIkJsYWNrIExpb24gR2F0ZSwgS2Vuc2luZ3RvbiBHYXJkZW5zIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiSHlkZSBQYXJrIENvcm5lciwgSHlkZSBQYXJrIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fMGZmNGEwMjI0YjBiNDhkY2EyMjQ5YjUxZjQwYWVhOGZfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uXzBmZjRhMDIyNGIwYjQ4ZGNhMjI0OWI1MWY0MGFlYThmLnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fMGZmNGEwMjI0YjBiNDhkY2EyMjQ5YjUxZjQwYWVhOGYuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fZTZiMGI1MWE5NjEwNDk3MWI5ZjY2NjUwZjRlMjNhNzZfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uX2U2YjBiNTFhOTYxMDQ5NzFiOWY2NjY1MGY0ZTIzYTc2ID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4xODQ0MDAyMjEsIDUxLjUwMjA0MjM4XSwgWy0wLjE4Nzg0MjcxNywgNTEuNTA5OTA4MzddXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogMTc5NSwgImVuZF9zdGF0aW9uX25hbWUiOiAiQmxhY2sgTGlvbiBHYXRlLCBLZW5zaW5ndG9uIEdhcmRlbnMiLCAiaGlnaGxpZ2h0IjogeyJjb2xvciI6ICJncmVlbiIsICJkYXNoQXJyYXkiOiAiNSwgNSIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiA0fSwgInN0YXJ0X3N0YXRpb25fbmFtZSI6ICJQYWxhY2UgR2F0ZSwgS2Vuc2luZ3RvbiBHYXJkZW5zIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fZTZiMGI1MWE5NjEwNDk3MWI5ZjY2NjUwZjRlMjNhNzZfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uX2U2YjBiNTFhOTYxMDQ5NzFiOWY2NjY1MGY0ZTIzYTc2LnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fZTZiMGI1MWE5NjEwNDk3MWI5ZjY2NjUwZjRlMjNhNzYuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fN2RlZjU0Y2FjMzc3NDNhODgyNGE2ODNkOGQ2MjBjMmVfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uXzdkZWY1NGNhYzM3NzQzYTg4MjRhNjgzZDhkNjIwYzJlID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4xNTM1MjA5MzUsIDUxLjUwMzExNzk5XSwgWy0wLjE3MzA2MDMyLCA1MS41MDUwMTRdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogMTc5MCwgImVuZF9zdGF0aW9uX25hbWUiOiAiU2VycGVudGluZSBDYXIgUGFyaywgSHlkZSBQYXJrIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiSHlkZSBQYXJrIENvcm5lciwgSHlkZSBQYXJrIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fN2RlZjU0Y2FjMzc3NDNhODgyNGE2ODNkOGQ2MjBjMmVfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uXzdkZWY1NGNhYzM3NzQzYTg4MjRhNjgzZDhkNjIwYzJlLnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fN2RlZjU0Y2FjMzc3NDNhODgyNGE2ODNkOGQ2MjBjMmUuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fMzlkMGU5ZjY1NmUyNDk0Mzk1MWViMDI3Y2UzMjZlOGFfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uXzM5ZDBlOWY2NTZlMjQ5NDM5NTFlYjAyN2NlMzI2ZThhID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4yMDE5NjgsIDUxLjQ3NTA4OV0sIFstMC4yMDg0ODUyOTMsIDUxLjQ3ODkzOTMxXV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgInByb3BlcnRpZXMiOiB7ImNudCI6IDE2MDYsICJlbmRfc3RhdGlvbl9uYW1lIjogIlN0LiBQZXRlcidzIFRlcnJhY2UsIEZ1bGhhbSIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIlBhcnNvbnMgR3JlZW4gU3RhdGlvbiwgUGFyc29ucyBHcmVlbiIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uXzM5ZDBlOWY2NTZlMjQ5NDM5NTFlYjAyN2NlMzI2ZThhX29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl8zOWQwZTlmNjU2ZTI0OTQzOTUxZWIwMjdjZTMyNmU4YS5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uXzM5ZDBlOWY2NTZlMjQ5NDM5NTFlYjAyN2NlMzI2ZThhLmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uXzM4N2YwMTljYzliMTRjZWZhODA3ZDI0OTkyMmYxOWMyX29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl8zODdmMDE5Y2M5YjE0Y2VmYTgwN2QyNDk5MjJmMTljMiA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMDE1NzE3NjE0LCA1MS41NDkzNjldLCBbLTAuMDEwNTEwNTY1LCA1MS41NDA5NF1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiAxNTczLCAiZW5kX3N0YXRpb25fbmFtZSI6ICJBcXVhdGljIENlbnRyZSwgUXVlZW4gRWxpemFiZXRoIE9seW1waWMgUGFyayIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIkxlZSBWYWxsZXkgVmVsb1BhcmssIFF1ZWVuIEVsaXphYmV0aCBPbHltcGljIFBhcmsiLCAic3R5bGUiOiB7ImNvbG9yIjogImJsdWUiLCAiZGFzaEFycmF5IjogIjcsIDciLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogMn19LCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl8zODdmMDE5Y2M5YjE0Y2VmYTgwN2QyNDk5MjJmMTljMl9vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICB9CiAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2I4MDcyMDQwYTJkODQ1NmQ5ODlkZGI1MDNiYjQ3YjE5ICk7CiAgICAgICAgZ2VvX2pzb25fMzg3ZjAxOWNjOWIxNGNlZmE4MDdkMjQ5OTIyZjE5YzIuc2V0U3R5bGUoZnVuY3Rpb24oZmVhdHVyZSkge3JldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGU7fSk7CiAgICAgICAgCiAgICAKICAgICAgICBnZW9fanNvbl8zODdmMDE5Y2M5YjE0Y2VmYTgwN2QyNDk5MjJmMTljMi5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgZnVuY3Rpb24obGF5ZXIpewogICAgICAgICAgICAvLyBDb252ZXJ0IG5vbi1wcmltaXRpdmUgdG8gU3RyaW5nLgogICAgICAgICAgICBsZXQgaGFuZGxlT2JqZWN0ID0gKGZlYXR1cmUpPT50eXBlb2YoZmVhdHVyZSk9PSdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgOiBmZWF0dXJlOwogICAgICAgICAgICBsZXQgZmllbGRzID0gWydzdGFydF9zdGF0aW9uX25hbWUnLCAnZW5kX3N0YXRpb25fbmFtZScsICdjbnQnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAnPHRhYmxlPicgKwogICAgICAgICAgICBTdHJpbmcoCiAgICAgICAgICAgICAgICBmaWVsZHMubWFwKAogICAgICAgICAgICAgICAgY29sdW1ubmFtZT0+CiAgICAgICAgICAgICAgICAgICAgYDx0ciBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPgogICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0icGFkZGluZzogNHB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgJHsgY29sdW1ubmFtZS50b0xvY2FsZVN0cmluZygpfQogICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiA0cHg7Ij4ke2hhbmRsZU9iamVjdChsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbY29sdW1ubmFtZV0pCiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlU3RyaW5nKCl9PC90ZD48L3RyPmAKICAgICAgICAgICAgICAgICkuam9pbignJykpCiAgICAgICAgICAgICAgICArJzwvdGFibGU+JwogICAgICAgICAgICB9LCB7InN0aWNreSI6IHRydWV9KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBnZW9fanNvbl8yOTgyMzVjNTc3ZDA0NDg5ODQyNGE4ZWEzZmJhMzQ2OV9vbkVhY2hGZWF0dXJlID0gZnVuY3Rpb24gb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICAgICAgbGF5ZXIub24oewogICAgICAgICAgICAgICAgICAgIG1vdXNlb3V0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5zdHlsZSk7fSwKICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXI6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLmhpZ2hsaWdodCk7fSwKICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMuZml0Qm91bmRzKGUudGFyZ2V0LmdldEJvdW5kcygpKTt9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICB2YXIgZ2VvX2pzb25fMjk4MjM1YzU3N2QwNDQ4OTg0MjRhOGVhM2ZiYTM0NjkgPSBMLmdlb0pzb24oCiAgICAgICAgICAgIHsiZmVhdHVyZXMiOiBbeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy0wLjE4Nzg0MjcxNywgNTEuNTA5OTA4MzddLCBbLTAuMTU4NDU2MDg5LCA1MS41MDI5NTM3OV1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiAxNTY5LCAiZW5kX3N0YXRpb25fbmFtZSI6ICJBbGJlcnQgR2F0ZSwgSHlkZSBQYXJrIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiQmxhY2sgTGlvbiBHYXRlLCBLZW5zaW5ndG9uIEdhcmRlbnMiLCAic3R5bGUiOiB7ImNvbG9yIjogImJsdWUiLCAiZGFzaEFycmF5IjogIjcsIDciLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogMn19LCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl8yOTgyMzVjNTc3ZDA0NDg5ODQyNGE4ZWEzZmJhMzQ2OV9vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICB9CiAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2I4MDcyMDQwYTJkODQ1NmQ5ODlkZGI1MDNiYjQ3YjE5ICk7CiAgICAgICAgZ2VvX2pzb25fMjk4MjM1YzU3N2QwNDQ4OTg0MjRhOGVhM2ZiYTM0Njkuc2V0U3R5bGUoZnVuY3Rpb24oZmVhdHVyZSkge3JldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGU7fSk7CiAgICAgICAgCiAgICAKICAgICAgICBnZW9fanNvbl8yOTgyMzVjNTc3ZDA0NDg5ODQyNGE4ZWEzZmJhMzQ2OS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgZnVuY3Rpb24obGF5ZXIpewogICAgICAgICAgICAvLyBDb252ZXJ0IG5vbi1wcmltaXRpdmUgdG8gU3RyaW5nLgogICAgICAgICAgICBsZXQgaGFuZGxlT2JqZWN0ID0gKGZlYXR1cmUpPT50eXBlb2YoZmVhdHVyZSk9PSdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgOiBmZWF0dXJlOwogICAgICAgICAgICBsZXQgZmllbGRzID0gWydzdGFydF9zdGF0aW9uX25hbWUnLCAnZW5kX3N0YXRpb25fbmFtZScsICdjbnQnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAnPHRhYmxlPicgKwogICAgICAgICAgICBTdHJpbmcoCiAgICAgICAgICAgICAgICBmaWVsZHMubWFwKAogICAgICAgICAgICAgICAgY29sdW1ubmFtZT0+CiAgICAgICAgICAgICAgICAgICAgYDx0ciBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPgogICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0icGFkZGluZzogNHB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgJHsgY29sdW1ubmFtZS50b0xvY2FsZVN0cmluZygpfQogICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiA0cHg7Ij4ke2hhbmRsZU9iamVjdChsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbY29sdW1ubmFtZV0pCiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlU3RyaW5nKCl9PC90ZD48L3RyPmAKICAgICAgICAgICAgICAgICkuam9pbignJykpCiAgICAgICAgICAgICAgICArJzwvdGFibGU+JwogICAgICAgICAgICB9LCB7InN0aWNreSI6IHRydWV9KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBnZW9fanNvbl83OWFkNjAxNmI1Yjk0YTAyOWI0NmE0MzYwM2Y0ZTg3NV9vbkVhY2hGZWF0dXJlID0gZnVuY3Rpb24gb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICAgICAgbGF5ZXIub24oewogICAgICAgICAgICAgICAgICAgIG1vdXNlb3V0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5zdHlsZSk7fSwKICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXI6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLmhpZ2hsaWdodCk7fSwKICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMuZml0Qm91bmRzKGUudGFyZ2V0LmdldEJvdW5kcygpKTt9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICB2YXIgZ2VvX2pzb25fNzlhZDYwMTZiNWI5NGEwMjliNDZhNDM2MDNmNGU4NzUgPSBMLmdlb0pzb24oCiAgICAgICAgICAgIHsiZmVhdHVyZXMiOiBbeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy0wLjE1MzUyMDkzNSwgNTEuNTAzMTE3OTldLCBbLTAuMTU3Mjc1NjM2LCA1MS41MTAwMTcyXV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgInByb3BlcnRpZXMiOiB7ImNudCI6IDE0NzAsICJlbmRfc3RhdGlvbl9uYW1lIjogIlBhcmsgTGFuZSAsIEh5ZGUgUGFyayIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIkh5ZGUgUGFyayBDb3JuZXIsIEh5ZGUgUGFyayIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uXzc5YWQ2MDE2YjViOTRhMDI5YjQ2YTQzNjAzZjRlODc1X29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl83OWFkNjAxNmI1Yjk0YTAyOWI0NmE0MzYwM2Y0ZTg3NS5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uXzc5YWQ2MDE2YjViOTRhMDI5YjQ2YTQzNjAzZjRlODc1LmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uX2U3MTI5MzEzNzcxNDQxNjJhMmEzNWVmMjQyMDM0OTY1X29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl9lNzEyOTMxMzc3MTQ0MTYyYTJhMzVlZjI0MjAzNDk2NSA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMTg0NDAwMjIxLCA1MS41MDIwNDIzOF0sIFstMC4xNTM1MjA5MzUsIDUxLjUwMzExNzk5XV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgInByb3BlcnRpZXMiOiB7ImNudCI6IDE0NTUsICJlbmRfc3RhdGlvbl9uYW1lIjogIkh5ZGUgUGFyayBDb3JuZXIsIEh5ZGUgUGFyayIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIlBhbGFjZSBHYXRlLCBLZW5zaW5ndG9uIEdhcmRlbnMiLCAic3R5bGUiOiB7ImNvbG9yIjogImJsdWUiLCAiZGFzaEFycmF5IjogIjcsIDciLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogMn19LCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl9lNzEyOTMxMzc3MTQ0MTYyYTJhMzVlZjI0MjAzNDk2NV9vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICB9CiAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2I4MDcyMDQwYTJkODQ1NmQ5ODlkZGI1MDNiYjQ3YjE5ICk7CiAgICAgICAgZ2VvX2pzb25fZTcxMjkzMTM3NzE0NDE2MmEyYTM1ZWYyNDIwMzQ5NjUuc2V0U3R5bGUoZnVuY3Rpb24oZmVhdHVyZSkge3JldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGU7fSk7CiAgICAgICAgCiAgICAKICAgICAgICBnZW9fanNvbl9lNzEyOTMxMzc3MTQ0MTYyYTJhMzVlZjI0MjAzNDk2NS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgZnVuY3Rpb24obGF5ZXIpewogICAgICAgICAgICAvLyBDb252ZXJ0IG5vbi1wcmltaXRpdmUgdG8gU3RyaW5nLgogICAgICAgICAgICBsZXQgaGFuZGxlT2JqZWN0ID0gKGZlYXR1cmUpPT50eXBlb2YoZmVhdHVyZSk9PSdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgOiBmZWF0dXJlOwogICAgICAgICAgICBsZXQgZmllbGRzID0gWydzdGFydF9zdGF0aW9uX25hbWUnLCAnZW5kX3N0YXRpb25fbmFtZScsICdjbnQnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAnPHRhYmxlPicgKwogICAgICAgICAgICBTdHJpbmcoCiAgICAgICAgICAgICAgICBmaWVsZHMubWFwKAogICAgICAgICAgICAgICAgY29sdW1ubmFtZT0+CiAgICAgICAgICAgICAgICAgICAgYDx0ciBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPgogICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0icGFkZGluZzogNHB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgJHsgY29sdW1ubmFtZS50b0xvY2FsZVN0cmluZygpfQogICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiA0cHg7Ij4ke2hhbmRsZU9iamVjdChsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbY29sdW1ubmFtZV0pCiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlU3RyaW5nKCl9PC90ZD48L3RyPmAKICAgICAgICAgICAgICAgICkuam9pbignJykpCiAgICAgICAgICAgICAgICArJzwvdGFibGU+JwogICAgICAgICAgICB9LCB7InN0aWNreSI6IHRydWV9KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBnZW9fanNvbl9kNjY2ZjIwM2NjOWY0ODkzODg3NDZlMzYxNmNmNDRhNF9vbkVhY2hGZWF0dXJlID0gZnVuY3Rpb24gb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICAgICAgbGF5ZXIub24oewogICAgICAgICAgICAgICAgICAgIG1vdXNlb3V0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5zdHlsZSk7fSwKICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXI6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLmhpZ2hsaWdodCk7fSwKICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMuZml0Qm91bmRzKGUudGFyZ2V0LmdldEJvdW5kcygpKTt9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICB2YXIgZ2VvX2pzb25fZDY2NmYyMDNjYzlmNDg5Mzg4NzQ2ZTM2MTZjZjQ0YTQgPSBMLmdlb0pzb24oCiAgICAgICAgICAgIHsiZmVhdHVyZXMiOiBbeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy0wLjAxMTg4OTQ4MiwgNTEuNTM4NzE4XSwgWy0wLjAxMDUxMDU2NSwgNTEuNTQwOTRdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogMTM5MCwgImVuZF9zdGF0aW9uX25hbWUiOiAiQXF1YXRpYyBDZW50cmUsIFF1ZWVuIEVsaXphYmV0aCBPbHltcGljIFBhcmsiLCAiaGlnaGxpZ2h0IjogeyJjb2xvciI6ICJncmVlbiIsICJkYXNoQXJyYXkiOiAiNSwgNSIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiA0fSwgInN0YXJ0X3N0YXRpb25fbmFtZSI6ICJQb2RpdW0sIFF1ZWVuIEVsaXphYmV0aCBPbHltcGljIFBhcmsiLCAic3R5bGUiOiB7ImNvbG9yIjogImJsdWUiLCAiZGFzaEFycmF5IjogIjcsIDciLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogMn19LCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl9kNjY2ZjIwM2NjOWY0ODkzODg3NDZlMzYxNmNmNDRhNF9vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICB9CiAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2I4MDcyMDQwYTJkODQ1NmQ5ODlkZGI1MDNiYjQ3YjE5ICk7CiAgICAgICAgZ2VvX2pzb25fZDY2NmYyMDNjYzlmNDg5Mzg4NzQ2ZTM2MTZjZjQ0YTQuc2V0U3R5bGUoZnVuY3Rpb24oZmVhdHVyZSkge3JldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGU7fSk7CiAgICAgICAgCiAgICAKICAgICAgICBnZW9fanNvbl9kNjY2ZjIwM2NjOWY0ODkzODg3NDZlMzYxNmNmNDRhNC5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgZnVuY3Rpb24obGF5ZXIpewogICAgICAgICAgICAvLyBDb252ZXJ0IG5vbi1wcmltaXRpdmUgdG8gU3RyaW5nLgogICAgICAgICAgICBsZXQgaGFuZGxlT2JqZWN0ID0gKGZlYXR1cmUpPT50eXBlb2YoZmVhdHVyZSk9PSdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgOiBmZWF0dXJlOwogICAgICAgICAgICBsZXQgZmllbGRzID0gWydzdGFydF9zdGF0aW9uX25hbWUnLCAnZW5kX3N0YXRpb25fbmFtZScsICdjbnQnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAnPHRhYmxlPicgKwogICAgICAgICAgICBTdHJpbmcoCiAgICAgICAgICAgICAgICBmaWVsZHMubWFwKAogICAgICAgICAgICAgICAgY29sdW1ubmFtZT0+CiAgICAgICAgICAgICAgICAgICAgYDx0ciBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPgogICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0icGFkZGluZzogNHB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgJHsgY29sdW1ubmFtZS50b0xvY2FsZVN0cmluZygpfQogICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiA0cHg7Ij4ke2hhbmRsZU9iamVjdChsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbY29sdW1ubmFtZV0pCiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlU3RyaW5nKCl9PC90ZD48L3RyPmAKICAgICAgICAgICAgICAgICkuam9pbignJykpCiAgICAgICAgICAgICAgICArJzwvdGFibGU+JwogICAgICAgICAgICB9LCB7InN0aWNreSI6IHRydWV9KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBnZW9fanNvbl82MGIxZGRkOTZlNDk0MWUyYTNlNGQxYmQ5MThiNmNkN19vbkVhY2hGZWF0dXJlID0gZnVuY3Rpb24gb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICAgICAgbGF5ZXIub24oewogICAgICAgICAgICAgICAgICAgIG1vdXNlb3V0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5zdHlsZSk7fSwKICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXI6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLmhpZ2hsaWdodCk7fSwKICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMuZml0Qm91bmRzKGUudGFyZ2V0LmdldEJvdW5kcygpKTt9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICB2YXIgZ2VvX2pzb25fNjBiMWRkZDk2ZTQ5NDFlMmEzZTRkMWJkOTE4YjZjZDcgPSBMLmdlb0pzb24oCiAgICAgICAgICAgIHsiZmVhdHVyZXMiOiBbeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy0wLjE1NzI3NTYzNiwgNTEuNTEwMDE3Ml0sIFstMC4xNTM1MjA5MzUsIDUxLjUwMzExNzk5XV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgInByb3BlcnRpZXMiOiB7ImNudCI6IDEzNjYsICJlbmRfc3RhdGlvbl9uYW1lIjogIkh5ZGUgUGFyayBDb3JuZXIsIEh5ZGUgUGFyayIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIlBhcmsgTGFuZSAsIEh5ZGUgUGFyayIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uXzYwYjFkZGQ5NmU0OTQxZTJhM2U0ZDFiZDkxOGI2Y2Q3X29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl82MGIxZGRkOTZlNDk0MWUyYTNlNGQxYmQ5MThiNmNkNy5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uXzYwYjFkZGQ5NmU0OTQxZTJhM2U0ZDFiZDkxOGI2Y2Q3LmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uXzEzOTEwMGI3MTlhNDQyMzE4YjliMDkzOTllMDU1NDg3X29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl8xMzkxMDBiNzE5YTQ0MjMxOGI5YjA5Mzk5ZTA1NTQ4NyA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMTczMDYwMzIsIDUxLjUwNTAxNF0sIFstMC4xNTM1MjA5MzUsIDUxLjUwMzExNzk5XV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgInByb3BlcnRpZXMiOiB7ImNudCI6IDEzNjMsICJlbmRfc3RhdGlvbl9uYW1lIjogIkh5ZGUgUGFyayBDb3JuZXIsIEh5ZGUgUGFyayIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIlNlcnBlbnRpbmUgQ2FyIFBhcmssIEh5ZGUgUGFyayIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uXzEzOTEwMGI3MTlhNDQyMzE4YjliMDkzOTllMDU1NDg3X29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl8xMzkxMDBiNzE5YTQ0MjMxOGI5YjA5Mzk5ZTA1NTQ4Ny5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uXzEzOTEwMGI3MTlhNDQyMzE4YjliMDkzOTllMDU1NDg3LmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uXzc1MDdiZjY0MjM0NTQwYmFhNmYzN2ZkOTg1M2I1YzllX29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl83NTA3YmY2NDIzNDU0MGJhYTZmMzdmZDk4NTNiNWM5ZSA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMTU4NDU2MDg5LCA1MS41MDI5NTM3OV0sIFstMC4xNTcyNzU2MzYsIDUxLjUxMDAxNzJdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogMTMzNCwgImVuZF9zdGF0aW9uX25hbWUiOiAiUGFyayBMYW5lICwgSHlkZSBQYXJrIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiQWxiZXJ0IEdhdGUsIEh5ZGUgUGFyayIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uXzc1MDdiZjY0MjM0NTQwYmFhNmYzN2ZkOTg1M2I1YzllX29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl83NTA3YmY2NDIzNDU0MGJhYTZmMzdmZDk4NTNiNWM5ZS5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uXzc1MDdiZjY0MjM0NTQwYmFhNmYzN2ZkOTg1M2I1YzllLmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uX2RjMmEzYTQ4NTUzNDQ2NjE5MGRkM2JjZWZiZDUwNmNhX29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl9kYzJhM2E0ODU1MzQ0NjYxOTBkZDNiY2VmYmQ1MDZjYSA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMTc5ODU0MTg0Mzg5MSwgNTEuNTAxNzE1NDM3Mzg2N10sIFstMC4xNTM1MjA5MzUsIDUxLjUwMzExNzk5XV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgInByb3BlcnRpZXMiOiB7ImNudCI6IDEzMzEsICJlbmRfc3RhdGlvbl9uYW1lIjogIkh5ZGUgUGFyayBDb3JuZXIsIEh5ZGUgUGFyayIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIlF1ZWVuJ3MgR2F0ZSwgS2Vuc2luZ3RvbiBHYXJkZW5zIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fZGMyYTNhNDg1NTM0NDY2MTkwZGQzYmNlZmJkNTA2Y2Ffb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uX2RjMmEzYTQ4NTUzNDQ2NjE5MGRkM2JjZWZiZDUwNmNhLnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fZGMyYTNhNDg1NTM0NDY2MTkwZGQzYmNlZmJkNTA2Y2EuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fZGFkZGM5MjNlMWM1NGRiNDhiN2Y5YjhiNjIwNzQ1OGJfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uX2RhZGRjOTIzZTFjNTRkYjQ4YjdmOWI4YjYyMDc0NThiID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4wMTA1MTA1NjUsIDUxLjU0MDk0XSwgWy0wLjAxNTcxNzYxNCwgNTEuNTQ5MzY5XV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgInByb3BlcnRpZXMiOiB7ImNudCI6IDEzMDYsICJlbmRfc3RhdGlvbl9uYW1lIjogIkxlZSBWYWxsZXkgVmVsb1BhcmssIFF1ZWVuIEVsaXphYmV0aCBPbHltcGljIFBhcmsiLCAiaGlnaGxpZ2h0IjogeyJjb2xvciI6ICJncmVlbiIsICJkYXNoQXJyYXkiOiAiNSwgNSIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiA0fSwgInN0YXJ0X3N0YXRpb25fbmFtZSI6ICJBcXVhdGljIENlbnRyZSwgUXVlZW4gRWxpemFiZXRoIE9seW1waWMgUGFyayIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uX2RhZGRjOTIzZTFjNTRkYjQ4YjdmOWI4YjYyMDc0NThiX29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl9kYWRkYzkyM2UxYzU0ZGI0OGI3ZjliOGI2MjA3NDU4Yi5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uX2RhZGRjOTIzZTFjNTRkYjQ4YjdmOWI4YjYyMDc0NThiLmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uXzc5NjU4ZDYwNTk3YjQ5NDVhOWIxY2ZmMTRjMmJhMjQwX29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl83OTY1OGQ2MDU5N2I0OTQ1YTliMWNmZjE0YzJiYTI0MCA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMTU3Mjc1NjM2LCA1MS41MTAwMTcyXSwgWy0wLjE3MDI3OTU1NSwgNTEuNTA2NDUxNzldXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogMTI3OCwgImVuZF9zdGF0aW9uX25hbWUiOiAiVHJpYW5nbGUgQ2FyIFBhcmssIEh5ZGUgUGFyayIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIlBhcmsgTGFuZSAsIEh5ZGUgUGFyayIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uXzc5NjU4ZDYwNTk3YjQ5NDVhOWIxY2ZmMTRjMmJhMjQwX29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl83OTY1OGQ2MDU5N2I0OTQ1YTliMWNmZjE0YzJiYTI0MC5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uXzc5NjU4ZDYwNTk3YjQ5NDVhOWIxY2ZmMTRjMmJhMjQwLmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uXzk5ZDM2Y2U5MTViNTQ2ZWI5MWYyNGVjNzY2NjViNzMyX29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl85OWQzNmNlOTE1YjU0NmViOTFmMjRlYzc2NjY1YjczMiA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMDEwNTEwNTY1LCA1MS41NDA5NF0sIFstMC4wMTE4ODk0ODIsIDUxLjUzODcxOF1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiAxMjc1LCAiZW5kX3N0YXRpb25fbmFtZSI6ICJQb2RpdW0sIFF1ZWVuIEVsaXphYmV0aCBPbHltcGljIFBhcmsiLCAiaGlnaGxpZ2h0IjogeyJjb2xvciI6ICJncmVlbiIsICJkYXNoQXJyYXkiOiAiNSwgNSIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiA0fSwgInN0YXJ0X3N0YXRpb25fbmFtZSI6ICJBcXVhdGljIENlbnRyZSwgUXVlZW4gRWxpemFiZXRoIE9seW1waWMgUGFyayIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uXzk5ZDM2Y2U5MTViNTQ2ZWI5MWYyNGVjNzY2NjViNzMyX29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl85OWQzNmNlOTE1YjU0NmViOTFmMjRlYzc2NjY1YjczMi5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uXzk5ZDM2Y2U5MTViNTQ2ZWI5MWYyNGVjNzY2NjViNzMyLmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uXzdhYjVjYzFjNmU0YjQ2NzU5YWQ2YTEzYWU5MjBiNWQzX29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl83YWI1Y2MxYzZlNGI0Njc1OWFkNmExM2FlOTIwYjVkMyA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMTU4NDU2MDg5LCA1MS41MDI5NTM3OV0sIFstMC4xODc4NDI3MTcsIDUxLjUwOTkwODM3XV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgInByb3BlcnRpZXMiOiB7ImNudCI6IDEyNjAsICJlbmRfc3RhdGlvbl9uYW1lIjogIkJsYWNrIExpb24gR2F0ZSwgS2Vuc2luZ3RvbiBHYXJkZW5zIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiQWxiZXJ0IEdhdGUsIEh5ZGUgUGFyayIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uXzdhYjVjYzFjNmU0YjQ2NzU5YWQ2YTEzYWU5MjBiNWQzX29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl83YWI1Y2MxYzZlNGI0Njc1OWFkNmExM2FlOTIwYjVkMy5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uXzdhYjVjYzFjNmU0YjQ2NzU5YWQ2YTEzYWU5MjBiNWQzLmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uXzRjYzY0ZmJkOWYxODQwNDc5MTU2MDFkM2FjYTcxOWU0X29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl80Y2M2NGZiZDlmMTg0MDQ3OTE1NjAxZDNhY2E3MTllNCA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMTcwMjc5NTU1LCA1MS41MDY0NTE3OV0sIFstMC4xNTcyNzU2MzYsIDUxLjUxMDAxNzJdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogMTIyMCwgImVuZF9zdGF0aW9uX25hbWUiOiAiUGFyayBMYW5lICwgSHlkZSBQYXJrIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiVHJpYW5nbGUgQ2FyIFBhcmssIEh5ZGUgUGFyayIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uXzRjYzY0ZmJkOWYxODQwNDc5MTU2MDFkM2FjYTcxOWU0X29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl80Y2M2NGZiZDlmMTg0MDQ3OTE1NjAxZDNhY2E3MTllNC5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uXzRjYzY0ZmJkOWYxODQwNDc5MTU2MDFkM2FjYTcxOWU0LmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uX2MyMDJjM2QxOTQzYTRmNjI5OWU5MmM1M2JlMWQwNzU3X29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl9jMjAyYzNkMTk0M2E0ZjYyOTllOTJjNTNiZTFkMDc1NyA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMjA4NDg1MjkzLCA1MS40Nzg5MzkzMV0sIFstMC4yMDE5NjgsIDUxLjQ3NTA4OV1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiAxMTk2LCAiZW5kX3N0YXRpb25fbmFtZSI6ICJQYXJzb25zIEdyZWVuIFN0YXRpb24sIFBhcnNvbnMgR3JlZW4iLCAiaGlnaGxpZ2h0IjogeyJjb2xvciI6ICJncmVlbiIsICJkYXNoQXJyYXkiOiAiNSwgNSIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiA0fSwgInN0YXJ0X3N0YXRpb25fbmFtZSI6ICJTdC4gUGV0ZXIncyBUZXJyYWNlLCBGdWxoYW0iLCAic3R5bGUiOiB7ImNvbG9yIjogImJsdWUiLCAiZGFzaEFycmF5IjogIjcsIDciLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogMn19LCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl9jMjAyYzNkMTk0M2E0ZjYyOTllOTJjNTNiZTFkMDc1N19vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICB9CiAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2I4MDcyMDQwYTJkODQ1NmQ5ODlkZGI1MDNiYjQ3YjE5ICk7CiAgICAgICAgZ2VvX2pzb25fYzIwMmMzZDE5NDNhNGY2Mjk5ZTkyYzUzYmUxZDA3NTcuc2V0U3R5bGUoZnVuY3Rpb24oZmVhdHVyZSkge3JldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGU7fSk7CiAgICAgICAgCiAgICAKICAgICAgICBnZW9fanNvbl9jMjAyYzNkMTk0M2E0ZjYyOTllOTJjNTNiZTFkMDc1Ny5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgZnVuY3Rpb24obGF5ZXIpewogICAgICAgICAgICAvLyBDb252ZXJ0IG5vbi1wcmltaXRpdmUgdG8gU3RyaW5nLgogICAgICAgICAgICBsZXQgaGFuZGxlT2JqZWN0ID0gKGZlYXR1cmUpPT50eXBlb2YoZmVhdHVyZSk9PSdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgOiBmZWF0dXJlOwogICAgICAgICAgICBsZXQgZmllbGRzID0gWydzdGFydF9zdGF0aW9uX25hbWUnLCAnZW5kX3N0YXRpb25fbmFtZScsICdjbnQnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAnPHRhYmxlPicgKwogICAgICAgICAgICBTdHJpbmcoCiAgICAgICAgICAgICAgICBmaWVsZHMubWFwKAogICAgICAgICAgICAgICAgY29sdW1ubmFtZT0+CiAgICAgICAgICAgICAgICAgICAgYDx0ciBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPgogICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0icGFkZGluZzogNHB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgJHsgY29sdW1ubmFtZS50b0xvY2FsZVN0cmluZygpfQogICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiA0cHg7Ij4ke2hhbmRsZU9iamVjdChsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbY29sdW1ubmFtZV0pCiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlU3RyaW5nKCl9PC90ZD48L3RyPmAKICAgICAgICAgICAgICAgICkuam9pbignJykpCiAgICAgICAgICAgICAgICArJzwvdGFibGU+JwogICAgICAgICAgICB9LCB7InN0aWNreSI6IHRydWV9KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBnZW9fanNvbl9hNzhlZjNiZDJlMTI0OGM3OTI2MTYxZjliMzA0OTY3ZF9vbkVhY2hGZWF0dXJlID0gZnVuY3Rpb24gb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICAgICAgbGF5ZXIub24oewogICAgICAgICAgICAgICAgICAgIG1vdXNlb3V0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5zdHlsZSk7fSwKICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXI6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLmhpZ2hsaWdodCk7fSwKICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMuZml0Qm91bmRzKGUudGFyZ2V0LmdldEJvdW5kcygpKTt9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICB2YXIgZ2VvX2pzb25fYTc4ZWYzYmQyZTEyNDhjNzkyNjE2MWY5YjMwNDk2N2QgPSBMLmdlb0pzb24oCiAgICAgICAgICAgIHsiZmVhdHVyZXMiOiBbeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy0wLjE1MzUyMDkzNSwgNTEuNTAzMTE3OTldLCBbLTAuMTc5ODU0MTg0Mzg5MSwgNTEuNTAxNzE1NDM3Mzg2N11dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiAxMTcyLCAiZW5kX3N0YXRpb25fbmFtZSI6ICJRdWVlbidzIEdhdGUsIEtlbnNpbmd0b24gR2FyZGVucyIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIkh5ZGUgUGFyayBDb3JuZXIsIEh5ZGUgUGFyayIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uX2E3OGVmM2JkMmUxMjQ4Yzc5MjYxNjFmOWIzMDQ5NjdkX29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl9hNzhlZjNiZDJlMTI0OGM3OTI2MTYxZjliMzA0OTY3ZC5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uX2E3OGVmM2JkMmUxMjQ4Yzc5MjYxNjFmOWIzMDQ5NjdkLmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uX2Y5MTc1M2Q0M2I3MTRjNmQ5Y2NjOTgxNmM4NDk1YThmX29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl9mOTE3NTNkNDNiNzE0YzZkOWNjYzk4MTZjODQ5NWE4ZiA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMTEyODI0MDgsIDUxLjUwMzc5MTY4XSwgWy0wLjA5ODg1MDkxNSwgNTEuNTE1NDE4Nl1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiAxMTAzLCAiZW5kX3N0YXRpb25fbmFtZSI6ICJOZXdnYXRlIFN0cmVldCAsIFN0LiBQYXVsJ3MiLCAiaGlnaGxpZ2h0IjogeyJjb2xvciI6ICJncmVlbiIsICJkYXNoQXJyYXkiOiAiNSwgNSIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiA0fSwgInN0YXJ0X3N0YXRpb25fbmFtZSI6ICJXYXRlcmxvbyBTdGF0aW9uIDMsIFdhdGVybG9vIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fZjkxNzUzZDQzYjcxNGM2ZDljY2M5ODE2Yzg0OTVhOGZfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uX2Y5MTc1M2Q0M2I3MTRjNmQ5Y2NjOTgxNmM4NDk1YThmLnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fZjkxNzUzZDQzYjcxNGM2ZDljY2M5ODE2Yzg0OTVhOGYuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fMTJjMWIwYWRiY2RhNDgxZDgwMDRhNjhlNWZjM2VjNmNfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uXzEyYzFiMGFkYmNkYTQ4MWQ4MDA0YTY4ZTVmYzNlYzZjID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4wMTA1MTA1NjUsIDUxLjU0MDk0XSwgWy0wLjAyMTYzMDM1OSwgNTEuNTQwMzExNV1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiAxMDk2LCAiZW5kX3N0YXRpb25fbmFtZSI6ICJNb25pZXIgUm9hZCwgSGFja25leSBXaWNrIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiQXF1YXRpYyBDZW50cmUsIFF1ZWVuIEVsaXphYmV0aCBPbHltcGljIFBhcmsiLCAic3R5bGUiOiB7ImNvbG9yIjogImJsdWUiLCAiZGFzaEFycmF5IjogIjcsIDciLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogMn19LCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl8xMmMxYjBhZGJjZGE0ODFkODAwNGE2OGU1ZmMzZWM2Y19vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICB9CiAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2I4MDcyMDQwYTJkODQ1NmQ5ODlkZGI1MDNiYjQ3YjE5ICk7CiAgICAgICAgZ2VvX2pzb25fMTJjMWIwYWRiY2RhNDgxZDgwMDRhNjhlNWZjM2VjNmMuc2V0U3R5bGUoZnVuY3Rpb24oZmVhdHVyZSkge3JldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGU7fSk7CiAgICAgICAgCiAgICAKICAgICAgICBnZW9fanNvbl8xMmMxYjBhZGJjZGE0ODFkODAwNGE2OGU1ZmMzZWM2Yy5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgZnVuY3Rpb24obGF5ZXIpewogICAgICAgICAgICAvLyBDb252ZXJ0IG5vbi1wcmltaXRpdmUgdG8gU3RyaW5nLgogICAgICAgICAgICBsZXQgaGFuZGxlT2JqZWN0ID0gKGZlYXR1cmUpPT50eXBlb2YoZmVhdHVyZSk9PSdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgOiBmZWF0dXJlOwogICAgICAgICAgICBsZXQgZmllbGRzID0gWydzdGFydF9zdGF0aW9uX25hbWUnLCAnZW5kX3N0YXRpb25fbmFtZScsICdjbnQnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAnPHRhYmxlPicgKwogICAgICAgICAgICBTdHJpbmcoCiAgICAgICAgICAgICAgICBmaWVsZHMubWFwKAogICAgICAgICAgICAgICAgY29sdW1ubmFtZT0+CiAgICAgICAgICAgICAgICAgICAgYDx0ciBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPgogICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0icGFkZGluZzogNHB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgJHsgY29sdW1ubmFtZS50b0xvY2FsZVN0cmluZygpfQogICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiA0cHg7Ij4ke2hhbmRsZU9iamVjdChsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbY29sdW1ubmFtZV0pCiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlU3RyaW5nKCl9PC90ZD48L3RyPmAKICAgICAgICAgICAgICAgICkuam9pbignJykpCiAgICAgICAgICAgICAgICArJzwvdGFibGU+JwogICAgICAgICAgICB9LCB7InN0aWNreSI6IHRydWV9KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBnZW9fanNvbl8wNDY2Y2UxYzI4OTk0NGFmODU5NTdlYTc0MDM0YmZmZl9vbkVhY2hGZWF0dXJlID0gZnVuY3Rpb24gb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICAgICAgbGF5ZXIub24oewogICAgICAgICAgICAgICAgICAgIG1vdXNlb3V0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5zdHlsZSk7fSwKICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXI6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLmhpZ2hsaWdodCk7fSwKICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMuZml0Qm91bmRzKGUudGFyZ2V0LmdldEJvdW5kcygpKTt9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICB2YXIgZ2VvX2pzb25fMDQ2NmNlMWMyODk5NDRhZjg1OTU3ZWE3NDAzNGJmZmYgPSBMLmdlb0pzb24oCiAgICAgICAgICAgIHsiZmVhdHVyZXMiOiBbeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy0wLjE3MDI3OTU1NSwgNTEuNTA2NDUxNzldLCBbLTAuMTg3ODQyNzE3LCA1MS41MDk5MDgzN11dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiAxMDk0LCAiZW5kX3N0YXRpb25fbmFtZSI6ICJCbGFjayBMaW9uIEdhdGUsIEtlbnNpbmd0b24gR2FyZGVucyIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIlRyaWFuZ2xlIENhciBQYXJrLCBIeWRlIFBhcmsiLCAic3R5bGUiOiB7ImNvbG9yIjogImJsdWUiLCAiZGFzaEFycmF5IjogIjcsIDciLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogMn19LCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl8wNDY2Y2UxYzI4OTk0NGFmODU5NTdlYTc0MDM0YmZmZl9vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICB9CiAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2I4MDcyMDQwYTJkODQ1NmQ5ODlkZGI1MDNiYjQ3YjE5ICk7CiAgICAgICAgZ2VvX2pzb25fMDQ2NmNlMWMyODk5NDRhZjg1OTU3ZWE3NDAzNGJmZmYuc2V0U3R5bGUoZnVuY3Rpb24oZmVhdHVyZSkge3JldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGU7fSk7CiAgICAgICAgCiAgICAKICAgICAgICBnZW9fanNvbl8wNDY2Y2UxYzI4OTk0NGFmODU5NTdlYTc0MDM0YmZmZi5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgZnVuY3Rpb24obGF5ZXIpewogICAgICAgICAgICAvLyBDb252ZXJ0IG5vbi1wcmltaXRpdmUgdG8gU3RyaW5nLgogICAgICAgICAgICBsZXQgaGFuZGxlT2JqZWN0ID0gKGZlYXR1cmUpPT50eXBlb2YoZmVhdHVyZSk9PSdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgOiBmZWF0dXJlOwogICAgICAgICAgICBsZXQgZmllbGRzID0gWydzdGFydF9zdGF0aW9uX25hbWUnLCAnZW5kX3N0YXRpb25fbmFtZScsICdjbnQnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAnPHRhYmxlPicgKwogICAgICAgICAgICBTdHJpbmcoCiAgICAgICAgICAgICAgICBmaWVsZHMubWFwKAogICAgICAgICAgICAgICAgY29sdW1ubmFtZT0+CiAgICAgICAgICAgICAgICAgICAgYDx0ciBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPgogICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0icGFkZGluZzogNHB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgJHsgY29sdW1ubmFtZS50b0xvY2FsZVN0cmluZygpfQogICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiA0cHg7Ij4ke2hhbmRsZU9iamVjdChsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbY29sdW1ubmFtZV0pCiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlU3RyaW5nKCl9PC90ZD48L3RyPmAKICAgICAgICAgICAgICAgICkuam9pbignJykpCiAgICAgICAgICAgICAgICArJzwvdGFibGU+JwogICAgICAgICAgICB9LCB7InN0aWNreSI6IHRydWV9KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBnZW9fanNvbl8yMTdkMWU0MTU3OGE0NTVhOGJkMDg5NjIwNjBlNjJhZF9vbkVhY2hGZWF0dXJlID0gZnVuY3Rpb24gb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICAgICAgbGF5ZXIub24oewogICAgICAgICAgICAgICAgICAgIG1vdXNlb3V0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5zdHlsZSk7fSwKICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXI6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLmhpZ2hsaWdodCk7fSwKICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMuZml0Qm91bmRzKGUudGFyZ2V0LmdldEJvdW5kcygpKTt9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICB2YXIgZ2VvX2pzb25fMjE3ZDFlNDE1NzhhNDU1YThiZDA4OTYyMDYwZTYyYWQgPSBMLmdlb0pzb24oCiAgICAgICAgICAgIHsiZmVhdHVyZXMiOiBbeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy0wLjE3OTg1NDE4NDM4OTEsIDUxLjUwMTcxNTQzNzM4NjddLCBbLTAuMTg3ODQyNzE3LCA1MS41MDk5MDgzN11dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiAxMDgxLCAiZW5kX3N0YXRpb25fbmFtZSI6ICJCbGFjayBMaW9uIEdhdGUsIEtlbnNpbmd0b24gR2FyZGVucyIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIlF1ZWVuJ3MgR2F0ZSwgS2Vuc2luZ3RvbiBHYXJkZW5zIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fMjE3ZDFlNDE1NzhhNDU1YThiZDA4OTYyMDYwZTYyYWRfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uXzIxN2QxZTQxNTc4YTQ1NWE4YmQwODk2MjA2MGU2MmFkLnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fMjE3ZDFlNDE1NzhhNDU1YThiZDA4OTYyMDYwZTYyYWQuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fZGFkNjFiYWIzYTlkNDE1MTk4YzRiNzkzYzMwNGRhOTNfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uX2RhZDYxYmFiM2E5ZDQxNTE5OGM0Yjc5M2MzMDRkYTkzID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4xNTM1MjA5MzUsIDUxLjUwMzExNzk5XSwgWy0wLjE4NDQwMDIyMSwgNTEuNTAyMDQyMzhdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogMTA3NiwgImVuZF9zdGF0aW9uX25hbWUiOiAiUGFsYWNlIEdhdGUsIEtlbnNpbmd0b24gR2FyZGVucyIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIkh5ZGUgUGFyayBDb3JuZXIsIEh5ZGUgUGFyayIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uX2RhZDYxYmFiM2E5ZDQxNTE5OGM0Yjc5M2MzMDRkYTkzX29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl9kYWQ2MWJhYjNhOWQ0MTUxOThjNGI3OTNjMzA0ZGE5My5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uX2RhZDYxYmFiM2E5ZDQxNTE5OGM0Yjc5M2MzMDRkYTkzLmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uXzdjYTZlOGRmYTdjODQwYWZiYzE0MjFjOTVlMjNmMzVkX29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl83Y2E2ZThkZmE3Yzg0MGFmYmMxNDIxYzk1ZTIzZjM1ZCA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMTU4NDU2MDg5LCA1MS41MDI5NTM3OV0sIFstMC4xNzAyNzk1NTUsIDUxLjUwNjQ1MTc5XV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgInByb3BlcnRpZXMiOiB7ImNudCI6IDEwNjQsICJlbmRfc3RhdGlvbl9uYW1lIjogIlRyaWFuZ2xlIENhciBQYXJrLCBIeWRlIFBhcmsiLCAiaGlnaGxpZ2h0IjogeyJjb2xvciI6ICJncmVlbiIsICJkYXNoQXJyYXkiOiAiNSwgNSIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiA0fSwgInN0YXJ0X3N0YXRpb25fbmFtZSI6ICJBbGJlcnQgR2F0ZSwgSHlkZSBQYXJrIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fN2NhNmU4ZGZhN2M4NDBhZmJjMTQyMWM5NWUyM2YzNWRfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uXzdjYTZlOGRmYTdjODQwYWZiYzE0MjFjOTVlMjNmMzVkLnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fN2NhNmU4ZGZhN2M4NDBhZmJjMTQyMWM5NWUyM2YzNWQuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fN2MwMjA1ODczM2RhNGNlZGI3M2M3MGExNTU3ZTMyOWFfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uXzdjMDIwNTg3MzNkYTRjZWRiNzNjNzBhMTU1N2UzMjlhID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4xMjM2MTY4MjQsIDUxLjUyOTk0MzcxXSwgWy0wLjExNjU1LCA1MS41MTgyNF1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiAxMDE5LCAiZW5kX3N0YXRpb25fbmFtZSI6ICJSZWQgTGlvbiBTdHJlZXQsIEhvbGJvcm4iLCAiaGlnaGxpZ2h0IjogeyJjb2xvciI6ICJncmVlbiIsICJkYXNoQXJyYXkiOiAiNSwgNSIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiA0fSwgInN0YXJ0X3N0YXRpb25fbmFtZSI6ICJCZWxncm92ZSBTdHJlZXQgLCBLaW5nJ3MgQ3Jvc3MiLCAic3R5bGUiOiB7ImNvbG9yIjogImJsdWUiLCAiZGFzaEFycmF5IjogIjcsIDciLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogMn19LCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl83YzAyMDU4NzMzZGE0Y2VkYjczYzcwYTE1NTdlMzI5YV9vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICB9CiAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2I4MDcyMDQwYTJkODQ1NmQ5ODlkZGI1MDNiYjQ3YjE5ICk7CiAgICAgICAgZ2VvX2pzb25fN2MwMjA1ODczM2RhNGNlZGI3M2M3MGExNTU3ZTMyOWEuc2V0U3R5bGUoZnVuY3Rpb24oZmVhdHVyZSkge3JldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGU7fSk7CiAgICAgICAgCiAgICAKICAgICAgICBnZW9fanNvbl83YzAyMDU4NzMzZGE0Y2VkYjczYzcwYTE1NTdlMzI5YS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgZnVuY3Rpb24obGF5ZXIpewogICAgICAgICAgICAvLyBDb252ZXJ0IG5vbi1wcmltaXRpdmUgdG8gU3RyaW5nLgogICAgICAgICAgICBsZXQgaGFuZGxlT2JqZWN0ID0gKGZlYXR1cmUpPT50eXBlb2YoZmVhdHVyZSk9PSdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgOiBmZWF0dXJlOwogICAgICAgICAgICBsZXQgZmllbGRzID0gWydzdGFydF9zdGF0aW9uX25hbWUnLCAnZW5kX3N0YXRpb25fbmFtZScsICdjbnQnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAnPHRhYmxlPicgKwogICAgICAgICAgICBTdHJpbmcoCiAgICAgICAgICAgICAgICBmaWVsZHMubWFwKAogICAgICAgICAgICAgICAgY29sdW1ubmFtZT0+CiAgICAgICAgICAgICAgICAgICAgYDx0ciBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPgogICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0icGFkZGluZzogNHB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgJHsgY29sdW1ubmFtZS50b0xvY2FsZVN0cmluZygpfQogICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiA0cHg7Ij4ke2hhbmRsZU9iamVjdChsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbY29sdW1ubmFtZV0pCiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlU3RyaW5nKCl9PC90ZD48L3RyPmAKICAgICAgICAgICAgICAgICkuam9pbignJykpCiAgICAgICAgICAgICAgICArJzwvdGFibGU+JwogICAgICAgICAgICB9LCB7InN0aWNreSI6IHRydWV9KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBnZW9fanNvbl8xZjRlNGE1Yzg4MWQ0ZmEyYjA3NGIzYTJlODY1OGExZF9vbkVhY2hGZWF0dXJlID0gZnVuY3Rpb24gb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICAgICAgbGF5ZXIub24oewogICAgICAgICAgICAgICAgICAgIG1vdXNlb3V0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5zdHlsZSk7fSwKICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXI6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLmhpZ2hsaWdodCk7fSwKICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMuZml0Qm91bmRzKGUudGFyZ2V0LmdldEJvdW5kcygpKTt9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICB2YXIgZ2VvX2pzb25fMWY0ZTRhNWM4ODFkNGZhMmIwNzRiM2EyZTg2NThhMWQgPSBMLmdlb0pzb24oCiAgICAgICAgICAgIHsiZmVhdHVyZXMiOiBbeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy0wLjExNjU1LCA1MS41MTgyNF0sIFstMC4xMjM2MTY4MjQsIDUxLjUyOTk0MzcxXV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgInByb3BlcnRpZXMiOiB7ImNudCI6IDEwMDYsICJlbmRfc3RhdGlvbl9uYW1lIjogIkJlbGdyb3ZlIFN0cmVldCAsIEtpbmcncyBDcm9zcyIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIlJlZCBMaW9uIFN0cmVldCwgSG9sYm9ybiIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uXzFmNGU0YTVjODgxZDRmYTJiMDc0YjNhMmU4NjU4YTFkX29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl8xZjRlNGE1Yzg4MWQ0ZmEyYjA3NGIzYTJlODY1OGExZC5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uXzFmNGU0YTVjODgxZDRmYTJiMDc0YjNhMmU4NjU4YTFkLmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uX2VkNWI2ZjM4YjRkZjRkMGRhZGZlNGJhYTYxMjRjYzA3X29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl9lZDViNmYzOGI0ZGY0ZDBkYWRmZTRiYWE2MTI0Y2MwNyA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMTEyODI0MDgsIDUxLjUwMzc5MTY4XSwgWy0wLjA5OTE0MTQwOCwgNTEuNTEyNDg0NDVdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogMTAwMSwgImVuZF9zdGF0aW9uX25hbWUiOiAiR29kbGltYW4gU3RyZWV0LCBTdC4gUGF1bCdzIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiV2F0ZXJsb28gU3RhdGlvbiAzLCBXYXRlcmxvbyIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uX2VkNWI2ZjM4YjRkZjRkMGRhZGZlNGJhYTYxMjRjYzA3X29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl9lZDViNmYzOGI0ZGY0ZDBkYWRmZTRiYWE2MTI0Y2MwNy5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uX2VkNWI2ZjM4YjRkZjRkMGRhZGZlNGJhYTYxMjRjYzA3LmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uXzgyZTkwZTVjNGJmZTRjODdhYWNlYzcxM2VmZWQ0NzQ4X29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl84MmU5MGU1YzRiZmU0Yzg3YWFjZWM3MTNlZmVkNDc0OCA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMTU3Mjc1NjM2LCA1MS41MTAwMTcyXSwgWy0wLjE1ODQ1NjA4OSwgNTEuNTAyOTUzNzldXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogOTg4LCAiZW5kX3N0YXRpb25fbmFtZSI6ICJBbGJlcnQgR2F0ZSwgSHlkZSBQYXJrIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiUGFyayBMYW5lICwgSHlkZSBQYXJrIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fODJlOTBlNWM0YmZlNGM4N2FhY2VjNzEzZWZlZDQ3NDhfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uXzgyZTkwZTVjNGJmZTRjODdhYWNlYzcxM2VmZWQ0NzQ4LnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fODJlOTBlNWM0YmZlNGM4N2FhY2VjNzEzZWZlZDQ3NDguYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fMmY0OWNmYWE3NWUzNDNiNGIyZTZjNzMxMWE3Y2FiMzFfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uXzJmNDljZmFhNzVlMzQzYjRiMmU2YzczMTFhN2NhYjMxID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4yMTUwODcwOTIsIDUxLjQ5MDIxNzYyXSwgWy0wLjIxNDQyODM3OCwgNTEuNDg2MDYyMDZdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogOTUyLCAiZW5kX3N0YXRpb25fbmFtZSI6ICJHcmV5aG91bmQgUm9hZCwgSGFtbWVyc21pdGgiLCAiaGlnaGxpZ2h0IjogeyJjb2xvciI6ICJncmVlbiIsICJkYXNoQXJyYXkiOiAiNSwgNSIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiA0fSwgInN0YXJ0X3N0YXRpb25fbmFtZSI6ICJCYXJvbnMgQ291cnQgU3RhdGlvbiwgV2VzdCBLZW5zaW5ndG9uIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fMmY0OWNmYWE3NWUzNDNiNGIyZTZjNzMxMWE3Y2FiMzFfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uXzJmNDljZmFhNzVlMzQzYjRiMmU2YzczMTFhN2NhYjMxLnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fMmY0OWNmYWE3NWUzNDNiNGIyZTZjNzMxMWE3Y2FiMzEuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fNGRhNDIzMzc4MDA5NDA3YzkxYTFhYWRjNzVlMzM2NmZfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uXzRkYTQyMzM3ODAwOTQwN2M5MWExYWFkYzc1ZTMzNjZmID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4xNzAyNzk1NTUsIDUxLjUwNjQ1MTc5XSwgWy0wLjE1ODQ1NjA4OSwgNTEuNTAyOTUzNzldXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogOTI4LCAiZW5kX3N0YXRpb25fbmFtZSI6ICJBbGJlcnQgR2F0ZSwgSHlkZSBQYXJrIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiVHJpYW5nbGUgQ2FyIFBhcmssIEh5ZGUgUGFyayIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uXzRkYTQyMzM3ODAwOTQwN2M5MWExYWFkYzc1ZTMzNjZmX29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl80ZGE0MjMzNzgwMDk0MDdjOTFhMWFhZGM3NWUzMzY2Zi5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uXzRkYTQyMzM3ODAwOTQwN2M5MWExYWFkYzc1ZTMzNjZmLmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uX2JlMDYxMTUwN2EyNzQ2ODRiMjg5YTZlYTM3MmY4MDllX29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl9iZTA2MTE1MDdhMjc0Njg0YjI4OWE2ZWEzNzJmODA5ZSA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMTE2Mjc5LCA1MS41MjQ1NjRdLCBbLTAuMTIzNjE2ODI0LCA1MS41Mjk5NDM3MV1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiA5MTAsICJlbmRfc3RhdGlvbl9uYW1lIjogIkJlbGdyb3ZlIFN0cmVldCAsIEtpbmcncyBDcm9zcyIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIldyZW4gU3RyZWV0LCBIb2xib3JuIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fYmUwNjExNTA3YTI3NDY4NGIyODlhNmVhMzcyZjgwOWVfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uX2JlMDYxMTUwN2EyNzQ2ODRiMjg5YTZlYTM3MmY4MDllLnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fYmUwNjExNTA3YTI3NDY4NGIyODlhNmVhMzcyZjgwOWUuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fMGYzNTMxYTE2ZDIyNDJkYjg4NTYyMmQ5NDA2MTUyMjBfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uXzBmMzUzMWExNmQyMjQyZGI4ODU2MjJkOTQwNjE1MjIwID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4xMjM2MTY4MjQsIDUxLjUyOTk0MzcxXSwgWy0wLjA5ODg1MDkxNSwgNTEuNTE1NDE4Nl1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiA5MDQsICJlbmRfc3RhdGlvbl9uYW1lIjogIk5ld2dhdGUgU3RyZWV0ICwgU3QuIFBhdWwncyIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIkJlbGdyb3ZlIFN0cmVldCAsIEtpbmcncyBDcm9zcyIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uXzBmMzUzMWExNmQyMjQyZGI4ODU2MjJkOTQwNjE1MjIwX29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl8wZjM1MzFhMTZkMjI0MmRiODg1NjIyZDk0MDYxNTIyMC5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uXzBmMzUzMWExNmQyMjQyZGI4ODU2MjJkOTQwNjE1MjIwLmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uXzU3ODQzMzM5YzI4NDRjOTNhY2Q1YjkxYzI1ZTE0ZGMyX29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl81Nzg0MzMzOWMyODQ0YzkzYWNkNWI5MWMyNWUxNGRjMiA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMDY2OTEsIDUxLjUwNzEzMV0sIFstMC4wNTc1NDQsIDUxLjUwNDc0OV1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiA4ODcsICJlbmRfc3RhdGlvbl9uYW1lIjogIldhcHBpbmcgTGFuZSwgV2FwcGluZyIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIk5lc2hhbSBTdHJlZXQsIFdhcHBpbmciLCAic3R5bGUiOiB7ImNvbG9yIjogImJsdWUiLCAiZGFzaEFycmF5IjogIjcsIDciLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogMn19LCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl81Nzg0MzMzOWMyODQ0YzkzYWNkNWI5MWMyNWUxNGRjMl9vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICB9CiAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2I4MDcyMDQwYTJkODQ1NmQ5ODlkZGI1MDNiYjQ3YjE5ICk7CiAgICAgICAgZ2VvX2pzb25fNTc4NDMzMzljMjg0NGM5M2FjZDViOTFjMjVlMTRkYzIuc2V0U3R5bGUoZnVuY3Rpb24oZmVhdHVyZSkge3JldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGU7fSk7CiAgICAgICAgCiAgICAKICAgICAgICBnZW9fanNvbl81Nzg0MzMzOWMyODQ0YzkzYWNkNWI5MWMyNWUxNGRjMi5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgZnVuY3Rpb24obGF5ZXIpewogICAgICAgICAgICAvLyBDb252ZXJ0IG5vbi1wcmltaXRpdmUgdG8gU3RyaW5nLgogICAgICAgICAgICBsZXQgaGFuZGxlT2JqZWN0ID0gKGZlYXR1cmUpPT50eXBlb2YoZmVhdHVyZSk9PSdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgOiBmZWF0dXJlOwogICAgICAgICAgICBsZXQgZmllbGRzID0gWydzdGFydF9zdGF0aW9uX25hbWUnLCAnZW5kX3N0YXRpb25fbmFtZScsICdjbnQnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAnPHRhYmxlPicgKwogICAgICAgICAgICBTdHJpbmcoCiAgICAgICAgICAgICAgICBmaWVsZHMubWFwKAogICAgICAgICAgICAgICAgY29sdW1ubmFtZT0+CiAgICAgICAgICAgICAgICAgICAgYDx0ciBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPgogICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0icGFkZGluZzogNHB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgJHsgY29sdW1ubmFtZS50b0xvY2FsZVN0cmluZygpfQogICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiA0cHg7Ij4ke2hhbmRsZU9iamVjdChsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbY29sdW1ubmFtZV0pCiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlU3RyaW5nKCl9PC90ZD48L3RyPmAKICAgICAgICAgICAgICAgICkuam9pbignJykpCiAgICAgICAgICAgICAgICArJzwvdGFibGU+JwogICAgICAgICAgICB9LCB7InN0aWNreSI6IHRydWV9KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBnZW9fanNvbl9mNWQ3Y2JiZjZkOTc0M2U3YjM5ZDUzYWM5OGUyNjA0Zl9vbkVhY2hGZWF0dXJlID0gZnVuY3Rpb24gb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICAgICAgbGF5ZXIub24oewogICAgICAgICAgICAgICAgICAgIG1vdXNlb3V0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5zdHlsZSk7fSwKICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXI6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLmhpZ2hsaWdodCk7fSwKICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMuZml0Qm91bmRzKGUudGFyZ2V0LmdldEJvdW5kcygpKTt9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICB2YXIgZ2VvX2pzb25fZjVkN2NiYmY2ZDk3NDNlN2IzOWQ1M2FjOThlMjYwNGYgPSBMLmdlb0pzb24oCiAgICAgICAgICAgIHsiZmVhdHVyZXMiOiBbeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy0wLjEyMzYxNjgyNCwgNTEuNTI5OTQzNzFdLCBbLTAuMTE2Mjc5LCA1MS41MjQ1NjRdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogODgyLCAiZW5kX3N0YXRpb25fbmFtZSI6ICJXcmVuIFN0cmVldCwgSG9sYm9ybiIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIkJlbGdyb3ZlIFN0cmVldCAsIEtpbmcncyBDcm9zcyIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uX2Y1ZDdjYmJmNmQ5NzQzZTdiMzlkNTNhYzk4ZTI2MDRmX29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl9mNWQ3Y2JiZjZkOTc0M2U3YjM5ZDUzYWM5OGUyNjA0Zi5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uX2Y1ZDdjYmJmNmQ5NzQzZTdiMzlkNTNhYzk4ZTI2MDRmLmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uXzE4OWIzYzMxN2ZiNzQ5NzZhMzFiOGZkN2FiN2RiMzYyX29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl8xODliM2MzMTdmYjc0OTc2YTMxYjhmZDdhYjdkYjM2MiA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMDIxNjMwMzU5LCA1MS41NDAzMTE1XSwgWy0wLjAxMDUxMDU2NSwgNTEuNTQwOTRdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogODYyLCAiZW5kX3N0YXRpb25fbmFtZSI6ICJBcXVhdGljIENlbnRyZSwgUXVlZW4gRWxpemFiZXRoIE9seW1waWMgUGFyayIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIk1vbmllciBSb2FkLCBIYWNrbmV5IFdpY2siLCAic3R5bGUiOiB7ImNvbG9yIjogImJsdWUiLCAiZGFzaEFycmF5IjogIjcsIDciLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogMn19LCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl8xODliM2MzMTdmYjc0OTc2YTMxYjhmZDdhYjdkYjM2Ml9vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICB9CiAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2I4MDcyMDQwYTJkODQ1NmQ5ODlkZGI1MDNiYjQ3YjE5ICk7CiAgICAgICAgZ2VvX2pzb25fMTg5YjNjMzE3ZmI3NDk3NmEzMWI4ZmQ3YWI3ZGIzNjIuc2V0U3R5bGUoZnVuY3Rpb24oZmVhdHVyZSkge3JldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGU7fSk7CiAgICAgICAgCiAgICAKICAgICAgICBnZW9fanNvbl8xODliM2MzMTdmYjc0OTc2YTMxYjhmZDdhYjdkYjM2Mi5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgZnVuY3Rpb24obGF5ZXIpewogICAgICAgICAgICAvLyBDb252ZXJ0IG5vbi1wcmltaXRpdmUgdG8gU3RyaW5nLgogICAgICAgICAgICBsZXQgaGFuZGxlT2JqZWN0ID0gKGZlYXR1cmUpPT50eXBlb2YoZmVhdHVyZSk9PSdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgOiBmZWF0dXJlOwogICAgICAgICAgICBsZXQgZmllbGRzID0gWydzdGFydF9zdGF0aW9uX25hbWUnLCAnZW5kX3N0YXRpb25fbmFtZScsICdjbnQnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAnPHRhYmxlPicgKwogICAgICAgICAgICBTdHJpbmcoCiAgICAgICAgICAgICAgICBmaWVsZHMubWFwKAogICAgICAgICAgICAgICAgY29sdW1ubmFtZT0+CiAgICAgICAgICAgICAgICAgICAgYDx0ciBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPgogICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0icGFkZGluZzogNHB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgJHsgY29sdW1ubmFtZS50b0xvY2FsZVN0cmluZygpfQogICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiA0cHg7Ij4ke2hhbmRsZU9iamVjdChsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbY29sdW1ubmFtZV0pCiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlU3RyaW5nKCl9PC90ZD48L3RyPmAKICAgICAgICAgICAgICAgICkuam9pbignJykpCiAgICAgICAgICAgICAgICArJzwvdGFibGU+JwogICAgICAgICAgICB9LCB7InN0aWNreSI6IHRydWV9KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBnZW9fanNvbl85NTc4OTRlMjMwYjY0ZWQ4YmVkZThmNDllYzBkNWNiY19vbkVhY2hGZWF0dXJlID0gZnVuY3Rpb24gb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICAgICAgbGF5ZXIub24oewogICAgICAgICAgICAgICAgICAgIG1vdXNlb3V0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5zdHlsZSk7fSwKICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXI6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLmhpZ2hsaWdodCk7fSwKICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMuZml0Qm91bmRzKGUudGFyZ2V0LmdldEJvdW5kcygpKTt9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICB2YXIgZ2VvX2pzb25fOTU3ODk0ZTIzMGI2NGVkOGJlZGU4ZjQ5ZWMwZDVjYmMgPSBMLmdlb0pzb24oCiAgICAgICAgICAgIHsiZmVhdHVyZXMiOiBbeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy0wLjE3NDU1NCwgNTEuNDk5OTE3XSwgWy0wLjE3Mzg4MSwgNTEuNDk0NDEyXV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgInByb3BlcnRpZXMiOiB7ImNudCI6IDg1OSwgImVuZF9zdGF0aW9uX25hbWUiOiAiU291dGggS2Vuc2luZ3RvbiBTdGF0aW9uLCBTb3V0aCBLZW5zaW5ndG9uIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiRXhoaWJpdGlvbiBSb2FkLCBLbmlnaHRzYnJpZGdlIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fOTU3ODk0ZTIzMGI2NGVkOGJlZGU4ZjQ5ZWMwZDVjYmNfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uXzk1Nzg5NGUyMzBiNjRlZDhiZWRlOGY0OWVjMGQ1Y2JjLnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fOTU3ODk0ZTIzMGI2NGVkOGJlZGU4ZjQ5ZWMwZDVjYmMuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fNDIyMzU1MDkwMzM3NGE1NDhhNzUxNGFlMGQ2MjZmODBfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uXzQyMjM1NTA5MDMzNzRhNTQ4YTc1MTRhZTBkNjI2ZjgwID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4xOTY0MjIsIDUxLjUwOTM1MzQyXSwgWy0wLjIwMjYwODYxMiwgNTEuNTE2MzIwOTVdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogODU1LCAiZW5kX3N0YXRpb25fbmFtZSI6ICJBbGwgU2FpbnRzIENodXJjaCwgUG9ydG9iZWxsbyIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIk5vdHRpbmcgSGlsbCBHYXRlIFN0YXRpb24sIE5vdHRpbmcgSGlsbCIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uXzQyMjM1NTA5MDMzNzRhNTQ4YTc1MTRhZTBkNjI2ZjgwX29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl80MjIzNTUwOTAzMzc0YTU0OGE3NTE0YWUwZDYyNmY4MC5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uXzQyMjM1NTA5MDMzNzRhNTQ4YTc1MTRhZTBkNjI2ZjgwLmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uXzNmYzkzMWQ3NTkwMDQ5OWZhOGY1MGU4ODMzMTUwNWU4X29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl8zZmM5MzFkNzU5MDA0OTlmYThmNTBlODgzMzE1MDVlOCA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMDIxNjMwMzU5LCA1MS41NDAzMTE1XSwgWy0wLjAwNDgxLCA1MS41NDE3OTNdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogODQ0LCAiZW5kX3N0YXRpb25fbmFtZSI6ICJTdHJhdGZvcmQgU3RhdGlvbiwgU3RyYXRmb3JkIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiTW9uaWVyIFJvYWQsIEhhY2tuZXkgV2ljayIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uXzNmYzkzMWQ3NTkwMDQ5OWZhOGY1MGU4ODMzMTUwNWU4X29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl8zZmM5MzFkNzU5MDA0OTlmYThmNTBlODgzMzE1MDVlOC5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uXzNmYzkzMWQ3NTkwMDQ5OWZhOGY1MGU4ODMzMTUwNWU4LmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uXzY1YjFkMzYwY2Y4ZDQ4YjI5ODgwNjMzM2Y3MDBkMWEwX29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl82NWIxZDM2MGNmOGQ0OGIyOTg4MDYzMzNmNzAwZDFhMCA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMTIzNjE2ODI0LCA1MS41Mjk5NDM3MV0sIFstMC4xMzIzMjg4MzcsIDUxLjUxNTYzMTQ0XV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgInByb3BlcnRpZXMiOiB7ImNudCI6IDg0MCwgImVuZF9zdGF0aW9uX25hbWUiOiAiU29obyBTcXVhcmUgLCBTb2hvIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiQmVsZ3JvdmUgU3RyZWV0ICwgS2luZydzIENyb3NzIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fNjViMWQzNjBjZjhkNDhiMjk4ODA2MzMzZjcwMGQxYTBfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uXzY1YjFkMzYwY2Y4ZDQ4YjI5ODgwNjMzM2Y3MDBkMWEwLnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fNjViMWQzNjBjZjhkNDhiMjk4ODA2MzMzZjcwMGQxYTAuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fYjYwMmIzZjk2YjVhNGFlMWJkOTgyOTFlMjI0MTYzMTBfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uX2I2MDJiM2Y5NmI1YTRhZTFiZDk4MjkxZTIyNDE2MzEwID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4xODIxMjYyNDgsIDUxLjQ2MzQ4OTE0XSwgWy0wLjE3MzAyOTI2LCA1MS40NjQ4OTQ0NV1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiA4MzUsICJlbmRfc3RhdGlvbl9uYW1lIjogIkdyYW50IFJvYWQgRWFzdCwgQ2xhcGhhbSBKdW5jdGlvbiIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIlVzayBSb2FkLCBDbGFwaGFtIEp1bmN0aW9uIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fYjYwMmIzZjk2YjVhNGFlMWJkOTgyOTFlMjI0MTYzMTBfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uX2I2MDJiM2Y5NmI1YTRhZTFiZDk4MjkxZTIyNDE2MzEwLnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fYjYwMmIzZjk2YjVhNGFlMWJkOTgyOTFlMjI0MTYzMTAuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fMDc3Yzk1ODViMjAxNGMzNWExN2ZiNGI0NWQ4YTczMjRfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uXzA3N2M5NTg1YjIwMTRjMzVhMTdmYjRiNDVkOGE3MzI0ID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4xNzM4ODEsIDUxLjQ5NDQxMl0sIFstMC4xNzQ1NTQsIDUxLjQ5OTkxN11dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiA4MzIsICJlbmRfc3RhdGlvbl9uYW1lIjogIkV4aGliaXRpb24gUm9hZCwgS25pZ2h0c2JyaWRnZSIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIlNvdXRoIEtlbnNpbmd0b24gU3RhdGlvbiwgU291dGggS2Vuc2luZ3RvbiIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uXzA3N2M5NTg1YjIwMTRjMzVhMTdmYjRiNDVkOGE3MzI0X29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl8wNzdjOTU4NWIyMDE0YzM1YTE3ZmI0YjQ1ZDhhNzMyNC5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uXzA3N2M5NTg1YjIwMTRjMzVhMTdmYjRiNDVkOGE3MzI0LmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uXzU3NDY4MTA0NTVjYjRlZDBiZTAxOGQwODA2YWIzM2Q2X29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl81NzQ2ODEwNDU1Y2I0ZWQwYmUwMThkMDgwNmFiMzNkNiA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMDc1ODg1Njg2LCA1MS41MzY1ODUxNF0sIFstMC4wNjI1NDYsIDUxLjUzNTY3OF1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiA4MjYsICJlbmRfc3RhdGlvbl9uYW1lIjogIlJlZ2VudCdzIFJvdyAsIEhhZ2dlcnN0b24iLCAiaGlnaGxpZ2h0IjogeyJjb2xvciI6ICJncmVlbiIsICJkYXNoQXJyYXkiOiAiNSwgNSIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiA0fSwgInN0YXJ0X3N0YXRpb25fbmFtZSI6ICJEdW5zdG9uIFJvYWQgLCBIYWdnZXJzdG9uIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fNTc0NjgxMDQ1NWNiNGVkMGJlMDE4ZDA4MDZhYjMzZDZfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uXzU3NDY4MTA0NTVjYjRlZDBiZTAxOGQwODA2YWIzM2Q2LnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fNTc0NjgxMDQ1NWNiNGVkMGJlMDE4ZDA4MDZhYjMzZDYuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fMmVmODQzOTQxYjk3NGZmN2I2YWY0OTY1ZTEwOGUwYzZfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uXzJlZjg0Mzk0MWI5NzRmZjdiNmFmNDk2NWUxMDhlMGM2ID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4xMzYxMjM5OCwgNTEuNDgyMzYyXSwgWy0wLjEyNDQ2OTk0OCwgNTEuNDg1OTE3MTRdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogODE1LCAiZW5kX3N0YXRpb25fbmFtZSI6ICJWYXV4aGFsbCBDcm9zcywgVmF1eGhhbGwiLCAiaGlnaGxpZ2h0IjogeyJjb2xvciI6ICJncmVlbiIsICJkYXNoQXJyYXkiOiAiNSwgNSIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiA0fSwgInN0YXJ0X3N0YXRpb25fbmFtZSI6ICJSaXZlcmxpZ2h0IE5vcnRoLCBOaW5lIEVsbXMiLCAic3R5bGUiOiB7ImNvbG9yIjogImJsdWUiLCAiZGFzaEFycmF5IjogIjcsIDciLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogMn19LCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl8yZWY4NDM5NDFiOTc0ZmY3YjZhZjQ5NjVlMTA4ZTBjNl9vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICB9CiAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2I4MDcyMDQwYTJkODQ1NmQ5ODlkZGI1MDNiYjQ3YjE5ICk7CiAgICAgICAgZ2VvX2pzb25fMmVmODQzOTQxYjk3NGZmN2I2YWY0OTY1ZTEwOGUwYzYuc2V0U3R5bGUoZnVuY3Rpb24oZmVhdHVyZSkge3JldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGU7fSk7CiAgICAgICAgCiAgICAKICAgICAgICBnZW9fanNvbl8yZWY4NDM5NDFiOTc0ZmY3YjZhZjQ5NjVlMTA4ZTBjNi5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgZnVuY3Rpb24obGF5ZXIpewogICAgICAgICAgICAvLyBDb252ZXJ0IG5vbi1wcmltaXRpdmUgdG8gU3RyaW5nLgogICAgICAgICAgICBsZXQgaGFuZGxlT2JqZWN0ID0gKGZlYXR1cmUpPT50eXBlb2YoZmVhdHVyZSk9PSdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgOiBmZWF0dXJlOwogICAgICAgICAgICBsZXQgZmllbGRzID0gWydzdGFydF9zdGF0aW9uX25hbWUnLCAnZW5kX3N0YXRpb25fbmFtZScsICdjbnQnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAnPHRhYmxlPicgKwogICAgICAgICAgICBTdHJpbmcoCiAgICAgICAgICAgICAgICBmaWVsZHMubWFwKAogICAgICAgICAgICAgICAgY29sdW1ubmFtZT0+CiAgICAgICAgICAgICAgICAgICAgYDx0ciBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPgogICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0icGFkZGluZzogNHB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgJHsgY29sdW1ubmFtZS50b0xvY2FsZVN0cmluZygpfQogICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiA0cHg7Ij4ke2hhbmRsZU9iamVjdChsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbY29sdW1ubmFtZV0pCiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlU3RyaW5nKCl9PC90ZD48L3RyPmAKICAgICAgICAgICAgICAgICkuam9pbignJykpCiAgICAgICAgICAgICAgICArJzwvdGFibGU+JwogICAgICAgICAgICB9LCB7InN0aWNreSI6IHRydWV9KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBnZW9fanNvbl83M2M2NzIyYmE5ZTI0NWI5ODMyZTI1NmI3YzBlZTdhZV9vbkVhY2hGZWF0dXJlID0gZnVuY3Rpb24gb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICAgICAgbGF5ZXIub24oewogICAgICAgICAgICAgICAgICAgIG1vdXNlb3V0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5zdHlsZSk7fSwKICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXI6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLmhpZ2hsaWdodCk7fSwKICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMuZml0Qm91bmRzKGUudGFyZ2V0LmdldEJvdW5kcygpKTt9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICB2YXIgZ2VvX2pzb25fNzNjNjcyMmJhOWUyNDViOTgzMmUyNTZiN2MwZWU3YWUgPSBMLmdlb0pzb24oCiAgICAgICAgICAgIHsiZmVhdHVyZXMiOiBbeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy0wLjE4NDQwMDIyMSwgNTEuNTAyMDQyMzhdLCBbLTAuMTU4NDU2MDg5LCA1MS41MDI5NTM3OV1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiA4MTIsICJlbmRfc3RhdGlvbl9uYW1lIjogIkFsYmVydCBHYXRlLCBIeWRlIFBhcmsiLCAiaGlnaGxpZ2h0IjogeyJjb2xvciI6ICJncmVlbiIsICJkYXNoQXJyYXkiOiAiNSwgNSIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiA0fSwgInN0YXJ0X3N0YXRpb25fbmFtZSI6ICJQYWxhY2UgR2F0ZSwgS2Vuc2luZ3RvbiBHYXJkZW5zIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fNzNjNjcyMmJhOWUyNDViOTgzMmUyNTZiN2MwZWU3YWVfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uXzczYzY3MjJiYTllMjQ1Yjk4MzJlMjU2YjdjMGVlN2FlLnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fNzNjNjcyMmJhOWUyNDViOTgzMmUyNTZiN2MwZWU3YWUuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fYTZmNzc5MDFmYjY5NDk5ZTkwOGE4ZDU3ODVkNzVkN2Ffb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uX2E2Zjc3OTAxZmI2OTQ5OWU5MDhhOGQ1Nzg1ZDc1ZDdhID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4wNjI1NDYsIDUxLjUzNTY3OF0sIFstMC4wNzU4ODU2ODYsIDUxLjUzNjU4NTE0XV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgInByb3BlcnRpZXMiOiB7ImNudCI6IDgxMSwgImVuZF9zdGF0aW9uX25hbWUiOiAiRHVuc3RvbiBSb2FkICwgSGFnZ2Vyc3RvbiIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIlJlZ2VudCdzIFJvdyAsIEhhZ2dlcnN0b24iLCAic3R5bGUiOiB7ImNvbG9yIjogImJsdWUiLCAiZGFzaEFycmF5IjogIjcsIDciLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogMn19LCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl9hNmY3NzkwMWZiNjk0OTllOTA4YThkNTc4NWQ3NWQ3YV9vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICB9CiAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2I4MDcyMDQwYTJkODQ1NmQ5ODlkZGI1MDNiYjQ3YjE5ICk7CiAgICAgICAgZ2VvX2pzb25fYTZmNzc5MDFmYjY5NDk5ZTkwOGE4ZDU3ODVkNzVkN2Euc2V0U3R5bGUoZnVuY3Rpb24oZmVhdHVyZSkge3JldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGU7fSk7CiAgICAgICAgCiAgICAKICAgICAgICBnZW9fanNvbl9hNmY3NzkwMWZiNjk0OTllOTA4YThkNTc4NWQ3NWQ3YS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgZnVuY3Rpb24obGF5ZXIpewogICAgICAgICAgICAvLyBDb252ZXJ0IG5vbi1wcmltaXRpdmUgdG8gU3RyaW5nLgogICAgICAgICAgICBsZXQgaGFuZGxlT2JqZWN0ID0gKGZlYXR1cmUpPT50eXBlb2YoZmVhdHVyZSk9PSdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgOiBmZWF0dXJlOwogICAgICAgICAgICBsZXQgZmllbGRzID0gWydzdGFydF9zdGF0aW9uX25hbWUnLCAnZW5kX3N0YXRpb25fbmFtZScsICdjbnQnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAnPHRhYmxlPicgKwogICAgICAgICAgICBTdHJpbmcoCiAgICAgICAgICAgICAgICBmaWVsZHMubWFwKAogICAgICAgICAgICAgICAgY29sdW1ubmFtZT0+CiAgICAgICAgICAgICAgICAgICAgYDx0ciBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPgogICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0icGFkZGluZzogNHB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgJHsgY29sdW1ubmFtZS50b0xvY2FsZVN0cmluZygpfQogICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiA0cHg7Ij4ke2hhbmRsZU9iamVjdChsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbY29sdW1ubmFtZV0pCiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlU3RyaW5nKCl9PC90ZD48L3RyPmAKICAgICAgICAgICAgICAgICkuam9pbignJykpCiAgICAgICAgICAgICAgICArJzwvdGFibGU+JwogICAgICAgICAgICB9LCB7InN0aWNreSI6IHRydWV9KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBnZW9fanNvbl9mYTk1NTA0ZjcxNzQ0MjY2OWRiZTdiODk3MWZjMTViMF9vbkVhY2hGZWF0dXJlID0gZnVuY3Rpb24gb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICAgICAgbGF5ZXIub24oewogICAgICAgICAgICAgICAgICAgIG1vdXNlb3V0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5zdHlsZSk7fSwKICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXI6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLmhpZ2hsaWdodCk7fSwKICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMuZml0Qm91bmRzKGUudGFyZ2V0LmdldEJvdW5kcygpKTt9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICB2YXIgZ2VvX2pzb25fZmE5NTUwNGY3MTc0NDI2NjlkYmU3Yjg5NzFmYzE1YjAgPSBMLmdlb0pzb24oCiAgICAgICAgICAgIHsiZmVhdHVyZXMiOiBbeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy0wLjIyMzg1MjI1NiwgNTEuNDgzNzMyMjVdLCBbLTAuMjE1MDg3MDkyLCA1MS40OTAyMTc2Ml1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiA4MDksICJlbmRfc3RhdGlvbl9uYW1lIjogIkJhcm9ucyBDb3VydCBTdGF0aW9uLCBXZXN0IEtlbnNpbmd0b24iLCAiaGlnaGxpZ2h0IjogeyJjb2xvciI6ICJncmVlbiIsICJkYXNoQXJyYXkiOiAiNSwgNSIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiA0fSwgInN0YXJ0X3N0YXRpb25fbmFtZSI6ICJSYWludmlsbGUgUm9hZCwgSGFtbWVyc21pdGgiLCAic3R5bGUiOiB7ImNvbG9yIjogImJsdWUiLCAiZGFzaEFycmF5IjogIjcsIDciLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogMn19LCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl9mYTk1NTA0ZjcxNzQ0MjY2OWRiZTdiODk3MWZjMTViMF9vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICB9CiAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2I4MDcyMDQwYTJkODQ1NmQ5ODlkZGI1MDNiYjQ3YjE5ICk7CiAgICAgICAgZ2VvX2pzb25fZmE5NTUwNGY3MTc0NDI2NjlkYmU3Yjg5NzFmYzE1YjAuc2V0U3R5bGUoZnVuY3Rpb24oZmVhdHVyZSkge3JldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGU7fSk7CiAgICAgICAgCiAgICAKICAgICAgICBnZW9fanNvbl9mYTk1NTA0ZjcxNzQ0MjY2OWRiZTdiODk3MWZjMTViMC5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgZnVuY3Rpb24obGF5ZXIpewogICAgICAgICAgICAvLyBDb252ZXJ0IG5vbi1wcmltaXRpdmUgdG8gU3RyaW5nLgogICAgICAgICAgICBsZXQgaGFuZGxlT2JqZWN0ID0gKGZlYXR1cmUpPT50eXBlb2YoZmVhdHVyZSk9PSdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgOiBmZWF0dXJlOwogICAgICAgICAgICBsZXQgZmllbGRzID0gWydzdGFydF9zdGF0aW9uX25hbWUnLCAnZW5kX3N0YXRpb25fbmFtZScsICdjbnQnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAnPHRhYmxlPicgKwogICAgICAgICAgICBTdHJpbmcoCiAgICAgICAgICAgICAgICBmaWVsZHMubWFwKAogICAgICAgICAgICAgICAgY29sdW1ubmFtZT0+CiAgICAgICAgICAgICAgICAgICAgYDx0ciBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPgogICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0icGFkZGluZzogNHB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgJHsgY29sdW1ubmFtZS50b0xvY2FsZVN0cmluZygpfQogICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiA0cHg7Ij4ke2hhbmRsZU9iamVjdChsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbY29sdW1ubmFtZV0pCiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlU3RyaW5nKCl9PC90ZD48L3RyPmAKICAgICAgICAgICAgICAgICkuam9pbignJykpCiAgICAgICAgICAgICAgICArJzwvdGFibGU+JwogICAgICAgICAgICB9LCB7InN0aWNreSI6IHRydWV9KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBnZW9fanNvbl83OWYzOTE5ODg1YmI0YzM5YmJkODA5MGQ5MWU2NmU1NF9vbkVhY2hGZWF0dXJlID0gZnVuY3Rpb24gb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICAgICAgbGF5ZXIub24oewogICAgICAgICAgICAgICAgICAgIG1vdXNlb3V0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5zdHlsZSk7fSwKICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXI6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLmhpZ2hsaWdodCk7fSwKICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMuZml0Qm91bmRzKGUudGFyZ2V0LmdldEJvdW5kcygpKTt9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICB2YXIgZ2VvX2pzb25fNzlmMzkxOTg4NWJiNGMzOWJiZDgwOTBkOTFlNjZlNTQgPSBMLmdlb0pzb24oCiAgICAgICAgICAgIHsiZmVhdHVyZXMiOiBbeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy0wLjA5ODg1MDkxNSwgNTEuNTE1NDE4Nl0sIFstMC4xMTI4MjQwOCwgNTEuNTAzNzkxNjhdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogODA5LCAiZW5kX3N0YXRpb25fbmFtZSI6ICJXYXRlcmxvbyBTdGF0aW9uIDMsIFdhdGVybG9vIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiTmV3Z2F0ZSBTdHJlZXQgLCBTdC4gUGF1bCdzIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fNzlmMzkxOTg4NWJiNGMzOWJiZDgwOTBkOTFlNjZlNTRfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uXzc5ZjM5MTk4ODViYjRjMzliYmQ4MDkwZDkxZTY2ZTU0LnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fNzlmMzkxOTg4NWJiNGMzOWJiZDgwOTBkOTFlNjZlNTQuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fNTdkMWNhNDMzYWI5NGZjMmIwZGE4ZTMzOThjOWQ2NDNfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uXzU3ZDFjYTQzM2FiOTRmYzJiMGRhOGUzMzk4YzlkNjQzID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4xMjAyMDI2MTQsIDUxLjUyMzM0NjcyXSwgWy0wLjEyMzYxNjgyNCwgNTEuNTI5OTQzNzFdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogODA1LCAiZW5kX3N0YXRpb25fbmFtZSI6ICJCZWxncm92ZSBTdHJlZXQgLCBLaW5nJ3MgQ3Jvc3MiLCAiaGlnaGxpZ2h0IjogeyJjb2xvciI6ICJncmVlbiIsICJkYXNoQXJyYXkiOiAiNSwgNSIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiA0fSwgInN0YXJ0X3N0YXRpb25fbmFtZSI6ICJHdWlsZm9yZCBTdHJlZXQgLCBCbG9vbXNidXJ5IiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fNTdkMWNhNDMzYWI5NGZjMmIwZGE4ZTMzOThjOWQ2NDNfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uXzU3ZDFjYTQzM2FiOTRmYzJiMGRhOGUzMzk4YzlkNjQzLnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fNTdkMWNhNDMzYWI5NGZjMmIwZGE4ZTMzOThjOWQ2NDMuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fNTAyNWZlYWRhNzE1NGNkODlkMmVkMDVjNTQ5ODFlMDJfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uXzUwMjVmZWFkYTcxNTRjZDg5ZDJlZDA1YzU0OTgxZTAyID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4xMTI4MjQwOCwgNTEuNTAzNzkxNjhdLCBbLTAuMDk3NDQxNjg3LCA1MS41MTE5NjE3Nl1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiA4MDIsICJlbmRfc3RhdGlvbl9uYW1lIjogIlF1ZWVuIFZpY3RvcmlhIFN0cmVldCwgU3QuIFBhdWwncyIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIldhdGVybG9vIFN0YXRpb24gMywgV2F0ZXJsb28iLCAic3R5bGUiOiB7ImNvbG9yIjogImJsdWUiLCAiZGFzaEFycmF5IjogIjcsIDciLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogMn19LCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl81MDI1ZmVhZGE3MTU0Y2Q4OWQyZWQwNWM1NDk4MWUwMl9vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICB9CiAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2I4MDcyMDQwYTJkODQ1NmQ5ODlkZGI1MDNiYjQ3YjE5ICk7CiAgICAgICAgZ2VvX2pzb25fNTAyNWZlYWRhNzE1NGNkODlkMmVkMDVjNTQ5ODFlMDIuc2V0U3R5bGUoZnVuY3Rpb24oZmVhdHVyZSkge3JldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGU7fSk7CiAgICAgICAgCiAgICAKICAgICAgICBnZW9fanNvbl81MDI1ZmVhZGE3MTU0Y2Q4OWQyZWQwNWM1NDk4MWUwMi5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgZnVuY3Rpb24obGF5ZXIpewogICAgICAgICAgICAvLyBDb252ZXJ0IG5vbi1wcmltaXRpdmUgdG8gU3RyaW5nLgogICAgICAgICAgICBsZXQgaGFuZGxlT2JqZWN0ID0gKGZlYXR1cmUpPT50eXBlb2YoZmVhdHVyZSk9PSdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgOiBmZWF0dXJlOwogICAgICAgICAgICBsZXQgZmllbGRzID0gWydzdGFydF9zdGF0aW9uX25hbWUnLCAnZW5kX3N0YXRpb25fbmFtZScsICdjbnQnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAnPHRhYmxlPicgKwogICAgICAgICAgICBTdHJpbmcoCiAgICAgICAgICAgICAgICBmaWVsZHMubWFwKAogICAgICAgICAgICAgICAgY29sdW1ubmFtZT0+CiAgICAgICAgICAgICAgICAgICAgYDx0ciBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPgogICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0icGFkZGluZzogNHB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgJHsgY29sdW1ubmFtZS50b0xvY2FsZVN0cmluZygpfQogICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiA0cHg7Ij4ke2hhbmRsZU9iamVjdChsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbY29sdW1ubmFtZV0pCiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlU3RyaW5nKCl9PC90ZD48L3RyPmAKICAgICAgICAgICAgICAgICkuam9pbignJykpCiAgICAgICAgICAgICAgICArJzwvdGFibGU+JwogICAgICAgICAgICB9LCB7InN0aWNreSI6IHRydWV9KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBnZW9fanNvbl81OGVjODkxMzJjNTM0YTdkOTQ4NTA1ODM1NzE4ZGJjMl9vbkVhY2hGZWF0dXJlID0gZnVuY3Rpb24gb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICAgICAgbGF5ZXIub24oewogICAgICAgICAgICAgICAgICAgIG1vdXNlb3V0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5zdHlsZSk7fSwKICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXI6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLmhpZ2hsaWdodCk7fSwKICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMuZml0Qm91bmRzKGUudGFyZ2V0LmdldEJvdW5kcygpKTt9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICB2YXIgZ2VvX2pzb25fNThlYzg5MTMyYzUzNGE3ZDk0ODUwNTgzNTcxOGRiYzIgPSBMLmdlb0pzb24oCiAgICAgICAgICAgIHsiZmVhdHVyZXMiOiBbeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy0wLjEyOTY5ODk2MywgNTEuNTAwNzAzMDVdLCBbLTAuMTQ5NTY5MjAxLCA1MS41MDI3NDAyNV1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiA3OTksICJlbmRfc3RhdGlvbl9uYW1lIjogIldlbGxpbmd0b24gQXJjaCwgSHlkZSBQYXJrIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiU3RvcmV5J3MgR2F0ZSwgV2VzdG1pbnN0ZXIiLCAic3R5bGUiOiB7ImNvbG9yIjogImJsdWUiLCAiZGFzaEFycmF5IjogIjcsIDciLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogMn19LCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl81OGVjODkxMzJjNTM0YTdkOTQ4NTA1ODM1NzE4ZGJjMl9vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICB9CiAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2I4MDcyMDQwYTJkODQ1NmQ5ODlkZGI1MDNiYjQ3YjE5ICk7CiAgICAgICAgZ2VvX2pzb25fNThlYzg5MTMyYzUzNGE3ZDk0ODUwNTgzNTcxOGRiYzIuc2V0U3R5bGUoZnVuY3Rpb24oZmVhdHVyZSkge3JldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGU7fSk7CiAgICAgICAgCiAgICAKICAgICAgICBnZW9fanNvbl81OGVjODkxMzJjNTM0YTdkOTQ4NTA1ODM1NzE4ZGJjMi5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgZnVuY3Rpb24obGF5ZXIpewogICAgICAgICAgICAvLyBDb252ZXJ0IG5vbi1wcmltaXRpdmUgdG8gU3RyaW5nLgogICAgICAgICAgICBsZXQgaGFuZGxlT2JqZWN0ID0gKGZlYXR1cmUpPT50eXBlb2YoZmVhdHVyZSk9PSdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgOiBmZWF0dXJlOwogICAgICAgICAgICBsZXQgZmllbGRzID0gWydzdGFydF9zdGF0aW9uX25hbWUnLCAnZW5kX3N0YXRpb25fbmFtZScsICdjbnQnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAnPHRhYmxlPicgKwogICAgICAgICAgICBTdHJpbmcoCiAgICAgICAgICAgICAgICBmaWVsZHMubWFwKAogICAgICAgICAgICAgICAgY29sdW1ubmFtZT0+CiAgICAgICAgICAgICAgICAgICAgYDx0ciBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPgogICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0icGFkZGluZzogNHB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgJHsgY29sdW1ubmFtZS50b0xvY2FsZVN0cmluZygpfQogICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiA0cHg7Ij4ke2hhbmRsZU9iamVjdChsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbY29sdW1ubmFtZV0pCiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlU3RyaW5nKCl9PC90ZD48L3RyPmAKICAgICAgICAgICAgICAgICkuam9pbignJykpCiAgICAgICAgICAgICAgICArJzwvdGFibGU+JwogICAgICAgICAgICB9LCB7InN0aWNreSI6IHRydWV9KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBnZW9fanNvbl8xZWUzMTBiNzY2Zjc0ZTQzYjRkYjQ5NGE1YzRiZGFjYV9vbkVhY2hGZWF0dXJlID0gZnVuY3Rpb24gb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICAgICAgbGF5ZXIub24oewogICAgICAgICAgICAgICAgICAgIG1vdXNlb3V0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5zdHlsZSk7fSwKICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXI6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLmhpZ2hsaWdodCk7fSwKICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMuZml0Qm91bmRzKGUudGFyZ2V0LmdldEJvdW5kcygpKTt9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICB2YXIgZ2VvX2pzb25fMWVlMzEwYjc2NmY3NGU0M2I0ZGI0OTRhNWM0YmRhY2EgPSBMLmdlb0pzb24oCiAgICAgICAgICAgIHsiZmVhdHVyZXMiOiBbeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy0wLjIxNzQwMDA5MywgNTEuNTA0MDM4MjFdLCBbLTAuMjE3NTE1MDcxLCA1MS41MDAzNTMwNl1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiA3OTIsICJlbmRfc3RhdGlvbl9uYW1lIjogIlJpY2htb25kIFdheSwgU2hlcGhlcmQncyBCdXNoIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiV29vZHN0b2NrIEdyb3ZlLCBTaGVwaGVyZCdzIEJ1c2giLCAic3R5bGUiOiB7ImNvbG9yIjogImJsdWUiLCAiZGFzaEFycmF5IjogIjcsIDciLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogMn19LCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl8xZWUzMTBiNzY2Zjc0ZTQzYjRkYjQ5NGE1YzRiZGFjYV9vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICB9CiAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2I4MDcyMDQwYTJkODQ1NmQ5ODlkZGI1MDNiYjQ3YjE5ICk7CiAgICAgICAgZ2VvX2pzb25fMWVlMzEwYjc2NmY3NGU0M2I0ZGI0OTRhNWM0YmRhY2Euc2V0U3R5bGUoZnVuY3Rpb24oZmVhdHVyZSkge3JldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGU7fSk7CiAgICAgICAgCiAgICAKICAgICAgICBnZW9fanNvbl8xZWUzMTBiNzY2Zjc0ZTQzYjRkYjQ5NGE1YzRiZGFjYS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgZnVuY3Rpb24obGF5ZXIpewogICAgICAgICAgICAvLyBDb252ZXJ0IG5vbi1wcmltaXRpdmUgdG8gU3RyaW5nLgogICAgICAgICAgICBsZXQgaGFuZGxlT2JqZWN0ID0gKGZlYXR1cmUpPT50eXBlb2YoZmVhdHVyZSk9PSdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgOiBmZWF0dXJlOwogICAgICAgICAgICBsZXQgZmllbGRzID0gWydzdGFydF9zdGF0aW9uX25hbWUnLCAnZW5kX3N0YXRpb25fbmFtZScsICdjbnQnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAnPHRhYmxlPicgKwogICAgICAgICAgICBTdHJpbmcoCiAgICAgICAgICAgICAgICBmaWVsZHMubWFwKAogICAgICAgICAgICAgICAgY29sdW1ubmFtZT0+CiAgICAgICAgICAgICAgICAgICAgYDx0ciBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPgogICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0icGFkZGluZzogNHB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgJHsgY29sdW1ubmFtZS50b0xvY2FsZVN0cmluZygpfQogICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiA0cHg7Ij4ke2hhbmRsZU9iamVjdChsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbY29sdW1ubmFtZV0pCiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlU3RyaW5nKCl9PC90ZD48L3RyPmAKICAgICAgICAgICAgICAgICkuam9pbignJykpCiAgICAgICAgICAgICAgICArJzwvdGFibGU+JwogICAgICAgICAgICB9LCB7InN0aWNreSI6IHRydWV9KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBnZW9fanNvbl9kMzJkZjI2ZGQyY2Q0NGU3YTBhMzFkYzI0YzJkMTM3N19vbkVhY2hGZWF0dXJlID0gZnVuY3Rpb24gb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICAgICAgbGF5ZXIub24oewogICAgICAgICAgICAgICAgICAgIG1vdXNlb3V0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5zdHlsZSk7fSwKICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXI6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLmhpZ2hsaWdodCk7fSwKICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMuZml0Qm91bmRzKGUudGFyZ2V0LmdldEJvdW5kcygpKTt9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICB2YXIgZ2VvX2pzb25fZDMyZGYyNmRkMmNkNDRlN2EwYTMxZGMyNGMyZDEzNzcgPSBMLmdlb0pzb24oCiAgICAgICAgICAgIHsiZmVhdHVyZXMiOiBbeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy0wLjE0OTU2OTIwMSwgNTEuNTAyNzQwMjVdLCBbLTAuMTUzNTIwOTM1LCA1MS41MDMxMTc5OV1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiA3OTAsICJlbmRfc3RhdGlvbl9uYW1lIjogIkh5ZGUgUGFyayBDb3JuZXIsIEh5ZGUgUGFyayIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIldlbGxpbmd0b24gQXJjaCwgSHlkZSBQYXJrIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fZDMyZGYyNmRkMmNkNDRlN2EwYTMxZGMyNGMyZDEzNzdfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uX2QzMmRmMjZkZDJjZDQ0ZTdhMGEzMWRjMjRjMmQxMzc3LnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fZDMyZGYyNmRkMmNkNDRlN2EwYTMxZGMyNGMyZDEzNzcuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fODVlYjA4ZTAwMjQzNDZmMTkwODJlZmQ4NWFkNjRkOGFfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uXzg1ZWIwOGUwMDI0MzQ2ZjE5MDgyZWZkODVhZDY0ZDhhID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4xMjM2MTY4MjQsIDUxLjUyOTk0MzcxXSwgWy0wLjEzNzg0MTMzMywgNTEuNTE0NjE5OTVdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogNzg4LCAiZW5kX3N0YXRpb25fbmFtZSI6ICJHcmVhdCBNYXJsYm9yb3VnaCBTdHJlZXQsIFNvaG8iLCAiaGlnaGxpZ2h0IjogeyJjb2xvciI6ICJncmVlbiIsICJkYXNoQXJyYXkiOiAiNSwgNSIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiA0fSwgInN0YXJ0X3N0YXRpb25fbmFtZSI6ICJCZWxncm92ZSBTdHJlZXQgLCBLaW5nJ3MgQ3Jvc3MiLCAic3R5bGUiOiB7ImNvbG9yIjogImJsdWUiLCAiZGFzaEFycmF5IjogIjcsIDciLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogMn19LCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl84NWViMDhlMDAyNDM0NmYxOTA4MmVmZDg1YWQ2NGQ4YV9vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICB9CiAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2I4MDcyMDQwYTJkODQ1NmQ5ODlkZGI1MDNiYjQ3YjE5ICk7CiAgICAgICAgZ2VvX2pzb25fODVlYjA4ZTAwMjQzNDZmMTkwODJlZmQ4NWFkNjRkOGEuc2V0U3R5bGUoZnVuY3Rpb24oZmVhdHVyZSkge3JldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGU7fSk7CiAgICAgICAgCiAgICAKICAgICAgICBnZW9fanNvbl84NWViMDhlMDAyNDM0NmYxOTA4MmVmZDg1YWQ2NGQ4YS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgZnVuY3Rpb24obGF5ZXIpewogICAgICAgICAgICAvLyBDb252ZXJ0IG5vbi1wcmltaXRpdmUgdG8gU3RyaW5nLgogICAgICAgICAgICBsZXQgaGFuZGxlT2JqZWN0ID0gKGZlYXR1cmUpPT50eXBlb2YoZmVhdHVyZSk9PSdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgOiBmZWF0dXJlOwogICAgICAgICAgICBsZXQgZmllbGRzID0gWydzdGFydF9zdGF0aW9uX25hbWUnLCAnZW5kX3N0YXRpb25fbmFtZScsICdjbnQnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAnPHRhYmxlPicgKwogICAgICAgICAgICBTdHJpbmcoCiAgICAgICAgICAgICAgICBmaWVsZHMubWFwKAogICAgICAgICAgICAgICAgY29sdW1ubmFtZT0+CiAgICAgICAgICAgICAgICAgICAgYDx0ciBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPgogICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0icGFkZGluZzogNHB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgJHsgY29sdW1ubmFtZS50b0xvY2FsZVN0cmluZygpfQogICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiA0cHg7Ij4ke2hhbmRsZU9iamVjdChsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbY29sdW1ubmFtZV0pCiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlU3RyaW5nKCl9PC90ZD48L3RyPmAKICAgICAgICAgICAgICAgICkuam9pbignJykpCiAgICAgICAgICAgICAgICArJzwvdGFibGU+JwogICAgICAgICAgICB9LCB7InN0aWNreSI6IHRydWV9KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBnZW9fanNvbl9hODIxNWRkY2I0Nzc0NjNjOGE5N2NkNzkwMDBhMGJjOV9vbkVhY2hGZWF0dXJlID0gZnVuY3Rpb24gb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICAgICAgbGF5ZXIub24oewogICAgICAgICAgICAgICAgICAgIG1vdXNlb3V0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5zdHlsZSk7fSwKICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXI6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLmhpZ2hsaWdodCk7fSwKICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMuZml0Qm91bmRzKGUudGFyZ2V0LmdldEJvdW5kcygpKTt9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICB2YXIgZ2VvX2pzb25fYTgyMTVkZGNiNDc3NDYzYzhhOTdjZDc5MDAwYTBiYzkgPSBMLmdlb0pzb24oCiAgICAgICAgICAgIHsiZmVhdHVyZXMiOiBbeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy0wLjE0OTU2OTIwMSwgNTEuNTAyNzQwMjVdLCBbLTAuMTcwMjc5NTU1LCA1MS41MDY0NTE3OV1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiA3ODcsICJlbmRfc3RhdGlvbl9uYW1lIjogIlRyaWFuZ2xlIENhciBQYXJrLCBIeWRlIFBhcmsiLCAiaGlnaGxpZ2h0IjogeyJjb2xvciI6ICJncmVlbiIsICJkYXNoQXJyYXkiOiAiNSwgNSIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiA0fSwgInN0YXJ0X3N0YXRpb25fbmFtZSI6ICJXZWxsaW5ndG9uIEFyY2gsIEh5ZGUgUGFyayIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uX2E4MjE1ZGRjYjQ3NzQ2M2M4YTk3Y2Q3OTAwMGEwYmM5X29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl9hODIxNWRkY2I0Nzc0NjNjOGE5N2NkNzkwMDBhMGJjOS5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uX2E4MjE1ZGRjYjQ3NzQ2M2M4YTk3Y2Q3OTAwMGEwYmM5LmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uX2ZjYTcwYTZjNGFjNDQ4ZDJhNzcwYjBmZjRhZDZlYTZkX29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl9mY2E3MGE2YzRhYzQ0OGQyYTc3MGIwZmY0YWQ2ZWE2ZCA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMTI0NDY5OTQ4LCA1MS40ODU5MTcxNF0sIFstMC4xMzYxMjM5OCwgNTEuNDgyMzYyXV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgInByb3BlcnRpZXMiOiB7ImNudCI6IDc3MiwgImVuZF9zdGF0aW9uX25hbWUiOiAiUml2ZXJsaWdodCBOb3J0aCwgTmluZSBFbG1zIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiVmF1eGhhbGwgQ3Jvc3MsIFZhdXhoYWxsIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fZmNhNzBhNmM0YWM0NDhkMmE3NzBiMGZmNGFkNmVhNmRfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uX2ZjYTcwYTZjNGFjNDQ4ZDJhNzcwYjBmZjRhZDZlYTZkLnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fZmNhNzBhNmM0YWM0NDhkMmE3NzBiMGZmNGFkNmVhNmQuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fYmYwZjJjZjJkYzE1NGI3MmFmYTZmYWZkYTVlMmRiNTFfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uX2JmMGYyY2YyZGMxNTRiNzJhZmE2ZmFmZGE1ZTJkYjUxID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4xODc4NDI3MTcsIDUxLjUwOTkwODM3XSwgWy0wLjE3OTg1NDE4NDM4OTEsIDUxLjUwMTcxNTQzNzM4NjddXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogNzY4LCAiZW5kX3N0YXRpb25fbmFtZSI6ICJRdWVlbidzIEdhdGUsIEtlbnNpbmd0b24gR2FyZGVucyIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIkJsYWNrIExpb24gR2F0ZSwgS2Vuc2luZ3RvbiBHYXJkZW5zIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fYmYwZjJjZjJkYzE1NGI3MmFmYTZmYWZkYTVlMmRiNTFfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uX2JmMGYyY2YyZGMxNTRiNzJhZmE2ZmFmZGE1ZTJkYjUxLnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fYmYwZjJjZjJkYzE1NGI3MmFmYTZmYWZkYTVlMmRiNTEuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fMTFlYTVlYWEyMzJkNDU4ZmE2OGRhYThiMTQzMzk5MTBfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uXzExZWE1ZWFhMjMyZDQ1OGZhNjhkYWE4YjE0MzM5OTEwID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4wNzQ3NTQ4NzIsIDUxLjUyMzY0ODA0XSwgWy0wLjA3OTI0OSwgNTEuNTE4OTA4XV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgInByb3BlcnRpZXMiOiB7ImNudCI6IDc2MywgImVuZF9zdGF0aW9uX25hbWUiOiAiQnJ1c2hmaWVsZCBTdHJlZXQsIExpdmVycG9vbCBTdHJlZXQiLCAiaGlnaGxpZ2h0IjogeyJjb2xvciI6ICJncmVlbiIsICJkYXNoQXJyYXkiOiAiNSwgNSIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiA0fSwgInN0YXJ0X3N0YXRpb25fbmFtZSI6ICJCZXRobmFsIEdyZWVuIFJvYWQsIFNob3JlZGl0Y2giLCAic3R5bGUiOiB7ImNvbG9yIjogImJsdWUiLCAiZGFzaEFycmF5IjogIjcsIDciLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogMn19LCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl8xMWVhNWVhYTIzMmQ0NThmYTY4ZGFhOGIxNDMzOTkxMF9vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICB9CiAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2I4MDcyMDQwYTJkODQ1NmQ5ODlkZGI1MDNiYjQ3YjE5ICk7CiAgICAgICAgZ2VvX2pzb25fMTFlYTVlYWEyMzJkNDU4ZmE2OGRhYThiMTQzMzk5MTAuc2V0U3R5bGUoZnVuY3Rpb24oZmVhdHVyZSkge3JldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGU7fSk7CiAgICAgICAgCiAgICAKICAgICAgICBnZW9fanNvbl8xMWVhNWVhYTIzMmQ0NThmYTY4ZGFhOGIxNDMzOTkxMC5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgZnVuY3Rpb24obGF5ZXIpewogICAgICAgICAgICAvLyBDb252ZXJ0IG5vbi1wcmltaXRpdmUgdG8gU3RyaW5nLgogICAgICAgICAgICBsZXQgaGFuZGxlT2JqZWN0ID0gKGZlYXR1cmUpPT50eXBlb2YoZmVhdHVyZSk9PSdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgOiBmZWF0dXJlOwogICAgICAgICAgICBsZXQgZmllbGRzID0gWydzdGFydF9zdGF0aW9uX25hbWUnLCAnZW5kX3N0YXRpb25fbmFtZScsICdjbnQnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAnPHRhYmxlPicgKwogICAgICAgICAgICBTdHJpbmcoCiAgICAgICAgICAgICAgICBmaWVsZHMubWFwKAogICAgICAgICAgICAgICAgY29sdW1ubmFtZT0+CiAgICAgICAgICAgICAgICAgICAgYDx0ciBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPgogICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0icGFkZGluZzogNHB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgJHsgY29sdW1ubmFtZS50b0xvY2FsZVN0cmluZygpfQogICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiA0cHg7Ij4ke2hhbmRsZU9iamVjdChsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbY29sdW1ubmFtZV0pCiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlU3RyaW5nKCl9PC90ZD48L3RyPmAKICAgICAgICAgICAgICAgICkuam9pbignJykpCiAgICAgICAgICAgICAgICArJzwvdGFibGU+JwogICAgICAgICAgICB9LCB7InN0aWNreSI6IHRydWV9KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBnZW9fanNvbl8yYjI4ZWQ2NmUxZWQ0ZjVlYjdkMWY5ZWFjYTNlOGJjZF9vbkVhY2hGZWF0dXJlID0gZnVuY3Rpb24gb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICAgICAgbGF5ZXIub24oewogICAgICAgICAgICAgICAgICAgIG1vdXNlb3V0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5zdHlsZSk7fSwKICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXI6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLmhpZ2hsaWdodCk7fSwKICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMuZml0Qm91bmRzKGUudGFyZ2V0LmdldEJvdW5kcygpKTt9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICB2YXIgZ2VvX2pzb25fMmIyOGVkNjZlMWVkNGY1ZWI3ZDFmOWVhY2EzZThiY2QgPSBMLmdlb0pzb24oCiAgICAgICAgICAgIHsiZmVhdHVyZXMiOiBbeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy0wLjA2NjkxLCA1MS41MDcxMzFdLCBbLTAuMDU4NjgxLCA1MS41MDY5NDZdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogNzUxLCAiZW5kX3N0YXRpb25fbmFtZSI6ICJSZWFyZG9uIFN0cmVldCwgV2FwcGluZyIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIk5lc2hhbSBTdHJlZXQsIFdhcHBpbmciLCAic3R5bGUiOiB7ImNvbG9yIjogImJsdWUiLCAiZGFzaEFycmF5IjogIjcsIDciLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogMn19LCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl8yYjI4ZWQ2NmUxZWQ0ZjVlYjdkMWY5ZWFjYTNlOGJjZF9vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICB9CiAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2I4MDcyMDQwYTJkODQ1NmQ5ODlkZGI1MDNiYjQ3YjE5ICk7CiAgICAgICAgZ2VvX2pzb25fMmIyOGVkNjZlMWVkNGY1ZWI3ZDFmOWVhY2EzZThiY2Quc2V0U3R5bGUoZnVuY3Rpb24oZmVhdHVyZSkge3JldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGU7fSk7CiAgICAgICAgCiAgICAKICAgICAgICBnZW9fanNvbl8yYjI4ZWQ2NmUxZWQ0ZjVlYjdkMWY5ZWFjYTNlOGJjZC5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgZnVuY3Rpb24obGF5ZXIpewogICAgICAgICAgICAvLyBDb252ZXJ0IG5vbi1wcmltaXRpdmUgdG8gU3RyaW5nLgogICAgICAgICAgICBsZXQgaGFuZGxlT2JqZWN0ID0gKGZlYXR1cmUpPT50eXBlb2YoZmVhdHVyZSk9PSdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgOiBmZWF0dXJlOwogICAgICAgICAgICBsZXQgZmllbGRzID0gWydzdGFydF9zdGF0aW9uX25hbWUnLCAnZW5kX3N0YXRpb25fbmFtZScsICdjbnQnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAnPHRhYmxlPicgKwogICAgICAgICAgICBTdHJpbmcoCiAgICAgICAgICAgICAgICBmaWVsZHMubWFwKAogICAgICAgICAgICAgICAgY29sdW1ubmFtZT0+CiAgICAgICAgICAgICAgICAgICAgYDx0ciBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPgogICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0icGFkZGluZzogNHB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgJHsgY29sdW1ubmFtZS50b0xvY2FsZVN0cmluZygpfQogICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiA0cHg7Ij4ke2hhbmRsZU9iamVjdChsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbY29sdW1ubmFtZV0pCiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlU3RyaW5nKCl9PC90ZD48L3RyPmAKICAgICAgICAgICAgICAgICkuam9pbignJykpCiAgICAgICAgICAgICAgICArJzwvdGFibGU+JwogICAgICAgICAgICB9LCB7InN0aWNreSI6IHRydWV9KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBnZW9fanNvbl81YWY3ODRmMzllZTY0NGI1ODYyN2VhYmE4M2JjMjE2MF9vbkVhY2hGZWF0dXJlID0gZnVuY3Rpb24gb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICAgICAgbGF5ZXIub24oewogICAgICAgICAgICAgICAgICAgIG1vdXNlb3V0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5zdHlsZSk7fSwKICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXI6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLmhpZ2hsaWdodCk7fSwKICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMuZml0Qm91bmRzKGUudGFyZ2V0LmdldEJvdW5kcygpKTt9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICB2YXIgZ2VvX2pzb25fNWFmNzg0ZjM5ZWU2NDRiNTg2MjdlYWJhODNiYzIxNjAgPSBMLmdlb0pzb24oCiAgICAgICAgICAgIHsiZmVhdHVyZXMiOiBbeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy0wLjE5ODczNTM1NywgNTEuNDYwNjcwMDVdLCBbLTAuMTg3NDI3Mjk0LCA1MS40NjA4NjQ0Nl1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiA3NDIsICJlbmRfc3RhdGlvbl9uYW1lIjogIldhbmRzd29ydGggVG93biBTdGF0aW9uLCBXYW5kc3dvcnRoIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiT3NpZXJzIFJvYWQsIFdhbmRzd29ydGgiLCAic3R5bGUiOiB7ImNvbG9yIjogImJsdWUiLCAiZGFzaEFycmF5IjogIjcsIDciLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogMn19LCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl81YWY3ODRmMzllZTY0NGI1ODYyN2VhYmE4M2JjMjE2MF9vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICB9CiAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2I4MDcyMDQwYTJkODQ1NmQ5ODlkZGI1MDNiYjQ3YjE5ICk7CiAgICAgICAgZ2VvX2pzb25fNWFmNzg0ZjM5ZWU2NDRiNTg2MjdlYWJhODNiYzIxNjAuc2V0U3R5bGUoZnVuY3Rpb24oZmVhdHVyZSkge3JldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGU7fSk7CiAgICAgICAgCiAgICAKICAgICAgICBnZW9fanNvbl81YWY3ODRmMzllZTY0NGI1ODYyN2VhYmE4M2JjMjE2MC5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgZnVuY3Rpb24obGF5ZXIpewogICAgICAgICAgICAvLyBDb252ZXJ0IG5vbi1wcmltaXRpdmUgdG8gU3RyaW5nLgogICAgICAgICAgICBsZXQgaGFuZGxlT2JqZWN0ID0gKGZlYXR1cmUpPT50eXBlb2YoZmVhdHVyZSk9PSdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgOiBmZWF0dXJlOwogICAgICAgICAgICBsZXQgZmllbGRzID0gWydzdGFydF9zdGF0aW9uX25hbWUnLCAnZW5kX3N0YXRpb25fbmFtZScsICdjbnQnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAnPHRhYmxlPicgKwogICAgICAgICAgICBTdHJpbmcoCiAgICAgICAgICAgICAgICBmaWVsZHMubWFwKAogICAgICAgICAgICAgICAgY29sdW1ubmFtZT0+CiAgICAgICAgICAgICAgICAgICAgYDx0ciBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPgogICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0icGFkZGluZzogNHB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgJHsgY29sdW1ubmFtZS50b0xvY2FsZVN0cmluZygpfQogICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiA0cHg7Ij4ke2hhbmRsZU9iamVjdChsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbY29sdW1ubmFtZV0pCiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlU3RyaW5nKCl9PC90ZD48L3RyPmAKICAgICAgICAgICAgICAgICkuam9pbignJykpCiAgICAgICAgICAgICAgICArJzwvdGFibGU+JwogICAgICAgICAgICB9LCB7InN0aWNreSI6IHRydWV9KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBnZW9fanNvbl9hZDMzMzJjMDM3NWU0NmFiOTkxNDE5NzMzNmQ1MWM5Nl9vbkVhY2hGZWF0dXJlID0gZnVuY3Rpb24gb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICAgICAgbGF5ZXIub24oewogICAgICAgICAgICAgICAgICAgIG1vdXNlb3V0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5zdHlsZSk7fSwKICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXI6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLmhpZ2hsaWdodCk7fSwKICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMuZml0Qm91bmRzKGUudGFyZ2V0LmdldEJvdW5kcygpKTt9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICB2YXIgZ2VvX2pzb25fYWQzMzMyYzAzNzVlNDZhYjk5MTQxOTczMzZkNTFjOTYgPSBMLmdlb0pzb24oCiAgICAgICAgICAgIHsiZmVhdHVyZXMiOiBbeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy0wLjE3MzA2MDMyLCA1MS41MDUwMTRdLCBbLTAuMTg3ODQyNzE3LCA1MS41MDk5MDgzN11dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiA3MzYsICJlbmRfc3RhdGlvbl9uYW1lIjogIkJsYWNrIExpb24gR2F0ZSwgS2Vuc2luZ3RvbiBHYXJkZW5zIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiU2VycGVudGluZSBDYXIgUGFyaywgSHlkZSBQYXJrIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fYWQzMzMyYzAzNzVlNDZhYjk5MTQxOTczMzZkNTFjOTZfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uX2FkMzMzMmMwMzc1ZTQ2YWI5OTE0MTk3MzM2ZDUxYzk2LnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fYWQzMzMyYzAzNzVlNDZhYjk5MTQxOTczMzZkNTFjOTYuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fM2E5OGRjNzY4YWVhNDI4NzhmOTAzNzNkOGM2YWQwYjFfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uXzNhOThkYzc2OGFlYTQyODc4ZjkwMzczZDhjNmFkMGIxID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4wMDQ4MSwgNTEuNTQxNzkzXSwgWy0wLjAyMTYzMDM1OSwgNTEuNTQwMzExNV1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiA3MjUsICJlbmRfc3RhdGlvbl9uYW1lIjogIk1vbmllciBSb2FkLCBIYWNrbmV5IFdpY2siLCAiaGlnaGxpZ2h0IjogeyJjb2xvciI6ICJncmVlbiIsICJkYXNoQXJyYXkiOiAiNSwgNSIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiA0fSwgInN0YXJ0X3N0YXRpb25fbmFtZSI6ICJTdHJhdGZvcmQgU3RhdGlvbiwgU3RyYXRmb3JkIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fM2E5OGRjNzY4YWVhNDI4NzhmOTAzNzNkOGM2YWQwYjFfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uXzNhOThkYzc2OGFlYTQyODc4ZjkwMzczZDhjNmFkMGIxLnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fM2E5OGRjNzY4YWVhNDI4NzhmOTAzNzNkOGM2YWQwYjEuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fZTdiMDBjNjBhNDcyNDdiNzlkMTA1MmRkZjE2OWM5ZTlfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uX2U3YjAwYzYwYTQ3MjQ3Yjc5ZDEwNTJkZGYxNjljOWU5ID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4xNzAyNzk1NTUsIDUxLjUwNjQ1MTc5XSwgWy0wLjE3MzA2MDMyLCA1MS41MDUwMTRdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogNzIxLCAiZW5kX3N0YXRpb25fbmFtZSI6ICJTZXJwZW50aW5lIENhciBQYXJrLCBIeWRlIFBhcmsiLCAiaGlnaGxpZ2h0IjogeyJjb2xvciI6ICJncmVlbiIsICJkYXNoQXJyYXkiOiAiNSwgNSIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiA0fSwgInN0YXJ0X3N0YXRpb25fbmFtZSI6ICJUcmlhbmdsZSBDYXIgUGFyaywgSHlkZSBQYXJrIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fZTdiMDBjNjBhNDcyNDdiNzlkMTA1MmRkZjE2OWM5ZTlfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uX2U3YjAwYzYwYTQ3MjQ3Yjc5ZDEwNTJkZGYxNjljOWU5LnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fZTdiMDBjNjBhNDcyNDdiNzlkMTA1MmRkZjE2OWM5ZTkuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fN2RkZDRlMDZlZDBmNDFkNjhmYjVkMTcyN2FkMmE4MTNfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uXzdkZGQ0ZTA2ZWQwZjQxZDY4ZmI1ZDE3MjdhZDJhODEzID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4yMTQ0MjgzNzgsIDUxLjQ4NjA2MjA2XSwgWy0wLjIxNTA4NzA5MiwgNTEuNDkwMjE3NjJdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogNzIxLCAiZW5kX3N0YXRpb25fbmFtZSI6ICJCYXJvbnMgQ291cnQgU3RhdGlvbiwgV2VzdCBLZW5zaW5ndG9uIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiR3JleWhvdW5kIFJvYWQsIEhhbW1lcnNtaXRoIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fN2RkZDRlMDZlZDBmNDFkNjhmYjVkMTcyN2FkMmE4MTNfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uXzdkZGQ0ZTA2ZWQwZjQxZDY4ZmI1ZDE3MjdhZDJhODEzLnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fN2RkZDRlMDZlZDBmNDFkNjhmYjVkMTcyN2FkMmE4MTMuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fM2ExMWQwNzUyODMxNGFlNzhhN2UyOTMxODU1YjdhY2Zfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uXzNhMTFkMDc1MjgzMTRhZTc4YTdlMjkzMTg1NWI3YWNmID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4yMTc0MDAwOTMsIDUxLjUwNDAzODIxXSwgWy0wLjIxMTQ1NTk4LCA1MS40OTc2MDgwNF1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiA3MjAsICJlbmRfc3RhdGlvbl9uYW1lIjogIk1hY2xpc2UgUm9hZCwgT2x5bXBpYSIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIldvb2RzdG9jayBHcm92ZSwgU2hlcGhlcmQncyBCdXNoIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fM2ExMWQwNzUyODMxNGFlNzhhN2UyOTMxODU1YjdhY2Zfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uXzNhMTFkMDc1MjgzMTRhZTc4YTdlMjkzMTg1NWI3YWNmLnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fM2ExMWQwNzUyODMxNGFlNzhhN2UyOTMxODU1YjdhY2YuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fMGUzYTY0ZWQxZWQ5NGM5Y2FlNzA1ZmFmMzdkYzE1N2Jfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uXzBlM2E2NGVkMWVkOTRjOWNhZTcwNWZhZjM3ZGMxNTdiID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4yMTUwODcwOTIsIDUxLjQ5MDIxNzYyXSwgWy0wLjIyMzg1MjI1NiwgNTEuNDgzNzMyMjVdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogNzIwLCAiZW5kX3N0YXRpb25fbmFtZSI6ICJSYWludmlsbGUgUm9hZCwgSGFtbWVyc21pdGgiLCAiaGlnaGxpZ2h0IjogeyJjb2xvciI6ICJncmVlbiIsICJkYXNoQXJyYXkiOiAiNSwgNSIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiA0fSwgInN0YXJ0X3N0YXRpb25fbmFtZSI6ICJCYXJvbnMgQ291cnQgU3RhdGlvbiwgV2VzdCBLZW5zaW5ndG9uIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fMGUzYTY0ZWQxZWQ5NGM5Y2FlNzA1ZmFmMzdkYzE1N2Jfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uXzBlM2E2NGVkMWVkOTRjOWNhZTcwNWZhZjM3ZGMxNTdiLnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fMGUzYTY0ZWQxZWQ5NGM5Y2FlNzA1ZmFmMzdkYzE1N2IuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fMDdhMGI4ZjY1ZTNlNDMxYTk3ZTMxMmZiMWY1ZTM2YmNfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uXzA3YTBiOGY2NWUzZTQzMWE5N2UzMTJmYjFmNWUzNmJjID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4xNzk4NTQxODQzODkxLCA1MS41MDE3MTU0MzczODY3XSwgWy0wLjE1ODQ1NjA4OSwgNTEuNTAyOTUzNzldXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogNzE4LCAiZW5kX3N0YXRpb25fbmFtZSI6ICJBbGJlcnQgR2F0ZSwgSHlkZSBQYXJrIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiUXVlZW4ncyBHYXRlLCBLZW5zaW5ndG9uIEdhcmRlbnMiLCAic3R5bGUiOiB7ImNvbG9yIjogImJsdWUiLCAiZGFzaEFycmF5IjogIjcsIDciLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogMn19LCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl8wN2EwYjhmNjVlM2U0MzFhOTdlMzEyZmIxZjVlMzZiY19vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICB9CiAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2I4MDcyMDQwYTJkODQ1NmQ5ODlkZGI1MDNiYjQ3YjE5ICk7CiAgICAgICAgZ2VvX2pzb25fMDdhMGI4ZjY1ZTNlNDMxYTk3ZTMxMmZiMWY1ZTM2YmMuc2V0U3R5bGUoZnVuY3Rpb24oZmVhdHVyZSkge3JldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGU7fSk7CiAgICAgICAgCiAgICAKICAgICAgICBnZW9fanNvbl8wN2EwYjhmNjVlM2U0MzFhOTdlMzEyZmIxZjVlMzZiYy5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgZnVuY3Rpb24obGF5ZXIpewogICAgICAgICAgICAvLyBDb252ZXJ0IG5vbi1wcmltaXRpdmUgdG8gU3RyaW5nLgogICAgICAgICAgICBsZXQgaGFuZGxlT2JqZWN0ID0gKGZlYXR1cmUpPT50eXBlb2YoZmVhdHVyZSk9PSdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgOiBmZWF0dXJlOwogICAgICAgICAgICBsZXQgZmllbGRzID0gWydzdGFydF9zdGF0aW9uX25hbWUnLCAnZW5kX3N0YXRpb25fbmFtZScsICdjbnQnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAnPHRhYmxlPicgKwogICAgICAgICAgICBTdHJpbmcoCiAgICAgICAgICAgICAgICBmaWVsZHMubWFwKAogICAgICAgICAgICAgICAgY29sdW1ubmFtZT0+CiAgICAgICAgICAgICAgICAgICAgYDx0ciBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPgogICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0icGFkZGluZzogNHB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgJHsgY29sdW1ubmFtZS50b0xvY2FsZVN0cmluZygpfQogICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiA0cHg7Ij4ke2hhbmRsZU9iamVjdChsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbY29sdW1ubmFtZV0pCiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlU3RyaW5nKCl9PC90ZD48L3RyPmAKICAgICAgICAgICAgICAgICkuam9pbignJykpCiAgICAgICAgICAgICAgICArJzwvdGFibGU+JwogICAgICAgICAgICB9LCB7InN0aWNreSI6IHRydWV9KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBnZW9fanNvbl9lMDQ3ZmQ4OTdiOTU0YWNkODIzMjMwZmE1ZTEwYjg3M19vbkVhY2hGZWF0dXJlID0gZnVuY3Rpb24gb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICAgICAgbGF5ZXIub24oewogICAgICAgICAgICAgICAgICAgIG1vdXNlb3V0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5zdHlsZSk7fSwKICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXI6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLmhpZ2hsaWdodCk7fSwKICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMuZml0Qm91bmRzKGUudGFyZ2V0LmdldEJvdW5kcygpKTt9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICB2YXIgZ2VvX2pzb25fZTA0N2ZkODk3Yjk1NGFjZDgyMzIzMGZhNWUxMGI4NzMgPSBMLmdlb0pzb24oCiAgICAgICAgICAgIHsiZmVhdHVyZXMiOiBbeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy0wLjEzMjMyODgzNywgNTEuNTE1NjMxNDRdLCBbLTAuMTIzNjE2ODI0LCA1MS41Mjk5NDM3MV1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiA3MTQsICJlbmRfc3RhdGlvbl9uYW1lIjogIkJlbGdyb3ZlIFN0cmVldCAsIEtpbmcncyBDcm9zcyIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIlNvaG8gU3F1YXJlICwgU29obyIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uX2UwNDdmZDg5N2I5NTRhY2Q4MjMyMzBmYTVlMTBiODczX29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl9lMDQ3ZmQ4OTdiOTU0YWNkODIzMjMwZmE1ZTEwYjg3My5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uX2UwNDdmZDg5N2I5NTRhY2Q4MjMyMzBmYTVlMTBiODczLmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uXzZjNDIxM2U3NDI3MDQyODhiYjJhMTNiMDBkZTU4ZDVhX29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl82YzQyMTNlNzQyNzA0Mjg4YmIyYTEzYjAwZGU1OGQ1YSA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMTQ5NTY5MjAxLCA1MS41MDI3NDAyNV0sIFstMC4xODc4NDI3MTcsIDUxLjUwOTkwODM3XV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgInByb3BlcnRpZXMiOiB7ImNudCI6IDcxNCwgImVuZF9zdGF0aW9uX25hbWUiOiAiQmxhY2sgTGlvbiBHYXRlLCBLZW5zaW5ndG9uIEdhcmRlbnMiLCAiaGlnaGxpZ2h0IjogeyJjb2xvciI6ICJncmVlbiIsICJkYXNoQXJyYXkiOiAiNSwgNSIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiA0fSwgInN0YXJ0X3N0YXRpb25fbmFtZSI6ICJXZWxsaW5ndG9uIEFyY2gsIEh5ZGUgUGFyayIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uXzZjNDIxM2U3NDI3MDQyODhiYjJhMTNiMDBkZTU4ZDVhX29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl82YzQyMTNlNzQyNzA0Mjg4YmIyYTEzYjAwZGU1OGQ1YS5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uXzZjNDIxM2U3NDI3MDQyODhiYjJhMTNiMDBkZTU4ZDVhLmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uXzllZDRmYzMyOWQwODQ5OGNhYWY1NGNlYmQwNTYxNTE0X29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl85ZWQ0ZmMzMjlkMDg0OThjYWFmNTRjZWJkMDU2MTUxNCA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMTg3ODQyNzE3LCA1MS41MDk5MDgzN10sIFstMC4xNzAyNzk1NTUsIDUxLjUwNjQ1MTc5XV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgInByb3BlcnRpZXMiOiB7ImNudCI6IDcxMywgImVuZF9zdGF0aW9uX25hbWUiOiAiVHJpYW5nbGUgQ2FyIFBhcmssIEh5ZGUgUGFyayIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIkJsYWNrIExpb24gR2F0ZSwgS2Vuc2luZ3RvbiBHYXJkZW5zIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fOWVkNGZjMzI5ZDA4NDk4Y2FhZjU0Y2ViZDA1NjE1MTRfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uXzllZDRmYzMyOWQwODQ5OGNhYWY1NGNlYmQwNTYxNTE0LnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fOWVkNGZjMzI5ZDA4NDk4Y2FhZjU0Y2ViZDA1NjE1MTQuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fOTIyY2UwYWQ2MDI2NGZmNmIxY2VlN2RiNTQ4N2VkYTVfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uXzkyMmNlMGFkNjAyNjRmZjZiMWNlZTdkYjU0ODdlZGE1ID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4xMzgwNzI2OTEsIDUxLjUxNzM0NDAzXSwgWy0wLjEyMzYxNjgyNCwgNTEuNTI5OTQzNzFdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogNzEzLCAiZW5kX3N0YXRpb25fbmFtZSI6ICJCZWxncm92ZSBTdHJlZXQgLCBLaW5nJ3MgQ3Jvc3MiLCAiaGlnaGxpZ2h0IjogeyJjb2xvciI6ICJncmVlbiIsICJkYXNoQXJyYXkiOiAiNSwgNSIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiA0fSwgInN0YXJ0X3N0YXRpb25fbmFtZSI6ICJXZWxscyBTdHJlZXQsIEZpdHpyb3ZpYSIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uXzkyMmNlMGFkNjAyNjRmZjZiMWNlZTdkYjU0ODdlZGE1X29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl85MjJjZTBhZDYwMjY0ZmY2YjFjZWU3ZGI1NDg3ZWRhNS5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uXzkyMmNlMGFkNjAyNjRmZjZiMWNlZTdkYjU0ODdlZGE1LmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uXzNhYTU2MDMzNjYyZjRlY2I5YzE2NWJmMDM2YWM0ZTg1X29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl8zYWE1NjAzMzY2MmY0ZWNiOWMxNjViZjAzNmFjNGU4NSA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMjExNDU1OTgsIDUxLjQ5NzYwODA0XSwgWy0wLjIxNzQwMDA5MywgNTEuNTA0MDM4MjFdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogNzA0LCAiZW5kX3N0YXRpb25fbmFtZSI6ICJXb29kc3RvY2sgR3JvdmUsIFNoZXBoZXJkJ3MgQnVzaCIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIk1hY2xpc2UgUm9hZCwgT2x5bXBpYSIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uXzNhYTU2MDMzNjYyZjRlY2I5YzE2NWJmMDM2YWM0ZTg1X29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl8zYWE1NjAzMzY2MmY0ZWNiOWMxNjViZjAzNmFjNGU4NS5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uXzNhYTU2MDMzNjYyZjRlY2I5YzE2NWJmMDM2YWM0ZTg1LmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uX2FmZWIyMTBhODVhMTRlYTQ5Nzg2NTg0YTQ0M2MxYmI0X29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl9hZmViMjEwYTg1YTE0ZWE0OTc4NjU4NGE0NDNjMWJiNCA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMDE0NjkxMjYsIDUxLjU0NjgwNV0sIFstMC4wMTA1MTA1NjUsIDUxLjU0MDk0XV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgInByb3BlcnRpZXMiOiB7ImNudCI6IDcwNCwgImVuZF9zdGF0aW9uX25hbWUiOiAiQXF1YXRpYyBDZW50cmUsIFF1ZWVuIEVsaXphYmV0aCBPbHltcGljIFBhcmsiLCAiaGlnaGxpZ2h0IjogeyJjb2xvciI6ICJncmVlbiIsICJkYXNoQXJyYXkiOiAiNSwgNSIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiA0fSwgInN0YXJ0X3N0YXRpb25fbmFtZSI6ICJUaW1iZXIgTG9kZ2UsIFF1ZWVuIEVsaXphYmV0aCBPbHltcGljIFBhcmsiLCAic3R5bGUiOiB7ImNvbG9yIjogImJsdWUiLCAiZGFzaEFycmF5IjogIjcsIDciLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogMn19LCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl9hZmViMjEwYTg1YTE0ZWE0OTc4NjU4NGE0NDNjMWJiNF9vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICB9CiAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2I4MDcyMDQwYTJkODQ1NmQ5ODlkZGI1MDNiYjQ3YjE5ICk7CiAgICAgICAgZ2VvX2pzb25fYWZlYjIxMGE4NWExNGVhNDk3ODY1ODRhNDQzYzFiYjQuc2V0U3R5bGUoZnVuY3Rpb24oZmVhdHVyZSkge3JldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGU7fSk7CiAgICAgICAgCiAgICAKICAgICAgICBnZW9fanNvbl9hZmViMjEwYTg1YTE0ZWE0OTc4NjU4NGE0NDNjMWJiNC5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgZnVuY3Rpb24obGF5ZXIpewogICAgICAgICAgICAvLyBDb252ZXJ0IG5vbi1wcmltaXRpdmUgdG8gU3RyaW5nLgogICAgICAgICAgICBsZXQgaGFuZGxlT2JqZWN0ID0gKGZlYXR1cmUpPT50eXBlb2YoZmVhdHVyZSk9PSdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgOiBmZWF0dXJlOwogICAgICAgICAgICBsZXQgZmllbGRzID0gWydzdGFydF9zdGF0aW9uX25hbWUnLCAnZW5kX3N0YXRpb25fbmFtZScsICdjbnQnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAnPHRhYmxlPicgKwogICAgICAgICAgICBTdHJpbmcoCiAgICAgICAgICAgICAgICBmaWVsZHMubWFwKAogICAgICAgICAgICAgICAgY29sdW1ubmFtZT0+CiAgICAgICAgICAgICAgICAgICAgYDx0ciBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPgogICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0icGFkZGluZzogNHB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgJHsgY29sdW1ubmFtZS50b0xvY2FsZVN0cmluZygpfQogICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiA0cHg7Ij4ke2hhbmRsZU9iamVjdChsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbY29sdW1ubmFtZV0pCiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlU3RyaW5nKCl9PC90ZD48L3RyPmAKICAgICAgICAgICAgICAgICkuam9pbignJykpCiAgICAgICAgICAgICAgICArJzwvdGFibGU+JwogICAgICAgICAgICB9LCB7InN0aWNreSI6IHRydWV9KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBnZW9fanNvbl9lYmY4MjUzOTdhYWE0YThmYWZhZDM0YTAzZTlkMTNiN19vbkVhY2hGZWF0dXJlID0gZnVuY3Rpb24gb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICAgICAgbGF5ZXIub24oewogICAgICAgICAgICAgICAgICAgIG1vdXNlb3V0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5zdHlsZSk7fSwKICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXI6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLmhpZ2hsaWdodCk7fSwKICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMuZml0Qm91bmRzKGUudGFyZ2V0LmdldEJvdW5kcygpKTt9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICB2YXIgZ2VvX2pzb25fZWJmODI1Mzk3YWFhNGE4ZmFmYWQzNGEwM2U5ZDEzYjcgPSBMLmdlb0pzb24oCiAgICAgICAgICAgIHsiZmVhdHVyZXMiOiBbeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy0wLjIwMjYwODYxMiwgNTEuNTE2MzIwOTVdLCBbLTAuMTk2NDIyLCA1MS41MDkzNTM0Ml1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiA3MDQsICJlbmRfc3RhdGlvbl9uYW1lIjogIk5vdHRpbmcgSGlsbCBHYXRlIFN0YXRpb24sIE5vdHRpbmcgSGlsbCIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIkFsbCBTYWludHMgQ2h1cmNoLCBQb3J0b2JlbGxvIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fZWJmODI1Mzk3YWFhNGE4ZmFmYWQzNGEwM2U5ZDEzYjdfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uX2ViZjgyNTM5N2FhYTRhOGZhZmFkMzRhMDNlOWQxM2I3LnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fZWJmODI1Mzk3YWFhNGE4ZmFmYWQzNGEwM2U5ZDEzYjcuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fMDcyNTI2YzU2YWFiNDk2MDg3Y2RhZTk1ODQ5NDgwZDlfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uXzA3MjUyNmM1NmFhYjQ5NjA4N2NkYWU5NTg0OTQ4MGQ5ID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4xODc4NDI3MTcsIDUxLjUwOTkwODM3XSwgWy0wLjE3MzA2MDMyLCA1MS41MDUwMTRdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogNzAyLCAiZW5kX3N0YXRpb25fbmFtZSI6ICJTZXJwZW50aW5lIENhciBQYXJrLCBIeWRlIFBhcmsiLCAiaGlnaGxpZ2h0IjogeyJjb2xvciI6ICJncmVlbiIsICJkYXNoQXJyYXkiOiAiNSwgNSIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiA0fSwgInN0YXJ0X3N0YXRpb25fbmFtZSI6ICJCbGFjayBMaW9uIEdhdGUsIEtlbnNpbmd0b24gR2FyZGVucyIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uXzA3MjUyNmM1NmFhYjQ5NjA4N2NkYWU5NTg0OTQ4MGQ5X29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl8wNzI1MjZjNTZhYWI0OTYwODdjZGFlOTU4NDk0ODBkOS5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uXzA3MjUyNmM1NmFhYjQ5NjA4N2NkYWU5NTg0OTQ4MGQ5LmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uX2RiMjE4NzIzMmExODQ5NDlhZGQxNDQ1ZGJkNDFhYjkxX29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl9kYjIxODcyMzJhMTg0OTQ5YWRkMTQ0NWRiZDQxYWI5MSA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMDg3MjYyOTk1LCA1MS41MDYzMDQ0MV0sIFstMC4wNzQxODkyMjUsIDUxLjUwMjI3OTkyXV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgInByb3BlcnRpZXMiOiB7ImNudCI6IDY5NCwgImVuZF9zdGF0aW9uX25hbWUiOiAiQ3VybGV3IFN0cmVldCwgU2hhZCBUaGFtZXMiLCAiaGlnaGxpZ2h0IjogeyJjb2xvciI6ICJncmVlbiIsICJkYXNoQXJyYXkiOiAiNSwgNSIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiA0fSwgInN0YXJ0X3N0YXRpb25fbmFtZSI6ICJEdWtlIFN0cmVldCBIaWxsLCBMb25kb24gQnJpZGdlIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fZGIyMTg3MjMyYTE4NDk0OWFkZDE0NDVkYmQ0MWFiOTFfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uX2RiMjE4NzIzMmExODQ5NDlhZGQxNDQ1ZGJkNDFhYjkxLnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fZGIyMTg3MjMyYTE4NDk0OWFkZDE0NDVkYmQ0MWFiOTEuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fMzRlMWFmMGJjNTkwNDQ1N2IxMzkxN2E3ZDRkYzAzOTNfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uXzM0ZTFhZjBiYzU5MDQ0NTdiMTM5MTdhN2Q0ZGMwMzkzID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4xMTI4MjQwOCwgNTEuNTAzNzkxNjhdLCBbLTAuMDg2Njg1NTQyLCA1MS41MTcwNzUyMV1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiA2ODQsICJlbmRfc3RhdGlvbl9uYW1lIjogIkZpbnNidXJ5IENpcmN1cywgTGl2ZXJwb29sIFN0cmVldCIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIldhdGVybG9vIFN0YXRpb24gMywgV2F0ZXJsb28iLCAic3R5bGUiOiB7ImNvbG9yIjogImJsdWUiLCAiZGFzaEFycmF5IjogIjcsIDciLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogMn19LCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl8zNGUxYWYwYmM1OTA0NDU3YjEzOTE3YTdkNGRjMDM5M19vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICB9CiAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2I4MDcyMDQwYTJkODQ1NmQ5ODlkZGI1MDNiYjQ3YjE5ICk7CiAgICAgICAgZ2VvX2pzb25fMzRlMWFmMGJjNTkwNDQ1N2IxMzkxN2E3ZDRkYzAzOTMuc2V0U3R5bGUoZnVuY3Rpb24oZmVhdHVyZSkge3JldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGU7fSk7CiAgICAgICAgCiAgICAKICAgICAgICBnZW9fanNvbl8zNGUxYWYwYmM1OTA0NDU3YjEzOTE3YTdkNGRjMDM5My5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgZnVuY3Rpb24obGF5ZXIpewogICAgICAgICAgICAvLyBDb252ZXJ0IG5vbi1wcmltaXRpdmUgdG8gU3RyaW5nLgogICAgICAgICAgICBsZXQgaGFuZGxlT2JqZWN0ID0gKGZlYXR1cmUpPT50eXBlb2YoZmVhdHVyZSk9PSdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgOiBmZWF0dXJlOwogICAgICAgICAgICBsZXQgZmllbGRzID0gWydzdGFydF9zdGF0aW9uX25hbWUnLCAnZW5kX3N0YXRpb25fbmFtZScsICdjbnQnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAnPHRhYmxlPicgKwogICAgICAgICAgICBTdHJpbmcoCiAgICAgICAgICAgICAgICBmaWVsZHMubWFwKAogICAgICAgICAgICAgICAgY29sdW1ubmFtZT0+CiAgICAgICAgICAgICAgICAgICAgYDx0ciBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPgogICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0icGFkZGluZzogNHB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgJHsgY29sdW1ubmFtZS50b0xvY2FsZVN0cmluZygpfQogICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiA0cHg7Ij4ke2hhbmRsZU9iamVjdChsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbY29sdW1ubmFtZV0pCiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlU3RyaW5nKCl9PC90ZD48L3RyPmAKICAgICAgICAgICAgICAgICkuam9pbignJykpCiAgICAgICAgICAgICAgICArJzwvdGFibGU+JwogICAgICAgICAgICB9LCB7InN0aWNreSI6IHRydWV9KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBnZW9fanNvbl9kMDU1NzY3NDZkMTk0ZDExYTNlMGI0MzJmYjdkN2RjOV9vbkVhY2hGZWF0dXJlID0gZnVuY3Rpb24gb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICAgICAgbGF5ZXIub24oewogICAgICAgICAgICAgICAgICAgIG1vdXNlb3V0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5zdHlsZSk7fSwKICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXI6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLmhpZ2hsaWdodCk7fSwKICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMuZml0Qm91bmRzKGUudGFyZ2V0LmdldEJvdW5kcygpKTt9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICB2YXIgZ2VvX2pzb25fZDA1NTc2NzQ2ZDE5NGQxMWEzZTBiNDMyZmI3ZDdkYzkgPSBMLmdlb0pzb24oCiAgICAgICAgICAgIHsiZmVhdHVyZXMiOiBbeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy0wLjA5NzQ0MTY4NywgNTEuNTExOTYxNzZdLCBbLTAuMTEyODI0MDgsIDUxLjUwMzc5MTY4XV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgInByb3BlcnRpZXMiOiB7ImNudCI6IDY3NSwgImVuZF9zdGF0aW9uX25hbWUiOiAiV2F0ZXJsb28gU3RhdGlvbiAzLCBXYXRlcmxvbyIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIlF1ZWVuIFZpY3RvcmlhIFN0cmVldCwgU3QuIFBhdWwncyIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uX2QwNTU3Njc0NmQxOTRkMTFhM2UwYjQzMmZiN2Q3ZGM5X29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl9kMDU1NzY3NDZkMTk0ZDExYTNlMGI0MzJmYjdkN2RjOS5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uX2QwNTU3Njc0NmQxOTRkMTFhM2UwYjQzMmZiN2Q3ZGM5LmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uX2VmYjYwYzgwMDI3YTRhMjU5YTQ3OTdiODI4MmExMDM1X29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl9lZmI2MGM4MDAyN2E0YTI1OWE0Nzk3YjgyODJhMTAzNSA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMTMwNDMxNzI3LCA1MS41MjE2ODA3OF0sIFstMC4xMjM2MTY4MjQsIDUxLjUyOTk0MzcxXV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgInByb3BlcnRpZXMiOiB7ImNudCI6IDY3NCwgImVuZF9zdGF0aW9uX25hbWUiOiAiQmVsZ3JvdmUgU3RyZWV0ICwgS2luZydzIENyb3NzIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiTWFsZXQgU3RyZWV0LCBCbG9vbXNidXJ5IiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fZWZiNjBjODAwMjdhNGEyNTlhNDc5N2I4MjgyYTEwMzVfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uX2VmYjYwYzgwMDI3YTRhMjU5YTQ3OTdiODI4MmExMDM1LnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fZWZiNjBjODAwMjdhNGEyNTlhNDc5N2I4MjgyYTEwMzUuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fOThjNDg0ZThmZTJkNDQ2MmJlOTgyNjBiNjQ1N2M5ZTBfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uXzk4YzQ4NGU4ZmUyZDQ0NjJiZTk4MjYwYjY0NTdjOWUwID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4wNTc1NDQsIDUxLjUwNDc0OV0sIFstMC4wNjY5MSwgNTEuNTA3MTMxXV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgInByb3BlcnRpZXMiOiB7ImNudCI6IDY3NCwgImVuZF9zdGF0aW9uX25hbWUiOiAiTmVzaGFtIFN0cmVldCwgV2FwcGluZyIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIldhcHBpbmcgTGFuZSwgV2FwcGluZyIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uXzk4YzQ4NGU4ZmUyZDQ0NjJiZTk4MjYwYjY0NTdjOWUwX29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl85OGM0ODRlOGZlMmQ0NDYyYmU5ODI2MGI2NDU3YzllMC5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uXzk4YzQ4NGU4ZmUyZDQ0NjJiZTk4MjYwYjY0NTdjOWUwLmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uXzBiNWEwNzAzY2JkZDRhNjU4MDdlYTliMmVlOThiNDEyX29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl8wYjVhMDcwM2NiZGQ0YTY1ODA3ZWE5YjJlZTk4YjQxMiA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMTg3ODQyNzE3LCA1MS41MDk5MDgzN10sIFstMC4xNTcyNzU2MzYsIDUxLjUxMDAxNzJdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogNjcyLCAiZW5kX3N0YXRpb25fbmFtZSI6ICJQYXJrIExhbmUgLCBIeWRlIFBhcmsiLCAiaGlnaGxpZ2h0IjogeyJjb2xvciI6ICJncmVlbiIsICJkYXNoQXJyYXkiOiAiNSwgNSIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiA0fSwgInN0YXJ0X3N0YXRpb25fbmFtZSI6ICJCbGFjayBMaW9uIEdhdGUsIEtlbnNpbmd0b24gR2FyZGVucyIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uXzBiNWEwNzAzY2JkZDRhNjU4MDdlYTliMmVlOThiNDEyX29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl8wYjVhMDcwM2NiZGQ0YTY1ODA3ZWE5YjJlZTk4YjQxMi5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uXzBiNWEwNzAzY2JkZDRhNjU4MDdlYTliMmVlOThiNDEyLmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uX2U2NTIxMDRlZDc1MzRhODhhNWYwZjNlOTA4NzgzMDdhX29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl9lNjUyMTA0ZWQ3NTM0YTg4YTVmMGYzZTkwODc4MzA3YSA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMTU4NDU2MDg5LCA1MS41MDI5NTM3OV0sIFstMC4xNzMwNjAzMiwgNTEuNTA1MDE0XV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgInByb3BlcnRpZXMiOiB7ImNudCI6IDY3MiwgImVuZF9zdGF0aW9uX25hbWUiOiAiU2VycGVudGluZSBDYXIgUGFyaywgSHlkZSBQYXJrIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiQWxiZXJ0IEdhdGUsIEh5ZGUgUGFyayIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uX2U2NTIxMDRlZDc1MzRhODhhNWYwZjNlOTA4NzgzMDdhX29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl9lNjUyMTA0ZWQ3NTM0YTg4YTVmMGYzZTkwODc4MzA3YS5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uX2U2NTIxMDRlZDc1MzRhODhhNWYwZjNlOTA4NzgzMDdhLmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uX2FiMzRiMTZkN2E4NTQ3MGU5ODYwODM3Y2YxNzgyMjVmX29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl9hYjM0YjE2ZDdhODU0NzBlOTg2MDgzN2NmMTc4MjI1ZiA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMDExODg5NDgyLCA1MS41Mzg3MThdLCBbLTAuMDE1NzE3NjE0LCA1MS41NDkzNjldXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogNjY4LCAiZW5kX3N0YXRpb25fbmFtZSI6ICJMZWUgVmFsbGV5IFZlbG9QYXJrLCBRdWVlbiBFbGl6YWJldGggT2x5bXBpYyBQYXJrIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiUG9kaXVtLCBRdWVlbiBFbGl6YWJldGggT2x5bXBpYyBQYXJrIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fYWIzNGIxNmQ3YTg1NDcwZTk4NjA4MzdjZjE3ODIyNWZfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uX2FiMzRiMTZkN2E4NTQ3MGU5ODYwODM3Y2YxNzgyMjVmLnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fYWIzNGIxNmQ3YTg1NDcwZTk4NjA4MzdjZjE3ODIyNWYuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fZWYxMmNjMGM1ZThkNDIwMThiODk4NDQ1YTFkNTUzYjNfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uX2VmMTJjYzBjNWU4ZDQyMDE4Yjg5ODQ0NWExZDU1M2IzID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4xNTcyNzU2MzYsIDUxLjUxMDAxNzJdLCBbLTAuMTg3ODQyNzE3LCA1MS41MDk5MDgzN11dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiA2NjcsICJlbmRfc3RhdGlvbl9uYW1lIjogIkJsYWNrIExpb24gR2F0ZSwgS2Vuc2luZ3RvbiBHYXJkZW5zIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiUGFyayBMYW5lICwgSHlkZSBQYXJrIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fZWYxMmNjMGM1ZThkNDIwMThiODk4NDQ1YTFkNTUzYjNfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uX2VmMTJjYzBjNWU4ZDQyMDE4Yjg5ODQ0NWExZDU1M2IzLnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fZWYxMmNjMGM1ZThkNDIwMThiODk4NDQ1YTFkNTUzYjMuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fMGRhMGJmNWEyZWY5NGYwMGExOGFjY2VkYzhmNzZmMTVfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uXzBkYTBiZjVhMmVmOTRmMDBhMThhY2NlZGM4Zjc2ZjE1ID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4xMTI4MjQwOCwgNTEuNTAzNzkxNjhdLCBbLTAuMTA1MzQ0NDgsIDUxLjUxNTA1OTkxXV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgInByb3BlcnRpZXMiOiB7ImNudCI6IDY2MSwgImVuZF9zdGF0aW9uX25hbWUiOiAiU3QuIEJyaWRlIFN0cmVldCwgSG9sYm9ybiIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIldhdGVybG9vIFN0YXRpb24gMywgV2F0ZXJsb28iLCAic3R5bGUiOiB7ImNvbG9yIjogImJsdWUiLCAiZGFzaEFycmF5IjogIjcsIDciLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogMn19LCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl8wZGEwYmY1YTJlZjk0ZjAwYTE4YWNjZWRjOGY3NmYxNV9vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICB9CiAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2I4MDcyMDQwYTJkODQ1NmQ5ODlkZGI1MDNiYjQ3YjE5ICk7CiAgICAgICAgZ2VvX2pzb25fMGRhMGJmNWEyZWY5NGYwMGExOGFjY2VkYzhmNzZmMTUuc2V0U3R5bGUoZnVuY3Rpb24oZmVhdHVyZSkge3JldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGU7fSk7CiAgICAgICAgCiAgICAKICAgICAgICBnZW9fanNvbl8wZGEwYmY1YTJlZjk0ZjAwYTE4YWNjZWRjOGY3NmYxNS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgZnVuY3Rpb24obGF5ZXIpewogICAgICAgICAgICAvLyBDb252ZXJ0IG5vbi1wcmltaXRpdmUgdG8gU3RyaW5nLgogICAgICAgICAgICBsZXQgaGFuZGxlT2JqZWN0ID0gKGZlYXR1cmUpPT50eXBlb2YoZmVhdHVyZSk9PSdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgOiBmZWF0dXJlOwogICAgICAgICAgICBsZXQgZmllbGRzID0gWydzdGFydF9zdGF0aW9uX25hbWUnLCAnZW5kX3N0YXRpb25fbmFtZScsICdjbnQnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAnPHRhYmxlPicgKwogICAgICAgICAgICBTdHJpbmcoCiAgICAgICAgICAgICAgICBmaWVsZHMubWFwKAogICAgICAgICAgICAgICAgY29sdW1ubmFtZT0+CiAgICAgICAgICAgICAgICAgICAgYDx0ciBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPgogICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0icGFkZGluZzogNHB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgJHsgY29sdW1ubmFtZS50b0xvY2FsZVN0cmluZygpfQogICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiA0cHg7Ij4ke2hhbmRsZU9iamVjdChsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbY29sdW1ubmFtZV0pCiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlU3RyaW5nKCl9PC90ZD48L3RyPmAKICAgICAgICAgICAgICAgICkuam9pbignJykpCiAgICAgICAgICAgICAgICArJzwvdGFibGU+JwogICAgICAgICAgICB9LCB7InN0aWNreSI6IHRydWV9KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBnZW9fanNvbl9hZmJjYTVkOGZhODk0ZGFhOTE2NmNlNDJiNGFhOTY3Ml9vbkVhY2hGZWF0dXJlID0gZnVuY3Rpb24gb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICAgICAgbGF5ZXIub24oewogICAgICAgICAgICAgICAgICAgIG1vdXNlb3V0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5zdHlsZSk7fSwKICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXI6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLmhpZ2hsaWdodCk7fSwKICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMuZml0Qm91bmRzKGUudGFyZ2V0LmdldEJvdW5kcygpKTt9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICB2YXIgZ2VvX2pzb25fYWZiY2E1ZDhmYTg5NGRhYTkxNjZjZTQyYjRhYTk2NzIgPSBMLmdlb0pzb24oCiAgICAgICAgICAgIHsiZmVhdHVyZXMiOiBbeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy0wLjAwOTkzNTI2LCA1MS41NDYzMjZdLCBbLTAuMDE1NzE3NjE0LCA1MS41NDkzNjldXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogNjU0LCAiZW5kX3N0YXRpb25fbmFtZSI6ICJMZWUgVmFsbGV5IFZlbG9QYXJrLCBRdWVlbiBFbGl6YWJldGggT2x5bXBpYyBQYXJrIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiRWFzdCBWaWxsYWdlLCBRdWVlbiBFbGl6YWJldGggT2x5bXBpYyBQYXJrIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fYWZiY2E1ZDhmYTg5NGRhYTkxNjZjZTQyYjRhYTk2NzJfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uX2FmYmNhNWQ4ZmE4OTRkYWE5MTY2Y2U0MmI0YWE5NjcyLnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fYWZiY2E1ZDhmYTg5NGRhYTkxNjZjZTQyYjRhYTk2NzIuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fODM5YjBhODJkYmExNGUyNmI1MDM2YTY0OWZlM2RhNGJfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uXzgzOWIwYTgyZGJhMTRlMjZiNTAzNmE2NDlmZTNkYTRiID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4xNzMwNjAzMiwgNTEuNTA1MDE0XSwgWy0wLjE3MDI3OTU1NSwgNTEuNTA2NDUxNzldXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogNjU0LCAiZW5kX3N0YXRpb25fbmFtZSI6ICJUcmlhbmdsZSBDYXIgUGFyaywgSHlkZSBQYXJrIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiU2VycGVudGluZSBDYXIgUGFyaywgSHlkZSBQYXJrIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fODM5YjBhODJkYmExNGUyNmI1MDM2YTY0OWZlM2RhNGJfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uXzgzOWIwYTgyZGJhMTRlMjZiNTAzNmE2NDlmZTNkYTRiLnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fODM5YjBhODJkYmExNGUyNmI1MDM2YTY0OWZlM2RhNGIuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fZGMxMzZkMTMxOWZhNGNmYTk0N2IwMzE3MWRmNGY2NzFfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uX2RjMTM2ZDEzMTlmYTRjZmE5NDdiMDMxNzFkZjRmNjcxID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4wOTE3NzM3NzYsIDUxLjUwNDYyNzU5XSwgWy0wLjEwMDE4NjMzNywgNTEuNTA1ODE3NzZdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogNjUzLCAiZW5kX3N0YXRpb25fbmFtZSI6ICJCYW5rc2lkZSBNaXgsIEJhbmtzaWRlIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiSG9wIEV4Y2hhbmdlLCBUaGUgQm9yb3VnaCIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uX2RjMTM2ZDEzMTlmYTRjZmE5NDdiMDMxNzFkZjRmNjcxX29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl9kYzEzNmQxMzE5ZmE0Y2ZhOTQ3YjAzMTcxZGY0ZjY3MS5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uX2RjMTM2ZDEzMTlmYTRjZmE5NDdiMDMxNzFkZjRmNjcxLmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uXzdkYjI5MzhhOTljYTRkMDQ4NDAyNGY4YjVmMjZjMDFiX29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl83ZGIyOTM4YTk5Y2E0ZDA0ODQwMjRmOGI1ZjI2YzAxYiA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMTEyODI0MDgsIDUxLjUwMzc5MTY4XSwgWy0wLjA4MjQyMjM5OSwgNTEuNTE2MTU0NjFdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogNjUxLCAiZW5kX3N0YXRpb25fbmFtZSI6ICJXb3Jtd29vZCBTdHJlZXQsIExpdmVycG9vbCBTdHJlZXQiLCAiaGlnaGxpZ2h0IjogeyJjb2xvciI6ICJncmVlbiIsICJkYXNoQXJyYXkiOiAiNSwgNSIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiA0fSwgInN0YXJ0X3N0YXRpb25fbmFtZSI6ICJXYXRlcmxvbyBTdGF0aW9uIDMsIFdhdGVybG9vIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fN2RiMjkzOGE5OWNhNGQwNDg0MDI0ZjhiNWYyNmMwMWJfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uXzdkYjI5MzhhOTljYTRkMDQ4NDAyNGY4YjVmMjZjMDFiLnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fN2RiMjkzOGE5OWNhNGQwNDg0MDI0ZjhiNWYyNmMwMWIuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fNTkzMmM3ODY3YmM0NGMzZmIzMDA1M2Q1ZDY4OWE4Mzlfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uXzU5MzJjNzg2N2JjNDRjM2ZiMzAwNTNkNWQ2ODlhODM5ID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4xNzk4NTQxODQzODkxLCA1MS41MDE3MTU0MzczODY3XSwgWy0wLjE1NzI3NTYzNiwgNTEuNTEwMDE3Ml1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiA2NTAsICJlbmRfc3RhdGlvbl9uYW1lIjogIlBhcmsgTGFuZSAsIEh5ZGUgUGFyayIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIlF1ZWVuJ3MgR2F0ZSwgS2Vuc2luZ3RvbiBHYXJkZW5zIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fNTkzMmM3ODY3YmM0NGMzZmIzMDA1M2Q1ZDY4OWE4Mzlfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uXzU5MzJjNzg2N2JjNDRjM2ZiMzAwNTNkNWQ2ODlhODM5LnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fNTkzMmM3ODY3YmM0NGMzZmIzMDA1M2Q1ZDY4OWE4MzkuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fYTIzMDA0ZjFjYjIzNGYzYWE0MjhlNDFhZmViMWUxZjVfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uX2EyMzAwNGYxY2IyMzRmM2FhNDI4ZTQxYWZlYjFlMWY1ID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4xMTI4MjQwOCwgNTEuNTAzNzkxNjhdLCBbLTAuMDkyOTQwMzEsIDUxLjUxMzk3MDY1XV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgInByb3BlcnRpZXMiOiB7ImNudCI6IDY0OSwgImVuZF9zdGF0aW9uX25hbWUiOiAiQ2hlYXBzaWRlLCBCYW5rIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiV2F0ZXJsb28gU3RhdGlvbiAzLCBXYXRlcmxvbyIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uX2EyMzAwNGYxY2IyMzRmM2FhNDI4ZTQxYWZlYjFlMWY1X29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl9hMjMwMDRmMWNiMjM0ZjNhYTQyOGU0MWFmZWIxZTFmNS5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uX2EyMzAwNGYxY2IyMzRmM2FhNDI4ZTQxYWZlYjFlMWY1LmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uXzM5NDI1ZDNkMDUzOTQzZGE4NjBjYzBjYzBkODFjZGY3X29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl8zOTQyNWQzZDA1Mzk0M2RhODYwY2MwY2MwZDgxY2RmNyA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMTM3ODQxMzMzLCA1MS41MTQ2MTk5NV0sIFstMC4xMjM2MTY4MjQsIDUxLjUyOTk0MzcxXV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgInByb3BlcnRpZXMiOiB7ImNudCI6IDY0NywgImVuZF9zdGF0aW9uX25hbWUiOiAiQmVsZ3JvdmUgU3RyZWV0ICwgS2luZydzIENyb3NzIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiR3JlYXQgTWFybGJvcm91Z2ggU3RyZWV0LCBTb2hvIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fMzk0MjVkM2QwNTM5NDNkYTg2MGNjMGNjMGQ4MWNkZjdfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uXzM5NDI1ZDNkMDUzOTQzZGE4NjBjYzBjYzBkODFjZGY3LnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fMzk0MjVkM2QwNTM5NDNkYTg2MGNjMGNjMGQ4MWNkZjcuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fM2RkNzExMTI2ZjVkNDVlYmIzMTBlYmY3NzdkOWVlNWVfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uXzNkZDcxMTEyNmY1ZDQ1ZWJiMzEwZWJmNzc3ZDllZTVlID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4xNzMwNjAzMiwgNTEuNTA1MDE0XSwgWy0wLjE1NzI3NTYzNiwgNTEuNTEwMDE3Ml1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiA2NDAsICJlbmRfc3RhdGlvbl9uYW1lIjogIlBhcmsgTGFuZSAsIEh5ZGUgUGFyayIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIlNlcnBlbnRpbmUgQ2FyIFBhcmssIEh5ZGUgUGFyayIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uXzNkZDcxMTEyNmY1ZDQ1ZWJiMzEwZWJmNzc3ZDllZTVlX29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl8zZGQ3MTExMjZmNWQ0NWViYjMxMGViZjc3N2Q5ZWU1ZS5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uXzNkZDcxMTEyNmY1ZDQ1ZWJiMzEwZWJmNzc3ZDllZTVlLmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBmZWF0dXJlX2dyb3VwX2UxMTUyOGUwYmZhNTRjZDc5N2I5ZTg0MWQ2M2U1N2UwID0gTC5mZWF0dXJlR3JvdXAoCiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYyk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfN2QyODEyMGYxMDM4NDRmOGE1ZTQ3NDUwMzk5NzNlMzMgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MDI5NTM3OSwgLTAuMTU4NDU2MDg5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxNzkuNTc1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2UxMTUyOGUwYmZhNTRjZDc5N2I5ZTg0MWQ2M2U1N2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfN2QyODEyMGYxMDM4NDRmOGE1ZTQ3NDUwMzk5NzNlMzMuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgQWxiZXJ0IEdhdGUsIEh5ZGUgUGFyaywgNzE4MyB0cmlwc2AgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfNzUxZWRiNDExNDcxNGYyNDlhY2VkZGE0M2NlYWQyMjUgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MTYzMjA5NSwgLTAuMjAyNjA4NjEyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAyMS4zNzUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZTExNTI4ZTBiZmE1NGNkNzk3YjllODQxZDYzZTU3ZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV83NTFlZGI0MTE0NzE0ZjI0OWFjZWRkYTQzY2VhZDIyNS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBBbGwgU2FpbnRzIENodXJjaCwgUG9ydG9iZWxsbywgODU1IHRyaXBzYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV8zOTU5NjY4YjhlZjU0Zjg4YTA4YTExN2YzNWYyYTc4NSA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjU0MDk0LCAtMC4wMTA1MTA1NjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDExMy4yMjUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZTExNTI4ZTBiZmE1NGNkNzk3YjllODQxZDYzZTU3ZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV8zOTU5NjY4YjhlZjU0Zjg4YTA4YTExN2YzNWYyYTc4NS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBBcXVhdGljIENlbnRyZSwgUXVlZW4gRWxpemFiZXRoIE9seW1waWMgUGFyaywgNDUyOSB0cmlwc2AgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfYzY4YjllNWFiNjE4NDY1NDg5NmE3OGI1MWNhZTI5ZmMgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MDU4MTc3NiwgLTAuMTAwMTg2MzM3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxNi4zMjUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZTExNTI4ZTBiZmE1NGNkNzk3YjllODQxZDYzZTU3ZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV9jNjhiOWU1YWI2MTg0NjU0ODk2YTc4YjUxY2FlMjlmYy5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBCYW5rc2lkZSBNaXgsIEJhbmtzaWRlLCA2NTMgdHJpcHNgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzQwM2U2MGUwZDRjYTRmYjM5ZDUwZWM4ZDhkMzBmODNkID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNDkwMjE3NjIsIC0wLjIxNTA4NzA5Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMzguMjUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZTExNTI4ZTBiZmE1NGNkNzk3YjllODQxZDYzZTU3ZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV80MDNlNjBlMGQ0Y2E0ZmIzOWQ1MGVjOGQ4ZDMwZjgzZC5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBCYXJvbnMgQ291cnQgU3RhdGlvbiwgV2VzdCBLZW5zaW5ndG9uLCAxNTMwIHRyaXBzYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9mNWQzODFmYjBlODE0OTIzYmQ4MTVmZTg0ZmYwN2NhNSA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUyOTk0MzcxLCAtMC4xMjM2MTY4MjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDEzNi43MjUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZTExNTI4ZTBiZmE1NGNkNzk3YjllODQxZDYzZTU3ZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV9mNWQzODFmYjBlODE0OTIzYmQ4MTVmZTg0ZmYwN2NhNS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBCZWxncm92ZSBTdHJlZXQgLCBLaW5nJ3MgQ3Jvc3MsIDU0NjkgdHJpcHNgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzBjNGMzMDdkMDA5ZDQ0ZDlhYjY3NmFmNWYzNWY3ZWZjID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTA5OTA4MzcsIC0wLjE4Nzg0MjcxN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMjMwLjk1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2UxMTUyOGUwYmZhNTRjZDc5N2I5ZTg0MWQ2M2U1N2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfMGM0YzMwN2QwMDlkNDRkOWFiNjc2YWY1ZjM1ZjdlZmMuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgQmxhY2sgTGlvbiBHYXRlLCBLZW5zaW5ndG9uIEdhcmRlbnMsIDkyMzggdHJpcHNgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX2U0YmY1NmIzZTdmNjRkYmE5OGFmNjhlNDMwZWViY2MyID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTE4OTA4LCAtMC4wNzkyNDldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDE5LjA3NSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9lMTE1MjhlMGJmYTU0Y2Q3OTdiOWU4NDFkNjNlNTdlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2U0YmY1NmIzZTdmNjRkYmE5OGFmNjhlNDMwZWViY2MyLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEJydXNoZmllbGQgU3RyZWV0LCBMaXZlcnBvb2wgU3RyZWV0LCA3NjMgdHJpcHNgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzAyMGNlYjJkMTczMTQxOTJiY2U3NzZkNGNkZTM2NDQ4ID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTEzOTcwNjUsIC0wLjA5Mjk0MDMxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxNi4yMjUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZTExNTI4ZTBiZmE1NGNkNzk3YjllODQxZDYzZTU3ZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV8wMjBjZWIyZDE3MzE0MTkyYmNlNzc2ZDRjZGUzNjQ0OC5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBDaGVhcHNpZGUsIEJhbmssIDY0OSB0cmlwc2AgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfODM5NWNjZTVmNTdhNDU5ZWEyNjY2MWJmMTFlZGIxMWMgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MDIyNzk5MiwgLTAuMDc0MTg5MjI1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxNy4zNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9lMTE1MjhlMGJmYTU0Y2Q3OTdiOWU4NDFkNjNlNTdlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzgzOTVjY2U1ZjU3YTQ1OWVhMjY2NjFiZjExZWRiMTFjLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEN1cmxldyBTdHJlZXQsIFNoYWQgVGhhbWVzLCA2OTQgdHJpcHNgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzJhYjFmMDA3OWMzNzQwNTViMjcxMjI0NzRiYmEyNjcwID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTM2NTg1MTQsIC0wLjA3NTg4NTY4Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMjAuMjc1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2UxMTUyOGUwYmZhNTRjZDc5N2I5ZTg0MWQ2M2U1N2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfMmFiMWYwMDc5YzM3NDA1NWIyNzEyMjQ3NGJiYTI2NzAuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgRHVuc3RvbiBSb2FkICwgSGFnZ2Vyc3RvbiwgODExIHRyaXBzYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV85YzQ1NDlmYzIxODE0ZjMxYjhjOGFhODQxNDMwN2FhYSA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjQ5OTkxNywgLTAuMTc0NTU0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAyMC44LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2UxMTUyOGUwYmZhNTRjZDc5N2I5ZTg0MWQ2M2U1N2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfOWM0NTQ5ZmMyMTgxNGYzMWI4YzhhYTg0MTQzMDdhYWEuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgRXhoaWJpdGlvbiBSb2FkLCBLbmlnaHRzYnJpZGdlLCA4MzIgdHJpcHNgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzhjODBiZTlmMDliNzQ2MDNhMjM3MzM5MTc2ZGU4NzYzID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTE3MDc1MjEsIC0wLjA4NjY4NTU0Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTcuMSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9lMTE1MjhlMGJmYTU0Y2Q3OTdiOWU4NDFkNjNlNTdlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzhjODBiZTlmMDliNzQ2MDNhMjM3MzM5MTc2ZGU4NzYzLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEZpbnNidXJ5IENpcmN1cywgTGl2ZXJwb29sIFN0cmVldCwgNjg0IHRyaXBzYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV8xMjU3MGUwNTZjOGE0N2E0OTEyNWIwZTExODgwMzU3ZiA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUxMjQ4NDQ1LCAtMC4wOTkxNDE0MDhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDI1LjAyNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9lMTE1MjhlMGJmYTU0Y2Q3OTdiOWU4NDFkNjNlNTdlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzEyNTcwZTA1NmM4YTQ3YTQ5MTI1YjBlMTE4ODAzNTdmLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEdvZGxpbWFuIFN0cmVldCwgU3QuIFBhdWwncywgMTAwMSB0cmlwc2AgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfMWM3ODM3ZGZmMjM0NGUwYmI5MWUyOTUwZGVhMzQwNDIgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS40NjQ4OTQ0NSwgLTAuMTczMDI5MjZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDIwLjg3NSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9lMTE1MjhlMGJmYTU0Y2Q3OTdiOWU4NDFkNjNlNTdlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzFjNzgzN2RmZjIzNDRlMGJiOTFlMjk1MGRlYTM0MDQyLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEdyYW50IFJvYWQgRWFzdCwgQ2xhcGhhbSBKdW5jdGlvbiwgODM1IHRyaXBzYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV8zYWM0OWRmM2VjN2Y0MTgyODAzYjQ2ZTA1NjdmZTc0ZCA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUxNDYxOTk1LCAtMC4xMzc4NDEzMzNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDE5LjcsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZTExNTI4ZTBiZmE1NGNkNzk3YjllODQxZDYzZTU3ZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV8zYWM0OWRmM2VjN2Y0MTgyODAzYjQ2ZTA1NjdmZTc0ZC5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBHcmVhdCBNYXJsYm9yb3VnaCBTdHJlZXQsIFNvaG8sIDc4OCB0cmlwc2AgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfZjk5OWNiY2NhZTFmNDQzYzhjNWY1ZDIxZTU0MGVlYWIgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS40ODYwNjIwNiwgLTAuMjE0NDI4Mzc4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAyMy44LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2UxMTUyOGUwYmZhNTRjZDc5N2I5ZTg0MWQ2M2U1N2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfZjk5OWNiY2NhZTFmNDQzYzhjNWY1ZDIxZTU0MGVlYWIuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgR3JleWhvdW5kIFJvYWQsIEhhbW1lcnNtaXRoLCA5NTIgdHJpcHNgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzkzYzA5ZmZkMmMxMjQ4YmViYWE4ODFkMjgxMjJhYWNmID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTAzMTE3OTksIC0wLjE1MzUyMDkzNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMzE3LjE3NSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9lMTE1MjhlMGJmYTU0Y2Q3OTdiOWU4NDFkNjNlNTdlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzkzYzA5ZmZkMmMxMjQ4YmViYWE4ODFkMjgxMjJhYWNmLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEh5ZGUgUGFyayBDb3JuZXIsIEh5ZGUgUGFyaywgMTI2ODcgdHJpcHNgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzAzZmMzMzQzZDExZDQ5Zjc4YzBmOWI4MWUxNGQyMGZiID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTQ5MzY5LCAtMC4wMTU3MTc2MTRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDY1LjcsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZTExNTI4ZTBiZmE1NGNkNzk3YjllODQxZDYzZTU3ZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV8wM2ZjMzM0M2QxMWQ0OWY3OGMwZjliODFlMTRkMjBmYi5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBMZWUgVmFsbGV5IFZlbG9QYXJrLCBRdWVlbiBFbGl6YWJldGggT2x5bXBpYyBQYXJrLCAyNjI4IHRyaXBzYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9kMTA0ZTBlMjFhYmM0Y2I2YTFjOTQ0NjQ2NWEyMTlmNCA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjQ5NzYwODA0LCAtMC4yMTE0NTU5OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTguMCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9lMTE1MjhlMGJmYTU0Y2Q3OTdiOWU4NDFkNjNlNTdlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2QxMDRlMGUyMWFiYzRjYjZhMWM5NDQ2NDY1YTIxOWY0LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYE1hY2xpc2UgUm9hZCwgT2x5bXBpYSwgNzIwIHRyaXBzYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV8wNzEwOGQwMjI0YmM0MDVlOTQ0NmE1Mzc5OTMwNWQ0YyA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjU0MDMxMTUsIC0wLjAyMTYzMDM1OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNDUuNTI1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2UxMTUyOGUwYmZhNTRjZDc5N2I5ZTg0MWQ2M2U1N2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfMDcxMDhkMDIyNGJjNDA1ZTk0NDZhNTM3OTkzMDVkNGMuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgTW9uaWVyIFJvYWQsIEhhY2tuZXkgV2ljaywgMTgyMSB0cmlwc2AgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfZDI3YzE2MGYwNmY1NGExZGIwNTZmNjkxNGFjOWM0ZjQgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MDcxMzEsIC0wLjA2NjkxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxNi44NSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9lMTE1MjhlMGJmYTU0Y2Q3OTdiOWU4NDFkNjNlNTdlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2QyN2MxNjBmMDZmNTRhMWRiMDU2ZjY5MTRhYzljNGY0LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYE5lc2hhbSBTdHJlZXQsIFdhcHBpbmcsIDY3NCB0cmlwc2AgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfYjc0NjM0ZjIyNTRjNDk0NGI0ZmI4Yzg4NTcyNDE3ZmQgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MTU0MTg2LCAtMC4wOTg4NTA5MTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUwLjE3NSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9lMTE1MjhlMGJmYTU0Y2Q3OTdiOWU4NDFkNjNlNTdlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2I3NDYzNGYyMjU0YzQ5NDRiNGZiOGM4ODU3MjQxN2ZkLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYE5ld2dhdGUgU3RyZWV0ICwgU3QuIFBhdWwncywgMjAwNyB0cmlwc2AgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfMTNkODU4OWI0YWJmNDNhMmE4MjE2NzBiOWExNjI3ZmMgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MDkzNTM0MiwgLTAuMTk2NDIyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxNy42LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2UxMTUyOGUwYmZhNTRjZDc5N2I5ZTg0MWQ2M2U1N2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfMTNkODU4OWI0YWJmNDNhMmE4MjE2NzBiOWExNjI3ZmMuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgTm90dGluZyBIaWxsIEdhdGUgU3RhdGlvbiwgTm90dGluZyBIaWxsLCA3MDQgdHJpcHNgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzYxNmNjZjIxZWNlYzQ1MGY4Yjk4ZmExOWExOTAyYmI0ID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTAyMDQyMzgsIC0wLjE4NDQwMDIyMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogODEuMjc1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2UxMTUyOGUwYmZhNTRjZDc5N2I5ZTg0MWQ2M2U1N2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfNjE2Y2NmMjFlY2VjNDUwZjhiOThmYTE5YTE5MDJiYjQuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgUGFsYWNlIEdhdGUsIEtlbnNpbmd0b24gR2FyZGVucywgMzI1MSB0cmlwc2AgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfMWM2YjEyNTUwYTI3NDM4YTk1NzkzOWRjZTk5NGNlMzMgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MTAwMTcyLCAtMC4xNTcyNzU2MzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDE0OS42NSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9lMTE1MjhlMGJmYTU0Y2Q3OTdiOWU4NDFkNjNlNTdlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzFjNmIxMjU1MGEyNzQzOGE5NTc5MzlkY2U5OTRjZTMzLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYFBhcmsgTGFuZSAsIEh5ZGUgUGFyaywgNTk4NiB0cmlwc2AgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfZTgwZDVmOWRjYjdmNGFjNzhiM2ZmMWZjNzVjYmY3OTAgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS40NzUwODksIC0wLjIwMTk2OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMjkuOSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9lMTE1MjhlMGJmYTU0Y2Q3OTdiOWU4NDFkNjNlNTdlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2U4MGQ1ZjlkY2I3ZjRhYzc4YjNmZjFmYzc1Y2JmNzkwLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYFBhcnNvbnMgR3JlZW4gU3RhdGlvbiwgUGFyc29ucyBHcmVlbiwgMTE5NiB0cmlwc2AgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfMjE4OWM1MzgwZjQ3NDk4YjlmYzM2MGE5NzcxODJlM2UgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41Mzg3MTgsIC0wLjAxMTg4OTQ4Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMzEuODc1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2UxMTUyOGUwYmZhNTRjZDc5N2I5ZTg0MWQ2M2U1N2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfMjE4OWM1MzgwZjQ3NDk4YjlmYzM2MGE5NzcxODJlM2UuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgUG9kaXVtLCBRdWVlbiBFbGl6YWJldGggT2x5bXBpYyBQYXJrLCAxMjc1IHRyaXBzYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV83MmEzNjUwYjM3OGQ0MGExOTNlMGYzYjU5ZDRmMDFmYSA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUxMTk2MTc2LCAtMC4wOTc0NDE2ODddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDIwLjA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2UxMTUyOGUwYmZhNTRjZDc5N2I5ZTg0MWQ2M2U1N2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfNzJhMzY1MGIzNzhkNDBhMTkzZTBmM2I1OWQ0ZjAxZmEuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgUXVlZW4gVmljdG9yaWEgU3RyZWV0LCBTdC4gUGF1bCdzLCA4MDIgdHJpcHNgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzM0YmVhYzQ0MDJjYjRkM2ZhMzFjYWMyYTQ2YzU1ZDA1ID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTAxNzE1NDM3Mzg2NywgLTAuMTc5ODU0MTg0Mzg5MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNDguNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9lMTE1MjhlMGJmYTU0Y2Q3OTdiOWU4NDFkNjNlNTdlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzM0YmVhYzQ0MDJjYjRkM2ZhMzFjYWMyYTQ2YzU1ZDA1LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYFF1ZWVuJ3MgR2F0ZSwgS2Vuc2luZ3RvbiBHYXJkZW5zLCAxOTQwIHRyaXBzYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV8xODQ0MmMxOGU3YmE0OGFhODc1MzlhMDlkZGE4YjM2MyA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjQ4MzczMjI1LCAtMC4yMjM4NTIyNTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDE4LjAsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZTExNTI4ZTBiZmE1NGNkNzk3YjllODQxZDYzZTU3ZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV8xODQ0MmMxOGU3YmE0OGFhODc1MzlhMDlkZGE4YjM2My5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBSYWludmlsbGUgUm9hZCwgSGFtbWVyc21pdGgsIDcyMCB0cmlwc2AgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfZmQ2Mzk4NWM4N2M2NGIzNWFiMDk0NzE2Y2U0NGMyN2QgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MDY5NDYsIC0wLjA1ODY4MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTguNzc1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2UxMTUyOGUwYmZhNTRjZDc5N2I5ZTg0MWQ2M2U1N2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfZmQ2Mzk4NWM4N2M2NGIzNWFiMDk0NzE2Y2U0NGMyN2QuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgUmVhcmRvbiBTdHJlZXQsIFdhcHBpbmcsIDc1MSB0cmlwc2AgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfYTM0NjAzOTRiN2YxNDI0YzkwNjEyOTJjOTUyODUyNTYgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MTgyNCwgLTAuMTE2NTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDI1LjQ3NSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9lMTE1MjhlMGJmYTU0Y2Q3OTdiOWU4NDFkNjNlNTdlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2EzNDYwMzk0YjdmMTQyNGM5MDYxMjkyYzk1Mjg1MjU2LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYFJlZCBMaW9uIFN0cmVldCwgSG9sYm9ybiwgMTAxOSB0cmlwc2AgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfZTE3YzgzYTE0ZjA1NDQ5NGJlZmRlZmU5MzJiYmZlMmMgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MzU2NzgsIC0wLjA2MjU0Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMjAuNjUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZTExNTI4ZTBiZmE1NGNkNzk3YjllODQxZDYzZTU3ZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV9lMTdjODNhMTRmMDU0NDk0YmVmZGVmZTkzMmJiZmUyYy5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBSZWdlbnQncyBSb3cgLCBIYWdnZXJzdG9uLCA4MjYgdHJpcHNgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX2VkN2I1MzBlOGFhZTRjNTliODMyOTliNzkzMTQyNGFkID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTAwMzUzMDYsIC0wLjIxNzUxNTA3MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTkuOCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9lMTE1MjhlMGJmYTU0Y2Q3OTdiOWU4NDFkNjNlNTdlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2VkN2I1MzBlOGFhZTRjNTliODMyOTliNzkzMTQyNGFkLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYFJpY2htb25kIFdheSwgU2hlcGhlcmQncyBCdXNoLCA3OTIgdHJpcHNgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzBjNTgyYzMwZjRjOTRkN2ZhYTUzMDgxMzY5NWRhMWM2ID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNDgyMzYyLCAtMC4xMzYxMjM5OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTkuMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9lMTE1MjhlMGJmYTU0Y2Q3OTdiOWU4NDFkNjNlNTdlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzBjNTgyYzMwZjRjOTRkN2ZhYTUzMDgxMzY5NWRhMWM2LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYFJpdmVybGlnaHQgTm9ydGgsIE5pbmUgRWxtcywgNzcyIHRyaXBzYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV8wM2U5YWJjMjZlZGI0OTBjODQ3YWM5MTgxOWE0ZmYwZSA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUwNTAxNCwgLTAuMTczMDYwMzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDk3LjEyNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9lMTE1MjhlMGJmYTU0Y2Q3OTdiOWU4NDFkNjNlNTdlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzAzZTlhYmMyNmVkYjQ5MGM4NDdhYzkxODE5YTRmZjBlLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYFNlcnBlbnRpbmUgQ2FyIFBhcmssIEh5ZGUgUGFyaywgMzg4NSB0cmlwc2AgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfMmNiYmVhYzMyY2E0NDkyYWI2NmRjNDUxYmM0NDNkYTggPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MTU2MzE0NCwgLTAuMTMyMzI4ODM3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAyMS4wLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2UxMTUyOGUwYmZhNTRjZDc5N2I5ZTg0MWQ2M2U1N2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfMmNiYmVhYzMyY2E0NDkyYWI2NmRjNDUxYmM0NDNkYTguYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgU29obyBTcXVhcmUgLCBTb2hvLCA4NDAgdHJpcHNgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzBmZmEwMGUwNzQ3MzQ5Njc5MWRkZTEwNzUxOTY5NWM1ID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNDk0NDEyLCAtMC4xNzM4ODFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDIxLjQ3NSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9lMTE1MjhlMGJmYTU0Y2Q3OTdiOWU4NDFkNjNlNTdlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzBmZmEwMGUwNzQ3MzQ5Njc5MWRkZTEwNzUxOTY5NWM1LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYFNvdXRoIEtlbnNpbmd0b24gU3RhdGlvbiwgU291dGggS2Vuc2luZ3RvbiwgODU5IHRyaXBzYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV8yZjVkZTA5YTBkMWQ0MDI5OWI4ODE4MDU4MjhjMzU4ZSA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUxNTA1OTkxLCAtMC4xMDUzNDQ0OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTYuNTI1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2UxMTUyOGUwYmZhNTRjZDc5N2I5ZTg0MWQ2M2U1N2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfMmY1ZGUwOWEwZDFkNDAyOTliODgxODA1ODI4YzM1OGUuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgU3QuIEJyaWRlIFN0cmVldCwgSG9sYm9ybiwgNjYxIHRyaXBzYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9mMjFjMWM2MTQwZjU0NWViOGY3M2Y4OWM5ZDM4ZWEzNyA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjQ3ODkzOTMxLCAtMC4yMDg0ODUyOTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDQwLjE1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2UxMTUyOGUwYmZhNTRjZDc5N2I5ZTg0MWQ2M2U1N2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfZjIxYzFjNjE0MGY1NDVlYjhmNzNmODljOWQzOGVhMzcuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgU3QuIFBldGVyJ3MgVGVycmFjZSwgRnVsaGFtLCAxNjA2IHRyaXBzYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9kN2IzMzU0ZmUxOWE0ZWQ2YTIxNGViMDNjODdjMDBmZiA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjU0MTc5MywgLTAuMDA0ODFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDIxLjEsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZTExNTI4ZTBiZmE1NGNkNzk3YjllODQxZDYzZTU3ZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV9kN2IzMzU0ZmUxOWE0ZWQ2YTIxNGViMDNjODdjMDBmZi5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBTdHJhdGZvcmQgU3RhdGlvbiwgU3RyYXRmb3JkLCA4NDQgdHJpcHNgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzdiMzA4ZjM2Yjc4ZjQ5MzA4NGUyODRkNWFiNTFmMDFjID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTA2NDUxNzksIC0wLjE3MDI3OTU1NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTczLjA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2UxMTUyOGUwYmZhNTRjZDc5N2I5ZTg0MWQ2M2U1N2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfN2IzMDhmMzZiNzhmNDkzMDg0ZTI4NGQ1YWI1MWYwMWMuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgVHJpYW5nbGUgQ2FyIFBhcmssIEh5ZGUgUGFyaywgNjkyMiB0cmlwc2AgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfMjk2YjE4MDE3M2VlNDA1OTkzN2M1ODIxOWUwNzhhZGQgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS40ODU5MTcxNCwgLTAuMTI0NDY5OTQ4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAyMC4zNzUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZTExNTI4ZTBiZmE1NGNkNzk3YjllODQxZDYzZTU3ZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV8yOTZiMTgwMTczZWU0MDU5OTM3YzU4MjE5ZTA3OGFkZC5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBWYXV4aGFsbCBDcm9zcywgVmF1eGhhbGwsIDgxNSB0cmlwc2AgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfZDJmYWMxN2U4MjQxNDMxOWJkZWE3MmRkNDZhZjI0MTkgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS40NjA4NjQ0NiwgLTAuMTg3NDI3Mjk0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxOC41NSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9lMTE1MjhlMGJmYTU0Y2Q3OTdiOWU4NDFkNjNlNTdlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2QyZmFjMTdlODI0MTQzMTliZGVhNzJkZDQ2YWYyNDE5LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYFdhbmRzd29ydGggVG93biBTdGF0aW9uLCBXYW5kc3dvcnRoLCA3NDIgdHJpcHNgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzA0OTcwNzlmM2UzMTRmODA5YzcyNGI1YjNiZDBiNGVkID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTA0NzQ5LCAtMC4wNTc1NDRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDIyLjE3NSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9lMTE1MjhlMGJmYTU0Y2Q3OTdiOWU4NDFkNjNlNTdlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzA0OTcwNzlmM2UzMTRmODA5YzcyNGI1YjNiZDBiNGVkLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYFdhcHBpbmcgTGFuZSwgV2FwcGluZywgODg3IHRyaXBzYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9lNmYwMTZlNTI3NzA0ZmIwYjU2OTgyZWQyZDA2Yzc5ZSA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUwMzc5MTY4LCAtMC4xMTI4MjQwOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMzcuMSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9lMTE1MjhlMGJmYTU0Y2Q3OTdiOWU4NDFkNjNlNTdlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2U2ZjAxNmU1Mjc3MDRmYjBiNTY5ODJlZDJkMDZjNzllLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYFdhdGVybG9vIFN0YXRpb24gMywgV2F0ZXJsb28sIDE0ODQgdHJpcHNgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzBhYjU1OWIzZjllZDQyOTM4MjMwODRiMDYwOTM4MTE1ID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTAyNzQwMjUsIC0wLjE0OTU2OTIwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTkuOTc1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2UxMTUyOGUwYmZhNTRjZDc5N2I5ZTg0MWQ2M2U1N2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfMGFiNTU5YjNmOWVkNDI5MzgyMzA4NGIwNjA5MzgxMTUuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgV2VsbGluZ3RvbiBBcmNoLCBIeWRlIFBhcmssIDc5OSB0cmlwc2AgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfMDAxODQ3YTMwMzMyNDIxMDgzMTBmYzhlNjFjZDIxMTggPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MDQwMzgyMSwgLTAuMjE3NDAwMDkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxNy42LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2UxMTUyOGUwYmZhNTRjZDc5N2I5ZTg0MWQ2M2U1N2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfMDAxODQ3YTMwMzMyNDIxMDgzMTBmYzhlNjFjZDIxMTguYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgV29vZHN0b2NrIEdyb3ZlLCBTaGVwaGVyZCdzIEJ1c2gsIDcwNCB0cmlwc2AgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfZGE0M2ZhNmZkNTFlNDJhNGE1YmRhYjZlNDQ2MGM3YjcgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MTYxNTQ2MSwgLTAuMDgyNDIyMzk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxNi4yNzUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZTExNTI4ZTBiZmE1NGNkNzk3YjllODQxZDYzZTU3ZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV9kYTQzZmE2ZmQ1MWU0MmE0YTViZGFiNmU0NDYwYzdiNy5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBXb3Jtd29vZCBTdHJlZXQsIExpdmVycG9vbCBTdHJlZXQsIDY1MSB0cmlwc2AgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfNTQzNTFiNjQ1ODIxNDQ4ZmIwMDE2MzFhNTliMGI3ZTYgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MjQ1NjQsIC0wLjExNjI3OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMjIuMDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZTExNTI4ZTBiZmE1NGNkNzk3YjllODQxZDYzZTU3ZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV81NDM1MWI2NDU4MjE0NDhmYjAwMTYzMWE1OWIwYjdlNi5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBXcmVuIFN0cmVldCwgSG9sYm9ybiwgODgyIHRyaXBzYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbGF5ZXJfY29udHJvbF8yMzdjNjJhZjlkOGY0ZjBkYmEzZjEyZjE1N2YzM2VjNCA9IHsKICAgICAgICAgICAgICAgIGJhc2VfbGF5ZXJzIDogeyAiY2FydG9kYnBvc2l0cm9uIiA6IHRpbGVfbGF5ZXJfYWI2ZDAzYTkyZWI3NGUxMjg4YjI5NWEzM2NmYzc0MDEsIH0sCiAgICAgICAgICAgICAgICBvdmVybGF5cyA6IHsgIlBhdGhzIiA6IGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTksIlN0YXRpb25zIiA6IGZlYXR1cmVfZ3JvdXBfZTExNTI4ZTBiZmE1NGNkNzk3YjllODQxZDYzZTU3ZTAsIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIEwuY29udHJvbC5sYXllcnMoCiAgICAgICAgICAgICAgICBsYXllcl9jb250cm9sXzIzN2M2MmFmOWQ4ZjRmMGRiYTNmMTJmMTU3ZjMzZWM0LmJhc2VfbGF5ZXJzLAogICAgICAgICAgICAgICAgbGF5ZXJfY29udHJvbF8yMzdjNjJhZjlkOGY0ZjBkYmEzZjEyZjE1N2YzM2VjNC5vdmVybGF5cywKICAgICAgICAgICAgICAgIHtwb3NpdGlvbjogJ3RvcHJpZ2h0JywKICAgICAgICAgICAgICAgICBjb2xsYXBzZWQ6IHRydWUsCiAgICAgICAgICAgICAgICAgYXV0b1pJbmRleDogdHJ1ZQogICAgICAgICAgICAgICAgfSkuYWRkVG8obWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjKTsKICAgICAgICAgICAgCiAgICAgICAgCjwvc2NyaXB0Pg==\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x7f2cfca53f60>"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def style_function(feature):\n",
" return {\n",
" 'fillColor': '#ffaf00',\n",
" 'color': 'blue',\n",
" 'weight': 2,\n",
" 'dashArray': '7, 7'\n",
" }\n",
"\n",
"\n",
"def highlight_function(feature):\n",
" return {\n",
" 'fillColor': '#ffaf00',\n",
" 'color': 'green',\n",
" 'weight': 4,\n",
" 'dashArray': '5, 5'\n",
" }\n",
"\n",
"\n",
"m = folium.Map(location=[51.5060338196204, -0.128345361445949], \n",
" tiles='CartoDB positron', zoom_start=12)\n",
"\n",
"# Add Paths to map\n",
"path_feature_group = folium.FeatureGroup(name='Paths')\n",
"\n",
"# Add Stations\n",
"station_feature_group = folium.FeatureGroup(name='Stations')\n",
"\n",
"for idx, data in most_popular_paths.iterrows():\n",
" line = geojson.Feature(geometry=geojson.loads(data['line']),\n",
" properties=data[['start_station_name','end_station_name', 'cnt']].to_dict())\n",
" folium.GeoJson(\n",
" line,\n",
" overlay=True,\n",
" style_function=style_function,\n",
" highlight_function=highlight_function,\n",
" tooltip=folium.GeoJsonTooltip(fields=['start_station_name','end_station_name', 'cnt'],localize=True)\n",
" ).add_to(path_feature_group)\n",
"\n",
"end_stations = most_popular_paths.groupby(['end_station_name', 'end_geog'])['cnt'].sum().reset_index() \n",
"\n",
"for idx, data in end_stations.iterrows():\n",
" folium.Circle(\n",
" location=geojson.loads(data['end_geog'])['coordinates'][::-1],\n",
" radius=data['cnt']/40,\n",
" tooltip=\"{}, {} trips\".format(data['end_station_name'], data['cnt']),\n",
" color='crimson',\n",
" fill=True,\n",
" fill_color='crimson'\n",
" ).add_to(station_feature_group)\n",
" \n",
"path_feature_group.add_to(m)\n",
"station_feature_group.add_to(m)\n",
"\n",
"folium.LayerControl().add_to(m)\n",
" \n",
"m"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"%%bigquery diff\n",
"WITH \n",
" start_count AS (\n",
" SELECT\n",
" start_station_name,\n",
" COUNT(1) as start_cnt\n",
" FROM\n",
" `google.com:pso-bq-gis-demo.gis_demo.london_cycle`\n",
" WHERE\n",
" is_same_station IS false\n",
" GROUP BY 1\n",
" ),\n",
" end_count AS (\n",
" SELECT\n",
" end_station_name,\n",
" COUNT(1) as end_cnt\n",
" FROM\n",
" `google.com:pso-bq-gis-demo.gis_demo.london_cycle`\n",
" WHERE\n",
" is_same_station IS false\n",
" GROUP BY 1\n",
" )\n",
"SELECT\n",
" a.start_station_name AS station_name,\n",
" ST_ASGEOJSON(ST_GEOGPOINT(c.longitude, c.latitude)) geog,\n",
" a.start_cnt,\n",
" b.end_cnt,\n",
" a.start_cnt - b.end_cnt AS diff\n",
"FROM\n",
" start_count a\n",
"JOIN\n",
" end_count b\n",
"ON\n",
" a.start_station_name = b.end_station_name\n",
"JOIN\n",
" `google.com:pso-bq-gis-demo.gis_demo.cycle_stations` c\n",
"ON \n",
" a.start_station_name = c.name\n",
"ORDER BY 5 DESC"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>station_name</th>\n",
" <th>geog</th>\n",
" <th>start_cnt</th>\n",
" <th>end_cnt</th>\n",
" <th>diff</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Waterloo Station 2, Waterloo</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.11342629...</td>\n",
" <td>15008</td>\n",
" <td>10530</td>\n",
" <td>4478</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Eagle Wharf Road, Hoxton</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.09315, 5...</td>\n",
" <td>12622</td>\n",
" <td>8661</td>\n",
" <td>3961</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Waterloo Station 1, Waterloo</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.11386436...</td>\n",
" <td>25592</td>\n",
" <td>22855</td>\n",
" <td>2737</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Cloudesley Road, Angel</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.10902540...</td>\n",
" <td>5158</td>\n",
" <td>2924</td>\n",
" <td>2234</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Graham Street, Angel</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.09998114...</td>\n",
" <td>8942</td>\n",
" <td>6936</td>\n",
" <td>2006</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>Claremont Square, Angel</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.10991471...</td>\n",
" <td>4401</td>\n",
" <td>2408</td>\n",
" <td>1993</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>749</th>\n",
" <td>Brushfield Street, Liverpool Street</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.079249, ...</td>\n",
" <td>17283</td>\n",
" <td>21038</td>\n",
" <td>-3755</td>\n",
" </tr>\n",
" <tr>\n",
" <th>750</th>\n",
" <td>St. James's Square, St. James's</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.13462120...</td>\n",
" <td>11506</td>\n",
" <td>15522</td>\n",
" <td>-4016</td>\n",
" </tr>\n",
" <tr>\n",
" <th>751</th>\n",
" <td>William IV Street, Strand</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.12474927...</td>\n",
" <td>11387</td>\n",
" <td>15480</td>\n",
" <td>-4093</td>\n",
" </tr>\n",
" <tr>\n",
" <th>752</th>\n",
" <td>Newgate Street , St. Paul's</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.09885091...</td>\n",
" <td>13795</td>\n",
" <td>18326</td>\n",
" <td>-4531</td>\n",
" </tr>\n",
" <tr>\n",
" <th>753</th>\n",
" <td>Holborn Circus, Holborn</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.10865743...</td>\n",
" <td>13140</td>\n",
" <td>18425</td>\n",
" <td>-5285</td>\n",
" </tr>\n",
" <tr>\n",
" <th>754</th>\n",
" <td>Hop Exchange, The Borough</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.09177377...</td>\n",
" <td>18452</td>\n",
" <td>25715</td>\n",
" <td>-7263</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>755 rows × 5 columns</p>\n",
"</div>"
],
"text/plain": [
" station_name \\\n",
"0 Waterloo Station 2, Waterloo \n",
"1 Eagle Wharf Road, Hoxton \n",
"2 Waterloo Station 1, Waterloo \n",
"3 Cloudesley Road, Angel \n",
"4 Graham Street, Angel \n",
"5 Claremont Square, Angel \n",
".. ... \n",
"749 Brushfield Street, Liverpool Street \n",
"750 St. James's Square, St. James's \n",
"751 William IV Street, Strand \n",
"752 Newgate Street , St. Paul's \n",
"753 Holborn Circus, Holborn \n",
"754 Hop Exchange, The Borough \n",
"\n",
" geog start_cnt end_cnt \\\n",
"0 { \"type\": \"Point\", \"coordinates\": [-0.11342629... 15008 10530 \n",
"1 { \"type\": \"Point\", \"coordinates\": [-0.09315, 5... 12622 8661 \n",
"2 { \"type\": \"Point\", \"coordinates\": [-0.11386436... 25592 22855 \n",
"3 { \"type\": \"Point\", \"coordinates\": [-0.10902540... 5158 2924 \n",
"4 { \"type\": \"Point\", \"coordinates\": [-0.09998114... 8942 6936 \n",
"5 { \"type\": \"Point\", \"coordinates\": [-0.10991471... 4401 2408 \n",
".. ... ... ... \n",
"749 { \"type\": \"Point\", \"coordinates\": [-0.079249, ... 17283 21038 \n",
"750 { \"type\": \"Point\", \"coordinates\": [-0.13462120... 11506 15522 \n",
"751 { \"type\": \"Point\", \"coordinates\": [-0.12474927... 11387 15480 \n",
"752 { \"type\": \"Point\", \"coordinates\": [-0.09885091... 13795 18326 \n",
"753 { \"type\": \"Point\", \"coordinates\": [-0.10865743... 13140 18425 \n",
"754 { \"type\": \"Point\", \"coordinates\": [-0.09177377... 18452 25715 \n",
"\n",
" diff \n",
"0 4478 \n",
"1 3961 \n",
"2 2737 \n",
"3 2234 \n",
"4 2006 \n",
"5 1993 \n",
".. ... \n",
"749 -3755 \n",
"750 -4016 \n",
"751 -4093 \n",
"752 -4531 \n",
"753 -5285 \n",
"754 -7263 \n",
"\n",
"[755 rows x 5 columns]"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"diff"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"def build_circles_feature_group(data, \n",
" feature_group_name,\n",
" circle_size=200,\n",
" color='crimson', \n",
" geog_field='geog', \n",
" size_field='diff', \n",
" tooltip_field1='station_name', \n",
" tooltip_field2='diff'):\n",
" feature_group = folium.FeatureGroup(name=feature_group_name)\n",
" max_size = data[size_field].abs().max()\n",
" for idx, row in data.iterrows():\n",
" folium.Circle(\n",
" location=geojson.loads(row[geog_field])['coordinates'][::-1],\n",
" radius=(pd.np.abs(row[size_field])/max_size)*circle_size,\n",
" tooltip=\"{}: {}\".format(row[tooltip_field1], row[tooltip_field2]),\n",
" color=color,\n",
" fill=True,\n",
" fill_color=color\n",
" ).add_to(feature_group)\n",
" return feature_group"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVM9ZmFsc2U7IExfTk9fVE9VQ0g9ZmFsc2U7IExfRElTQUJMRV8zRD1mYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS40LjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NvZGUuanF1ZXJ5LmNvbS9qcXVlcnktMS4xMi40Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS40LjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdjZG4uZ2l0aGFjay5jb20vcHl0aG9uLXZpc3VhbGl6YXRpb24vZm9saXVtL21hc3Rlci9mb2xpdW0vdGVtcGxhdGVzL2xlYWZsZXQuYXdlc29tZS5yb3RhdGUuY3NzIi8+CiAgICA8c3R5bGU+aHRtbCwgYm9keSB7d2lkdGg6IDEwMCU7aGVpZ2h0OiAxMDAlO21hcmdpbjogMDtwYWRkaW5nOiAwO308L3N0eWxlPgogICAgPHN0eWxlPiNtYXAge3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO3JpZ2h0OjA7bGVmdDowO308L3N0eWxlPgogICAgCiAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLAogICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgIDxzdHlsZT4jbWFwX2ZlMzVjNzE3Yzc0MTRkMGQ5N2FkYWE5Mzk4OWNlNmVjIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDEwMC4wJTsKICAgICAgICBoZWlnaHQ6IDEwMC4wJTsKICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgIHRvcDogMC4wJTsKICAgICAgICB9CiAgICA8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgPGRpdiBjbGFzcz0iZm9saXVtLW1hcCIgaWQ9Im1hcF9mZTM1YzcxN2M3NDE0ZDBkOTdhZGFhOTM5ODljZTZlYyIgPjwvZGl2Pgo8L2JvZHk+CjxzY3JpcHQ+ICAgIAogICAgCiAgICAKICAgICAgICB2YXIgYm91bmRzID0gbnVsbDsKICAgIAoKICAgIHZhciBtYXBfZmUzNWM3MTdjNzQxNGQwZDk3YWRhYTkzOTg5Y2U2ZWMgPSBMLm1hcCgKICAgICAgICAnbWFwX2ZlMzVjNzE3Yzc0MTRkMGQ5N2FkYWE5Mzk4OWNlNmVjJywgewogICAgICAgIGNlbnRlcjogWzUxLjUwNjAzMzgxOTYyMDQsIC0wLjEyODM0NTM2MTQ0NTk0OV0sCiAgICAgICAgem9vbTogMTIsCiAgICAgICAgbWF4Qm91bmRzOiBib3VuZHMsCiAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3LAogICAgICAgIHpvb21Db250cm9sOiB0cnVlLAogICAgICAgIH0pOwoKCiAgICAKICAgIHZhciB0aWxlX2xheWVyX2FhNGUzNzJhYTRhNTRiZDBiNGJlNDhhZDI4Y2E4ZmQzID0gTC50aWxlTGF5ZXIoCiAgICAgICAgJ2h0dHBzOi8vY2FydG9kYi1iYXNlbWFwcy17c30uZ2xvYmFsLnNzbC5mYXN0bHkubmV0L2xpZ2h0X2FsbC97en0ve3h9L3t5fS5wbmcnLAogICAgICAgIHsKICAgICAgICAiYXR0cmlidXRpb24iOiBudWxsLAogICAgICAgICJkZXRlY3RSZXRpbmEiOiBmYWxzZSwKICAgICAgICAibWF4TmF0aXZlWm9vbSI6IDE4LAogICAgICAgICJtYXhab29tIjogMTgsCiAgICAgICAgIm1pblpvb20iOiAwLAogICAgICAgICJub1dyYXAiOiBmYWxzZSwKICAgICAgICAib3BhY2l0eSI6IDEsCiAgICAgICAgInN1YmRvbWFpbnMiOiAiYWJjIiwKICAgICAgICAidG1zIjogZmFsc2UKfSkuYWRkVG8obWFwX2ZlMzVjNzE3Yzc0MTRkMGQ5N2FkYWE5Mzk4OWNlNmVjKTsKICAgIAogICAgICAgICAgICB2YXIgZmVhdHVyZV9ncm91cF80YTMxNTA4ODVlOWI0OTZiYTMyMTQ0ODk5OTFlODY3ZiA9IEwuZmVhdHVyZUdyb3VwKAogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZmUzNWM3MTdjNzQxNGQwZDk3YWRhYTkzOTg5Y2U2ZWMpOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzI3MjU2NzQwNWFhYzRkZWY5OGViMzQxZWY0ODg3NmZmID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTAzOTE5NzMsIC0wLjExMzQyNjI5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAyMDAuMCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF80YTMxNTA4ODVlOWI0OTZiYTMyMTQ0ODk5OTFlODY3Zik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzI3MjU2NzQwNWFhYzRkZWY5OGViMzQxZWY0ODg3NmZmLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYFdhdGVybG9vIFN0YXRpb24gMiwgV2F0ZXJsb286IDQ0NzhgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzQ0MzZmMTE1MDE3NjQxNjZiMzM1MzkwYjAyNzBiMDczID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTMzNTYsIC0wLjA5MzE1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxNzYuOTA5MzM0NTI0MzQxMjMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGEzMTUwODg1ZTliNDk2YmEzMjE0NDg5OTkxZTg2N2YpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV80NDM2ZjExNTAxNzY0MTY2YjMzNTM5MGIwMjcwYjA3My5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBFYWdsZSBXaGFyZiBSb2FkLCBIb3h0b246IDM5NjFgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX2I2ZTMyYThiMDAzNjRiOWY5M2ViYWQ4Zjg1OTNkOTJlID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTA0MDI3OTQsIC0wLjExMzg2NDM2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxMjIuMjQyMDcyMzUzNzI5MzQsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGEzMTUwODg1ZTliNDk2YmEzMjE0NDg5OTkxZTg2N2YpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV9iNmUzMmE4YjAwMzY0YjlmOTNlYmFkOGY4NTkzZDkyZS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBXYXRlcmxvbyBTdGF0aW9uIDEsIFdhdGVybG9vOiAyNzM3YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV8zMjJiNzA4ZDlkNTc0ZmNjYmQ0ZGMxMjcxOTllM2U1YSA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUzNDQwODY4LCAtMC4xMDkwMjU0MDRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDk5Ljc3NjY4NjAyMDU0NDg5LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzRhMzE1MDg4NWU5YjQ5NmJhMzIxNDQ4OTk5MWU4NjdmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfMzIyYjcwOGQ5ZDU3NGZjY2JkNGRjMTI3MTk5ZTNlNWEuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgQ2xvdWRlc2xleSBSb2FkLCBBbmdlbDogMjIzNGAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfYjE5ZDNmODA2ZjJhNGFjYmJhN2IzZWMzMThhZTY2ODcgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MzI2NjE4NiwgLTAuMDk5OTgxMTQyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA4OS41OTM1Njg1NTczOTE2OSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF80YTMxNTA4ODVlOWI0OTZiYTMyMTQ0ODk5OTFlODY3Zik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2IxOWQzZjgwNmYyYTRhY2JiYTdiM2VjMzE4YWU2Njg3LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEdyYWhhbSBTdHJlZXQsIEFuZ2VsOiAyMDA2YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9iYWU0OTk2MGI2YmI0MDQ4ODMxMWUwM2EzYmYzZTZhNCA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUzMTY2NjgxLCAtMC4xMDk5MTQ3MTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDg5LjAxMjk1MjIxMDgwODQsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGEzMTUwODg1ZTliNDk2YmEzMjE0NDg5OTkxZTg2N2YpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV9iYWU0OTk2MGI2YmI0MDQ4ODMxMWUwM2EzYmYzZTZhNC5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBDbGFyZW1vbnQgU3F1YXJlLCBBbmdlbDogMTk5M2AgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfYzM2ZmM4OTUxNmQ3NGY2MDllODdkNWFhZGIxODFmNTQgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MzQwNDI5NCwgLTAuMDg2Mzc5NzE3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA4Ni45NTg0NjM1OTk4MjEzNCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF80YTMxNTA4ODVlOWI0OTZiYTMyMTQ0ODk5OTFlODY3Zik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2MzNmZjODk1MTZkNzRmNjA5ZTg3ZDVhYWRiMTgxZjU0LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYFNob3JlZGl0Y2ggUGFyaywgSG94dG9uOiAxOTQ3YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9iNjIxZDdiMzc1NTc0MzVjOGM1ZjA1NzUwNDYyNDZjZSA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUzMzMxOTYsIC0wLjExMTc4MTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDgwLjMwMzcwNzAxMjA1ODk1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzRhMzE1MDg4NWU5YjQ5NmJhMzIxNDQ4OTk5MWU4NjdmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfYjYyMWQ3YjM3NTU3NDM1YzhjNWYwNTc1MDQ2MjQ2Y2UuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgUmlzaW5naGlsbCBTdHJlZXQsIEFuZ2VsOiAxNzk4YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV8yMjcxMjljYWQxNDk0OTFhYTE4YzdmODE3OWJjNjc0MyA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUxMTY1NCwgLTAuMTc5NjY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA3OS4yMzE3OTk5MTA2NzQ0MSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF80YTMxNTA4ODVlOWI0OTZiYTMyMTQ0ODk5OTFlODY3Zik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzIyNzEyOWNhZDE0OTQ5MWFhMThjN2Y4MTc5YmM2NzQzLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYExhbmNhc3RlciBHYXRlICwgQmF5c3dhdGVyOiAxNzc0YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9mYTBhOTQxYzY5ZjQ0NmFlYTRlYTc2MmUwZWVjYjExYyA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUyNTU0MjIyLCAtMC4xMzgyMzEzMDNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDc2LjgyMDAwODkzMjU1OTE4LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzRhMzE1MDg4NWU5YjQ5NmJhMzIxNDQ4OTk5MWU4NjdmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfZmEwYTk0MWM2OWY0NDZhZWE0ZWE3NjJlMGVlY2IxMWMuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgSGFtcHN0ZWFkIFJvYWQsIEV1c3RvbjogMTcyMGAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfZWRkNmU3YmQ3NTc3NGQ5OThiNDA5OGIyM2Y4OTQ0MDQgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MjczMjYsIC0wLjEzNjA1Mjg2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA3NS4yNTY4MTEwNzYzNzMzOCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF80YTMxNTA4ODVlOWI0OTZiYTMyMTQ0ODk5OTFlODY3Zik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2VkZDZlN2JkNzU3NzRkOTk4YjQwOThiMjNmODk0NDA0LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYERydW1tb25kIFN0cmVldCAsIEV1c3RvbjogMTY4NWAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfYTJlOWZmNTI4OTE1NGQ5NmIwYTJmZmFmYzBlYWMwNzggPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MzA5OTE4MSwgLTAuMDkzOTAzODI1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA3My4wNjgzMzQwNzc3MTMyNiwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF80YTMxNTA4ODVlOWI0OTZiYTMyMTQ0ODk5OTFlODY3Zik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2EyZTlmZjUyODkxNTRkOTZiMGEyZmZhZmMwZWFjMDc4LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYFdlbmxvY2sgUm9hZCAsIEhveHRvbjogMTYzNmAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfYjQzNDRiYWJlZTZmNDljYTk1Njg1MDc5Nzg1YWZmZjIgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41Mjk0MjMsIC0wLjA5NzEyMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNjguODcwMDMxMjYzOTU3MTIsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGEzMTUwODg1ZTliNDk2YmEzMjE0NDg5OTkxZTg2N2YpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV9iNDM0NGJhYmVlNmY0OWNhOTU2ODUwNzk3ODVhZmZmMi5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBNYWNjbGVzZmllbGQgUmQsIFN0IEx1a2VzOiAxNTQyYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9kMDU2NDgwMzVmMDc0YjVjODVjYjczMTBlMTUyYzlhMSA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUwMjc1NzA0LCAtMC4xNTUzNDk3MjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDY4LjM3ODc0MDUwOTE1NTg4LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzRhMzE1MDg4NWU5YjQ5NmJhMzIxNDQ4OTk5MWU4NjdmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfZDA1NjQ4MDM1ZjA3NGI1Yzg1Y2I3MzEwZTE1MmM5YTEuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgS25pZ2h0c2JyaWRnZSwgSHlkZSBQYXJrOiAxNTMxYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9iODU5OWE1MWQ2NDg0ZjI4OTlmODBhOWIzZjMzYTZjYiA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUwOTM1MzQyLCAtMC4xOTY0MjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDY3LjQ0MDgyMTc5NTQ0NDM5LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzRhMzE1MDg4NWU5YjQ5NmJhMzIxNDQ4OTk5MWU4NjdmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfYjg1OTlhNTFkNjQ4NGYyODk5ZjgwYTliM2YzM2E2Y2IuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgTm90dGluZyBIaWxsIEdhdGUgU3RhdGlvbiwgTm90dGluZyBIaWxsOiAxNTEwYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9kZDQ5ZDFjODlmNmQ0NjIzOTY0MWU3NDJmOTk5NDFjNSA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUwODYwNTQ0LCAtMC4xOTM3NjQwOTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDYyLjQ4MzI1MTQ1MTU0MDg2NiwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF80YTMxNTA4ODVlOWI0OTZiYTMyMTQ0ODk5OTFlODY3Zik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2RkNDlkMWM4OWY2ZDQ2MjM5NjQxZTc0MmY5OTk0MWM1LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYFBhbGFjZSBHYXJkZW5zIFRlcnJhY2UsIE5vdHRpbmcgSGlsbDogMTM5OWAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfNzQ5MWQxNjFiNzZjNGNmYzgxZTI4YWUzMmZiNzUzZDggPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MjcyOTQ3LCAtMC4xNzQ2NTM2MDldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDYxLjQ1NjAwNzE0NjA0NzM0LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzRhMzE1MDg4NWU5YjQ5NmJhMzIxNDQ4OTk5MWU4NjdmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfNzQ5MWQxNjFiNzZjNGNmYzgxZTI4YWUzMmZiNzUzZDguYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgU3QuIEpvaG4ncyBXb29kIFJvYWQsIFN0LiBKb2huJ3MgV29vZDogMTM3NmAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfMDU4M2JkNThmNGJhNGRmY2E0ZWRlM2ViZDQ2OGM4YzIgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MTY0MTc0OSwgLTAuMTc5MTM1MDc5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA2MC45MjAwNTM1OTUzNTUwNywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF80YTMxNTA4ODVlOWI0OTZiYTMyMTQ0ODk5OTFlODY3Zik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzA1ODNiZDU4ZjRiYTRkZmNhNGVkZTNlYmQ0NjhjOGMyLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEVhc3Rib3VybmUgTWV3cywgUGFkZGluZ3RvbjogMTM2NGAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfMTU0NTZmYjk5ODk0NDUxYTkzNWVkMmQxZWI3OWNiYWEgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MTk5NjgsIC0wLjE2OTc3NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNjAuMDcxNDYwNDczNDI1NjQ1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzRhMzE1MDg4NWU5YjQ5NmJhMzIxNDQ4OTk5MWU4NjdmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfMTU0NTZmYjk5ODk0NDUxYTkzNWVkMmQxZWI3OWNiYWEuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgRWRnd2FyZSBSb2FkIFN0YXRpb24sIE1hcnlsZWJvbmU6IDEzNDVgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzg1YWZhMDYyODk3NTQ0ODlhNWQxN2MzNjY1NGY3YjNlID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTM2MzkyMTksIC0wLjExMjcyMTA2NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNTkuNDQ2MTgxMzMwOTUxMzIsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGEzMTUwODg1ZTliNDk2YmEzMjE0NDg5OTkxZTg2N2YpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV84NWFmYTA2Mjg5NzU0NDg5YTVkMTdjMzY2NTRmN2IzZS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBDaGFybG90dGUgVGVycmFjZSwgQW5nZWw6IDEzMzFgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX2IyMTY5YzFkOTVlNzQyNTdiOWFiOGUyNTE4ZDY4MTNlID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNDkzNjk5ODgsIC0wLjEyMTM5NDEwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNTguMTA2Mjk3NDU0MjIwNjQsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGEzMTUwODg1ZTliNDk2YmEzMjE0NDg5OTkxZTg2N2YpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV9iMjE2OWMxZDk1ZTc0MjU3YjlhYjhlMjUxOGQ2ODEzZS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBGaXJlIEJyaWdhZGUgUGllciwgVmF1eGhhbGw6IDEzMDFgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzRkNWE2NTNiM2I5OTQ0MzRhYmJhZGUxNGYwNTg1ODlhID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTEzMDc0LCAtMC4wNjQwOTRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDU3LjYxNTAwNjY5OTQxOTM4LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzRhMzE1MDg4NWU5YjQ5NmJhMzIxNDQ4OTk5MWU4NjdmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfNGQ1YTY1M2IzYjk5NDQzNGFiYmFkZTE0ZjA1ODU4OWEuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgQ2hyaXN0aWFuIFN0cmVldCwgV2hpdGVjaGFwZWw6IDEyOTBgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzczNzMzOTRkMTYxYzQ3NzRiOTM0NmM4ODdmZGE2MTBhID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTI5MTYzNDcsIC0wLjEwOTk3MDUyN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNTcuMTIzNzE1OTQ0NjE4MTM0LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzRhMzE1MDg4NWU5YjQ5NmJhMzIxNDQ4OTk5MWU4NjdmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfNzM3MzM5NGQxNjFjNDc3NGI5MzQ2Yzg4N2ZkYTYxMGEuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgUml2ZXIgU3RyZWV0ICwgQ2xlcmtlbndlbGw6IDEyNzlgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX2ZlZTZmZDc3MDVhNzQyNGY4YzI2OGFjYzY2NDA1NGZmID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTM3Mjc3OTUsIC0wLjA3OTIwMTg0OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNTYuMTg1Nzk3MjMwOTA2NjUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGEzMTUwODg1ZTliNDk2YmEzMjE0NDg5OTkxZTg2N2YpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV9mZWU2ZmQ3NzA1YTc0MjRmOGMyNjhhY2M2NjQwNTRmZi5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBIZXJ0Zm9yZCBSb2FkLCBEZSBCZWF1dm9pciBUb3duOiAxMjU4YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9lYzliOGY3OTg2MzM0YmJiODhjOWQ5ZjZiMjMxMmFiYyA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUzNTU4LCAtMC4wODI0OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNTUuODI4NDk0ODYzNzc4NDc0LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzRhMzE1MDg4NWU5YjQ5NmJhMzIxNDQ4OTk5MWU4NjdmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfZWM5YjhmNzk4NjMzNGJiYjg4YzlkOWY2YjIzMTJhYmMuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgUGl0ZmllbGQgU3RyZWV0IE5vcnRoLEhveHRvbjogMTI1MGAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfZGJjOGZjZGYwODI2NGMyMzkwYzE2YmM4MjNmZTFjZGUgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MDE3MzcyNiwgLTAuMTg0OTgwNjEyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1NC4wNDE5ODMwMjgxMzc1NjUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGEzMTUwODg1ZTliNDk2YmEzMjE0NDg5OTkxZTg2N2YpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV9kYmM4ZmNkZjA4MjY0YzIzOTBjMTZiYzgyM2ZlMWNkZS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBEZSBWZXJlIEdhcmRlbnMsIEtlbnNpbmd0b246IDEyMTBgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzRhZTc3Y2FlM2YzYTRlNGFiNGJlMDAwMzZlODYzNDMzID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTI5MTU0NDQsIC0wLjA5MzQyMTYxNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNTMuOTk3MzIwMjMyMjQ2NTQsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGEzMTUwODg1ZTliNDk2YmEzMjE0NDg5OTkxZTg2N2YpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV80YWU3N2NhZTNmM2E0ZTRhYjRiZTAwMDM2ZTg2MzQzMy5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBXaW5kc29yIFRlcnJhY2UsIEhveHRvbjogMTIwOWAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfYjE1NzIxOGI0Yjc0NDFjZjg0YzhlM2U5OGY1MzBkMzQgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MjI1MTEsIC0wLjE2MjI5OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNTMuMjgyNzE1NDk3OTkwMTc1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzRhMzE1MDg4NWU5YjQ5NmJhMzIxNDQ4OTk5MWU4NjdmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfYjE1NzIxOGI0Yjc0NDFjZjg0YzhlM2U5OGY1MzBkMzQuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgQm9zdG9uIFBsYWNlLCBNYXJ5bGVib25lOiAxMTkzYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV8yMGJjN2YzODU5ODE0NTRkODEzYzVlYTk0YTYzM2YxYiA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUwMzc5MTY4LCAtMC4xMTI4MjQwOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNTEuMjcyODg5NjgyODk0MTUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGEzMTUwODg1ZTliNDk2YmEzMjE0NDg5OTkxZTg2N2YpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV8yMGJjN2YzODU5ODE0NTRkODEzYzVlYTk0YTYzM2YxYi5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBXYXRlcmxvbyBTdGF0aW9uIDMsIFdhdGVybG9vOiAxMTQ4YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV8wNzkxY2FkZGE5OWM0Y2JhOWVjMjM3MjY2OGE2ZTc4NyA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUyNzg0MjczLCAtMC4xMDgwNjgxNTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUwLjM3OTYzMzc2NTA3MzY5LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzRhMzE1MDg4NWU5YjQ5NmJhMzIxNDQ4OTk5MWU4NjdmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfMDc5MWNhZGRhOTljNGNiYTllYzIzNzI2NjhhNmU3ODcuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgSGFyZHdpY2sgU3RyZWV0LCBDbGVya2Vud2VsbDogMTEyOGAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGZlYXR1cmVfZ3JvdXBfMmU2ODM0ZTlkOTUxNDA4ZWI2OTU5YTczYTQ3YWI0N2EgPSBMLmZlYXR1cmVHcm91cCgKICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2ZlMzVjNzE3Yzc0MTRkMGQ5N2FkYWE5Mzk4OWNlNmVjKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV8zZjBkOTEyMWRiNjg0ZTQ5YmVlNGY5NGE3YWNiZGZhOCA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjQ5NzYyMiwgLTAuMTI1OTc4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA0Mi41OTk0NzY4MDAyMjAyOTUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMmU2ODM0ZTlkOTUxNDA4ZWI2OTU5YTczYTQ3YWI0N2EpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV8zZjBkOTEyMWRiNjg0ZTQ5YmVlNGY5NGE3YWNiZGZhOC5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBBYmluZ2RvbiBHcmVlbiwgV2VzdG1pbnN0ZXI6IC0xNTQ3YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9hZDM0NjNiOTQ3ZDY0MDZhYjlkNmY2ZWFmYzAwYzRkOSA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUwNDk0MiwgLTAuMTE1NTMzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA0NC4xMTQwMDI0NzgzMTQ3NDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMmU2ODM0ZTlkOTUxNDA4ZWI2OTU5YTczYTQ3YWI0N2EpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV9hZDM0NjNiOTQ3ZDY0MDZhYjlkNmY2ZWFmYzAwYzRkOS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBDb25jZXJ0IEhhbGwgQXBwcm9hY2ggMiwgU291dGggQmFuazogLTE2MDJgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX2RlNDdhYmM1ODlkYzQxZmVhM2ZjMDE3MmUxYzdmZmFhID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTIwODU4ODcsIC0wLjA4OTg4Nzg1NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNDUuMjk4MDg2MTkwMjc5NSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8yZTY4MzRlOWQ5NTE0MDhlYjY5NTlhNzNhNDdhYjQ3YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2RlNDdhYmM1ODlkYzQxZmVhM2ZjMDE3MmUxYzdmZmFhLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEJ1bmhpbGwgUm93LCBNb29yZ2F0ZTogLTE2NDVgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzQwNWM2MTczMWE1MTQ4OTliYzI3MDg2YTZhMDRhZDI5ID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTA2NzY3LCAtMC4xMjM3MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDQ1LjI5ODA4NjE5MDI3OTUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMmU2ODM0ZTlkOTUxNDA4ZWI2OTU5YTczYTQ3YWI0N2EpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV80MDVjNjE3MzFhNTE0ODk5YmMyNzA4NmE2YTA0YWQyOS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBOb3J0aHVtYmVybGFuZCBBdmVudWUsIFN0cmFuZDogLTE2NDVgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzY0MWZkYTEyMzkzMDRlZTdiYmZhMGVkMTA2MGNkNTcwID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTEzOTcwNjUsIC0wLjA5Mjk0MDMxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA0Ny4wNjA0NDMzNDI5NzEyMjYsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMmU2ODM0ZTlkOTUxNDA4ZWI2OTU5YTczYTQ3YWI0N2EpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV82NDFmZGExMjM5MzA0ZWU3YmJmYTBlZDEwNjBjZDU3MC5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBDaGVhcHNpZGUsIEJhbms6IC0xNzA5YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9lODA2M2FjOGUwY2Y0YTgzYTllMGFkYWE4YTIyNmRmZiA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUwNTgxNzc2LCAtMC4xMDAxODYzMzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDQ3LjQxODQyMjEzOTYxMTczNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8yZTY4MzRlOWQ5NTE0MDhlYjY5NTlhNzNhNDdhYjQ3YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2U4MDYzYWM4ZTBjZjRhODNhOWUwYWRhYThhMjI2ZGZmLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEJhbmtzaWRlIE1peCwgQmFua3NpZGU6IC0xNzIyYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV85ODBlNzNiY2Q4NjM0YTc3YmE2M2Q1ZjQyY2UzMmUyMiA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUxNDQ5OTYyLCAtMC4xNDE0MjM2OTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDQ4LjE2MTkxNjU2MzQwMzU1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzJlNjgzNGU5ZDk1MTQwOGViNjk1OWE3M2E0N2FiNDdhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfOTgwZTczYmNkODYzNGE3N2JhNjNkNWY0MmNlMzJlMjIuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgTGl0dGxlIEFyZ3lsbCBTdHJlZXQsIFdlc3QgRW5kOiAtMTc0OWAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfNWY0ZTQ2MjhkYWFmNGQ0Zjg2NzJlYTExNjEyMDhmZDEgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MTE1OTQ4MSwgLTAuMDc3MTIxMzIyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA0OS4yMDgzMTYxMjI4MTQyNywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8yZTY4MzRlOWQ5NTE0MDhlYjY5NTlhNzNhNDdhYjQ3YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzVmNGU0NjI4ZGFhZjRkNGY4NjcyZWExMTYxMjA4ZmQxLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYENyb3Nzd2FsbCwgVG93ZXI6IC0xNzg3YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV84M2MxOGQyMjhmNzY0MTI4OWYyNzBhZmRmZDM3OGM1OCA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUwNjU0MzIxLCAtMC4xMjMxNzk2OTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDQ5LjQwMTA3MzkzNjM4OTkyLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzJlNjgzNGU5ZDk1MTQwOGViNjk1OWE3M2E0N2FiNDdhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfODNjMThkMjI4Zjc2NDEyODlmMjcwYWZkZmQzNzhjNTguYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgV2hpdGVoYWxsIFBsYWNlLCBTdHJhbmQ6IC0xNzk0YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV8wY2ZkNTJjMzU4M2U0MTRiOTIwYmNhNDEyMDFhOWExMCA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUwMDcwMzA1LCAtMC4xMjk2OTg5NjNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUwLjc3NzkxNTQ2MTkzMDMzNCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8yZTY4MzRlOWQ5NTE0MDhlYjY5NTlhNzNhNDdhYjQ3YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzBjZmQ1MmMzNTgzZTQxNGI5MjBiY2E0MTIwMWE5YTEwLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYFN0b3JleSdzIEdhdGUsIFdlc3RtaW5zdGVyOiAtMTg0NGAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfMDAxMzdhY2QxMTAwNDNjOTk2YzcwMWE5MmU3ZmUyZTYgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MDk1MDYyNywgLTAuMDc1NDU5NDgyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1Mi40MzAxMjUyOTI1Nzg4MiwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8yZTY4MzRlOWQ5NTE0MDhlYjY5NTlhNzNhNDdhYjQ3YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzAwMTM3YWNkMTEwMDQzYzk5NmM3MDFhOTJlN2ZlMmU2LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYFRvd2VyIEdhcmRlbnMgLCBUb3dlcjogLTE5MDRgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX2EzZjU4MGMxZWU1ZDQ5NzZhZjhjMzhlZTI1Mzg5MzEwID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTE1MDU5OTEsIC0wLjEwNTM0NDQ4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1My4yODM3NjcwMzg0MTM4OCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8yZTY4MzRlOWQ5NTE0MDhlYjY5NTlhNzNhNDdhYjQ3YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2EzZjU4MGMxZWU1ZDQ5NzZhZjhjMzhlZTI1Mzg5MzEwLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYFN0LiBCcmlkZSBTdHJlZXQsIEhvbGJvcm46IC0xOTM1YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV8xYWIwNzI4YTMyZjY0ZDIyOGUzM2QyNjc5NGZhYzhkZCA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUwMzQ5MzgsIC0wLjA3OTYyMDk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1My4zNjYzNzc1Mjk5NDYzMDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMmU2ODM0ZTlkOTUxNDA4ZWI2OTU5YTczYTQ3YWI0N2EpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV8xYWIwNzI4YTMyZjY0ZDIyOGUzM2QyNjc5NGZhYzhkZC5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBUb29sZXkgU3RyZWV0LCBCZXJtb25kc2V5OiAtMTkzOGAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfZWMwMTFjOGQ1MWY5NGUwN2E5OGM0M2VjOGY5NjIwZTggPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MTcwNzUyMSwgLTAuMDg2Njg1NTQyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1My42NDE3NDU4MzUwNTQzOSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8yZTY4MzRlOWQ5NTE0MDhlYjY5NTlhNzNhNDdhYjQ3YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2VjMDExYzhkNTFmOTRlMDdhOThjNDNlYzhmOTYyMGU4LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEZpbnNidXJ5IENpcmN1cywgTGl2ZXJwb29sIFN0cmVldDogLTE5NDhgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzg5NmM4NTUyZDdmNzQ1YWI4NzY4OGU5NWM5ZjQxZmNjID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNDk4MTI1NTksIC0wLjEzMjEwMjE2Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNTMuOTcyMTg3ODAxMTg0MDgsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMmU2ODM0ZTlkOTUxNDA4ZWI2OTU5YTczYTQ3YWI0N2EpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV84OTZjODU1MmQ3Zjc0NWFiODc2ODhlOTVjOWY0MWZjYy5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBBYmJleSBPcmNoYXJkIFN0cmVldCwgV2VzdG1pbnN0ZXI6IC0xOTYwYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV82NTYzMjM0ZDE4YjE0M2VhOGNkZDEwZTlhZWFjNzU4NyA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUwNDYzNjQsIC0wLjExNjU0MjI3OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNTQuNDQwMzEzOTE5ODY3ODIsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMmU2ODM0ZTlkOTUxNDA4ZWI2OTU5YTczYTQ3YWI0N2EpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV82NTYzMjM0ZDE4YjE0M2VhOGNkZDEwZTlhZWFjNzU4Ny5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBKdWJpbGVlIEdhcmRlbnMsIFNvdXRoIEJhbms6IC0xOTc3YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV85MWE1Mjg4YWI3YjA0OWUwODg5ZjBjYjI4YjhkNmNlYiA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUxMDQ4NDg5LCAtMC4wODI5ODk2MzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDU1LjA0NjEyNDE5MTEwNTYwNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8yZTY4MzRlOWQ5NTE0MDhlYjY5NTlhNzNhNDdhYjQ3YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzkxYTUyODhhYjdiMDQ5ZTA4ODlmMGNiMjhiOGQ2Y2ViLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEdyZWF0IFRvd2VyIFN0cmVldCwgTW9udW1lbnQ6IC0xOTk5YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV83MjBkOGJhN2RkNGM0YTUyOGQ1ZTMxNGQwMGYzMGVkZiA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjQ5OTkxNywgLTAuMTc0NTU0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1NS4zNDkwMjkzMjY3MjQ1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzJlNjgzNGU5ZDk1MTQwOGViNjk1OWE3M2E0N2FiNDdhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfNzIwZDhiYTdkZDRjNGE1MjhkNWUzMTRkMDBmMzBlZGYuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgRXhoaWJpdGlvbiBSb2FkLCBLbmlnaHRzYnJpZGdlOiAtMjAxMGAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfMjQ2NjQ2ZDY1ZWQxNGNiNDllMmY0NGM3ZDU2MDA4YTYgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MTYxNTQ2MSwgLTAuMDgyNDIyMzk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1NS4zNzY1NjYxNTcyMzUzMSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8yZTY4MzRlOWQ5NTE0MDhlYjY5NTlhNzNhNDdhYjQ3YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzI0NjY0NmQ2NWVkMTRjYjQ5ZTJmNDRjN2Q1NjAwOGE2LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYFdvcm13b29kIFN0cmVldCwgTGl2ZXJwb29sIFN0cmVldDogLTIwMTFgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzRhYzljNjc1NTFiNDQzYTU4Nzc1NWIwODM0ODg2ZWQ1ID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTEyNDg0NDUsIC0wLjA5OTE0MTQwOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNTguNjUzNDQ4OTg4MDIxNDgsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMmU2ODM0ZTlkOTUxNDA4ZWI2OTU5YTczYTQ3YWI0N2EpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV80YWM5YzY3NTUxYjQ0M2E1ODc3NTViMDgzNDg4NmVkNS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBHb2RsaW1hbiBTdHJlZXQsIFN0LiBQYXVsJ3M6IC0yMTMwYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV8xN2Y4MGJlM2ZkM2M0NGM3OTM1OGJjMzgwOGU3Y2EzNCA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjQ5Njc1MzAzLCAtMC4xMzg3MzM1NjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDYxLjQwNzEzMjAzOTEwMjI5NCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8yZTY4MzRlOWQ5NTE0MDhlYjY5NTlhNzNhNDdhYjQ3YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzE3ZjgwYmUzZmQzYzQ0Yzc5MzU4YmMzODA4ZTdjYTM0LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEhvd2ljayBQbGFjZSwgV2VzdG1pbnN0ZXI6IC0yMjMwYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9mMjJmMTZiMzJkMTM0Mjc3OGZhYTllNWRlMWZiZTY2MCA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUxMTk2ODAzLCAtMC4xMjA3MTg3NTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDYxLjgyMDE4NDQ5Njc2NDQyLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzJlNjgzNGU5ZDk1MTQwOGViNjk1OWE3M2E0N2FiNDdhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfZjIyZjE2YjMyZDEzNDI3NzhmYWE5ZTVkZTFmYmU2NjAuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgVGF2aXN0b2NrIFN0cmVldCwgQ292ZW50IEdhcmRlbjogLTIyNDVgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzFkYzVjZjdkMTdjMTQ0ZGZiN2E1ZTBjZDBmMzMyZGNkID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTE5MDY5MzIsIC0wLjA4ODI4NTM3N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNjYuNTI4OTgyNTE0MTEyNjMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMmU2ODM0ZTlkOTUxNDA4ZWI2OTU5YTczYTQ3YWI0N2EpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV8xZGM1Y2Y3ZDE3YzE0NGRmYjdhNWUwY2QwZjMzMmRjZC5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBNb29yZmllbGRzLCBNb29yZ2F0ZTogLTI0MTZgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzhmNzhiMTgyYmY3MjRjNTFiMjI5MzM1ZTA4MGE1Y2E0ID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTE1NjMxNDQsIC0wLjEzMjMyODgzN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogODUuMzY0MTc0NTgzNTA1NDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMmU2ODM0ZTlkOTUxNDA4ZWI2OTU5YTczYTQ3YWI0N2EpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV84Zjc4YjE4MmJmNzI0YzUxYjIyOTMzNWUwODBhNWNhNC5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBTb2hvIFNxdWFyZSAsIFNvaG86IC0zMTAwYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV83ZDgyZjE0MzNhOTI0Y2EwYjQyYzNiMTNhYzA5NTM1MCA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUxODkwOCwgLTAuMDc5MjQ5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxMDMuNDAwNzk4NTY4MDg0ODIsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMmU2ODM0ZTlkOTUxNDA4ZWI2OTU5YTczYTQ3YWI0N2EpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV83ZDgyZjE0MzNhOTI0Y2EwYjQyYzNiMTNhYzA5NTM1MC5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBCcnVzaGZpZWxkIFN0cmVldCwgTGl2ZXJwb29sIFN0cmVldDogLTM3NTVgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzAyM2M1NzZjOTVmOTRlZmI5NjljYTUzMmIxYTFmNmY2ID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTA3NDI0ODUsIC0wLjEzNDYyMTIwOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTEwLjU4NzkxMTMzMTQwNTc1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzJlNjgzNGU5ZDk1MTQwOGViNjk1OWE3M2E0N2FiNDdhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfMDIzYzU3NmM5NWY5NGVmYjk2OWNhNTMyYjFhMWY2ZjYuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgU3QuIEphbWVzJ3MgU3F1YXJlLCBTdC4gSmFtZXMnczogLTQwMTZgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX2JmZDZjOTYyNTY3ZTRhYjk5OGU2MDk3NzU0YmJjNjIzID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTA5NDYyMTIsIC0wLjEyNDc0OTI3NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTEyLjcwODI0NzI4MDczNzk4LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzJlNjgzNGU5ZDk1MTQwOGViNjk1OWE3M2E0N2FiNDdhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfYmZkNmM5NjI1NjdlNGFiOTk4ZTYwOTc3NTRiYmM2MjMuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgV2lsbGlhbSBJViBTdHJlZXQsIFN0cmFuZDogLTQwOTNgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzE4Y2NiZDA2ZDU2ODQ2Y2E5NTE3YWRhOTJkYTBiZWVhID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTE1NDE4NiwgLTAuMDk4ODUwOTE1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxMjQuNzY5Mzc5MDQ0NDcxOTksCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMmU2ODM0ZTlkOTUxNDA4ZWI2OTU5YTczYTQ3YWI0N2EpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV8xOGNjYmQwNmQ1Njg0NmNhOTUxN2FkYTkyZGEwYmVlYS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBOZXdnYXRlIFN0cmVldCAsIFN0LiBQYXVsJ3M6IC00NTMxYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9mZmUwNmU3MzlmZjM0YjM1YTdlMTY1OTRjZjQ4ZmU3OCA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUxNzk1MDI5LCAtMC4xMDg2NTc0MzFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDE0NS41MzIxNDkyNDk2MjEzNywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8yZTY4MzRlOWQ5NTE0MDhlYjY5NTlhNzNhNDdhYjQ3YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2ZmZTA2ZTczOWZmMzRiMzVhN2UxNjU5NGNmNDhmZTc4LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEhvbGJvcm4gQ2lyY3VzLCBIb2xib3JuOiAtNTI4NWAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfZGFjOWZhOTA0ZGQ2NDgxYmFlMmNjMDczMWY2OWQyNmQgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MDQ2Mjc1OSwgLTAuMDkxNzczNzc2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAyMDAuMCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8yZTY4MzRlOWQ5NTE0MDhlYjY5NTlhNzNhNDdhYjQ3YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2RhYzlmYTkwNGRkNjQ4MWJhZTJjYzA3MzFmNjlkMjZkLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEhvcCBFeGNoYW5nZSwgVGhlIEJvcm91Z2g6IC03MjYzYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbGF5ZXJfY29udHJvbF9jMDFiNGQ2NjcxOWE0ZDRjYjE4YWNjYjE4ZDY3NWMxMCA9IHsKICAgICAgICAgICAgICAgIGJhc2VfbGF5ZXJzIDogeyAiY2FydG9kYnBvc2l0cm9uIiA6IHRpbGVfbGF5ZXJfYWE0ZTM3MmFhNGE1NGJkMGI0YmU0OGFkMjhjYThmZDMsIH0sCiAgICAgICAgICAgICAgICBvdmVybGF5cyA6IHsgIkNvbW1vbiBTb3VyY2UgU3RhdGlvbnMiIDogZmVhdHVyZV9ncm91cF80YTMxNTA4ODVlOWI0OTZiYTMyMTQ0ODk5OTFlODY3ZiwiQ29tbW9uIERlc3RpbmF0aW9uIFN0YXRpb24iIDogZmVhdHVyZV9ncm91cF8yZTY4MzRlOWQ5NTE0MDhlYjY5NTlhNzNhNDdhYjQ3YSwgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgTC5jb250cm9sLmxheWVycygKICAgICAgICAgICAgICAgIGxheWVyX2NvbnRyb2xfYzAxYjRkNjY3MTlhNGQ0Y2IxOGFjY2IxOGQ2NzVjMTAuYmFzZV9sYXllcnMsCiAgICAgICAgICAgICAgICBsYXllcl9jb250cm9sX2MwMWI0ZDY2NzE5YTRkNGNiMThhY2NiMThkNjc1YzEwLm92ZXJsYXlzLAogICAgICAgICAgICAgICAge3Bvc2l0aW9uOiAndG9wcmlnaHQnLAogICAgICAgICAgICAgICAgIGNvbGxhcHNlZDogdHJ1ZSwKICAgICAgICAgICAgICAgICBhdXRvWkluZGV4OiB0cnVlCiAgICAgICAgICAgICAgICB9KS5hZGRUbyhtYXBfZmUzNWM3MTdjNzQxNGQwZDk3YWRhYTkzOTg5Y2U2ZWMpOwogICAgICAgICAgICAKICAgICAgICAKPC9zY3JpcHQ+\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x7f2cfca26f28>"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m = folium.Map(location=[51.5060338196204, -0.128345361445949], \n",
" tiles='CartoDB positron', zoom_start=12)\n",
"\n",
"common_src_station = build_circles_feature_group(diff.head(30), \n",
" feature_group_name='Common Source Stations',\n",
" color='crimson'\n",
" )\n",
"common_dest_station = build_circles_feature_group(diff.tail(30), \n",
" feature_group_name='Common Destination Station',\n",
" color='blue'\n",
" )\n",
"common_src_station.add_to(m)\n",
"common_dest_station.add_to(m)\n",
"\n",
"folium.LayerControl().add_to(m)\n",
" \n",
"m"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"%%bigquery diff_weekend\n",
"WITH \n",
" start_count AS (\n",
" SELECT\n",
" start_station_name,\n",
" COUNT(1) as start_cnt\n",
" FROM\n",
" `google.com:pso-bq-gis-demo.gis_demo.london_cycle`\n",
" WHERE\n",
" is_same_station IS false\n",
" AND EXTRACT(DAYOFWEEK FROM start_date) IN (1,7)\n",
" GROUP BY 1\n",
" ),\n",
" end_count AS (\n",
" SELECT\n",
" end_station_name,\n",
" COUNT(1) as end_cnt\n",
" FROM\n",
" `google.com:pso-bq-gis-demo.gis_demo.london_cycle`\n",
" WHERE\n",
" is_same_station IS false\n",
" AND EXTRACT(DAYOFWEEK FROM start_date) IN (1,7)\n",
" GROUP BY 1\n",
" )\n",
"SELECT\n",
" a.start_station_name AS station_name,\n",
" ST_ASGEOJSON(ST_GEOGPOINT(c.longitude, c.latitude)) geog,\n",
" a.start_cnt,\n",
" b.end_cnt,\n",
" a.start_cnt - b.end_cnt AS diff\n",
"FROM\n",
" start_count a\n",
"JOIN\n",
" end_count b\n",
"ON\n",
" a.start_station_name = b.end_station_name\n",
"JOIN\n",
" `google.com:pso-bq-gis-demo.gis_demo.cycle_stations` c\n",
"ON \n",
" a.start_station_name = c.name\n",
"ORDER BY 5 DESC"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>station_name</th>\n",
" <th>geog</th>\n",
" <th>start_cnt</th>\n",
" <th>end_cnt</th>\n",
" <th>diff</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Knightsbridge, Hyde Park</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.15534972...</td>\n",
" <td>1804</td>\n",
" <td>1186</td>\n",
" <td>618</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Waterloo Station 3, Waterloo</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.11282408...</td>\n",
" <td>1391</td>\n",
" <td>907</td>\n",
" <td>484</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Eagle Wharf Road, Hoxton</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.09315, 5...</td>\n",
" <td>2507</td>\n",
" <td>2102</td>\n",
" <td>405</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>The Green Bridge, Mile End</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.03562, 5...</td>\n",
" <td>3247</td>\n",
" <td>2847</td>\n",
" <td>400</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Lancaster Gate , Bayswater</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.179668, ...</td>\n",
" <td>1944</td>\n",
" <td>1560</td>\n",
" <td>384</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>St. John's Wood Road, St. John's Wood</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.17465360...</td>\n",
" <td>886</td>\n",
" <td>527</td>\n",
" <td>359</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>749</th>\n",
" <td>Jubilee Gardens, South Bank</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.11654227...</td>\n",
" <td>2081</td>\n",
" <td>2645</td>\n",
" <td>-564</td>\n",
" </tr>\n",
" <tr>\n",
" <th>750</th>\n",
" <td>William IV Street, Strand</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.12474927...</td>\n",
" <td>2093</td>\n",
" <td>2707</td>\n",
" <td>-614</td>\n",
" </tr>\n",
" <tr>\n",
" <th>751</th>\n",
" <td>Tavistock Street, Covent Garden</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.12071875...</td>\n",
" <td>2354</td>\n",
" <td>3035</td>\n",
" <td>-681</td>\n",
" </tr>\n",
" <tr>\n",
" <th>752</th>\n",
" <td>Storey's Gate, Westminster</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.12969896...</td>\n",
" <td>4789</td>\n",
" <td>5482</td>\n",
" <td>-693</td>\n",
" </tr>\n",
" <tr>\n",
" <th>753</th>\n",
" <td>Tower Gardens , Tower</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.07545948...</td>\n",
" <td>4250</td>\n",
" <td>4963</td>\n",
" <td>-713</td>\n",
" </tr>\n",
" <tr>\n",
" <th>754</th>\n",
" <td>Hop Exchange, The Borough</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.09177377...</td>\n",
" <td>4098</td>\n",
" <td>5950</td>\n",
" <td>-1852</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>755 rows × 5 columns</p>\n",
"</div>"
],
"text/plain": [
" station_name \\\n",
"0 Knightsbridge, Hyde Park \n",
"1 Waterloo Station 3, Waterloo \n",
"2 Eagle Wharf Road, Hoxton \n",
"3 The Green Bridge, Mile End \n",
"4 Lancaster Gate , Bayswater \n",
"5 St. John's Wood Road, St. John's Wood \n",
".. ... \n",
"749 Jubilee Gardens, South Bank \n",
"750 William IV Street, Strand \n",
"751 Tavistock Street, Covent Garden \n",
"752 Storey's Gate, Westminster \n",
"753 Tower Gardens , Tower \n",
"754 Hop Exchange, The Borough \n",
"\n",
" geog start_cnt end_cnt \\\n",
"0 { \"type\": \"Point\", \"coordinates\": [-0.15534972... 1804 1186 \n",
"1 { \"type\": \"Point\", \"coordinates\": [-0.11282408... 1391 907 \n",
"2 { \"type\": \"Point\", \"coordinates\": [-0.09315, 5... 2507 2102 \n",
"3 { \"type\": \"Point\", \"coordinates\": [-0.03562, 5... 3247 2847 \n",
"4 { \"type\": \"Point\", \"coordinates\": [-0.179668, ... 1944 1560 \n",
"5 { \"type\": \"Point\", \"coordinates\": [-0.17465360... 886 527 \n",
".. ... ... ... \n",
"749 { \"type\": \"Point\", \"coordinates\": [-0.11654227... 2081 2645 \n",
"750 { \"type\": \"Point\", \"coordinates\": [-0.12474927... 2093 2707 \n",
"751 { \"type\": \"Point\", \"coordinates\": [-0.12071875... 2354 3035 \n",
"752 { \"type\": \"Point\", \"coordinates\": [-0.12969896... 4789 5482 \n",
"753 { \"type\": \"Point\", \"coordinates\": [-0.07545948... 4250 4963 \n",
"754 { \"type\": \"Point\", \"coordinates\": [-0.09177377... 4098 5950 \n",
"\n",
" diff \n",
"0 618 \n",
"1 484 \n",
"2 405 \n",
"3 400 \n",
"4 384 \n",
"5 359 \n",
".. ... \n",
"749 -564 \n",
"750 -614 \n",
"751 -681 \n",
"752 -693 \n",
"753 -713 \n",
"754 -1852 \n",
"\n",
"[755 rows x 5 columns]"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"diff_weekend"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVM9ZmFsc2U7IExfTk9fVE9VQ0g9ZmFsc2U7IExfRElTQUJMRV8zRD1mYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS40LjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NvZGUuanF1ZXJ5LmNvbS9qcXVlcnktMS4xMi40Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS40LjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdjZG4uZ2l0aGFjay5jb20vcHl0aG9uLXZpc3VhbGl6YXRpb24vZm9saXVtL21hc3Rlci9mb2xpdW0vdGVtcGxhdGVzL2xlYWZsZXQuYXdlc29tZS5yb3RhdGUuY3NzIi8+CiAgICA8c3R5bGU+aHRtbCwgYm9keSB7d2lkdGg6IDEwMCU7aGVpZ2h0OiAxMDAlO21hcmdpbjogMDtwYWRkaW5nOiAwO308L3N0eWxlPgogICAgPHN0eWxlPiNtYXAge3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO3JpZ2h0OjA7bGVmdDowO308L3N0eWxlPgogICAgCiAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLAogICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgIDxzdHlsZT4jbWFwXzYwN2UxMjhkOTBmNDRiYjhiOGY3OGU0MTQwODM2MjNlIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDEwMC4wJTsKICAgICAgICBoZWlnaHQ6IDEwMC4wJTsKICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgIHRvcDogMC4wJTsKICAgICAgICB9CiAgICA8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgPGRpdiBjbGFzcz0iZm9saXVtLW1hcCIgaWQ9Im1hcF82MDdlMTI4ZDkwZjQ0YmI4YjhmNzhlNDE0MDgzNjIzZSIgPjwvZGl2Pgo8L2JvZHk+CjxzY3JpcHQ+ICAgIAogICAgCiAgICAKICAgICAgICB2YXIgYm91bmRzID0gbnVsbDsKICAgIAoKICAgIHZhciBtYXBfNjA3ZTEyOGQ5MGY0NGJiOGI4Zjc4ZTQxNDA4MzYyM2UgPSBMLm1hcCgKICAgICAgICAnbWFwXzYwN2UxMjhkOTBmNDRiYjhiOGY3OGU0MTQwODM2MjNlJywgewogICAgICAgIGNlbnRlcjogWzUxLjUwNjAzMzgxOTYyMDQsIC0wLjEyODM0NTM2MTQ0NTk0OV0sCiAgICAgICAgem9vbTogMTIsCiAgICAgICAgbWF4Qm91bmRzOiBib3VuZHMsCiAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3LAogICAgICAgIHpvb21Db250cm9sOiB0cnVlLAogICAgICAgIH0pOwoKCiAgICAKICAgIHZhciB0aWxlX2xheWVyXzc0NDZkZTk4OTFiNTQ3MTE4OTNlZTQxZjEzNWY4Y2U1ID0gTC50aWxlTGF5ZXIoCiAgICAgICAgJ2h0dHBzOi8vY2FydG9kYi1iYXNlbWFwcy17c30uZ2xvYmFsLnNzbC5mYXN0bHkubmV0L2xpZ2h0X2FsbC97en0ve3h9L3t5fS5wbmcnLAogICAgICAgIHsKICAgICAgICAiYXR0cmlidXRpb24iOiBudWxsLAogICAgICAgICJkZXRlY3RSZXRpbmEiOiBmYWxzZSwKICAgICAgICAibWF4TmF0aXZlWm9vbSI6IDE4LAogICAgICAgICJtYXhab29tIjogMTgsCiAgICAgICAgIm1pblpvb20iOiAwLAogICAgICAgICJub1dyYXAiOiBmYWxzZSwKICAgICAgICAib3BhY2l0eSI6IDEsCiAgICAgICAgInN1YmRvbWFpbnMiOiAiYWJjIiwKICAgICAgICAidG1zIjogZmFsc2UKfSkuYWRkVG8obWFwXzYwN2UxMjhkOTBmNDRiYjhiOGY3OGU0MTQwODM2MjNlKTsKICAgIAogICAgICAgICAgICB2YXIgZmVhdHVyZV9ncm91cF9iNDI1ZTMyMDc0YzM0NmI5YTBlYzYyYzBhNWNhZTFiZCA9IEwuZmVhdHVyZUdyb3VwKAogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjA3ZTEyOGQ5MGY0NGJiOGI4Zjc4ZTQxNDA4MzYyM2UpOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzNiODIwMmMzOWRhNTRlZDA4ZjEzNGUwZjIyOTU5NTkwID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTAyNzU3MDQsIC0wLjE1NTM0OTcyNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMjAwLjAsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjQyNWUzMjA3NGMzNDZiOWEwZWM2MmMwYTVjYWUxYmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV8zYjgyMDJjMzlkYTU0ZWQwOGYxMzRlMGYyMjk1OTU5MC5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBLbmlnaHRzYnJpZGdlLCBIeWRlIFBhcms6IDYxOGAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfZmM1Njg3OTEzYmMyNDk1NDk2MTE0NDc3OTBlNWI0NzQgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MDM3OTE2OCwgLTAuMTEyODI0MDhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDE1Ni42MzQzMDQyMDcxMTk3NSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iNDI1ZTMyMDc0YzM0NmI5YTBlYzYyYzBhNWNhZTFiZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2ZjNTY4NzkxM2JjMjQ5NTQ5NjExNDQ3NzkwZTViNDc0LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYFdhdGVybG9vIFN0YXRpb24gMywgV2F0ZXJsb286IDQ4NGAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfMjM5YzhkNDliYzU5NGI5N2EzYzNhNDFkMTQwMDQwOTEgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MzM1NiwgLTAuMDkzMTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDEzMS4wNjc5NjExNjUwNDg1NiwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iNDI1ZTMyMDc0YzM0NmI5YTBlYzYyYzBhNWNhZTFiZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzIzOWM4ZDQ5YmM1OTRiOTdhM2MzYTQxZDE0MDA0MDkxLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEVhZ2xlIFdoYXJmIFJvYWQsIEhveHRvbjogNDA1YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV81MDU0MWY4ZjU4M2Y0YjUyOGRlZWM2MjBlYzI2NGFhZSA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUyNDY3NywgLTAuMDM1NjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDEyOS40NDk4MzgxODc3MDIyNiwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iNDI1ZTMyMDc0YzM0NmI5YTBlYzYyYzBhNWNhZTFiZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzUwNTQxZjhmNTgzZjRiNTI4ZGVlYzYyMGVjMjY0YWFlLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYFRoZSBHcmVlbiBCcmlkZ2UsIE1pbGUgRW5kOiA0MDBgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzJlMGYwODA4NzdkMjQzNmJiN2E4NWViMGIyMjNiYmM0ID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTExNjU0LCAtMC4xNzk2NjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDEyNC4yNzE4NDQ2NjAxOTQxNiwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iNDI1ZTMyMDc0YzM0NmI5YTBlYzYyYzBhNWNhZTFiZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzJlMGYwODA4NzdkMjQzNmJiN2E4NWViMGIyMjNiYmM0LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYExhbmNhc3RlciBHYXRlICwgQmF5c3dhdGVyOiAzODRgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX2RmNzBjNTQwMGE2MzQ2YWJiOWY3ZDVjMWJlZDQyNzExID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTI3Mjk0NywgLTAuMTc0NjUzNjA5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxMTYuMTgxMjI5NzczNDYyNzksCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjQyNWUzMjA3NGMzNDZiOWEwZWM2MmMwYTVjYWUxYmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV9kZjcwYzU0MDBhNjM0NmFiYjlmN2Q1YzFiZWQ0MjcxMS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBTdC4gSm9obidzIFdvb2QgUm9hZCwgU3QuIEpvaG4ncyBXb29kOiAzNTlgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzA1NzE4NTk1MWQwMDRkN2Q5ZDVkNmI2ZGZlMzA4NjI2ID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNDkzNjk5ODgsIC0wLjEyMTM5NDEwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTA2LjQ3MjQ5MTkwOTM4NTEsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjQyNWUzMjA3NGMzNDZiOWEwZWM2MmMwYTVjYWUxYmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV8wNTcxODU5NTFkMDA0ZDdkOWQ1ZDZiNmRmZTMwODYyNi5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBGaXJlIEJyaWdhZGUgUGllciwgVmF1eGhhbGw6IDMyOWAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfMmRmMzc4OWZmMDJjNDk1MGFlZGZiYWNjNjkwYjNlNDMgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MzQwNDI5NCwgLTAuMDg2Mzc5NzE3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxMDMuNTU5ODcwNTUwMTYxOCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iNDI1ZTMyMDc0YzM0NmI5YTBlYzYyYzBhNWNhZTFiZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzJkZjM3ODlmZjAyYzQ5NTBhZWRmYmFjYzY5MGIzZTQzLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYFNob3JlZGl0Y2ggUGFyaywgSG94dG9uOiAzMjBgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzVmNTg2ZDY5OGI3YzQwODNiNzlkMmExMjg2MDU1ZTI0ID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTA4NjA1NDQsIC0wLjE5Mzc2NDA5Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTAzLjIzNjI0NTk1NDY5MjU2LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2I0MjVlMzIwNzRjMzQ2YjlhMGVjNjJjMGE1Y2FlMWJkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfNWY1ODZkNjk4YjdjNDA4M2I3OWQyYTEyODYwNTVlMjQuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgUGFsYWNlIEdhcmRlbnMgVGVycmFjZSwgTm90dGluZyBIaWxsOiAzMTlgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX2IwNWFlNzI4ZDRjNTRhMDE5ZDlmNGI3NThjOGYyY2ZiID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTAzOTE5NzMsIC0wLjExMzQyNjI5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxMDIuOTEyNjIxMzU5MjIzMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iNDI1ZTMyMDc0YzM0NmI5YTBlYzYyYzBhNWNhZTFiZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2IwNWFlNzI4ZDRjNTRhMDE5ZDlmNGI3NThjOGYyY2ZiLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYFdhdGVybG9vIFN0YXRpb24gMiwgV2F0ZXJsb286IDMxOGAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfNWZkOThlNTdlYTMxNDRlYTljMmZlZTEwMmJiNzU3MzggPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS40ODQ4Mzk5MSwgLTAuMTM4MDg5MDYyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA5Ni43NjM3NTQwNDUzMDc0NSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iNDI1ZTMyMDc0YzM0NmI5YTBlYzYyYzBhNWNhZTFiZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzVmZDk4ZTU3ZWEzMTQ0ZWE5YzJmZWUxMDJiYjc1NzM4LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYENsYXZlcnRvbiBTdHJlZXQsIFBpbWxpY286IDI5OWAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfYWMwYzYwMmU5YzRiNDZlYjk1ZWZiMmNhMTc1Zjc2ZTEgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MjcwNTgsIC0wLjAyNTI5Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogOTUuNDY5MjU1NjYzNDMwNDIsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjQyNWUzMjA3NGMzNDZiOWEwZWM2MmMwYTVjYWUxYmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV9hYzBjNjAyZTljNGI0NmViOTVlZmIyY2ExNzVmNzZlMS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBCb3cgUm9hZCBTdGF0aW9uLCBCb3c6IDI5NWAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfNTJkYjNhNjlmNDM1NDJlMTgxNTRiYjUyY2QzNWZiM2QgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MTIxMzY5MSwgLTAuMjAxNTU0OTY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA5NS40NjkyNTU2NjM0MzA0MiwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iNDI1ZTMyMDc0YzM0NmI5YTBlYzYyYzBhNWNhZTFiZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzUyZGIzYTY5ZjQzNTQyZTE4MTU0YmI1MmNkMzVmYjNkLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYENoZXBzdG93IFZpbGxhcywgTm90dGluZyBIaWxsOiAyOTVgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX2MwODNmNDVjZTkzMzQ0NmRiMjE3NmE1ZTEwNjYzNjgyID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTMxNjY2ODEsIC0wLjEwOTkxNDcxMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogOTQuNDk4MzgxODc3MDIyNjUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjQyNWUzMjA3NGMzNDZiOWEwZWM2MmMwYTVjYWUxYmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV9jMDgzZjQ1Y2U5MzM0NDZkYjIxNzZhNWUxMDY2MzY4Mi5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBDbGFyZW1vbnQgU3F1YXJlLCBBbmdlbDogMjkyYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV8zM2U0YTlkM2M4YzE0NGM3YmFmNjg4OGYwNWIxOTQ2ZCA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUyOTQyMywgLTAuMDk3MTIyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA5NC40OTgzODE4NzcwMjI2NSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iNDI1ZTMyMDc0YzM0NmI5YTBlYzYyYzBhNWNhZTFiZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzMzZTRhOWQzYzhjMTQ0YzdiYWY2ODg4ZjA1YjE5NDZkLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYE1hY2NsZXNmaWVsZCBSZCwgU3QgTHVrZXM6IDI5MmAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfZDNiMjY0Y2Y5YjI4NGI5MTg2OGJlNGZhNDdlNTNiM2EgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MzQ0MDg2OCwgLTAuMTA5MDI1NDA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA5My41Mjc1MDgwOTA2MTQ4OSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iNDI1ZTMyMDc0YzM0NmI5YTBlYzYyYzBhNWNhZTFiZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2QzYjI2NGNmOWIyODRiOTE4NjhiZTRmYTQ3ZTUzYjNhLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYENsb3VkZXNsZXkgUm9hZCwgQW5nZWw6IDI4OWAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfMjkyYmY1MzNiM2U5NGQ3ZDhjYWVjNWUzMjgyYjczNjEgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MDIzMTksIC0wLjIwMDc0Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogOTAuNjE0ODg2NzMxMzkxNTksCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjQyNWUzMjA3NGMzNDZiOWEwZWM2MmMwYTVjYWUxYmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV8yOTJiZjUzM2IzZTk0ZDdkOGNhZWM1ZTMyODJiNzM2MS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBIb2xsYW5kIFBhcmssIEtlbnNpbmd0b246IDI4MGAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfMWViNjQ1MGIyZTJiNGE1Njk5MTVlNGFjZjU0YTg1ODggPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MTc5NTAyOSwgLTAuMTA4NjU3NDMxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA4OS42NDQwMTI5NDQ5ODM4MSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iNDI1ZTMyMDc0YzM0NmI5YTBlYzYyYzBhNWNhZTFiZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzFlYjY0NTBiMmUyYjRhNTY5OTE1ZTRhY2Y1NGE4NTg4LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEhvbGJvcm4gQ2lyY3VzLCBIb2xib3JuOiAyNzdgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzA2YmFhMGI3YjExNDQ5NjRiYjhiMjQ0YTM5ZDEzYzc3ID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTMwOTkxODEsIC0wLjA5MzkwMzgyNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogODMuODE4NzcwMjI2NTM3MjMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjQyNWUzMjA3NGMzNDZiOWEwZWM2MmMwYTVjYWUxYmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV8wNmJhYTBiN2IxMTQ0OTY0YmI4YjI0NGEzOWQxM2M3Ny5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBXZW5sb2NrIFJvYWQgLCBIb3h0b246IDI1OWAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfZTViNTdmMTU5NjAxNDM0YmJmMjY4YTdhNWYyZWMxNTQgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MzU4OTI4MywgLTAuMTYwODU0NDI4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA4Mi44NDc4OTY0NDAxMjk0NiwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iNDI1ZTMyMDc0YzM0NmI5YTBlYzYyYzBhNWNhZTFiZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2U1YjU3ZjE1OTYwMTQzNGJiZjI2OGE3YTVmMmVjMTU0LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYFByaW5jZSBBbGJlcnQgUm9hZCwgVGhlIFJlZ2VudCdzIFBhcms6IDI1NmAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfOTVhNTFlYjk1YWJlNDZlZmFlMDdlZTc3ODgyYmMxYjUgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MTYzMjA5NSwgLTAuMjAyNjA4NjEyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA4MS41NTMzOTgwNTgyNTI0MywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iNDI1ZTMyMDc0YzM0NmI5YTBlYzYyYzBhNWNhZTFiZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzk1YTUxZWI5NWFiZTQ2ZWZhZTA3ZWU3Nzg4MmJjMWI1LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEFsbCBTYWludHMgQ2h1cmNoLCBQb3J0b2JlbGxvOiAyNTJgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX2JjZTNhNGNhMDg5YTRiNjI5ZjI4OTVjMzFiNTUxYWNmID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTMwMzQ0LCAtMC4xMDAxNjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDgwLjkwNjE0ODg2NzMxMzkyLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2I0MjVlMzIwNzRjMzQ2YjlhMGVjNjJjMGE1Y2FlMWJkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfYmNlM2E0Y2EwODlhNGI2MjlmMjg5NWMzMWI1NTFhY2YuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgQ2l0eSBSb2FkLCBBbmdlbDogMjUwYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9iNjI2ODUxNzBmMjI0YjQ0YWMzOWMyNWY2ZGYxZjQ1MCA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUyOTE1NDQ0LCAtMC4wOTM0MjE2MTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDc5LjYxMTY1MDQ4NTQzNjksCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjQyNWUzMjA3NGMzNDZiOWEwZWM2MmMwYTVjYWUxYmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV9iNjI2ODUxNzBmMjI0YjQ0YWMzOWMyNWY2ZGYxZjQ1MC5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBXaW5kc29yIFRlcnJhY2UsIEhveHRvbjogMjQ2YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV81ZDc2MjQ1NjBmZTQ0ZWFiOTNiOTcwN2MwYWYwNzFlZSA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUzNjU4NTE0LCAtMC4wNzU4ODU2ODZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDc4Ljk2NDQwMTI5NDQ5ODM3LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2I0MjVlMzIwNzRjMzQ2YjlhMGVjNjJjMGE1Y2FlMWJkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfNWQ3NjI0NTYwZmU0NGVhYjkzYjk3MDdjMGFmMDcxZWUuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgRHVuc3RvbiBSb2FkICwgSGFnZ2Vyc3RvbjogMjQ0YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV8yMTNiMjI5Zjk0ZWQ0NzkwOGMwZDg1MjcyYjgwMDIxMSA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjQ5MDE2MzYxLCAtMC4xOTAzOTM2Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNzcuNjY5OTAyOTEyNjIxMzUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjQyNWUzMjA3NGMzNDZiOWEwZWM2MmMwYTVjYWUxYmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV8yMTNiMjI5Zjk0ZWQ0NzkwOGMwZDg1MjcyYjgwMDIxMS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBCcmFtaGFtIEdhcmRlbnMsIEVhcmwncyBDb3VydDogMjQwYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV84MDM5MTE5MWFjMzE0OTkzOTlmNjk2MjFiMTI4MDU5ZCA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjQ4NTM1NzIsIC0wLjE0MjIwNzQ4MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNzcuNjY5OTAyOTEyNjIxMzUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjQyNWUzMjA3NGMzNDZiOWEwZWM2MmMwYTVjYWUxYmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV84MDM5MTE5MWFjMzE0OTkzOTlmNjk2MjFiMTI4MDU5ZC5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBHcm9zdmVub3IgUm9hZCwgUGltbGljbzogMjQwYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9lYWQ3ZTBmODYxYzA0MGMxOTVhNzY4MzAxMGFjODI4NSA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUzMzMxOTYsIC0wLjExMTc4MTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDc2LjA1MTc3OTkzNTI3NTA4LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2I0MjVlMzIwNzRjMzQ2YjlhMGVjNjJjMGE1Y2FlMWJkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfZWFkN2UwZjg2MWMwNDBjMTk1YTc2ODMwMTBhYzgyODUuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgUmlzaW5naGlsbCBTdHJlZXQsIEFuZ2VsOiAyMzVgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX2U2ZjgxYWUwY2JmOTQ5MzE5ZjY5MjhkMjY3ODc1OWU3ID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTA5MzUzNDIsIC0wLjE5NjQyMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNzQuMTEwMDMyMzYyNDU5NTUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjQyNWUzMjA3NGMzNDZiOWEwZWM2MmMwYTVjYWUxYmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV9lNmY4MWFlMGNiZjk0OTMxOWY2OTI4ZDI2Nzg3NTllNy5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBOb3R0aW5nIEhpbGwgR2F0ZSBTdGF0aW9uLCBOb3R0aW5nIEhpbGw6IDIyOWAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfNmIyMGVmMGI3ODU1NDQ4ZDkyMTNkNWM4MmY2MzA3YzQgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MDE3MzcyNiwgLTAuMTg0OTgwNjEyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA3My43ODY0MDc3NjY5OTAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2I0MjVlMzIwNzRjMzQ2YjlhMGVjNjJjMGE1Y2FlMWJkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfNmIyMGVmMGI3ODU1NDQ4ZDkyMTNkNWM4MmY2MzA3YzQuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgRGUgVmVyZSBHYXJkZW5zLCBLZW5zaW5ndG9uOiAyMjhgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzE0NGUwNzdkZTIyZDRmZWU5NGVmNjc3NDY2YzE5OGViID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTI5MTYzNDcsIC0wLjEwOTk3MDUyN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNzMuNzg2NDA3NzY2OTkwMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9iNDI1ZTMyMDc0YzM0NmI5YTBlYzYyYzBhNWNhZTFiZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzE0NGUwNzdkZTIyZDRmZWU5NGVmNjc3NDY2YzE5OGViLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYFJpdmVyIFN0cmVldCAsIENsZXJrZW53ZWxsOiAyMjhgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBmZWF0dXJlX2dyb3VwX2RhY2MxOGZiNTE4NjQyZGVhMDMyYWExMzkwMjQ2ODQxID0gTC5mZWF0dXJlR3JvdXAoCiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82MDdlMTI4ZDkwZjQ0YmI4YjhmNzhlNDE0MDgzNjIzZSk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfN2E2NmI3N2ViYWM3NGMyNGIyNjkwYzZmMThmYzJjNjIgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MTQ0OTk2MiwgLTAuMTQxNDIzNjk1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAyNy4yMTM4MjI4OTQxNjg0NjYsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGFjYzE4ZmI1MTg2NDJkZWEwMzJhYTEzOTAyNDY4NDEpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV83YTY2Yjc3ZWJhYzc0YzI0YjI2OTBjNmYxOGZjMmM2Mi5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBMaXR0bGUgQXJneWxsIFN0cmVldCwgV2VzdCBFbmQ6IC0yNTJgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzU5NDkwYzg2NDU4NDQ0Mzk5YmNiMjJlZTZmZGVjMTQ0ID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTEyMjc2MjIsIC0wLjE1NzQzNjk3Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMjcuNTM3Nzk2OTc2MjQxOSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9kYWNjMThmYjUxODY0MmRlYTAzMmFhMTM5MDI0Njg0MSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzU5NDkwYzg2NDU4NDQ0Mzk5YmNiMjJlZTZmZGVjMTQ0LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEdyZWVuIFN0cmVldCwgTWF5ZmFpcjogLTI1NWAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfODZlYzNlNTdhNmZkNGFkYWE1M2I5YWRkY2FkMGE5NzUgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS40OTk5MTcsIC0wLjE3NDU1NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMjguMjkzNzM2NTAxMDc5OTEzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhY2MxOGZiNTE4NjQyZGVhMDMyYWExMzkwMjQ2ODQxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfODZlYzNlNTdhNmZkNGFkYWE1M2I5YWRkY2FkMGE5NzUuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgRXhoaWJpdGlvbiBSb2FkLCBLbmlnaHRzYnJpZGdlOiAtMjYyYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV82ZjlhZGY2MzA3MmU0ZjY3OWQyYThiYTcxM2I3Mzk1NCA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUxMjQ4NDQ1LCAtMC4wOTkxNDE0MDhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDI4LjcyNTcwMTk0Mzg0NDQ5NSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9kYWNjMThmYjUxODY0MmRlYTAzMmFhMTM5MDI0Njg0MSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzZmOWFkZjYzMDcyZTRmNjc5ZDJhOGJhNzEzYjczOTU0LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEdvZGxpbWFuIFN0cmVldCwgU3QuIFBhdWwnczogLTI2NmAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfYzAzZWE1OWJjNzFiNGU0ZWFhM2Q0ZjRiYWEzM2VhODkgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MDAzOTc5MiwgLTAuMTkzMDY4Mzg1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAyOC44MzM2OTMzMDQ1MzU2MzYsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGFjYzE4ZmI1MTg2NDJkZWEwMzJhYTEzOTAyNDY4NDEpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV9jMDNlYTU5YmM3MWI0ZTRlYWEzZDRmNGJhYTMzZWE4OS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBXcmlnaHQncyBMYW5lLCBLZW5zaW5ndG9uOiAtMjY3YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9lOTc5NWJkZWI5MmE0MTEwODc2NmU2ODAzN2IyZWUxMiA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUxMzUyNzU1LCAtMC4xMzAxMTA4MjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDI5LjM3MzY1MDEwNzk5MTM2MywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9kYWNjMThmYjUxODY0MmRlYTAzMmFhMTM5MDI0Njg0MSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2U5Nzk1YmRlYjkyYTQxMTA4NzY2ZTY4MDM3YjJlZTEyLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYE1vb3IgU3RyZWV0LCBTb2hvOiAtMjcyYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV8wNTE3ZWVhMDFjNWY0MGFlYjNjYWNiMzJkM2JiN2UwNiA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjQ5Njc1MzAzLCAtMC4xMzg3MzM1NjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDI5LjQ4MTY0MTQ2ODY4MjUwOCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9kYWNjMThmYjUxODY0MmRlYTAzMmFhMTM5MDI0Njg0MSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzA1MTdlZWEwMWM1ZjQwYWViM2NhY2IzMmQzYmI3ZTA2LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEhvd2ljayBQbGFjZSwgV2VzdG1pbnN0ZXI6IC0yNzNgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX2U1ZTVlMTQwOGU2NzQ0NGNhMTJmOGZiOGViYjE1NWNhID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTM1NzE2ODMsIC0wLjA2MDI5MTgxM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMjkuODA1NjE1NTUwNzU1OTM4LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhY2MxOGZiNTE4NjQyZGVhMDMyYWExMzkwMjQ2ODQxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfZTVlNWUxNDA4ZTY3NDQ0Y2ExMmY4ZmI4ZWJiMTU1Y2EuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgQWRhIFN0cmVldCwgSGFja25leSBDZW50cmFsOiAtMjc2YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9kNTViMDc3ZGU2OGQ0ZDNhYmY4NmNmZWU0MzA4YzlkOCA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUxMDczNjg3LCAtMC4xNDQxNjUyMzldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMxLjEwMTUxMTg3OTA0OTY3NCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9kYWNjMThmYjUxODY0MmRlYTAzMmFhMTM5MDI0Njg0MSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2Q1NWIwNzdkZTY4ZDRkM2FiZjg2Y2ZlZTQzMDhjOWQ4LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEJydXRvbiBTdHJlZXQsIE1heWZhaXI6IC0yODhgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzAzYjMzZTRjYmIyOTQzY2Y5YTkyYWYxN2VkYWViMDViID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTA5NjM5MzgsIC0wLjEzMTUxMDk0OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMzIuNjEzMzkwOTI4NzI1NywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9kYWNjMThmYjUxODY0MmRlYTAzMmFhMTM5MDI0Njg0MSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzAzYjMzZTRjYmIyOTQzY2Y5YTkyYWYxN2VkYWViMDViLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYFBhbnRvbiBTdHJlZXQsIFdlc3QgRW5kOiAtMzAyYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9iYmRlZjM3YzI1NzI0MmQyOTNjNTA0M2U1OTgwNmVmMyA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUwNjIzLCAtMC4wMjI5Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMzMuNDc3MzIxODE0MjU0ODY0LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhY2MxOGZiNTE4NjQyZGVhMDMyYWExMzkwMjQ2ODQxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfYmJkZWYzN2MyNTcyNDJkMjkzYzUwNDNlNTk4MDZlZjMuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgRmlzaGVybWFuJ3MgV2FsayBXZXN0LCBDYW5hcnkgV2hhcmY6IC0zMTBgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzgyYzViN2JhNjY3NjQwNzc4M2MwYmNjY2QwMTI5MjczID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNDY2OTA3LCAtMC4yMTY1NzNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDM0Ljk4OTIwMDg2MzkzMDg4LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhY2MxOGZiNTE4NjQyZGVhMDMyYWExMzkwMjQ2ODQxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfODJjNWI3YmE2Njc2NDA3NzgzYzBiY2NjZDAxMjkyNzMuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgUHV0bmV5IFBpZXIsIFdhbmRzd29ydGg6IC0zMjRgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX2ZhNDk3YmRlN2MxOTRjMTlhY2NjN2ViOWM2YzU1NmRjID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTA2NTQzMjEsIC0wLjEyMzE3OTY5N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMzUuMjA1MTgzNTg1MzEzMTgsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGFjYzE4ZmI1MTg2NDJkZWEwMzJhYTEzOTAyNDY4NDEpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV9mYTQ5N2JkZTdjMTk0YzE5YWNjYzdlYjljNmM1NTZkYy5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBXaGl0ZWhhbGwgUGxhY2UsIFN0cmFuZDogLTMyNmAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfMjY1M2YzOGRmMjg2NGUzOTk3MTRjZTBlN2U0MWMwMWYgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MDAwODkxOTc4LCAtMC4xMTY2Mjg3MDA2NzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDM2LjA2OTExNDQ3MDg0MjM0LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhY2MxOGZiNTE4NjQyZGVhMDMyYWExMzkwMjQ2ODQxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfMjY1M2YzOGRmMjg2NGUzOTk3MTRjZTBlN2U0MWMwMWYuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgTGFtYmV0aCBQYWxhY2UgUm9hZCwgV2F0ZXJsb286IC0zMzRgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzk4MTZhMzA5YjI5NjQzODI5ZGZjNjYxY2JmNWY3M2RiID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTEwMDE3MiwgLTAuMTU3Mjc1NjM2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzNi4yODUwOTcxOTIyMjQ2MjYsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGFjYzE4ZmI1MTg2NDJkZWEwMzJhYTEzOTAyNDY4NDEpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV85ODE2YTMwOWIyOTY0MzgyOWRmYzY2MWNiZjVmNzNkYi5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBQYXJrIExhbmUgLCBIeWRlIFBhcms6IC0zMzZgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX2E5YjlkODYwZWViZDRhNTc5Y2UwOGFmYjc2NWNjYWVjID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTAzMTE3OTksIC0wLjE1MzUyMDkzNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMzYuODI1MDUzOTk1NjgwMzUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGFjYzE4ZmI1MTg2NDJkZWEwMzJhYTEzOTAyNDY4NDEpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV9hOWI5ZDg2MGVlYmQ0YTU3OWNlMDhhZmI3NjVjY2FlYy5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBIeWRlIFBhcmsgQ29ybmVyLCBIeWRlIFBhcms6IC0zNDFgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzNlN2JiYzgxNjgwMTQ1MWQ4MDcxMDkzZmNlZTQxMmVmID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTA0MDI3OTQsIC0wLjExMzg2NDM2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzOS40MTY4NDY2NTIyNjc4MTQsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGFjYzE4ZmI1MTg2NDJkZWEwMzJhYTEzOTAyNDY4NDEpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV8zZTdiYmM4MTY4MDE0NTFkODA3MTA5M2ZjZWU0MTJlZi5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBXYXRlcmxvbyBTdGF0aW9uIDEsIFdhdGVybG9vOiAtMzY1YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9hZmZhOTRlMzJmYzg0YzgwOWQ1YjdlZTA5YWQ1YWU5NCA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUwODEwMzA5LCAtMC4xMjYwMjEwM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMzkuODQ4ODEyMDk1MDMyNCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9kYWNjMThmYjUxODY0MmRlYTAzMmFhMTM5MDI0Njg0MSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2FmZmE5NGUzMmZjODRjODA5ZDViN2VlMDlhZDVhZTk0LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYENyYXZlbiBTdHJlZXQsIFN0cmFuZDogLTM2OWAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfODMyZThiNTZhNzhhNDI5ZmFmOTE3ZTMyNDE3ZTc5NmYgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MTg5MDgsIC0wLjA3OTI0OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNDEuMDM2NzE3MDYyNjM0OTksCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGFjYzE4ZmI1MTg2NDJkZWEwMzJhYTEzOTAyNDY4NDEpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV84MzJlOGI1NmE3OGE0MjlmYWY5MTdlMzI0MTdlNzk2Zi5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBCcnVzaGZpZWxkIFN0cmVldCwgTGl2ZXJwb29sIFN0cmVldDogLTM4MGAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfZjU1MDQzZmEwZGFmNGYwM2IzNDdhYTM5MjQ3MzcyOTYgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MTU2MzE0NCwgLTAuMTMyMzI4ODM3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1MC41Mzk5NTY4MDM0NTU3MiwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9kYWNjMThmYjUxODY0MmRlYTAzMmFhMTM5MDI0Njg0MSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2Y1NTA0M2ZhMGRhZjRmMDNiMzQ3YWEzOTI0NzM3Mjk2LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYFNvaG8gU3F1YXJlICwgU29obzogLTQ2OGAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfNzIwNDBlYWZkMjZmNGQ0NjhiM2FhNGM4MTA3NDhhMDUgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MDM0OTM4LCAtMC4wNzk2MjA5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNTEuMTg3OTA0OTY3NjAyNTksCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGFjYzE4ZmI1MTg2NDJkZWEwMzJhYTEzOTAyNDY4NDEpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV83MjA0MGVhZmQyNmY0ZDQ2OGIzYWE0YzgxMDc0OGEwNS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBUb29sZXkgU3RyZWV0LCBCZXJtb25kc2V5OiAtNDc0YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV8zMWNiMzkwY2Q2ZjI0OGNmOTA2MjYzOGZjMWYwNDdhNSA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUwNzQyNDg1LCAtMC4xMzQ2MjEyMDldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUzLjQ1NTcyMzU0MjExNjYzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhY2MxOGZiNTE4NjQyZGVhMDMyYWExMzkwMjQ2ODQxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfMzFjYjM5MGNkNmYyNDhjZjkwNjI2MzhmYzFmMDQ3YTUuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgU3QuIEphbWVzJ3MgU3F1YXJlLCBTdC4gSmFtZXMnczogLTQ5NWAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfNWI0OGM1MzUyODQ1NDNkMTg1YjdlZjhkNjI5ZGFhM2MgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS40OTgxMjU1OSwgLTAuMTMyMTAyMTY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1NS45Mzk1MjQ4MzgwMTI5NiwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9kYWNjMThmYjUxODY0MmRlYTAzMmFhMTM5MDI0Njg0MSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzViNDhjNTM1Mjg0NTQzZDE4NWI3ZWY4ZDYyOWRhYTNjLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEFiYmV5IE9yY2hhcmQgU3RyZWV0LCBXZXN0bWluc3RlcjogLTUxOGAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfZmZiZjMzY2U2MjkyNDg3OGFhMmJjMTQ3NmRlNTRjNDUgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS40OTc2MjIsIC0wLjEyNTk3OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNTguODU1MjkxNTc2NjczODY0LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhY2MxOGZiNTE4NjQyZGVhMDMyYWExMzkwMjQ2ODQxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfZmZiZjMzY2U2MjkyNDg3OGFhMmJjMTQ3NmRlNTRjNDUuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgQWJpbmdkb24gR3JlZW4sIFdlc3RtaW5zdGVyOiAtNTQ1YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV8zZTFiYTJjYmNkOGU0MzhkODUwYWY4MTJlMmI4ZjY4MSA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUwNDYzNjQsIC0wLjExNjU0MjI3OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNjAuOTA3MTI3NDI5ODA1NjIsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGFjYzE4ZmI1MTg2NDJkZWEwMzJhYTEzOTAyNDY4NDEpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV8zZTFiYTJjYmNkOGU0MzhkODUwYWY4MTJlMmI4ZjY4MS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBKdWJpbGVlIEdhcmRlbnMsIFNvdXRoIEJhbms6IC01NjRgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX2M1ZjViOTUwMWVmMDQzNTBiYTg0M2E0NTIyMmU4NzQwID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTA5NDYyMTIsIC0wLjEyNDc0OTI3NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNjYuMzA2Njk1NDY0MzYyODUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGFjYzE4ZmI1MTg2NDJkZWEwMzJhYTEzOTAyNDY4NDEpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV9jNWY1Yjk1MDFlZjA0MzUwYmE4NDNhNDUyMjJlODc0MC5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBXaWxsaWFtIElWIFN0cmVldCwgU3RyYW5kOiAtNjE0YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9lMTYyOTVmMzBmOTg0MTg5ODg4ZmNhMDIzMGRiYmY0OSA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUxMTk2ODAzLCAtMC4xMjA3MTg3NTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDczLjU0MjExNjYzMDY2OTU1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhY2MxOGZiNTE4NjQyZGVhMDMyYWExMzkwMjQ2ODQxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfZTE2Mjk1ZjMwZjk4NDE4OTg4OGZjYTAyMzBkYmJmNDkuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgVGF2aXN0b2NrIFN0cmVldCwgQ292ZW50IEdhcmRlbjogLTY4MWAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfNWI0MGFkNjJjZjYyNDhkYTgyMjdmMmE3NGNkNWVmZDAgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MDA3MDMwNSwgLTAuMTI5Njk4OTYzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA3NC44MzgwMTI5NTg5NjMyOSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9kYWNjMThmYjUxODY0MmRlYTAzMmFhMTM5MDI0Njg0MSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzViNDBhZDYyY2Y2MjQ4ZGE4MjI3ZjJhNzRjZDVlZmQwLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYFN0b3JleSdzIEdhdGUsIFdlc3RtaW5zdGVyOiAtNjkzYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV8xNzRiNjBmNzIwZGE0ZTNkODdjN2MzNWQzNTYxODAxNSA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUwOTUwNjI3LCAtMC4wNzU0NTk0ODJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDc2Ljk5Nzg0MDE3Mjc4NjE4LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhY2MxOGZiNTE4NjQyZGVhMDMyYWExMzkwMjQ2ODQxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfMTc0YjYwZjcyMGRhNGUzZDg3YzdjMzVkMzU2MTgwMTUuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgVG93ZXIgR2FyZGVucyAsIFRvd2VyOiAtNzEzYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV85NzAxMDZiNmM1MWY0NzcyYTQ4ZGVjMTM2OTBlMDFlMiA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUwNDYyNzU5LCAtMC4wOTE3NzM3NzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDIwMC4wLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhY2MxOGZiNTE4NjQyZGVhMDMyYWExMzkwMjQ2ODQxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfOTcwMTA2YjZjNTFmNDc3MmE0OGRlYzEzNjkwZTAxZTIuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgSG9wIEV4Y2hhbmdlLCBUaGUgQm9yb3VnaDogLTE4NTJgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBsYXllcl9jb250cm9sXzljYTU4NTU0MTk0YzQyOWJhZmQ0MGZlMjY3YmJkMWE2ID0gewogICAgICAgICAgICAgICAgYmFzZV9sYXllcnMgOiB7ICJjYXJ0b2RicG9zaXRyb24iIDogdGlsZV9sYXllcl83NDQ2ZGU5ODkxYjU0NzExODkzZWU0MWYxMzVmOGNlNSwgfSwKICAgICAgICAgICAgICAgIG92ZXJsYXlzIDogeyAiQ29tbW9uIFNvdXJjZSBTdGF0aW9ucyIgOiBmZWF0dXJlX2dyb3VwX2I0MjVlMzIwNzRjMzQ2YjlhMGVjNjJjMGE1Y2FlMWJkLCJDb21tb24gRGVzdGluYXRpb24gU3RhdGlvbiIgOiBmZWF0dXJlX2dyb3VwX2RhY2MxOGZiNTE4NjQyZGVhMDMyYWExMzkwMjQ2ODQxLCB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICBMLmNvbnRyb2wubGF5ZXJzKAogICAgICAgICAgICAgICAgbGF5ZXJfY29udHJvbF85Y2E1ODU1NDE5NGM0MjliYWZkNDBmZTI2N2JiZDFhNi5iYXNlX2xheWVycywKICAgICAgICAgICAgICAgIGxheWVyX2NvbnRyb2xfOWNhNTg1NTQxOTRjNDI5YmFmZDQwZmUyNjdiYmQxYTYub3ZlcmxheXMsCiAgICAgICAgICAgICAgICB7cG9zaXRpb246ICd0b3ByaWdodCcsCiAgICAgICAgICAgICAgICAgY29sbGFwc2VkOiB0cnVlLAogICAgICAgICAgICAgICAgIGF1dG9aSW5kZXg6IHRydWUKICAgICAgICAgICAgICAgIH0pLmFkZFRvKG1hcF82MDdlMTI4ZDkwZjQ0YmI4YjhmNzhlNDE0MDgzNjIzZSk7CiAgICAgICAgICAgIAogICAgICAgIAo8L3NjcmlwdD4=\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x7f2cfc0b8080>"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m = folium.Map(location=[51.5060338196204, -0.128345361445949], \n",
" tiles='CartoDB positron', zoom_start=12)\n",
"\n",
"common_src_station = build_circles_feature_group(diff_weekend.head(30), \n",
" feature_group_name='Common Source Stations',\n",
" color='crimson'\n",
" )\n",
"common_dest_station = build_circles_feature_group(diff_weekend.tail(30), \n",
" feature_group_name='Common Destination Station',\n",
" color='blue'\n",
" )\n",
"common_src_station.add_to(m)\n",
"common_dest_station.add_to(m)\n",
"\n",
"folium.LayerControl().add_to(m)\n",
" \n",
"m"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [],
"source": [
"%%bigquery diff_weekday_morning\n",
"WITH \n",
" start_count AS (\n",
" SELECT\n",
" start_station_name,\n",
" COUNT(1) as start_cnt\n",
" FROM\n",
" `google.com:pso-bq-gis-demo.gis_demo.london_cycle`\n",
" WHERE\n",
" is_same_station IS false\n",
" AND EXTRACT(DAYOFWEEK FROM start_date) NOT IN (1,7)\n",
" AND EXTRACT(HOUR FROM start_date) BETWEEN 8 AND 10\n",
" GROUP BY 1\n",
" ),\n",
" end_count AS (\n",
" SELECT\n",
" end_station_name,\n",
" COUNT(1) as end_cnt\n",
" FROM\n",
" `google.com:pso-bq-gis-demo.gis_demo.london_cycle`\n",
" WHERE\n",
" is_same_station IS false\n",
" AND EXTRACT(DAYOFWEEK FROM start_date) NOT IN (1,7)\n",
" AND EXTRACT(HOUR FROM start_date) BETWEEN 8 AND 10\n",
" GROUP BY 1\n",
" )\n",
"SELECT\n",
" a.start_station_name AS station_name,\n",
" ST_ASGEOJSON(ST_GEOGPOINT(c.longitude, c.latitude)) geog,\n",
" a.start_cnt,\n",
" b.end_cnt,\n",
" a.start_cnt - b.end_cnt AS diff\n",
"FROM\n",
" start_count a\n",
"JOIN\n",
" end_count b\n",
"ON\n",
" a.start_station_name = b.end_station_name\n",
"JOIN\n",
" `google.com:pso-bq-gis-demo.gis_demo.cycle_stations` c\n",
"ON \n",
" a.start_station_name = c.name\n",
"ORDER BY 5 DESC"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>station_name</th>\n",
" <th>geog</th>\n",
" <th>start_cnt</th>\n",
" <th>end_cnt</th>\n",
" <th>diff</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Belgrove Street , King's Cross</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.12361682...</td>\n",
" <td>20188</td>\n",
" <td>2268</td>\n",
" <td>17920</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Waterloo Station 1, Waterloo</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.11386436...</td>\n",
" <td>15854</td>\n",
" <td>1699</td>\n",
" <td>14155</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Waterloo Station 3, Waterloo</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.11282408...</td>\n",
" <td>14088</td>\n",
" <td>808</td>\n",
" <td>13280</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Waterloo Station 2, Waterloo</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.11342629...</td>\n",
" <td>8131</td>\n",
" <td>114</td>\n",
" <td>8017</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Drummond Street , Euston</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.13605286...</td>\n",
" <td>2957</td>\n",
" <td>420</td>\n",
" <td>2537</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>Kennington Cross, Kennington</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.11143579...</td>\n",
" <td>3007</td>\n",
" <td>491</td>\n",
" <td>2516</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>749</th>\n",
" <td>Red Lion Street, Holborn</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.11655, 5...</td>\n",
" <td>803</td>\n",
" <td>4539</td>\n",
" <td>-3736</td>\n",
" </tr>\n",
" <tr>\n",
" <th>750</th>\n",
" <td>Moorfields, Moorgate</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.08828537...</td>\n",
" <td>2449</td>\n",
" <td>6215</td>\n",
" <td>-3766</td>\n",
" </tr>\n",
" <tr>\n",
" <th>751</th>\n",
" <td>Malet Street, Bloomsbury</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.13043172...</td>\n",
" <td>1016</td>\n",
" <td>5292</td>\n",
" <td>-4276</td>\n",
" </tr>\n",
" <tr>\n",
" <th>752</th>\n",
" <td>Soho Square , Soho</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.13232883...</td>\n",
" <td>497</td>\n",
" <td>5963</td>\n",
" <td>-5466</td>\n",
" </tr>\n",
" <tr>\n",
" <th>753</th>\n",
" <td>Newgate Street , St. Paul's</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.09885091...</td>\n",
" <td>819</td>\n",
" <td>7749</td>\n",
" <td>-6930</td>\n",
" </tr>\n",
" <tr>\n",
" <th>754</th>\n",
" <td>Holborn Circus, Holborn</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.10865743...</td>\n",
" <td>664</td>\n",
" <td>10229</td>\n",
" <td>-9565</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>755 rows × 5 columns</p>\n",
"</div>"
],
"text/plain": [
" station_name \\\n",
"0 Belgrove Street , King's Cross \n",
"1 Waterloo Station 1, Waterloo \n",
"2 Waterloo Station 3, Waterloo \n",
"3 Waterloo Station 2, Waterloo \n",
"4 Drummond Street , Euston \n",
"5 Kennington Cross, Kennington \n",
".. ... \n",
"749 Red Lion Street, Holborn \n",
"750 Moorfields, Moorgate \n",
"751 Malet Street, Bloomsbury \n",
"752 Soho Square , Soho \n",
"753 Newgate Street , St. Paul's \n",
"754 Holborn Circus, Holborn \n",
"\n",
" geog start_cnt end_cnt \\\n",
"0 { \"type\": \"Point\", \"coordinates\": [-0.12361682... 20188 2268 \n",
"1 { \"type\": \"Point\", \"coordinates\": [-0.11386436... 15854 1699 \n",
"2 { \"type\": \"Point\", \"coordinates\": [-0.11282408... 14088 808 \n",
"3 { \"type\": \"Point\", \"coordinates\": [-0.11342629... 8131 114 \n",
"4 { \"type\": \"Point\", \"coordinates\": [-0.13605286... 2957 420 \n",
"5 { \"type\": \"Point\", \"coordinates\": [-0.11143579... 3007 491 \n",
".. ... ... ... \n",
"749 { \"type\": \"Point\", \"coordinates\": [-0.11655, 5... 803 4539 \n",
"750 { \"type\": \"Point\", \"coordinates\": [-0.08828537... 2449 6215 \n",
"751 { \"type\": \"Point\", \"coordinates\": [-0.13043172... 1016 5292 \n",
"752 { \"type\": \"Point\", \"coordinates\": [-0.13232883... 497 5963 \n",
"753 { \"type\": \"Point\", \"coordinates\": [-0.09885091... 819 7749 \n",
"754 { \"type\": \"Point\", \"coordinates\": [-0.10865743... 664 10229 \n",
"\n",
" diff \n",
"0 17920 \n",
"1 14155 \n",
"2 13280 \n",
"3 8017 \n",
"4 2537 \n",
"5 2516 \n",
".. ... \n",
"749 -3736 \n",
"750 -3766 \n",
"751 -4276 \n",
"752 -5466 \n",
"753 -6930 \n",
"754 -9565 \n",
"\n",
"[755 rows x 5 columns]"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"diff_weekday_morning"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVM9ZmFsc2U7IExfTk9fVE9VQ0g9ZmFsc2U7IExfRElTQUJMRV8zRD1mYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS40LjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NvZGUuanF1ZXJ5LmNvbS9qcXVlcnktMS4xMi40Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS40LjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdjZG4uZ2l0aGFjay5jb20vcHl0aG9uLXZpc3VhbGl6YXRpb24vZm9saXVtL21hc3Rlci9mb2xpdW0vdGVtcGxhdGVzL2xlYWZsZXQuYXdlc29tZS5yb3RhdGUuY3NzIi8+CiAgICA8c3R5bGU+aHRtbCwgYm9keSB7d2lkdGg6IDEwMCU7aGVpZ2h0OiAxMDAlO21hcmdpbjogMDtwYWRkaW5nOiAwO308L3N0eWxlPgogICAgPHN0eWxlPiNtYXAge3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO3JpZ2h0OjA7bGVmdDowO308L3N0eWxlPgogICAgCiAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLAogICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgIDxzdHlsZT4jbWFwXzdhZTMwNjhhYTBlODQ4YWE5ZWEyOWFiMzczZTYwNzRhIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDEwMC4wJTsKICAgICAgICBoZWlnaHQ6IDEwMC4wJTsKICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgIHRvcDogMC4wJTsKICAgICAgICB9CiAgICA8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgPGRpdiBjbGFzcz0iZm9saXVtLW1hcCIgaWQ9Im1hcF83YWUzMDY4YWEwZTg0OGFhOWVhMjlhYjM3M2U2MDc0YSIgPjwvZGl2Pgo8L2JvZHk+CjxzY3JpcHQ+ICAgIAogICAgCiAgICAKICAgICAgICB2YXIgYm91bmRzID0gbnVsbDsKICAgIAoKICAgIHZhciBtYXBfN2FlMzA2OGFhMGU4NDhhYTllYTI5YWIzNzNlNjA3NGEgPSBMLm1hcCgKICAgICAgICAnbWFwXzdhZTMwNjhhYTBlODQ4YWE5ZWEyOWFiMzczZTYwNzRhJywgewogICAgICAgIGNlbnRlcjogWzUxLjUwNjAzMzgxOTYyMDQsIC0wLjEyODM0NTM2MTQ0NTk0OV0sCiAgICAgICAgem9vbTogMTIsCiAgICAgICAgbWF4Qm91bmRzOiBib3VuZHMsCiAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3LAogICAgICAgIHpvb21Db250cm9sOiB0cnVlLAogICAgICAgIH0pOwoKCiAgICAKICAgIHZhciB0aWxlX2xheWVyXzVlZTlkZTZlMzVkNzQ1N2JiMjU3MzEzMjVkODJiNjcxID0gTC50aWxlTGF5ZXIoCiAgICAgICAgJ2h0dHBzOi8vY2FydG9kYi1iYXNlbWFwcy17c30uZ2xvYmFsLnNzbC5mYXN0bHkubmV0L2xpZ2h0X2FsbC97en0ve3h9L3t5fS5wbmcnLAogICAgICAgIHsKICAgICAgICAiYXR0cmlidXRpb24iOiBudWxsLAogICAgICAgICJkZXRlY3RSZXRpbmEiOiBmYWxzZSwKICAgICAgICAibWF4TmF0aXZlWm9vbSI6IDE4LAogICAgICAgICJtYXhab29tIjogMTgsCiAgICAgICAgIm1pblpvb20iOiAwLAogICAgICAgICJub1dyYXAiOiBmYWxzZSwKICAgICAgICAib3BhY2l0eSI6IDEsCiAgICAgICAgInN1YmRvbWFpbnMiOiAiYWJjIiwKICAgICAgICAidG1zIjogZmFsc2UKfSkuYWRkVG8obWFwXzdhZTMwNjhhYTBlODQ4YWE5ZWEyOWFiMzczZTYwNzRhKTsKICAgIAogICAgICAgICAgICB2YXIgZmVhdHVyZV9ncm91cF8zMDM0Zjg2MjFiYTM0ZTc4OTQyYjU4ZGE1NWE3ZTFjMSA9IEwuZmVhdHVyZUdyb3VwKAogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FlMzA2OGFhMGU4NDhhYTllYTI5YWIzNzNlNjA3NGEpOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX2JhZjdiMTY3MzU3MDRiMDFiZDQ0MGQxMmQyYWE3OGM3ID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTI5OTQzNzEsIC0wLjEyMzYxNjgyNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMjAwLjAsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMzAzNGY4NjIxYmEzNGU3ODk0MmI1OGRhNTVhN2UxYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV9iYWY3YjE2NzM1NzA0YjAxYmQ0NDBkMTJkMmFhNzhjNy5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBCZWxncm92ZSBTdHJlZXQgLCBLaW5nJ3MgQ3Jvc3M6IDE3OTIwYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV8zNDM3NWUwNTAxMzI0OGI3OWRjMjgzMDU0YjBmNzUwYiA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUwNDAyNzk0LCAtMC4xMTM4NjQzNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTU3Ljk3OTkxMDcxNDI4NTcyLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzMwMzRmODYyMWJhMzRlNzg5NDJiNThkYTU1YTdlMWMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfMzQzNzVlMDUwMTMyNDhiNzlkYzI4MzA1NGIwZjc1MGIuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgV2F0ZXJsb28gU3RhdGlvbiAxLCBXYXRlcmxvbzogMTQxNTVgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX2IzYTY1OTA2MTJlNjRmM2U5ZjE0NmExMmUyNGYxODE5ID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTAzNzkxNjgsIC0wLjExMjgyNDA4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxNDguMjE0Mjg1NzE0Mjg1NzIsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMzAzNGY4NjIxYmEzNGU3ODk0MmI1OGRhNTVhN2UxYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV9iM2E2NTkwNjEyZTY0ZjNlOWYxNDZhMTJlMjRmMTgxOS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBXYXRlcmxvbyBTdGF0aW9uIDMsIFdhdGVybG9vOiAxMzI4MGAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfMTk0N2EyNzJhNjliNDg1MmJiMmQzMzkyNjVjNzA4NjAgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MDM5MTk3MywgLTAuMTEzNDI2MjldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDg5LjQ3NTQ0NjQyODU3MTQzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzMwMzRmODYyMWJhMzRlNzg5NDJiNThkYTU1YTdlMWMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfMTk0N2EyNzJhNjliNDg1MmJiMmQzMzkyNjVjNzA4NjAuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgV2F0ZXJsb28gU3RhdGlvbiAyLCBXYXRlcmxvbzogODAxN2AgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfN2RkMGU1NzkyOWU2NDA4MzhmMGEwODE3NWFjNGRjNjIgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MjczMjYsIC0wLjEzNjA1Mjg2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAyOC4zMTQ3MzIxNDI4NTcxNDIsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMzAzNGY4NjIxYmEzNGU3ODk0MmI1OGRhNTVhN2UxYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV83ZGQwZTU3OTI5ZTY0MDgzOGYwYTA4MTc1YWM0ZGM2Mi5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBEcnVtbW9uZCBTdHJlZXQgLCBFdXN0b246IDI1MzdgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzZhZjE0MzFlMDUyMzQxNzNiYmZlYjk1OGMzZDRkN2E3ID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNDg4OTQwMjIsIC0wLjExMTQzNTc5Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMjguMDgwMzU3MTQyODU3MTQyLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzMwMzRmODYyMWJhMzRlNzg5NDJiNThkYTU1YTdlMWMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfNmFmMTQzMWUwNTIzNDE3M2JiZmViOTU4YzNkNGQ3YTcuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgS2VubmluZ3RvbiBDcm9zcywgS2VubmluZ3RvbjogMjUxNmAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfM2Y2NTk4NTY4OWZjNDc4MzgyOWNhNDUwN2Q1ZTY3NTQgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MzM1NiwgLTAuMDkzMTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDI3LjkwMTc4NTcxNDI4NTcxNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8zMDM0Zjg2MjFiYTM0ZTc4OTQyYjU4ZGE1NWE3ZTFjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzNmNjU5ODU2ODlmYzQ3ODM4MjljYTQ1MDdkNWU2NzU0LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEVhZ2xlIFdoYXJmIFJvYWQsIEhveHRvbjogMjUwMGAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfNjZhMGY5ZGY5MWExNDdmYWFmZDAzYmIwZTViZGY0OWIgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MTE2NTQsIC0wLjE3OTY2OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMjIuNDMzMDM1NzE0Mjg1NzE1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzMwMzRmODYyMWJhMzRlNzg5NDJiNThkYTU1YTdlMWMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfNjZhMGY5ZGY5MWExNDdmYWFmZDAzYmIwZTViZGY0OWIuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgTGFuY2FzdGVyIEdhdGUgLCBCYXlzd2F0ZXI6IDIwMTBgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzViYmVhYzlkNDJhZDRjZTBhZGY5MWI3ZTdlMWZiNWVlID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTM0NDA4NjgsIC0wLjEwOTAyNTQwNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMjIuNDIxODc1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzMwMzRmODYyMWJhMzRlNzg5NDJiNThkYTU1YTdlMWMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfNWJiZWFjOWQ0MmFkNGNlMGFkZjkxYjdlN2UxZmI1ZWUuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgQ2xvdWRlc2xleSBSb2FkLCBBbmdlbDogMjAwOWAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfNWZlYTRjNDExZWJiNGUwMzhmMTAxNjcwNWVhOGJlZmQgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MzQwNDI5NCwgLTAuMDg2Mzc5NzE3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAyMS45NzU0NDY0Mjg1NzE0MywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8zMDM0Zjg2MjFiYTM0ZTc4OTQyYjU4ZGE1NWE3ZTFjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzVmZWE0YzQxMWViYjRlMDM4ZjEwMTY3MDVlYThiZWZkLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYFNob3JlZGl0Y2ggUGFyaywgSG94dG9uOiAxOTY5YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV8yN2RkNmZmMjM1ZGI0ZWFlOTAwZWY4NWYzYTRmNWQwNiA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUzNjU4NTE0LCAtMC4wNzU4ODU2ODZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDIxLjAxNTYyNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8zMDM0Zjg2MjFiYTM0ZTc4OTQyYjU4ZGE1NWE3ZTFjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzI3ZGQ2ZmYyMzVkYjRlYWU5MDBlZjg1ZjNhNGY1ZDA2LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYER1bnN0b24gUm9hZCAsIEhhZ2dlcnN0b246IDE4ODNgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX2ZhMWRiZGUyNzhkNTRmNTliZTc2M2Y1MzEwZWMzNWQwID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNDc3ODM5LCAtMC4xMTY0OTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDIwLjc3MDA4OTI4NTcxNDI4NSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8zMDM0Zjg2MjFiYTM0ZTc4OTQyYjU4ZGE1NWE3ZTFjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2ZhMWRiZGUyNzhkNTRmNTliZTc2M2Y1MzEwZWMzNWQwLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYENhbGR3ZWxsIFN0cmVldCwgU3RvY2t3ZWxsOiAxODYxYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV8wMDEyYTc5ZmI3ZWI0N2VhODhjNzY5MWVkNWJiZjA4OSA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUyODgzMzgsIC0wLjEzMjI1MDM2OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMjAuNzAzMTI1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzMwMzRmODYyMWJhMzRlNzg5NDJiNThkYTU1YTdlMWMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfMDAxMmE3OWZiN2ViNDdlYTg4Yzc2OTFlZDViYmYwODkuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgRG9yaWMgV2F5ICwgU29tZXJzIFRvd246IDE4NTVgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzA1ZTZhNmRhMDJkODQzYTQ4YmVjZDgwOGZiYzhiMWZiID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTEzMDc0LCAtMC4wNjQwOTRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDE5LjA3MzY2MDcxNDI4NTcxNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8zMDM0Zjg2MjFiYTM0ZTc4OTQyYjU4ZGE1NWE3ZTFjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzA1ZTZhNmRhMDJkODQzYTQ4YmVjZDgwOGZiYzhiMWZiLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYENocmlzdGlhbiBTdHJlZXQsIFdoaXRlY2hhcGVsOiAxNzA5YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV83NjZhNTAxNDc3OTc0NjVhYTYxMTI1MzBjMDIwYmQwNyA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUyMjUxMSwgLTAuMTYyMjk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxOS4wNDAxNzg1NzE0Mjg1NywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8zMDM0Zjg2MjFiYTM0ZTc4OTQyYjU4ZGE1NWE3ZTFjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzc2NmE1MDE0Nzc5NzQ2NWFhNjExMjUzMGMwMjBiZDA3LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEJvc3RvbiBQbGFjZSwgTWFyeWxlYm9uZTogMTcwNmAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfODRjNzc1ODNjYjJhNDhlYzg0OTc4ZDViMTc5NTc2NjUgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MzkzMjg1NywgLTAuMDc0Mjg0Njc1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxOC4zMzcwNTM1NzE0Mjg1NzMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMzAzNGY4NjIxYmEzNGU3ODk0MmI1OGRhNTVhN2UxYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV84NGM3NzU4M2NiMmE0OGVjODQ5NzhkNWIxNzk1NzY2NS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBIYWdnZXJzdG9uIFJvYWQsIEhhZ2dlcnN0b246IDE2NDNgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX2UwMjljZWEzNmQ4YTRjZGFhMDg5ODg1MzVkNWU4YjNiID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTI2ODM4MDYsIC0wLjEzMDUwNDMzNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTcuNTQ0NjQyODU3MTQyODU0LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzMwMzRmODYyMWJhMzRlNzg5NDJiNThkYTU1YTdlMWMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfZTAyOWNlYTM2ZDhhNGNkYWEwODk4ODUzNWQ1ZThiM2IuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgRW5kc2xlaWdoIEdhcmRlbnMsIEV1c3RvbjogMTU3MmAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfYmQ0MTQ2OTFmZWZjNGZkODkxMzJlYTRkZTRjMDQ3ODUgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MzU1OCwgLTAuMDgyNDldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDE3LjM0Mzc1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzMwMzRmODYyMWJhMzRlNzg5NDJiNThkYTU1YTdlMWMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfYmQ0MTQ2OTFmZWZjNGZkODkxMzJlYTRkZTRjMDQ3ODUuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgUGl0ZmllbGQgU3RyZWV0IE5vcnRoLEhveHRvbjogMTU1NGAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfZjVhNWE3OGQyYjNjNDdkNmE3NjlmYjcwYzZmNzhmMmYgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MzcyNzc5NSwgLTAuMDc5MjAxODQ5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxNy4zNDM3NSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8zMDM0Zjg2MjFiYTM0ZTc4OTQyYjU4ZGE1NWE3ZTFjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2Y1YTVhNzhkMmIzYzQ3ZDZhNzY5ZmI3MGM2Zjc4ZjJmLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEhlcnRmb3JkIFJvYWQsIERlIEJlYXV2b2lyIFRvd246IDE1NTRgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzYzOGNkOTJiMGQ4YjRiYmQ5NDdhOGFhOWE0ZWZkMTdiID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNDkzMjA0NDUsIC0wLjE0NDEzMjg3NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTcuMDc1ODkyODU3MTQyODU4LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzMwMzRmODYyMWJhMzRlNzg5NDJiNThkYTU1YTdlMWMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfNjM4Y2Q5MmIwZDhiNGJiZDk0N2E4YWE5YTRlZmQxN2IuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgQmVsZ3JhdmUgUm9hZCwgVmljdG9yaWE6IDE1MzBgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzM0MWQ0NzRjN2VlNjRhMWNiNTE1OWUyNGQwNzFmZTIyID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTExMDg4LCAtMC4wNTcxNTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDE2LjQ5NTUzNTcxNDI4NTcxNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8zMDM0Zjg2MjFiYTM0ZTc4OTQyYjU4ZGE1NWE3ZTFjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzM0MWQ0NzRjN2VlNjRhMWNiNTE1OWUyNGQwNzFmZTIyLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYFNoYWR3ZWxsIFN0YXRpb24sIFNoYWR3ZWxsOiAxNDc4YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9mODY2MDg4MGFkMjU0YjhjOTU1OGE3ZjQ5ZjY4ZGZhNCA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUxNjc4MDIzLCAtMC4xNzU0ODg4MDNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDE2LjQ3MzIxNDI4NTcxNDI4NSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8zMDM0Zjg2MjFiYTM0ZTc4OTQyYjU4ZGE1NWE3ZTFjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2Y4NjYwODgwYWQyNTRiOGM5NTU4YTdmNDlmNjhkZmE0LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYFdpbnNsYW5kIFN0cmVldCwgUGFkZGluZ3RvbjogMTQ3NmAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfMjk4OWQxOTE5ODI5NGIxY2JhNGNjOTYwOWRmMThiMGQgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS40ODY5MjkxNywgLTAuMTAyOTk2Mjk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxNi4wODI1ODkyODU3MTQyODUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMzAzNGY4NjIxYmEzNGU3ODk0MmI1OGRhNTVhN2UxYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV8yOTg5ZDE5MTk4Mjk0YjFjYmE0Y2M5NjA5ZGYxOGIwZC5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBEb2RkaW5ndG9uIEdyb3ZlLCBLZW5uaW5ndG9uOiAxNDQxYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9iY2FjNmJjNmNkYmI0YzcyYWQ0Y2MxNDE0ZGVhYWZmNyA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUyOTQyMywgLTAuMDk3MTIyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxNi4wMjY3ODU3MTQyODU3MTUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMzAzNGY4NjIxYmEzNGU3ODk0MmI1OGRhNTVhN2UxYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV9iY2FjNmJjNmNkYmI0YzcyYWQ0Y2MxNDE0ZGVhYWZmNy5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBNYWNjbGVzZmllbGQgUmQsIFN0IEx1a2VzOiAxNDM2YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9jMzdhN2E0YWNjM2M0OTQzODYxNGI1M2RmZGY0NDI0ZiA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjQ5NTA2MTA5LCAtMC4wODU4MTQ0ODldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDE1LjY2OTY0Mjg1NzE0Mjg1OCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8zMDM0Zjg2MjFiYTM0ZTc4OTQyYjU4ZGE1NWE3ZTFjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2MzN2E3YTRhY2MzYzQ5NDM4NjE0YjUzZGZkZjQ0MjRmLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEJyaWNrbGF5ZXJzIEFybXMsIEJvcm91Z2g6IDE0MDRgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzc1YTZlZjNhMWU5MTQzNzRhZTQ2MjExMzY3NDA4OWEwID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTQxNjAzLCAtMC4xMzg4NTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDE1LjQ3OTkxMDcxNDI4NTcxNCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8zMDM0Zjg2MjFiYTM0ZTc4OTQyYjU4ZGE1NWE3ZTFjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzc1YTZlZjNhMWU5MTQzNzRhZTQ2MjExMzY3NDA4OWEwLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEJvbm55IFN0cmVldCwgQ2FtZGVuIFRvd246IDEzODdgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzk4Y2VjMTc3MjYwNzRlM2Y4MzZhNDgwMTgzYmIzM2YwID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNDkyODgwNjcsIC0wLjExNDkzNDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTUuMzM0ODIxNDI4NTcxNDI5LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzMwMzRmODYyMWJhMzRlNzg5NDJiNThkYTU1YTdlMWMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfOThjZWMxNzcyNjA3NGUzZjgzNmE0ODAxODNiYjMzZjAuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgTG9sbGFyZCBTdHJlZXQsIFZhdXhoYWxsOiAxMzc0YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9lZDU0YmIxMjllOTM0MTFiYjFkYmRhYWNmOGM1M2Y5YyA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUyODY4MTU1LCAtMC4wNjU1NTAzMjFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDE1LjMwMTMzOTI4NTcxNDI4NSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF8zMDM0Zjg2MjFiYTM0ZTc4OTQyYjU4ZGE1NWE3ZTFjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2VkNTRiYjEyOWU5MzQxMWJiMWRiZGFhY2Y4YzUzZjljLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYER1cmFudCBTdHJlZXQsIEJldGhuYWwgR3JlZW46IDEzNzFgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzViNTlkZjdmOTBhNzQ1YjZhOGRkODQwYmU4ZDNlN2YzID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNDkxNDg0NzQsIC0wLjA5MDIyMDkxMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTUuMjY3ODU3MTQyODU3MTQ0LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzMwMzRmODYyMWJhMzRlNzg5NDJiNThkYTU1YTdlMWMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfNWI1OWRmN2Y5MGE3NDViNmE4ZGQ4NDBiZThkM2U3ZjMuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgUm9kbmV5IFJvYWQgLCBXYWx3b3J0aDogMTM2OGAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfMGMxYTc4OTU2MzliNDY3Y2E0MzcxMWRiMWM3NWY1MTcgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MTEwNjYsIC0wLjA1MzU1OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTQuOTIxODc1MDAwMDAwMDAyLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwXzMwMzRmODYyMWJhMzRlNzg5NDJiNThkYTU1YTdlMWMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfMGMxYTc4OTU2MzliNDY3Y2E0MzcxMWRiMWM3NWY1MTcuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgU3V0dG9uIFN0cmVldCwgU2hhZHdlbGw6IDEzMzdgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBmZWF0dXJlX2dyb3VwX2Y1MWI3ODc1MTZkZjQ1MDk4NzUwODI5ODgxMzYxYTMyID0gTC5mZWF0dXJlR3JvdXAoCiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWUzMDY4YWEwZTg0OGFhOWVhMjlhYjM3M2U2MDc0YSk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfZmU4N2UwMTBhOWFkNDJhNmE1OWM1MmNjMDdmZWVhM2UgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MTU4MDk5OCwgLTAuMTA1MjcwMjc1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA0Ni4wMDEwNDU0NzgzMDYzMjQsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZjUxYjc4NzUxNmRmNDUwOTg3NTA4Mjk4ODEzNjFhMzIpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV9mZTg3ZTAxMGE5YWQ0MmE2YTU5YzUyY2MwN2ZlZWEzZS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBTdG9uZWN1dHRlciBTdHJlZXQsIEhvbGJvcm46IC0yMjAwYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9iZmEyM2RlZGNiMjc0NmU3OWRiMzA1ZjU2ZTExNWNjMyA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUyMDk5NCwgLTAuMTM5MDE2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA0Ni4yMzEwNTA3MDU2OTc4NTQsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZjUxYjc4NzUxNmRmNDUwOTg3NTA4Mjk4ODEzNjFhMzIpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV9iZmEyM2RlZGNiMjc0NmU3OWRiMzA1ZjU2ZTExNWNjMy5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBIb3dsYW5kIFN0cmVldCwgRml0enJvdmlhOiAtMjIxMWAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfOWFjYWQ4NGFmMDUzNGE5MmE4OWVkODRkMjUzYTM0NmMgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MjEyODM3NywgLTAuMDg0NjA1NjkyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA0Ni42MDc0MjI4OTU5NzQ5MDYsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZjUxYjc4NzUxNmRmNDUwOTg3NTA4Mjk4ODEzNjFhMzIpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV85YWNhZDg0YWYwNTM0YTkyYTg5ZWQ4NGQyNTNhMzQ2Yy5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBDaHJpc3RvcGhlciBTdHJlZXQsIExpdmVycG9vbCBTdHJlZXQ6IC0yMjI5YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV85ZjBkNjJjZWViOGU0OWU0ODcwOTFmMmMyZTNhMjRkYiA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUwMTAyNjY4LCAtMC4xODAyNDYxMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDQ5LjU3NjU4MTI4NTkzODMyLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2Y1MWI3ODc1MTZkZjQ1MDk4NzUwODI5ODgxMzYxYTMyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfOWYwZDYyY2VlYjhlNDllNDg3MDkxZjJjMmUzYTI0ZGIuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgUXVlZW4ncyBHYXRlIChOb3J0aCksIEtlbnNpbmd0b246IC0yMzcxYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9jZmY0YjkzYmUyODM0NGQwYWIxYjcxYTQ2YTQ3ODM3ZiA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUwNjYxMywgLTAuMTQyODQ0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1MC4wNzg0MTA4NzI5NzQzOSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9mNTFiNzg3NTE2ZGY0NTA5ODc1MDgyOTg4MTM2MWEzMik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2NmZjRiOTNiZTI4MzQ0ZDBhYjFiNzFhNDZhNDc4MzdmLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEdyZWVuIFBhcmsgU3RhdGlvbiwgTWF5ZmFpcjogLTIzOTVgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzRkNTU0YjQxM2JiZjQ5MWY5NWI0YjkwY2FlMWU1MDc5ID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTE5MDgwMTEsIC0wLjEyNDY3ODQwMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNTEuNjI1NzE4NzY2MzM1NTk1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2Y1MWI3ODc1MTZkZjQ1MDk4NzUwODI5ODgxMzYxYTMyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfNGQ1NTRiNDEzYmJmNDkxZjk1YjRiOTBjYWUxZTUwNzkuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgQnJpdGlzaCBNdXNldW0sIEJsb29tc2J1cnk6IC0yNDY5YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9mN2FkZjQxZGU5ZTA0YmM5ODhkODg1Y2Y0NGI2YjExNiA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUxMjQ4NDQ1LCAtMC4wOTkxNDE0MDhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUyLjE2OTM2NzQ4NTYyNDY3NiwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9mNTFiNzg3NTE2ZGY0NTA5ODc1MDgyOTg4MTM2MWEzMik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2Y3YWRmNDFkZTllMDRiYzk4OGQ4ODVjZjQ0YjZiMTE2LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEdvZGxpbWFuIFN0cmVldCwgU3QuIFBhdWwnczogLTI0OTVgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzI5ZjFiZjJmOWQyZDRjNmY4NWU4NGVlNzgyMjJlNTdiID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNDk1NTkyOTEsIC0wLjE3OTA3NzYyNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNTIuNDQxMTkxODQ1MjY5MjEsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZjUxYjc4NzUxNmRmNDUwOTg3NTA4Mjk4ODEzNjFhMzIpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV8yOWYxYmYyZjlkMmQ0YzZmODVlODRlZTc4MjIyZTU3Yi5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBOYXR1cmFsIEhpc3RvcnkgTXVzZXVtLCBTb3V0aCBLZW5zaW5ndG9uOiAtMjUwOGAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfZGVmNjhmNDJmNTg4NDc2MjhhODNhNWE5N2JmNjZiZjQgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MjA1OTY4MSwgLTAuMTE2Njg4NDY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1Mi44NTkzODMxNjc3OTkyNjUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZjUxYjc4NzUxNmRmNDUwOTg3NTA4Mjk4ODEzNjFhMzIpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV9kZWY2OGY0MmY1ODg0NzYyOGE4M2E1YTk3YmY2NmJmNC5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBUaGVvYmFsZCdzIFJvYWQgLCBIb2xib3JuOiAtMjUyOGAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfM2I0MTc1MDI2MzNjNDg3Mjk3YTdkYjUyOTk4OGIxNDUgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MTE5NjgwMywgLTAuMTIwNzE4NzU5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1My4yOTg0ODQwNTY0NTU4MzQsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZjUxYjc4NzUxNmRmNDUwOTg3NTA4Mjk4ODEzNjFhMzIpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV8zYjQxNzUwMjYzM2M0ODcyOTdhN2RiNTI5OTg4YjE0NS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBUYXZpc3RvY2sgU3RyZWV0LCBDb3ZlbnQgR2FyZGVuOiAtMjU0OWAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfNDFkNTJiYzZlNzZjNGY4NWJjNDg0Nzg3MGIwODFlNzYgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MTczNDQwMywgLTAuMTM4MDcyNjkxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1Ni4wMzc2MzcyMTkwMjc3LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2Y1MWI3ODc1MTZkZjQ1MDk4NzUwODI5ODgxMzYxYTMyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfNDFkNTJiYzZlNzZjNGY4NWJjNDg0Nzg3MGIwODFlNzYuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgV2VsbHMgU3RyZWV0LCBGaXR6cm92aWE6IC0yNjgwYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV8zYWUxOTdjMzczMDY0MjQzODAwNzVmMmVkMjI5M2I4NyA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUyMTY2MTIsIC0wLjEwOTAwNjMyNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNTcuNTAxMzA2ODQ3ODgyOSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9mNTFiNzg3NTE2ZGY0NTA5ODc1MDgyOTg4MTM2MWEzMik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzNhZTE5N2MzNzMwNjQyNDM4MDA3NWYyZWQyMjkzYjg3LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEhhdHRvbiBXYWxsLCBIb2xib3JuOiAtMjc1MGAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfYmIwMjhmMTY4ZjY1NDJlMzk5ZGI0ZDMwNGMyMzgwMDYgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MTg4MjU1NSwgLTAuMTA4MDI4NDcyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1OC45MDIyNDc3NzgzNTg2LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2Y1MWI3ODc1MTZkZjQ1MDk4NzUwODI5ODgxMzYxYTMyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfYmIwMjhmMTY4ZjY1NDJlMzk5ZGI0ZDMwNGMyMzgwMDYuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgSGF0dG9uIEdhcmRlbiwgSG9sYm9ybjogLTI4MTdgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzI0M2ZmYjk4MTY3NDQ1ZTI5NzJlZDEwYjViMDNiZmZkID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTE4OTA4LCAtMC4wNzkyNDldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDYxLjIwMjMwMDA1MjI3MzkyLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2Y1MWI3ODc1MTZkZjQ1MDk4NzUwODI5ODgxMzYxYTMyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfMjQzZmZiOTgxNjc0NDVlMjk3MmVkMTBiNWIwM2JmZmQuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgQnJ1c2hmaWVsZCBTdHJlZXQsIExpdmVycG9vbCBTdHJlZXQ6IC0yOTI3YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9hNzVlYmE5OTBmM2E0MzU4OGFkYjM0NzBjOTRjN2M1NiA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUyNDY5NjI0LCAtMC4wODQ0MzkyODNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDYyLjk1ODcwMzYwNjkwMDE2LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2Y1MWI3ODc1MTZkZjQ1MDk4NzUwODI5ODgxMzYxYTMyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfYTc1ZWJhOTkwZjNhNDM1ODhhZGIzNDcwYzk0YzdjNTYuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgTGVvbmFyZCBDaXJjdXMgLCBTaG9yZWRpdGNoOiAtMzAxMWAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfNmI3MDBiM2NmZWUxNDkyYjhmYzEzMzc2MGU1YjlkYWQgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS40OTk5MTcsIC0wLjE3NDU1NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNjMuMDYzMjUxNDM3NTMyNjgsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZjUxYjc4NzUxNmRmNDUwOTg3NTA4Mjk4ODEzNjFhMzIpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV82YjcwMGIzY2ZlZTE0OTJiOGZjMTMzNzYwZTViOWRhZC5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBFeGhpYml0aW9uIFJvYWQsIEtuaWdodHNicmlkZ2U6IC0zMDE2YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9hNGNhODVmNTg0ZmQ0NTRmOTE3YjY4YjVmZTAwMDEwYiA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUxOTY1NiwgLTAuMTMyMzM5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA2NC41Njg3NDAxOTg2NDA4NywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9mNTFiNzg3NTE2ZGY0NTA5ODc1MDgyOTg4MTM2MWEzMik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2E0Y2E4NWY1ODRmZDQ1NGY5MTdiNjhiNWZlMDAwMTBiLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEFsZnJlZCBQbGFjZSwgQmxvb21zYnVyeTogLTMwODhgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX2MyZjA5YWI4ODIxMTQ4NTlhMTk2ZTJmNDUxNDdiN2Y1ID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTE0NjE5OTUsIC0wLjEzNzg0MTMzM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNjcuODUxNTQyMDgwNTAxODMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZjUxYjc4NzUxNmRmNDUwOTg3NTA4Mjk4ODEzNjFhMzIpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV9jMmYwOWFiODgyMTE0ODU5YTE5NmUyZjQ1MTQ3YjdmNS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBHcmVhdCBNYXJsYm9yb3VnaCBTdHJlZXQsIFNvaG86IC0zMjQ1YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV8wZTQ5OWJmNzdlYjk0MjRjOTBkZTNjOWJjYzA2MjgxYyA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjQ5ODEyNTU5LCAtMC4xMzIxMDIxNjZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDY5LjE0NzkzNTE4MDM0NTAyLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2Y1MWI3ODc1MTZkZjQ1MDk4NzUwODI5ODgxMzYxYTMyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfMGU0OTliZjc3ZWI5NDI0YzkwZGUzYzliY2MwNjI4MWMuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgQWJiZXkgT3JjaGFyZCBTdHJlZXQsIFdlc3RtaW5zdGVyOiAtMzMwN2AgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfMDk1MzAyMDE4Yzg5NGY5ODk3NzJmYzRjZDU1YjJlZWUgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MTc4MjE0NCwgLTAuMDk2NDk2ODY1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA3MS45MDc5OTc5MDkwNDMzOSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9mNTFiNzg3NTE2ZGY0NTA5ODc1MDgyOTg4MTM2MWEzMik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzA5NTMwMjAxOGM4OTRmOTg5NzcyZmM0Y2Q1NWIyZWVlLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYE11c2V1bSBvZiBMb25kb24sIEJhcmJpY2FuOiAtMzQzOWAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfNDY4ODZkN2ZlYjQ5NDE0YmExYzRjZWUzMDNjM2U5YmEgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MDU4MTc3NiwgLTAuMTAwMTg2MzM3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA3Ni4yOTkwMDY3OTU2MDg5OSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9mNTFiNzg3NTE2ZGY0NTA5ODc1MDgyOTg4MTM2MWEzMik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzQ2ODg2ZDdmZWI0OTQxNGJhMWM0Y2VlMzAzYzNlOWJhLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEJhbmtzaWRlIE1peCwgQmFua3NpZGU6IC0zNjQ5YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV8zYmQwZTdkNzA0ZTc0NzVmOThmYTM4MGU0Y2M1YWYyNiA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUwNzQyNDg1LCAtMC4xMzQ2MjEyMDldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDc2Ljg4NDQ3NDY0NzE1MTA3LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2Y1MWI3ODc1MTZkZjQ1MDk4NzUwODI5ODgxMzYxYTMyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfM2JkMGU3ZDcwNGU3NDc1Zjk4ZmEzODBlNGNjNWFmMjYuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgU3QuIEphbWVzJ3MgU3F1YXJlLCBTdC4gSmFtZXMnczogLTM2NzdgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzcxMmNmM2MxN2JkZjRjNjA5OWYxZDY5NTIyYjE4MWVlID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTEzOTcwNjUsIC0wLjA5Mjk0MDMxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA3Ny4yODE3NTY0MDM1NTQ2MiwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9mNTFiNzg3NTE2ZGY0NTA5ODc1MDgyOTg4MTM2MWEzMik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzcxMmNmM2MxN2JkZjRjNjA5OWYxZDY5NTIyYjE4MWVlLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYENoZWFwc2lkZSwgQmFuazogLTM2OTZgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX2VlOTFhMzc5NTlkODRiY2E4M2FiODA5ZGZlMWM1OTljID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTIyODUzMDEsIC0wLjA5OTk5NDA1Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNzcuODg4MTMzODIxMjIzMiwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9mNTFiNzg3NTE2ZGY0NTA5ODc1MDgyOTg4MTM2MWEzMik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2VlOTFhMzc5NTlkODRiY2E4M2FiODA5ZGZlMWM1OTljLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEJlcnJ5IFN0cmVldCwgQ2xlcmtlbndlbGw6IC0zNzI1YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV82ZTExN2U5MmJkOTI0MjkwYjNmZmNjYjE2MTMwOWU3OCA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUxODI0LCAtMC4xMTY1NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNzguMTE4MTM5MDQ4NjE0NzQsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZjUxYjc4NzUxNmRmNDUwOTg3NTA4Mjk4ODEzNjFhMzIpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV82ZTExN2U5MmJkOTI0MjkwYjNmZmNjYjE2MTMwOWU3OC5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBSZWQgTGlvbiBTdHJlZXQsIEhvbGJvcm46IC0zNzM2YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9kNTFiNmEwYWViMGY0NDcxYmVhZGY0ZWFkMDcyYzUzMSA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUxOTA2OTMyLCAtMC4wODgyODUzNzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDc4Ljc0NTQyNjAzMjQwOTgyLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2Y1MWI3ODc1MTZkZjQ1MDk4NzUwODI5ODgxMzYxYTMyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfZDUxYjZhMGFlYjBmNDQ3MWJlYWRmNGVhZDA3MmM1MzEuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgTW9vcmZpZWxkcywgTW9vcmdhdGU6IC0zNzY2YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV8xYTgwNDg2YjZhMzc0MTA1OGM4ZWNjZjg0YWRiZDM4ZiA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUyMTY4MDc4LCAtMC4xMzA0MzE3MjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDg5LjQwOTMwNDc1NjkyNjI5LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2Y1MWI3ODc1MTZkZjQ1MDk4NzUwODI5ODgxMzYxYTMyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfMWE4MDQ4NmI2YTM3NDEwNThjOGVjY2Y4NGFkYmQzOGYuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgTWFsZXQgU3RyZWV0LCBCbG9vbXNidXJ5OiAtNDI3NmAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfMmY5NDAwYjE5ZTBiNDQwMzk5ZGMzZGUwMTc3ZmNjOWUgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MTU2MzE0NCwgLTAuMTMyMzI4ODM3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxMTQuMjkxNjg4NDQ3NDY0NzEsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZjUxYjc4NzUxNmRmNDUwOTg3NTA4Mjk4ODEzNjFhMzIpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV8yZjk0MDBiMTllMGI0NDAzOTlkYzNkZTAxNzdmY2M5ZS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBTb2hvIFNxdWFyZSAsIFNvaG86IC01NDY2YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV80NTczYWMwOTRlMDc0NDZlOTY0MmIyMDRiODgxNjY0YyA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUxNTQxODYsIC0wLjA5ODg1MDkxNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTQ0LjkwMzI5MzI1NjY2NDk0LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2Y1MWI3ODc1MTZkZjQ1MDk4NzUwODI5ODgxMzYxYTMyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfNDU3M2FjMDk0ZTA3NDQ2ZTk2NDJiMjA0Yjg4MTY2NGMuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgTmV3Z2F0ZSBTdHJlZXQgLCBTdC4gUGF1bCdzOiAtNjkzMGAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfNjEzYzIzZmYyOWQ1NDM5OGIxNDBkZGNjYzVmMTY1ODYgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MTc5NTAyOSwgLTAuMTA4NjU3NDMxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAyMDAuMCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9mNTFiNzg3NTE2ZGY0NTA5ODc1MDgyOTg4MTM2MWEzMik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzYxM2MyM2ZmMjlkNTQzOThiMTQwZGRjY2M1ZjE2NTg2LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEhvbGJvcm4gQ2lyY3VzLCBIb2xib3JuOiAtOTU2NWAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGxheWVyX2NvbnRyb2xfMGVmYzg5MjAzMTg1NDQwZGFiYTc5OGY4YmYwY2QwZjcgPSB7CiAgICAgICAgICAgICAgICBiYXNlX2xheWVycyA6IHsgImNhcnRvZGJwb3NpdHJvbiIgOiB0aWxlX2xheWVyXzVlZTlkZTZlMzVkNzQ1N2JiMjU3MzEzMjVkODJiNjcxLCB9LAogICAgICAgICAgICAgICAgb3ZlcmxheXMgOiB7ICJDb21tb24gU291cmNlIFN0YXRpb25zIiA6IGZlYXR1cmVfZ3JvdXBfMzAzNGY4NjIxYmEzNGU3ODk0MmI1OGRhNTVhN2UxYzEsIkNvbW1vbiBEZXN0aW5hdGlvbiBTdGF0aW9uIiA6IGZlYXR1cmVfZ3JvdXBfZjUxYjc4NzUxNmRmNDUwOTg3NTA4Mjk4ODEzNjFhMzIsIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIEwuY29udHJvbC5sYXllcnMoCiAgICAgICAgICAgICAgICBsYXllcl9jb250cm9sXzBlZmM4OTIwMzE4NTQ0MGRhYmE3OThmOGJmMGNkMGY3LmJhc2VfbGF5ZXJzLAogICAgICAgICAgICAgICAgbGF5ZXJfY29udHJvbF8wZWZjODkyMDMxODU0NDBkYWJhNzk4ZjhiZjBjZDBmNy5vdmVybGF5cywKICAgICAgICAgICAgICAgIHtwb3NpdGlvbjogJ3RvcHJpZ2h0JywKICAgICAgICAgICAgICAgICBjb2xsYXBzZWQ6IHRydWUsCiAgICAgICAgICAgICAgICAgYXV0b1pJbmRleDogdHJ1ZQogICAgICAgICAgICAgICAgfSkuYWRkVG8obWFwXzdhZTMwNjhhYTBlODQ4YWE5ZWEyOWFiMzczZTYwNzRhKTsKICAgICAgICAgICAgCiAgICAgICAgCjwvc2NyaXB0Pg==\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x7f2cfc118d30>"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m = folium.Map(location=[51.5060338196204, -0.128345361445949], \n",
" tiles='CartoDB positron', zoom_start=12)\n",
"\n",
"common_src_station = build_circles_feature_group(diff_weekday_morning.head(30), \n",
" feature_group_name='Common Source Stations',\n",
" color='crimson'\n",
" )\n",
"common_dest_station = build_circles_feature_group(diff_weekday_morning.tail(30), \n",
" feature_group_name='Common Destination Station',\n",
" color='blue'\n",
" )\n",
"common_src_station.add_to(m)\n",
"common_dest_station.add_to(m)\n",
"\n",
"folium.LayerControl().add_to(m)\n",
" \n",
"m"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [],
"source": [
"%%bigquery diff_weekday_afternoon\n",
"WITH \n",
" start_count AS (\n",
" SELECT\n",
" start_station_name,\n",
" COUNT(1) as start_cnt\n",
" FROM\n",
" `google.com:pso-bq-gis-demo.gis_demo.london_cycle`\n",
" WHERE\n",
" is_same_station IS false\n",
" AND EXTRACT(DAYOFWEEK FROM start_date) NOT IN (1,7)\n",
" AND EXTRACT(HOUR FROM start_date) BETWEEN 16 AND 18\n",
" GROUP BY 1\n",
" ),\n",
" end_count AS (\n",
" SELECT\n",
" end_station_name,\n",
" COUNT(1) as end_cnt\n",
" FROM\n",
" `google.com:pso-bq-gis-demo.gis_demo.london_cycle`\n",
" WHERE\n",
" is_same_station IS false\n",
" AND EXTRACT(DAYOFWEEK FROM start_date) NOT IN (1,7)\n",
" AND EXTRACT(HOUR FROM start_date) BETWEEN 16 AND 28\n",
" GROUP BY 1\n",
" )\n",
"SELECT\n",
" a.start_station_name AS station_name,\n",
" ST_ASGEOJSON(ST_GEOGPOINT(c.longitude, c.latitude)) geog,\n",
" a.start_cnt,\n",
" b.end_cnt,\n",
" a.start_cnt - b.end_cnt AS diff\n",
"FROM\n",
" start_count a\n",
"JOIN\n",
" end_count b\n",
"ON\n",
" a.start_station_name = b.end_station_name\n",
"JOIN\n",
" `google.com:pso-bq-gis-demo.gis_demo.cycle_stations` c\n",
"ON \n",
" a.start_station_name = c.name\n",
"ORDER BY 5 DESC"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>station_name</th>\n",
" <th>geog</th>\n",
" <th>start_cnt</th>\n",
" <th>end_cnt</th>\n",
" <th>diff</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Holborn Circus, Holborn</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.10865743...</td>\n",
" <td>6279</td>\n",
" <td>1636</td>\n",
" <td>4643</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Newgate Street , St. Paul's</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.09885091...</td>\n",
" <td>6003</td>\n",
" <td>1760</td>\n",
" <td>4243</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Cheapside, Bank</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.09294031...</td>\n",
" <td>6822</td>\n",
" <td>2964</td>\n",
" <td>3858</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Museum of London, Barbican</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.09649686...</td>\n",
" <td>4806</td>\n",
" <td>1044</td>\n",
" <td>3762</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Red Lion Street, Holborn</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.11655, 5...</td>\n",
" <td>5232</td>\n",
" <td>1687</td>\n",
" <td>3545</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>Stonecutter Street, Holborn</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.10527027...</td>\n",
" <td>4168</td>\n",
" <td>648</td>\n",
" <td>3520</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>749</th>\n",
" <td>Endsleigh Gardens, Euston</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.13050433...</td>\n",
" <td>1522</td>\n",
" <td>5066</td>\n",
" <td>-3544</td>\n",
" </tr>\n",
" <tr>\n",
" <th>750</th>\n",
" <td>Baylis Road, Waterloo</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.11069930...</td>\n",
" <td>1745</td>\n",
" <td>5299</td>\n",
" <td>-3554</td>\n",
" </tr>\n",
" <tr>\n",
" <th>751</th>\n",
" <td>Waterloo Station 2, Waterloo</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.11342629...</td>\n",
" <td>475</td>\n",
" <td>9104</td>\n",
" <td>-8629</td>\n",
" </tr>\n",
" <tr>\n",
" <th>752</th>\n",
" <td>Waterloo Station 1, Waterloo</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.11386436...</td>\n",
" <td>1485</td>\n",
" <td>15947</td>\n",
" <td>-14462</td>\n",
" </tr>\n",
" <tr>\n",
" <th>753</th>\n",
" <td>Belgrove Street , King's Cross</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.12361682...</td>\n",
" <td>2639</td>\n",
" <td>29498</td>\n",
" <td>-26859</td>\n",
" </tr>\n",
" <tr>\n",
" <th>754</th>\n",
" <td>Waterloo Station 3, Waterloo</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.11282408...</td>\n",
" <td>1495</td>\n",
" <td>28609</td>\n",
" <td>-27114</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>755 rows × 5 columns</p>\n",
"</div>"
],
"text/plain": [
" station_name \\\n",
"0 Holborn Circus, Holborn \n",
"1 Newgate Street , St. Paul's \n",
"2 Cheapside, Bank \n",
"3 Museum of London, Barbican \n",
"4 Red Lion Street, Holborn \n",
"5 Stonecutter Street, Holborn \n",
".. ... \n",
"749 Endsleigh Gardens, Euston \n",
"750 Baylis Road, Waterloo \n",
"751 Waterloo Station 2, Waterloo \n",
"752 Waterloo Station 1, Waterloo \n",
"753 Belgrove Street , King's Cross \n",
"754 Waterloo Station 3, Waterloo \n",
"\n",
" geog start_cnt end_cnt \\\n",
"0 { \"type\": \"Point\", \"coordinates\": [-0.10865743... 6279 1636 \n",
"1 { \"type\": \"Point\", \"coordinates\": [-0.09885091... 6003 1760 \n",
"2 { \"type\": \"Point\", \"coordinates\": [-0.09294031... 6822 2964 \n",
"3 { \"type\": \"Point\", \"coordinates\": [-0.09649686... 4806 1044 \n",
"4 { \"type\": \"Point\", \"coordinates\": [-0.11655, 5... 5232 1687 \n",
"5 { \"type\": \"Point\", \"coordinates\": [-0.10527027... 4168 648 \n",
".. ... ... ... \n",
"749 { \"type\": \"Point\", \"coordinates\": [-0.13050433... 1522 5066 \n",
"750 { \"type\": \"Point\", \"coordinates\": [-0.11069930... 1745 5299 \n",
"751 { \"type\": \"Point\", \"coordinates\": [-0.11342629... 475 9104 \n",
"752 { \"type\": \"Point\", \"coordinates\": [-0.11386436... 1485 15947 \n",
"753 { \"type\": \"Point\", \"coordinates\": [-0.12361682... 2639 29498 \n",
"754 { \"type\": \"Point\", \"coordinates\": [-0.11282408... 1495 28609 \n",
"\n",
" diff \n",
"0 4643 \n",
"1 4243 \n",
"2 3858 \n",
"3 3762 \n",
"4 3545 \n",
"5 3520 \n",
".. ... \n",
"749 -3544 \n",
"750 -3554 \n",
"751 -8629 \n",
"752 -14462 \n",
"753 -26859 \n",
"754 -27114 \n",
"\n",
"[755 rows x 5 columns]"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"diff_weekday_afternoon"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVM9ZmFsc2U7IExfTk9fVE9VQ0g9ZmFsc2U7IExfRElTQUJMRV8zRD1mYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS40LjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NvZGUuanF1ZXJ5LmNvbS9qcXVlcnktMS4xMi40Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS40LjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdjZG4uZ2l0aGFjay5jb20vcHl0aG9uLXZpc3VhbGl6YXRpb24vZm9saXVtL21hc3Rlci9mb2xpdW0vdGVtcGxhdGVzL2xlYWZsZXQuYXdlc29tZS5yb3RhdGUuY3NzIi8+CiAgICA8c3R5bGU+aHRtbCwgYm9keSB7d2lkdGg6IDEwMCU7aGVpZ2h0OiAxMDAlO21hcmdpbjogMDtwYWRkaW5nOiAwO308L3N0eWxlPgogICAgPHN0eWxlPiNtYXAge3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO3JpZ2h0OjA7bGVmdDowO308L3N0eWxlPgogICAgCiAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLAogICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgIDxzdHlsZT4jbWFwX2UyMGFmMzQ1MmE5YzQ0NmVhYWY2Y2E3YzBkNTQwMWVkIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDEwMC4wJTsKICAgICAgICBoZWlnaHQ6IDEwMC4wJTsKICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgIHRvcDogMC4wJTsKICAgICAgICB9CiAgICA8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgPGRpdiBjbGFzcz0iZm9saXVtLW1hcCIgaWQ9Im1hcF9lMjBhZjM0NTJhOWM0NDZlYWFmNmNhN2MwZDU0MDFlZCIgPjwvZGl2Pgo8L2JvZHk+CjxzY3JpcHQ+ICAgIAogICAgCiAgICAKICAgICAgICB2YXIgYm91bmRzID0gbnVsbDsKICAgIAoKICAgIHZhciBtYXBfZTIwYWYzNDUyYTljNDQ2ZWFhZjZjYTdjMGQ1NDAxZWQgPSBMLm1hcCgKICAgICAgICAnbWFwX2UyMGFmMzQ1MmE5YzQ0NmVhYWY2Y2E3YzBkNTQwMWVkJywgewogICAgICAgIGNlbnRlcjogWzUxLjUwNjAzMzgxOTYyMDQsIC0wLjEyODM0NTM2MTQ0NTk0OV0sCiAgICAgICAgem9vbTogMTIsCiAgICAgICAgbWF4Qm91bmRzOiBib3VuZHMsCiAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3LAogICAgICAgIHpvb21Db250cm9sOiB0cnVlLAogICAgICAgIH0pOwoKCiAgICAKICAgIHZhciB0aWxlX2xheWVyXzhhZjNjN2U5MTA2ZTQwMTk5YTA3MGE2MjNjYmE3NjQzID0gTC50aWxlTGF5ZXIoCiAgICAgICAgJ2h0dHBzOi8vY2FydG9kYi1iYXNlbWFwcy17c30uZ2xvYmFsLnNzbC5mYXN0bHkubmV0L2xpZ2h0X2FsbC97en0ve3h9L3t5fS5wbmcnLAogICAgICAgIHsKICAgICAgICAiYXR0cmlidXRpb24iOiBudWxsLAogICAgICAgICJkZXRlY3RSZXRpbmEiOiBmYWxzZSwKICAgICAgICAibWF4TmF0aXZlWm9vbSI6IDE4LAogICAgICAgICJtYXhab29tIjogMTgsCiAgICAgICAgIm1pblpvb20iOiAwLAogICAgICAgICJub1dyYXAiOiBmYWxzZSwKICAgICAgICAib3BhY2l0eSI6IDEsCiAgICAgICAgInN1YmRvbWFpbnMiOiAiYWJjIiwKICAgICAgICAidG1zIjogZmFsc2UKfSkuYWRkVG8obWFwX2UyMGFmMzQ1MmE5YzQ0NmVhYWY2Y2E3YzBkNTQwMWVkKTsKICAgIAogICAgICAgICAgICB2YXIgZmVhdHVyZV9ncm91cF9kZmMyMGE5YmVkNGY0NjcxODA4MzJlNTk2ZmNkZTFjNCA9IEwuZmVhdHVyZUdyb3VwKAogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZTIwYWYzNDUyYTljNDQ2ZWFhZjZjYTdjMGQ1NDAxZWQpOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzMyZjlhYWUxZDM4MTQzYTU4ZmYwYmFmYzZlM2MwMzFhID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTE3OTUwMjksIC0wLjEwODY1NzQzMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMjAwLjAsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGZjMjBhOWJlZDRmNDY3MTgwODMyZTU5NmZjZGUxYzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV8zMmY5YWFlMWQzODE0M2E1OGZmMGJhZmM2ZTNjMDMxYS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBIb2xib3JuIENpcmN1cywgSG9sYm9ybjogNDY0M2AgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfOTFiY2YzMzk0MDVjNDNlYmEyY2E0NDA1ZGU0NGExNzQgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MTU0MTg2LCAtMC4wOTg4NTA5MTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDE4Mi43Njk3NjA5MzA0MzI5LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2RmYzIwYTliZWQ0ZjQ2NzE4MDgzMmU1OTZmY2RlMWM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfOTFiY2YzMzk0MDVjNDNlYmEyY2E0NDA1ZGU0NGExNzQuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgTmV3Z2F0ZSBTdHJlZXQgLCBTdC4gUGF1bCdzOiA0MjQzYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9jNzc1NmQ4NmExNjQ0OGRkOWRkZTFiOWI4YTNhNGI0OCA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUxMzk3MDY1LCAtMC4wOTI5NDAzMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTY2LjE4NTY1NTgyNTk3NDU4LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2RmYzIwYTliZWQ0ZjQ2NzE4MDgzMmU1OTZmY2RlMWM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfYzc3NTZkODZhMTY0NDhkZDlkZGUxYjliOGEzYTRiNDguYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgQ2hlYXBzaWRlLCBCYW5rOiAzODU4YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9lYWJkZmMzY2U0MDg0ZWY0OTY2NzE1ZWZjNjExNzg0MyA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUxNzgyMTQ0LCAtMC4wOTY0OTY4NjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDE2Mi4wNTAzOTg0NDkyNzg0OCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9kZmMyMGE5YmVkNGY0NjcxODA4MzJlNTk2ZmNkZTFjNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2VhYmRmYzNjZTQwODRlZjQ5NjY3MTVlZmM2MTE3ODQzLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYE11c2V1bSBvZiBMb25kb24sIEJhcmJpY2FuOiAzNzYyYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV84Mjg4YjY5ZWI5MGI0OTgzOTI2ZTE5MmM1ZTY5ZmFjYiA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUxODI0LCAtMC4xMTY1NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTUyLjcwMjk5Mzc1NDAzODMyLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2RmYzIwYTliZWQ0ZjQ2NzE4MDgzMmU1OTZmY2RlMWM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfODI4OGI2OWViOTBiNDk4MzkyNmUxOTJjNWU2OWZhY2IuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgUmVkIExpb24gU3RyZWV0LCBIb2xib3JuOiAzNTQ1YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV82ZDg2NWI3YmMwMTM0YzQ0YTFmZjkwM2FiYWNlMzdkZSA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUxNTgwOTk4LCAtMC4xMDUyNzAyNzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDE1MS42MjYxMDM4MTIxOTA0LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2RmYzIwYTliZWQ0ZjQ2NzE4MDgzMmU1OTZmY2RlMWM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfNmQ4NjViN2JjMDEzNGM0NGExZmY5MDNhYmFjZTM3ZGUuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgU3RvbmVjdXR0ZXIgU3RyZWV0LCBIb2xib3JuOiAzNTIwYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9iOTA0M2ZmZjJkMjE0NDVjODExNTA4NDEwMjUyOWFlMSA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUxOTY1NiwgLTAuMTMyMzM5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxMjYuMjk3NjUyMzc5OTI2NzYsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGZjMjBhOWJlZDRmNDY3MTgwODMyZTU5NmZjZGUxYzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV9iOTA0M2ZmZjJkMjE0NDVjODExNTA4NDEwMjUyOWFlMS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBBbGZyZWQgUGxhY2UsIEJsb29tc2J1cnk6IDI5MzJgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzlmZjQ3NDQ0M2FmNTQxYzE4OGRmMmFkZmUzZjMzNTQxID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTIxNjgwNzgsIC0wLjEzMDQzMTcyN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTE5LjkyMjQ2MzkyNDE4Njk2LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2RmYzIwYTliZWQ0ZjQ2NzE4MDgzMmU1OTZmY2RlMWM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfOWZmNDc0NDQzYWY1NDFjMTg4ZGYyYWRmZTNmMzM1NDEuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgTWFsZXQgU3RyZWV0LCBCbG9vbXNidXJ5OiAyNzg0YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV83NTA4M2I3MTEzMGE0MTRhYjQwN2NlYWM5MDJkNjJkOCA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUxODgyNTU1LCAtMC4xMDgwMjg0NzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDExNy4wMzYzOTg4ODAwMzQ0NSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9kZmMyMGE5YmVkNGY0NjcxODA4MzJlNTk2ZmNkZTFjNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzc1MDgzYjcxMTMwYTQxNGFiNDA3Y2VhYzkwMmQ2MmQ4LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEhhdHRvbiBHYXJkZW4sIEhvbGJvcm46IDI3MTdgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX2Y0NjY3MDkxMWM2NTRjYWE4MTBmMmI1YjcyNTQ5OGFlID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTEzODIxMDIsIC0wLjEwNzkyNzcwNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTE1Ljc0NDEzMDk0OTgxNjkyLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2RmYzIwYTliZWQ0ZjQ2NzE4MDgzMmU1OTZmY2RlMWM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfZjQ2NjcwOTExYzY1NGNhYTgxMGYyYjViNzI1NDk4YWUuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgQm91dmVyaWUgU3RyZWV0LCBUZW1wbGU6IDI2ODdgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzc1N2ExYWViMjU1ZjQ0MGU5ZTQzNjY2NTQ5OTI2YzM2ID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTE3NDI4LCAtMC4xMDc5ODddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDExMC43MDQyODYwMjE5Njg1NiwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9kZmMyMGE5YmVkNGY0NjcxODA4MzJlNTk2ZmNkZTFjNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzc1N2ExYWViMjU1ZjQ0MGU5ZTQzNjY2NTQ5OTI2YzM2LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYE5ldyBGZXR0ZXIgTGFuZSwgSG9sYm9ybjogMjU3MGAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfN2I1MTY1NDNhYjAwNDMzNzg4ZGZkZjA2YzAwNDk2ZWMgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MTczNDQwMywgLTAuMTM4MDcyNjkxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA5OS42NzY5MzMwMTc0NDU2LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2RmYzIwYTliZWQ0ZjQ2NzE4MDgzMmU1OTZmY2RlMWM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfN2I1MTY1NDNhYjAwNDMzNzg4ZGZkZjA2YzAwNDk2ZWMuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgV2VsbHMgU3RyZWV0LCBGaXR6cm92aWE6IDIzMTRgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzFlZTI0OGFhMjBkOTQ4YjliZTljYmExM2NjMTU0NTBkID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNDk4MTI1NTksIC0wLjEzMjEwMjE2Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogOTkuNjMzODU3NDE5NzcxNywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9kZmMyMGE5YmVkNGY0NjcxODA4MzJlNTk2ZmNkZTFjNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzFlZTI0OGFhMjBkOTQ4YjliZTljYmExM2NjMTU0NTBkLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEFiYmV5IE9yY2hhcmQgU3RyZWV0LCBXZXN0bWluc3RlcjogMjMxM2AgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfYTViNjE2YTBlNjViNDE1OGFkMWNlNThkZTY4NjQ1NjUgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MTQ2MTk5NSwgLTAuMTM3ODQxMzMzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA5Ny4zMDc3NzUxNDUzODAxMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9kZmMyMGE5YmVkNGY0NjcxODA4MzJlNTk2ZmNkZTFjNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2E1YjYxNmEwZTY1YjQxNThhZDFjZTU4ZGU2ODY0NTY1LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEdyZWF0IE1hcmxib3JvdWdoIFN0cmVldCwgU29obzogMjI1OWAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfMGY5MTY3ZDFjZTc4NDJkZDg5NTVhN2RiODNlNjU5M2YgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MDc0MjQ4NSwgLTAuMTM0NjIxMjA5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA5Mi42NTU2MTA1OTY1OTcwMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9kZmMyMGE5YmVkNGY0NjcxODA4MzJlNTk2ZmNkZTFjNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzBmOTE2N2QxY2U3ODQyZGQ4OTU1YTdkYjgzZTY1OTNmLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYFN0LiBKYW1lcydzIFNxdWFyZSwgU3QuIEphbWVzJ3M6IDIxNTFgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzMzNDc3NzNkMzNiMjQ0ODFhNWVlZWQ3MDk0ZTQ2ZDViID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTE1MDU5OTEsIC0wLjEwNTM0NDQ4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA5Mi4wNTI1NTIyMjkxNjIxNywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9kZmMyMGE5YmVkNGY0NjcxODA4MzJlNTk2ZmNkZTFjNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzMzNDc3NzNkMzNiMjQ0ODFhNWVlZWQ3MDk0ZTQ2ZDViLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYFN0LiBCcmlkZSBTdHJlZXQsIEhvbGJvcm46IDIxMzdgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzdmZDY2NmU0YzZjNzQ0ZjQ5OGE1MWM3M2M5MTEyNTg2ID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTExOTYxNzYsIC0wLjA5NzQ0MTY4N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogOTEuODM3MTc0MjQwNzkyNTksCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGZjMjBhOWJlZDRmNDY3MTgwODMyZTU5NmZjZGUxYzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV83ZmQ2NjZlNGM2Yzc0NGY0OThhNTFjNzNjOTExMjU4Ni5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBRdWVlbiBWaWN0b3JpYSBTdHJlZXQsIFN0LiBQYXVsJ3M6IDIxMzJgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzFhMTViOTBmZTU0NjQ5Yzc4YTYyOWEwOTFlNmM3NTJlID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTIyODUzMDEsIC0wLjA5OTk5NDA1Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogODkuODEyNjIxMTUwMTE4NDYsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGZjMjBhOWJlZDRmNDY3MTgwODMyZTU5NmZjZGUxYzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV8xYTE1YjkwZmU1NDY0OWM3OGE2MjlhMDkxZTZjNzUyZS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBCZXJyeSBTdHJlZXQsIENsZXJrZW53ZWxsOiAyMDg1YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV8zMmU5ODE5NmU1NTg0NWZkODVjMGNlZjA1YWMxMDI0ZiA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUxNTkzNzI1LCAtMC4xMTE3NzgzNDhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDg5LjA4MDMzNTk4OTY2MTg1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2RmYzIwYTliZWQ0ZjQ2NzE4MDgzMmU1OTZmY2RlMWM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfMzJlOTgxOTZlNTU4NDVmZDg1YzBjZWYwNWFjMTAyNGYuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgQnJlYW1zIEJ1aWxkaW5ncywgSG9sYm9ybjogMjA2OGAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfYmY0Yjc1Y2FkMDVhNDY4ODkwODYzNzU2MWU2YTk2YWYgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MjEyODM3NywgLTAuMDg0NjA1NjkyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA4My4xNzg5NzkxMDgzMzUxMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9kZmMyMGE5YmVkNGY0NjcxODA4MzJlNTk2ZmNkZTFjNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2JmNGI3NWNhZDA1YTQ2ODg5MDg2Mzc1NjFlNmE5NmFmLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYENocmlzdG9waGVyIFN0cmVldCwgTGl2ZXJwb29sIFN0cmVldDogMTkzMWAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfYzI5NWVkOGYxZjQ4NDQ1ZTg1YjA1MDJkMjQ3MGZhYzQgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MTUzMDgwNSwgLTAuMTQ3MjAzNzExXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA4MC4zNzkwNjUyNTk1MzA0OCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9kZmMyMGE5YmVkNGY0NjcxODA4MzJlNTk2ZmNkZTFjNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2MyOTVlZDhmMWY0ODQ0NWU4NWIwNTAyZDI0NzBmYWM0LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYENoYXBlbCBQbGFjZSwgTWFyeWxlYm9uZTogMTg2NmAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfMDI2NzE0ODYyNjE1NDU0OWEzYWIwMWFjMDAwMWVjMzYgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MjA1OTY4MSwgLTAuMTE2Njg4NDY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA4MC4wMzQ0NjA0NzgxMzkxNCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9kZmMyMGE5YmVkNGY0NjcxODA4MzJlNTk2ZmNkZTFjNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzAyNjcxNDg2MjYxNTQ1NDlhM2FiMDFhYzAwMDFlYzM2LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYFRoZW9iYWxkJ3MgUm9hZCAsIEhvbGJvcm46IDE4NThgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX2QwNDhmZDU2ODIzZTRkYjJiNjAxMTc1YzJhZmIxNmEzID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNDkxODg0MDksIC0wLjEyNTY3NDgxNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNzkuNDMxNDAyMTEwNzA0MjgsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGZjMjBhOWJlZDRmNDY3MTgwODMyZTU5NmZjZGUxYzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV9kMDQ4ZmQ1NjgyM2U0ZGIyYjYwMTE3NWMyYWZiMTZhMy5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBNaWxsYmFuayBUb3dlciwgUGltbGljbzogMTg0NGAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfYTc0Y2M5ZWYwYjNjNDFlYmFmMWU1NDA1OTgyM2Q2N2UgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MjA5NjI2MiwgLTAuMDg1NjM0MjQyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA3OC4wMDk5MDczODc0NjUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGZjMjBhOWJlZDRmNDY3MTgwODMyZTU5NmZjZGUxYzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV9hNzRjYzllZjBiM2M0MWViYWYxZTU0MDU5ODIzZDY3ZS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBGaW5zYnVyeSBTcXVhcmUgLCBNb29yZ2F0ZTogMTgxMWAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfZWVkYjJkMjFiNmFmNGIxMmFjMjM5MTU2YzgyNzIwNDUgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MTI0ODQ0NSwgLTAuMDk5MTQxNDA4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA3Ny43MDgzNzgyMDM3NDc1NywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9kZmMyMGE5YmVkNGY0NjcxODA4MzJlNTk2ZmNkZTFjNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2VlZGIyZDIxYjZhZjRiMTJhYzIzOTE1NmM4MjcyMDQ1LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEdvZGxpbWFuIFN0cmVldCwgU3QuIFBhdWwnczogMTgwNGAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfMjdhOTFiZmIxZmJkNDZjN2I4Mjg5YzJhNmFiMDMxYjcgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MDU4MTc3NiwgLTAuMTAwMTg2MzM3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA3Ny41NzkxNTE0MTA3MjU4MywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9kZmMyMGE5YmVkNGY0NjcxODA4MzJlNTk2ZmNkZTFjNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzI3YTkxYmZiMWZiZDQ2YzdiODI4OWMyYTZhYjAzMWI3LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEJhbmtzaWRlIE1peCwgQmFua3NpZGU6IDE4MDFgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzVmZmY2NDM4OWM4ZjQ3MzRiODFlMmM1ZGFmZDU4YTNhID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTA2MjMsIC0wLjAyMjk2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA3Ny4zNjM3NzM0MjIzNTYyMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9kZmMyMGE5YmVkNGY0NjcxODA4MzJlNTk2ZmNkZTFjNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzVmZmY2NDM4OWM4ZjQ3MzRiODFlMmM1ZGFmZDU4YTNhLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEZpc2hlcm1hbidzIFdhbGsgV2VzdCwgQ2FuYXJ5IFdoYXJmOiAxNzk2YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9kZWQ4OWEwZGViOGY0ODEyYTE4ZGMxMTNlYTI5ZjJiMCA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUxOTA4MDExLCAtMC4xMjQ2Nzg0MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDc2LjQ1OTE4NTg3MTIwMzk2LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2RmYzIwYTliZWQ0ZjQ2NzE4MDgzMmU1OTZmY2RlMWM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfZGVkODlhMGRlYjhmNDgxMmExOGRjMTEzZWEyOWYyYjAuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgQnJpdGlzaCBNdXNldW0sIEJsb29tc2J1cnk6IDE3NzVgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX2FlNDRlMWEzMzEwYTQ0MjY5MzYwZjhmOWEzYjdiODU2ID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNDk1ODA1ODksIC0wLjEyNzU3NTIzM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNzQuNjUwMDEwNzY4ODk5NDIsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGZjMjBhOWJlZDRmNDY3MTgwODMyZTU5NmZjZGUxYzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV9hZTQ0ZTFhMzMxMGE0NDI2OTM2MGY4ZjlhM2I3Yjg1Ni5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBTbWl0aCBTcXVhcmUsIFdlc3RtaW5zdGVyOiAxNzMzYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV80NDU0ZWVkNzhiYzc0MTFlOTc5MjQ3YTdjZGMzNGU4NSA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUwMzA4MywgLTAuMDE3Njc2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA3NC40Nzc3MDgzNzgyMDM3NCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9kZmMyMGE5YmVkNGY0NjcxODA4MzJlNTk2ZmNkZTFjNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzQ0NTRlZWQ3OGJjNzQxMWU5NzkyNDdhN2NkYzM0ZTg1LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYFVwcGVyIEJhbmsgU3RyZWV0LCBDYW5hcnkgV2hhcmY6IDE3MjlgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBmZWF0dXJlX2dyb3VwX2MzNjBmZTYyZDNiMTQwZTliNWM0YmJjY2IwM2E2NThhID0gTC5mZWF0dXJlR3JvdXAoCiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lMjBhZjM0NTJhOWM0NDZlYWFmNmNhN2MwZDU0MDFlZCk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfYTNmMjc5ZWM0MDcxNDk4ZGJjNTU1NDc2MzM2MmFjY2MgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS40ODQzODY1NywgLTAuMjA0ODE1MTRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDE1Ljc3NzgyNjk1Mjg2NTY3OSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9jMzYwZmU2MmQzYjE0MGU5YjVjNGJiY2NiMDNhNjU4YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2EzZjI3OWVjNDA3MTQ5OGRiYzU1NTQ3NjMzNjJhY2NjLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYE5vcm1hbmQgUGFyaywgV2VzdCBLZW5zaW5ndG9uOiAtMjEzOWAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfZGI1ZWE2OWRhYTNhNDZiNzhiZWIwZTQzMWJlMDI4YTQgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS40ODU5MTcxNCwgLTAuMTI0NDY5OTQ4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxNS44NDQyMTMzMjE1MzEzMTIsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYzM2MGZlNjJkM2IxNDBlOWI1YzRiYmNjYjAzYTY1OGEpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV9kYjVlYTY5ZGFhM2E0NmI3OGJlYjBlNDMxYmUwMjhhNC5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBWYXV4aGFsbCBDcm9zcywgVmF1eGhhbGw6IC0yMTQ4YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV84YTA5YjIwOTdmZjY0NmZjYThjOWQ0OTUzN2IyMDM0MSA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUxOTI2NSwgLTAuMDIxMzQ1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxNS44NjYzNDIxMTEwODY1MjMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYzM2MGZlNjJkM2IxNDBlOWI1YzRiYmNjYjAzYTY1OGEpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV84YTA5YjIwOTdmZjY0NmZjYThjOWQ0OTUzN2IyMDM0MS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBGdXJ6ZSBHcmVlbiwgQm93OiAtMjE1MWAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfZDg5MjMyYTkyNmZhNDU0NGJkNDI5MzVlOTMyODExM2YgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS40Nzc4MzksIC0wLjExNjQ5M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTYuMDI4NjE5OTAxMTU4MDczLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2MzNjBmZTYyZDNiMTQwZTliNWM0YmJjY2IwM2E2NThhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfZDg5MjMyYTkyNmZhNDU0NGJkNDI5MzVlOTMyODExM2YuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgQ2FsZHdlbGwgU3RyZWV0LCBTdG9ja3dlbGw6IC0yMTczYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV83ZjA1NGU1MWFmNWQ0NTg1ODUyYzliZDkwYmMyMDMxYiA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUzMjA5MSwgLTAuMDYxNDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDE2LjE2MTM5MjYzODQ4OTM0MiwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9jMzYwZmU2MmQzYjE0MGU5YjVjNGJiY2NiMDNhNjU4YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzdmMDU0ZTUxYWY1ZDQ1ODU4NTJjOWJkOTBiYzIwMzFiLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYFByaXRjaGFyZCdzIFJvYWQsIEJldGhuYWwgR3JlZW46IC0yMTkxYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9lNWNkZDMyN2ExOTI0ZDA1OTMxNThhOTFkMmU1Y2U0YSA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjQ5MzM3MjY0LCAtMC4wOTk2ODA2N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTYuNjQwODQ5NzQ1NTE4OTIsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYzM2MGZlNjJkM2IxNDBlOWI1YzRiYmNjYjAzYTY1OGEpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV9lNWNkZDMyN2ExOTI0ZDA1OTMxNThhOTFkMmU1Y2U0YS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBXYWx3b3J0aCBSb2FkLCBFbGVwaGFudCAmIENhc3RsZTogLTIyNTZgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX2FhZGFjYTRiNWI1YjQ1ZWZhNjQ4NGNiMTM4NDAwMDU3ID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTA2MTMzMjQsIC0wLjExNDY4NjM4NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTYuNzA3MjM2MTE0MTg0NTUzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2MzNjBmZTYyZDNiMTQwZTliNWM0YmJjY2IwM2E2NThhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfYWFkYWNhNGI1YjViNDVlZmE2NDg0Y2IxMzg0MDAwNTcuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgQmVsdmVkZXJlIFJvYWQgMSwgU291dGggQmFuazogLTIyNjVgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzkwYTlkMTZlZmM2NDQzN2E4MTI2YWYzZGIxNGM5ZmRkID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTM2Mzg0MzUsIC0wLjEwMjc1NzU3OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTcuMTk0MDY5NDg0Mzk5MiwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9jMzYwZmU2MmQzYjE0MGU5YjVjNGJiY2NiMDNhNjU4YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzkwYTlkMTZlZmM2NDQzN2E4MTI2YWYzZGIxNGM5ZmRkLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYElzbGluZ3RvbiBHcmVlbiwgQW5nZWw6IC0yMzMxYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV8zYTMyOTNmNGY4MDc0ZDliOGY0OTExYTM4NjQzMmRhOSA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUxMjg3MTEsIC0wLjAzODk4NjZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDE3LjYwNzE0MDIyMjc2MzE1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2MzNjBmZTYyZDNiMTQwZTliNWM0YmJjY2IwM2E2NThhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfM2EzMjkzZjRmODA3NGQ5YjhmNDkxMWEzODY0MzJkYTkuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgRmxhbWJvcm91Z2ggU3RyZWV0LCBMaW1laG91c2U6IC0yMzg3YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV8xYmU2NjkwMjViNWE0MWQ0OGFkYmY1ZmQyOTAyMmNjZiA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUwNTU2OTA1LCAtMC4xMTE2MDY2OTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDE4LjcyODMzMjIyNjg5Mzg2LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2MzNjBmZTYyZDNiMTQwZTliNWM0YmJjY2IwM2E2NThhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfMWJlNjY5MDI1YjVhNDFkNDhhZGJmNWZkMjkwMjJjY2YuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgU3RhbWZvcmQgU3RyZWV0LCBTb3V0aCBCYW5rOiAtMjUzOWAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfNTkxNGVmODc0MGYyNGExMWIzOTAzYjIzYjg2MmQzM2IgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MDk0NjIxMiwgLTAuMTI0NzQ5Mjc0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxOC44MzE1OTk5MTE0ODQ4NDQsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYzM2MGZlNjJkM2IxNDBlOWI1YzRiYmNjYjAzYTY1OGEpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV81OTE0ZWY4NzQwZjI0YTExYjM5MDNiMjNiODYyZDMzYi5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBXaWxsaWFtIElWIFN0cmVldCwgU3RyYW5kOiAtMjU1M2AgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfY2ZkZDk2ZGZjZDIwNDc3ODllMDg5ZWI1YjJiMDA0NmQgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MzAxOTk4NzU1LCAtMC4xMjIyOTk0NDA4MDNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDE5LjU0NzA5NzQ0MDQzNjY3NiwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9jMzYwZmU2MmQzYjE0MGU5YjVjNGJiY2NiMDNhNjU4YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2NmZGQ5NmRmY2QyMDQ3Nzg5ZTA4OWViNWIyYjAwNDZkLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEJpcmtlbmhlYWQgU3RyZWV0LCBLaW5nJ3MgQ3Jvc3M6IC0yNjUwYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9iMjllYWM0MGM4MWE0M2VkOGQ5N2NhMDhiODZjMTc1YyA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjQ4NjM0MzQsIC0wLjEyMjQ5MjQxOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMjAuNTQyODkyOTcwNDIxMTg1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2MzNjBmZTYyZDNiMTQwZTliNWM0YmJjY2IwM2E2NThhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfYjI5ZWFjNDBjODFhNDNlZDhkOTdjYTA4Yjg2YzE3NWMuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgS2VubmluZ3RvbiBMYW5lIFJhaWwgQnJpZGdlLCBWYXV4aGFsbDogLTI3ODVgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzRmOGVjOGM1MDBkZTQwMTY5MjM3ZDkyMGRmZjc2N2Y3ID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTIyNTExLCAtMC4xNjIyOThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDIwLjg0NTMxOTc2MTAwOTA3MywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9jMzYwZmU2MmQzYjE0MGU5YjVjNGJiY2NiMDNhNjU4YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzRmOGVjOGM1MDBkZTQwMTY5MjM3ZDkyMGRmZjc2N2Y3LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEJvc3RvbiBQbGFjZSwgTWFyeWxlYm9uZTogLTI4MjZgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzBjZjlhYmRmZDU5ZDQwOTU4NDE4NGJmMTk0MDMyMmZlID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTE2NzgwMjMsIC0wLjE3NTQ4ODgwM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMjEuMjUxMDE0MjM2MTg3OTUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYzM2MGZlNjJkM2IxNDBlOWI1YzRiYmNjYjAzYTY1OGEpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV8wY2Y5YWJkZmQ1OWQ0MDk1ODQxODRiZjE5NDAzMjJmZS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBXaW5zbGFuZCBTdHJlZXQsIFBhZGRpbmd0b246IC0yODgxYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV80NjQxMGQ4MDU2ZWU0ZGZhODRkMWQ0Nzg4ZTdhZGJmYyA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUzNjU4NTE0LCAtMC4wNzU4ODU2ODZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDIxLjM5ODUzOTQ5OTg4OTM1NiwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9jMzYwZmU2MmQzYjE0MGU5YjVjNGJiY2NiMDNhNjU4YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzQ2NDEwZDgwNTZlZTRkZmE4NGQxZDQ3ODhlN2FkYmZjLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYER1bnN0b24gUm9hZCAsIEhhZ2dlcnN0b246IC0yOTAxYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9kNTZlOTViZjkyNGQ0N2QzYTI3ZWFjY2ZjZWI5MjA4MyA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUwNDk0MiwgLTAuMTE1NTMzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAyMS41MzEzMTIyMzcyMjA2MjUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYzM2MGZlNjJkM2IxNDBlOWI1YzRiYmNjYjAzYTY1OGEpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV9kNTZlOTViZjkyNGQ0N2QzYTI3ZWFjY2ZjZWI5MjA4My5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBDb25jZXJ0IEhhbGwgQXBwcm9hY2ggMiwgU291dGggQmFuazogLTI5MTlgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX2I4MDNiOGZmN2ZlZTRjZDc4NGY2NTEyNTY4ZTg2OTAzID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTM1Njc4LCAtMC4wNjI1NDZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDIyLjE1ODI5NDYwNzk1MTYxLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2MzNjBmZTYyZDNiMTQwZTliNWM0YmJjY2IwM2E2NThhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfYjgwM2I4ZmY3ZmVlNGNkNzg0ZjY1MTI1NjhlODY5MDMuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgUmVnZW50J3MgUm93ICwgSGFnZ2Vyc3RvbjogLTMwMDRgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzQ2MzZkZjBkNmMxODQ5M2VhODEzNjU2ZDkzMDNjNmExID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNDg4OTQwMjIsIC0wLjExMTQzNTc5Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMjIuNzI2MjY2ODczMjAyMDM2LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2MzNjBmZTYyZDNiMTQwZTliNWM0YmJjY2IwM2E2NThhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfNDYzNmRmMGQ2YzE4NDkzZWE4MTM2NTZkOTMwM2M2YTEuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgS2VubmluZ3RvbiBDcm9zcywgS2VubmluZ3RvbjogLTMwODFgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzkxMWY5MGZjMmU0YTQxNmQ4ZjI1ZDYyYWM5MWNmYTY5ID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTA4MTAzMDksIC0wLjEyNjAyMTAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAyMy40MTk2MzU2MTI1OTg2NTgsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYzM2MGZlNjJkM2IxNDBlOWI1YzRiYmNjYjAzYTY1OGEpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV85MTFmOTBmYzJlNGE0MTZkOGYyNWQ2MmFjOTFjZmE2OS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBDcmF2ZW4gU3RyZWV0LCBTdHJhbmQ6IC0zMTc1YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV8xMGRjZTRlNjJjM2E0ZGM2YjFhZjRiOGU3NWNiMThkYyA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUyMzY0ODA0LCAtMC4wNzQ3NTQ4NzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDIzLjg3Njk2MzkzMDA3MzAyNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9jMzYwZmU2MmQzYjE0MGU5YjVjNGJiY2NiMDNhNjU4YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzEwZGNlNGU2MmMzYTRkYzZiMWFmNGI4ZTc1Y2IxOGRjLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEJldGhuYWwgR3JlZW4gUm9hZCwgU2hvcmVkaXRjaDogLTMyMzdgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX2E4NTQ4ODc4YTllZDRjN2E4ZWE1YmU3MTFmOGU0NmI1ID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTI3MzI2LCAtMC4xMzYwNTI4Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMjQuMTY0NjM4MTk0MjkwNzcsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYzM2MGZlNjJkM2IxNDBlOWI1YzRiYmNjYjAzYTY1OGEpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV9hODU0ODg3OGE5ZWQ0YzdhOGVhNWJlNzExZjhlNDZiNS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBEcnVtbW9uZCBTdHJlZXQgLCBFdXN0b246IC0zMjc2YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9kN2Q0NmM5ODM4NzI0N2E3YjEzNzNmZmE0ZWFmYTIzZSA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUyODgzMzgsIC0wLjEzMjI1MDM2OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMjQuMjQ1Nzc3MDg5MzI2NTUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYzM2MGZlNjJkM2IxNDBlOWI1YzRiYmNjYjAzYTY1OGEpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV9kN2Q0NmM5ODM4NzI0N2E3YjEzNzNmZmE0ZWFmYTIzZS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBEb3JpYyBXYXkgLCBTb21lcnMgVG93bjogLTMyODdgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzc1NDViZjgyYWM0YTRhMWY5NjQwM2FmMDU5ODJjZTVjID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTA0NjI3NTksIC0wLjA5MTc3Mzc3Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMjUuNjc2NzcyMTQ3MjMwMjE0LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2MzNjBmZTYyZDNiMTQwZTliNWM0YmJjY2IwM2E2NThhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfNzU0NWJmODJhYzRhNGExZjk2NDAzYWYwNTk4MmNlNWMuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgSG9wIEV4Y2hhbmdlLCBUaGUgQm9yb3VnaDogLTM0ODFgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX2IxODE1NzFjYTZjNzRlZjA5NDdkN2QxMzlmZWZjZmU0ID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTI2ODM4MDYsIC0wLjEzMDUwNDMzNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMjYuMTQxNDc2NzI3ODg5NjUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYzM2MGZlNjJkM2IxNDBlOWI1YzRiYmNjYjAzYTY1OGEpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV9iMTgxNTcxY2E2Yzc0ZWYwOTQ3ZDdkMTM5ZmVmY2ZlNC5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBFbmRzbGVpZ2ggR2FyZGVucywgRXVzdG9uOiAtMzU0NGAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfYjY3N2FiYTljMjJhNDk4NTk3YjJjZmYyMzAzMzA4ZjIgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MDE0NDQ1NiwgLTAuMTEwNjk5MzA5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAyNi4yMTUyMzkzNTk3NDAzNTUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYzM2MGZlNjJkM2IxNDBlOWI1YzRiYmNjYjAzYTY1OGEpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV9iNjc3YWJhOWMyMmE0OTg1OTdiMmNmZjIzMDMzMDhmMi5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBCYXlsaXMgUm9hZCwgV2F0ZXJsb286IC0zNTU0YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV8wYWU1Y2MwMzQ5ZGI0OWM4YjZmZmI1MDFhMTljOGM3YSA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUwMzkxOTczLCAtMC4xMTM0MjYyOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNjMuNjQ5Nzc1MDIzOTcyODYsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYzM2MGZlNjJkM2IxNDBlOWI1YzRiYmNjYjAzYTY1OGEpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV8wYWU1Y2MwMzQ5ZGI0OWM4YjZmZmI1MDFhMTljOGM3YS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBXYXRlcmxvbyBTdGF0aW9uIDIsIFdhdGVybG9vOiAtODYyOWAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfZTNkZTJlNGIyMDdkNDZkYjg0MzZhZjIzNDA5ZjNlNTkgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MDQwMjc5NCwgLTAuMTEzODY0MzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDEwNi42NzU1MTgxODI0ODg3NCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9jMzYwZmU2MmQzYjE0MGU5YjVjNGJiY2NiMDNhNjU4YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2UzZGUyZTRiMjA3ZDQ2ZGI4NDM2YWYyMzQwOWYzZTU5LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYFdhdGVybG9vIFN0YXRpb24gMSwgV2F0ZXJsb286IC0xNDQ2MmAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfMmQ5YTllMTQwNWQzNGM3NTgwOTQ5ZGM3MGRhYmJkZDAgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41Mjk5NDM3MSwgLTAuMTIzNjE2ODI0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxOTguMTE5MDUyODg3ODA3MDQsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYzM2MGZlNjJkM2IxNDBlOWI1YzRiYmNjYjAzYTY1OGEpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV8yZDlhOWUxNDA1ZDM0Yzc1ODA5NDlkYzcwZGFiYmRkMC5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBCZWxncm92ZSBTdHJlZXQgLCBLaW5nJ3MgQ3Jvc3M6IC0yNjg1OWAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfYzI5ZWNlZTFhY2M1NGFjYWFkMDlkYjgwZTkwMWViYmYgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MDM3OTE2OCwgLTAuMTEyODI0MDhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDIwMC4wLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2MzNjBmZTYyZDNiMTQwZTliNWM0YmJjY2IwM2E2NThhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfYzI5ZWNlZTFhY2M1NGFjYWFkMDlkYjgwZTkwMWViYmYuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgV2F0ZXJsb28gU3RhdGlvbiAzLCBXYXRlcmxvbzogLTI3MTE0YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbGF5ZXJfY29udHJvbF9lODc3MDM5MTE4MmY0YzRjYWY2NzhiNGNlMTRkOWVmYSA9IHsKICAgICAgICAgICAgICAgIGJhc2VfbGF5ZXJzIDogeyAiY2FydG9kYnBvc2l0cm9uIiA6IHRpbGVfbGF5ZXJfOGFmM2M3ZTkxMDZlNDAxOTlhMDcwYTYyM2NiYTc2NDMsIH0sCiAgICAgICAgICAgICAgICBvdmVybGF5cyA6IHsgIkNvbW1vbiBTb3VyY2UgU3RhdGlvbnMiIDogZmVhdHVyZV9ncm91cF9kZmMyMGE5YmVkNGY0NjcxODA4MzJlNTk2ZmNkZTFjNCwiQ29tbW9uIERlc3RpbmF0aW9uIFN0YXRpb24iIDogZmVhdHVyZV9ncm91cF9jMzYwZmU2MmQzYjE0MGU5YjVjNGJiY2NiMDNhNjU4YSwgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgTC5jb250cm9sLmxheWVycygKICAgICAgICAgICAgICAgIGxheWVyX2NvbnRyb2xfZTg3NzAzOTExODJmNGM0Y2FmNjc4YjRjZTE0ZDllZmEuYmFzZV9sYXllcnMsCiAgICAgICAgICAgICAgICBsYXllcl9jb250cm9sX2U4NzcwMzkxMTgyZjRjNGNhZjY3OGI0Y2UxNGQ5ZWZhLm92ZXJsYXlzLAogICAgICAgICAgICAgICAge3Bvc2l0aW9uOiAndG9wcmlnaHQnLAogICAgICAgICAgICAgICAgIGNvbGxhcHNlZDogdHJ1ZSwKICAgICAgICAgICAgICAgICBhdXRvWkluZGV4OiB0cnVlCiAgICAgICAgICAgICAgICB9KS5hZGRUbyhtYXBfZTIwYWYzNDUyYTljNDQ2ZWFhZjZjYTdjMGQ1NDAxZWQpOwogICAgICAgICAgICAKICAgICAgICAKPC9zY3JpcHQ+\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x7f2cf77a5a20>"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m = folium.Map(location=[51.5060338196204, -0.128345361445949], \n",
" tiles='CartoDB positron', zoom_start=12)\n",
"\n",
"common_src_station = build_circles_feature_group(diff_weekday_afternoon.head(30), \n",
" feature_group_name='Common Source Stations',\n",
" color='crimson'\n",
" )\n",
"common_dest_station = build_circles_feature_group(diff_weekday_afternoon.tail(30), \n",
" feature_group_name='Common Destination Station',\n",
" color='blue'\n",
" )\n",
"common_src_station.add_to(m)\n",
"common_dest_station.add_to(m)\n",
"\n",
"folium.LayerControl().add_to(m)\n",
" \n",
"m"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [],
"source": [
"%%bigquery closest_stations\n",
"WITH \n",
" stations AS (\n",
" SELECT\n",
" name,\n",
" ST_GEOGPOINT(longitude, latitude) geog\n",
" FROM\n",
" `google.com:pso-bq-gis-demo.gis_demo.cycle_stations` \n",
" ),\n",
" point_of_interest AS (\n",
" SELECT\n",
" name,\n",
" geog\n",
" FROM\n",
" stations\n",
" WHERE\n",
" name = 'Hop Exchange, The Borough'\n",
" )\n",
"SELECT\n",
" a.name source_station,\n",
" ST_ASGEOJSON(a.geog) source_geog,\n",
" b.name destination_station,\n",
" ST_ASGEOJSON(b.geog) destination_geog,\n",
" ST_DISTANCE(a.geog, b.geog) distance\n",
"FROM\n",
" stations a\n",
"JOIN\n",
" point_of_interest b\n",
"ON\n",
" a.name != b.name\n",
"ORDER BY 5\n",
"LIMIT 10"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>source_station</th>\n",
" <th>source_geog</th>\n",
" <th>destination_station</th>\n",
" <th>destination_geog</th>\n",
" <th>distance</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Park Street, Bankside</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.09275415...</td>\n",
" <td>Hop Exchange, The Borough</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.09177377...</td>\n",
" <td>164.399669</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Duke Street Hill, London Bridge</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.08726299...</td>\n",
" <td>Hop Exchange, The Borough</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.09177377...</td>\n",
" <td>363.641146</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Lavington Street, Bankside</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.09803181...</td>\n",
" <td>Hop Exchange, The Borough</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.09177377...</td>\n",
" <td>438.188537</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>New Globe Walk, Bankside</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.09644075...</td>\n",
" <td>Hop Exchange, The Borough</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.09177377...</td>\n",
" <td>445.381519</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Empire Square, The Borough</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.08974076...</td>\n",
" <td>Hop Exchange, The Borough</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.09177377...</td>\n",
" <td>445.792595</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>Southwark Street, Bankside</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.09834108...</td>\n",
" <td>Hop Exchange, The Borough</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.09177377...</td>\n",
" <td>462.792939</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>Borough High Street, The Borough</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.09452431...</td>\n",
" <td>Hop Exchange, The Borough</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.09177377...</td>\n",
" <td>476.940675</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>Union Street, The Borough</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.09849768...</td>\n",
" <td>Hop Exchange, The Borough</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.09177377...</td>\n",
" <td>476.964547</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>Swan Street, The Borough</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.09276270...</td>\n",
" <td>Hop Exchange, The Borough</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.09177377...</td>\n",
" <td>486.457105</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>Tate Modern, Bankside</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.09880724...</td>\n",
" <td>Hop Exchange, The Borough</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.09177377...</td>\n",
" <td>539.797840</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" source_station \\\n",
"0 Park Street, Bankside \n",
"1 Duke Street Hill, London Bridge \n",
"2 Lavington Street, Bankside \n",
"3 New Globe Walk, Bankside \n",
"4 Empire Square, The Borough \n",
"5 Southwark Street, Bankside \n",
"6 Borough High Street, The Borough \n",
"7 Union Street, The Borough \n",
"8 Swan Street, The Borough \n",
"9 Tate Modern, Bankside \n",
"\n",
" source_geog \\\n",
"0 { \"type\": \"Point\", \"coordinates\": [-0.09275415... \n",
"1 { \"type\": \"Point\", \"coordinates\": [-0.08726299... \n",
"2 { \"type\": \"Point\", \"coordinates\": [-0.09803181... \n",
"3 { \"type\": \"Point\", \"coordinates\": [-0.09644075... \n",
"4 { \"type\": \"Point\", \"coordinates\": [-0.08974076... \n",
"5 { \"type\": \"Point\", \"coordinates\": [-0.09834108... \n",
"6 { \"type\": \"Point\", \"coordinates\": [-0.09452431... \n",
"7 { \"type\": \"Point\", \"coordinates\": [-0.09849768... \n",
"8 { \"type\": \"Point\", \"coordinates\": [-0.09276270... \n",
"9 { \"type\": \"Point\", \"coordinates\": [-0.09880724... \n",
"\n",
" destination_station \\\n",
"0 Hop Exchange, The Borough \n",
"1 Hop Exchange, The Borough \n",
"2 Hop Exchange, The Borough \n",
"3 Hop Exchange, The Borough \n",
"4 Hop Exchange, The Borough \n",
"5 Hop Exchange, The Borough \n",
"6 Hop Exchange, The Borough \n",
"7 Hop Exchange, The Borough \n",
"8 Hop Exchange, The Borough \n",
"9 Hop Exchange, The Borough \n",
"\n",
" destination_geog distance \n",
"0 { \"type\": \"Point\", \"coordinates\": [-0.09177377... 164.399669 \n",
"1 { \"type\": \"Point\", \"coordinates\": [-0.09177377... 363.641146 \n",
"2 { \"type\": \"Point\", \"coordinates\": [-0.09177377... 438.188537 \n",
"3 { \"type\": \"Point\", \"coordinates\": [-0.09177377... 445.381519 \n",
"4 { \"type\": \"Point\", \"coordinates\": [-0.09177377... 445.792595 \n",
"5 { \"type\": \"Point\", \"coordinates\": [-0.09177377... 462.792939 \n",
"6 { \"type\": \"Point\", \"coordinates\": [-0.09177377... 476.940675 \n",
"7 { \"type\": \"Point\", \"coordinates\": [-0.09177377... 476.964547 \n",
"8 { \"type\": \"Point\", \"coordinates\": [-0.09177377... 486.457105 \n",
"9 { \"type\": \"Point\", \"coordinates\": [-0.09177377... 539.797840 "
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"closest_stations"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVM9ZmFsc2U7IExfTk9fVE9VQ0g9ZmFsc2U7IExfRElTQUJMRV8zRD1mYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS40LjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NvZGUuanF1ZXJ5LmNvbS9qcXVlcnktMS4xMi40Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS40LjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdjZG4uZ2l0aGFjay5jb20vcHl0aG9uLXZpc3VhbGl6YXRpb24vZm9saXVtL21hc3Rlci9mb2xpdW0vdGVtcGxhdGVzL2xlYWZsZXQuYXdlc29tZS5yb3RhdGUuY3NzIi8+CiAgICA8c3R5bGU+aHRtbCwgYm9keSB7d2lkdGg6IDEwMCU7aGVpZ2h0OiAxMDAlO21hcmdpbjogMDtwYWRkaW5nOiAwO308L3N0eWxlPgogICAgPHN0eWxlPiNtYXAge3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO3JpZ2h0OjA7bGVmdDowO308L3N0eWxlPgogICAgCiAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLAogICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgIDxzdHlsZT4jbWFwXzNjNWU5ZTc0YTBiNjQyM2Y4MWRiNmNlYjlhOWYwMTI3IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDEwMC4wJTsKICAgICAgICBoZWlnaHQ6IDEwMC4wJTsKICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgIHRvcDogMC4wJTsKICAgICAgICB9CiAgICA8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgPGRpdiBjbGFzcz0iZm9saXVtLW1hcCIgaWQ9Im1hcF8zYzVlOWU3NGEwYjY0MjNmODFkYjZjZWI5YTlmMDEyNyIgPjwvZGl2Pgo8L2JvZHk+CjxzY3JpcHQ+ICAgIAogICAgCiAgICAKICAgICAgICB2YXIgYm91bmRzID0gbnVsbDsKICAgIAoKICAgIHZhciBtYXBfM2M1ZTllNzRhMGI2NDIzZjgxZGI2Y2ViOWE5ZjAxMjcgPSBMLm1hcCgKICAgICAgICAnbWFwXzNjNWU5ZTc0YTBiNjQyM2Y4MWRiNmNlYjlhOWYwMTI3JywgewogICAgICAgIGNlbnRlcjogWzUxLjUwNDYyNzU5LCAtMC4wOTE3NzM3NzZdLAogICAgICAgIHpvb206IDE1LAogICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgIGxheWVyczogW10sCiAgICAgICAgd29ybGRDb3B5SnVtcDogZmFsc2UsCiAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NywKICAgICAgICB6b29tQ29udHJvbDogdHJ1ZSwKICAgICAgICB9KTsKCgogICAgCiAgICB2YXIgdGlsZV9sYXllcl8yMGMxYWI1NGM3N2Y0Njg5YmI2ZmRmZGZlOTBlOGFmZSA9IEwudGlsZUxheWVyKAogICAgICAgICdodHRwczovL2NhcnRvZGItYmFzZW1hcHMte3N9Lmdsb2JhbC5zc2wuZmFzdGx5Lm5ldC9saWdodF9hbGwve3p9L3t4fS97eX0ucG5nJywKICAgICAgICB7CiAgICAgICAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAgICAgICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgICAgICAgIm1heE5hdGl2ZVpvb20iOiAxOCwKICAgICAgICAibWF4Wm9vbSI6IDE4LAogICAgICAgICJtaW5ab29tIjogMCwKICAgICAgICAibm9XcmFwIjogZmFsc2UsCiAgICAgICAgIm9wYWNpdHkiOiAxLAogICAgICAgICJzdWJkb21haW5zIjogImFiYyIsCiAgICAgICAgInRtcyI6IGZhbHNlCn0pLmFkZFRvKG1hcF8zYzVlOWU3NGEwYjY0MjNmODFkYjZjZWI5YTlmMDEyNyk7CiAgICAKICAgICAgICB2YXIgbWFya2VyX2Y1MTBkYzMwMWZhMTQwMGY5MWFkOGE2NmFkZmU1OWQzID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs1MS41MDQ2Mjc1OSwgLTAuMDkxNzczNzc2XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzNjNWU5ZTc0YTBiNjQyM2Y4MWRiNmNlYjlhOWYwMTI3KTsKICAgICAgICAKICAgIAogICAgICAgIG1hcmtlcl9mNTEwZGMzMDFmYTE0MDBmOTFhZDhhNjZhZGZlNTlkMy5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBIb3AgRXhjaGFuZ2UsIFRoZSBCb3JvdWdoYCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgZmVhdHVyZV9ncm91cF9hNTgyNWI2ZTgyYzk0ZGUyYTJjZjQ2MmJiYTZjOTZkNCA9IEwuZmVhdHVyZUdyb3VwKAogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2M1ZTllNzRhMGI2NDIzZjgxZGI2Y2ViOWE5ZjAxMjcpOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX2E5YjI0MmYwZjE4YzRlYWE4Mjk2ZGUwZmExYjk1NWJiID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTA1OTc0MjYsIC0wLjA5Mjc1NDE1N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTUuMjI3ODkyNDE5MjQxMjI5LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2E1ODI1YjZlODJjOTRkZTJhMmNmNDYyYmJhNmM5NmQ0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfYTliMjQyZjBmMThjNGVhYTgyOTZkZTBmYTFiOTU1YmIuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgUGFyayBTdHJlZXQsIEJhbmtzaWRlOiAxNjQuMzk5NjY4NjI3MTQyMjZgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX2VlMmI4ZmUxYmE3NjQxZjRiM2ZkYjZlOGY0MjFjMThkID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTA2MzA0NDEsIC0wLjA4NzI2Mjk5NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMzMuNjgzMDg2NDUwMzA3NjUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYTU4MjViNmU4MmM5NGRlMmEyY2Y0NjJiYmE2Yzk2ZDQpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV9lZTJiOGZlMWJhNzY0MWY0YjNmZGI2ZThmNDIxYzE4ZC5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBEdWtlIFN0cmVldCBIaWxsLCBMb25kb24gQnJpZGdlOiAzNjMuNjQxMTQ2MDE3ODg2MjNgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzdkZTE2YzE1ZGM5ZTQwMzg4YWE1YTA5ODgxY2VkMGNhID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTA1MjI0MTc0NSwgLTAuMDk4MDMxODExODY2NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJjcmltc29uIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiY3JpbXNvbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNDAuNTg4MjA3NzQ3NjQ2ODYsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYTU4MjViNmU4MmM5NGRlMmEyY2Y0NjJiYmE2Yzk2ZDQpOwogICAgICAgICAgICAKICAgIAogICAgICAgIGNpcmNsZV83ZGUxNmMxNWRjOWU0MDM4OGFhNWEwOTg4MWNlZDBjYS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgYDxkaXY+YAogICAgICAgICAgICArIGBMYXZpbmd0b24gU3RyZWV0LCBCYW5rc2lkZTogNDM4LjE4ODUzNzIwMzcwODNgICsgYDwvZGl2PmAsCiAgICAgICAgICAgIHsic3RpY2t5IjogdHJ1ZX0KICAgICAgICApOwogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlX2Q3YmVmYzM4NGI1NjQ3YmFhZmIzYWI4YmQ3MTNiZTE5ID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNTEuNTA3Mzg1MywgLTAuMDk2NDQwNzUxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA0MS4yNTQ0NzQwNDg3MTc1MiwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9hNTgyNWI2ZTgyYzk0ZGUyYTJjZjQ2MmJiYTZjOTZkNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2Q3YmVmYzM4NGI1NjQ3YmFhZmIzYWI4YmQ3MTNiZTE5LmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYE5ldyBHbG9iZSBXYWxrLCBCYW5rc2lkZTogNDQ1LjM4MTUxOTQwMzU5ODY1YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV8wZTI3NTVmMzRlYzY0ZmRjOTNkMTNiNTFjZDcxNjM2MCA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUwMDgyMzQ2LCAtMC4wODk3NDA3NjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDQxLjI5MjU1MDg3NTI3MzAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2E1ODI1YjZlODJjOTRkZTJhMmNmNDYyYmJhNmM5NmQ0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfMGUyNzU1ZjM0ZWM2NGZkYzkzZDEzYjUxY2Q3MTYzNjAuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgRW1waXJlIFNxdWFyZSwgVGhlIEJvcm91Z2g6IDQ0NS43OTI1OTUxNzc5NTc5YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV8yNWNlNjM0Y2ZmZjM0MTBiYjNiNzU4NzhhMmM0OWNiMCA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUwNTQwOTk0MDMsIC0wLjA5ODM0MTA4ODQ1MDldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDQyLjg2NzI0NjI2NjM0MDIyNCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9hNTgyNWI2ZTgyYzk0ZGUyYTJjZjQ2MmJiYTZjOTZkNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzI1Y2U2MzRjZmZmMzQxMGJiM2I3NTg3OGEyYzQ5Y2IwLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYFNvdXRod2FyayBTdHJlZXQsIEJhbmtzaWRlOiA0NjIuNzkyOTM4NTg0MTgxOGAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfNWNlNDc1YTk2NmYxNDQ5MWEwZmJmMDVkNWI3NGY1ZWYgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MDA2OTQ5MSwgLTAuMDk0NTI0MzE5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA0NC4xNzc3MTI0ODEyNTAyNywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9hNTgyNWI2ZTgyYzk0ZGUyYTJjZjQ2MmJiYTZjOTZkNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlXzVjZTQ3NWE5NjZmMTQ0OTFhMGZiZjA1ZDViNzRmNWVmLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYEJvcm91Z2ggSGlnaCBTdHJlZXQsIFRoZSBCb3JvdWdoOiA0NzYuOTQwNjc1MjIwODA2NGAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfYTAxYWQ0YTVjZjUwNGRiYWJmZWE5OWJjMzU3ZTc1OWMgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MDM2ODgzNywgLTAuMDk4NDk3Njg0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA0NC4xNzk5MjM2NzY0MTA1NSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8oZmVhdHVyZV9ncm91cF9hNTgyNWI2ZTgyYzk0ZGUyYTJjZjQ2MmJiYTZjOTZkNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgY2lyY2xlX2EwMWFkNGE1Y2Y1MDRkYmFiZmVhOTliYzM1N2U3NTljLmJpbmRUb29sdGlwKAogICAgICAgICAgICBgPGRpdj5gCiAgICAgICAgICAgICsgYFVuaW9uIFN0cmVldCwgVGhlIEJvcm91Z2g6IDQ3Ni45NjQ1NDcxODgyMjA3YCArIGA8L2Rpdj5gLAogICAgICAgICAgICB7InN0aWNreSI6IHRydWV9CiAgICAgICAgKTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV8wNDllMmYwYTRhYzg0OGZiODg2ZTFmMzUwODMxOTg1MyA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjUwMDI5NjMxLCAtMC4wOTI3NjI3MDRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiY3JpbXNvbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImNyaW1zb24iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDQ1LjA1OTE5MzM4NjI5MzE1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2E1ODI1YjZlODJjOTRkZTJhMmNmNDYyYmJhNmM5NmQ0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfMDQ5ZTJmMGE0YWM4NDhmYjg4NmUxZjM1MDgzMTk4NTMuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgU3dhbiBTdHJlZXQsIFRoZSBCb3JvdWdoOiA0ODYuNDU3MTA0OTg2Njk0MWAgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfOTEzYmY4ZDNhZmJmNDk1Mzk3MDA4MTYyZDNmMGI4MmEgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFs1MS41MDY3MjUyODY4LCAtMC4wOTg4MDcyNDYxNjI3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImNyaW1zb24iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJjcmltc29uIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1MC4wLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhmZWF0dXJlX2dyb3VwX2E1ODI1YjZlODJjOTRkZTJhMmNmNDYyYmJhNmM5NmQ0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICBjaXJjbGVfOTEzYmY4ZDNhZmJmNDk1Mzk3MDA4MTYyZDNmMGI4MmEuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGA8ZGl2PmAKICAgICAgICAgICAgKyBgVGF0ZSBNb2Rlcm4sIEJhbmtzaWRlOiA1MzkuNzk3ODM5NzE3NTEzM2AgKyBgPC9kaXY+YCwKICAgICAgICAgICAgeyJzdGlja3kiOiB0cnVlfQogICAgICAgICk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGxheWVyX2NvbnRyb2xfOGE4Y2ZmMWZmNThkNDQzMTg1OWVlZDY5Zjc4M2RlODEgPSB7CiAgICAgICAgICAgICAgICBiYXNlX2xheWVycyA6IHsgImNhcnRvZGJwb3NpdHJvbiIgOiB0aWxlX2xheWVyXzIwYzFhYjU0Yzc3ZjQ2ODliYjZmZGZkZmU5MGU4YWZlLCB9LAogICAgICAgICAgICAgICAgb3ZlcmxheXMgOiB7ICJDbG9zZXN0IFN0YXRpb25zIiA6IGZlYXR1cmVfZ3JvdXBfYTU4MjViNmU4MmM5NGRlMmEyY2Y0NjJiYmE2Yzk2ZDQsIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIEwuY29udHJvbC5sYXllcnMoCiAgICAgICAgICAgICAgICBsYXllcl9jb250cm9sXzhhOGNmZjFmZjU4ZDQ0MzE4NTllZWQ2OWY3ODNkZTgxLmJhc2VfbGF5ZXJzLAogICAgICAgICAgICAgICAgbGF5ZXJfY29udHJvbF84YThjZmYxZmY1OGQ0NDMxODU5ZWVkNjlmNzgzZGU4MS5vdmVybGF5cywKICAgICAgICAgICAgICAgIHtwb3NpdGlvbjogJ3RvcHJpZ2h0JywKICAgICAgICAgICAgICAgICBjb2xsYXBzZWQ6IHRydWUsCiAgICAgICAgICAgICAgICAgYXV0b1pJbmRleDogdHJ1ZQogICAgICAgICAgICAgICAgfSkuYWRkVG8obWFwXzNjNWU5ZTc0YTBiNjQyM2Y4MWRiNmNlYjlhOWYwMTI3KTsKICAgICAgICAgICAgCiAgICAgICAgCjwvc2NyaXB0Pg==\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x7f2cf772c278>"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"destination_station = closest_stations.loc[0,['destination_station', 'destination_geog']]\n",
"destination_coords = geojson.loads(destination_station['destination_geog'])['coordinates'][::-1]\n",
"\n",
"m = folium.Map(location=destination_coords, \n",
" tiles='CartoDB positron', zoom_start=15)\n",
"\n",
"folium.Marker(destination_coords, \n",
" tooltip=destination_station['destination_station']\n",
" ).add_to(m)\n",
"\n",
"\n",
"closest_stations_feature_group = build_circles_feature_group(closest_stations, \n",
" feature_group_name='Closest Stations',\n",
" circle_size=50,\n",
" color='crimson',\n",
" geog_field='source_geog', \n",
" size_field='distance', \n",
" tooltip_field1='source_station', \n",
" tooltip_field2='distance'\n",
" )\n",
"closest_stations_feature_group.add_to(m)\n",
"folium.LayerControl().add_to(m)\n",
" \n",
"m"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "BQ-GIS-LondonCycle-Demo",
"version": "0.3.2",
"provenance": [],
"include_colab_link": true
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.3"
},
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/thinhha/6cb0d76bba1adb9d80871cd47576d440/bq-gis-demo.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "code",
"metadata": {
"id": "tWmm4OYtK8rv",
"colab_type": "code",
"colab": {}
},
"source": [
"!pip install --upgrade google-cloud-monitoring"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "mVp_ioQzK4bh",
"colab_type": "code",
"colab": {},
"outputId": "30ce1b6a-8c85-42cc-97bc-7e1ac2607a09"
},
"source": [
"import sys\n",
"print(sys.executable)\n",
"print(sys.version)"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"/usr/bin/python3\n",
"3.5.3 (default, Sep 27 2018, 17:25:39) \n",
"[GCC 6.3.0 20170516]\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "PXAHlQOYK4bl",
"colab_type": "code",
"colab": {}
},
"source": [
"import os\n",
"import geojson\n",
"import pandas as pd\n",
"\n",
"from google.cloud import bigquery\n",
"from IPython.display import GeoJSON"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "lCO7dzmFK4bn",
"colab_type": "code",
"colab": {},
"outputId": "ba06119d-e233-420e-f112-23bf06673f89"
},
"source": [
"import folium\n",
"from folium import plugins\n",
"\n",
"folium.__version__"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"'0.8.3'"
]
},
"metadata": {
"tags": []
},
"execution_count": 3
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "TlUgK_j2K4bq",
"colab_type": "code",
"colab": {},
"outputId": "cffc7717-8572-49c6-f529-904c1b6f5848"
},
"source": [
"import geopandas as gpd\n",
"\n",
"gpd.__version__"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"'0.4.1'"
]
},
"metadata": {
"tags": []
},
"execution_count": 4
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "n_tYpyvwK4bt",
"colab_type": "code",
"colab": {}
},
"source": [
"pd.set_option('max_rows', 12)\n",
"%matplotlib inline"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "23bwg_jAK4bv",
"colab_type": "code",
"colab": {},
"outputId": "5dde0a82-2088-4302-aad8-5e6ffcae827a"
},
"source": [
"%%bigquery\n",
"SELECT\n",
" *\n",
"FROM\n",
" `google.com:pso-bq-gis-demo.gis_demo.london_cycle`\n",
"LIMIT 5"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>rental_id</th>\n",
" <th>start_date</th>\n",
" <th>start_station_name</th>\n",
" <th>start_station_latitude</th>\n",
" <th>start_station_longitude</th>\n",
" <th>start_station_docks_count</th>\n",
" <th>end_date</th>\n",
" <th>end_station_name</th>\n",
" <th>end_station_latitude</th>\n",
" <th>end_station_longitude</th>\n",
" <th>end_station_docks_count</th>\n",
" <th>duration</th>\n",
" <th>is_same_station</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>62475502</td>\n",
" <td>2017-02-18 16:15:00+00:00</td>\n",
" <td>Broomhouse Lane, Parsons Green</td>\n",
" <td>51.468419</td>\n",
" <td>-0.199136</td>\n",
" <td>29</td>\n",
" <td>2017-02-18 16:22:00+00:00</td>\n",
" <td>Aintree Street, Fulham</td>\n",
" <td>51.481021</td>\n",
" <td>-0.209973</td>\n",
" <td>24</td>\n",
" <td>420</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>62474522</td>\n",
" <td>2017-02-18 15:52:00+00:00</td>\n",
" <td>Ranelagh Gardens, Fulham</td>\n",
" <td>51.467601</td>\n",
" <td>-0.206827</td>\n",
" <td>39</td>\n",
" <td>2017-02-18 16:02:00+00:00</td>\n",
" <td>Aintree Street, Fulham</td>\n",
" <td>51.481021</td>\n",
" <td>-0.209973</td>\n",
" <td>24</td>\n",
" <td>600</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>62477580</td>\n",
" <td>2017-02-18 17:06:00+00:00</td>\n",
" <td>Michael Road, Walham Green</td>\n",
" <td>51.477276</td>\n",
" <td>-0.189210</td>\n",
" <td>37</td>\n",
" <td>2017-02-18 17:21:00+00:00</td>\n",
" <td>Aintree Street, Fulham</td>\n",
" <td>51.481021</td>\n",
" <td>-0.209973</td>\n",
" <td>24</td>\n",
" <td>900</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>62477618</td>\n",
" <td>2017-02-18 17:07:00+00:00</td>\n",
" <td>Michael Road, Walham Green</td>\n",
" <td>51.477276</td>\n",
" <td>-0.189210</td>\n",
" <td>37</td>\n",
" <td>2017-02-18 17:19:00+00:00</td>\n",
" <td>Aintree Street, Fulham</td>\n",
" <td>51.481021</td>\n",
" <td>-0.209973</td>\n",
" <td>24</td>\n",
" <td>720</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>62481482</td>\n",
" <td>2017-02-18 19:50:00+00:00</td>\n",
" <td>Alderney Street, Pimlico</td>\n",
" <td>51.488058</td>\n",
" <td>-0.140741</td>\n",
" <td>14</td>\n",
" <td>2017-02-18 20:15:00+00:00</td>\n",
" <td>Aintree Street, Fulham</td>\n",
" <td>51.481021</td>\n",
" <td>-0.209973</td>\n",
" <td>24</td>\n",
" <td>1500</td>\n",
" <td>False</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" rental_id start_date start_station_name \\\n",
"0 62475502 2017-02-18 16:15:00+00:00 Broomhouse Lane, Parsons Green \n",
"1 62474522 2017-02-18 15:52:00+00:00 Ranelagh Gardens, Fulham \n",
"2 62477580 2017-02-18 17:06:00+00:00 Michael Road, Walham Green \n",
"3 62477618 2017-02-18 17:07:00+00:00 Michael Road, Walham Green \n",
"4 62481482 2017-02-18 19:50:00+00:00 Alderney Street, Pimlico \n",
"\n",
" start_station_latitude start_station_longitude start_station_docks_count \\\n",
"0 51.468419 -0.199136 29 \n",
"1 51.467601 -0.206827 39 \n",
"2 51.477276 -0.189210 37 \n",
"3 51.477276 -0.189210 37 \n",
"4 51.488058 -0.140741 14 \n",
"\n",
" end_date end_station_name end_station_latitude \\\n",
"0 2017-02-18 16:22:00+00:00 Aintree Street, Fulham 51.481021 \n",
"1 2017-02-18 16:02:00+00:00 Aintree Street, Fulham 51.481021 \n",
"2 2017-02-18 17:21:00+00:00 Aintree Street, Fulham 51.481021 \n",
"3 2017-02-18 17:19:00+00:00 Aintree Street, Fulham 51.481021 \n",
"4 2017-02-18 20:15:00+00:00 Aintree Street, Fulham 51.481021 \n",
"\n",
" end_station_longitude end_station_docks_count duration is_same_station \n",
"0 -0.209973 24 420 False \n",
"1 -0.209973 24 600 False \n",
"2 -0.209973 24 900 False \n",
"3 -0.209973 24 720 False \n",
"4 -0.209973 24 1500 False "
]
},
"metadata": {
"tags": []
},
"execution_count": 6
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "WWamMzLfK4bx",
"colab_type": "code",
"colab": {},
"outputId": "bbf1f6c1-81c7-41cf-c35c-45a036892dd6"
},
"source": [
"%%bigquery\n",
"SELECT\n",
" *\n",
"FROM\n",
" `google.com:pso-bq-gis-demo.gis_demo.cycle_stations`\n",
"LIMIT 5"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>install_date</th>\n",
" <th>installed</th>\n",
" <th>latitude</th>\n",
" <th>locked</th>\n",
" <th>longitude</th>\n",
" <th>name</th>\n",
" <th>bikes_count</th>\n",
" <th>docks_count</th>\n",
" <th>nbEmptyDocks</th>\n",
" <th>removal_date</th>\n",
" <th>temporary</th>\n",
" <th>terminal_name</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>39</td>\n",
" <td>2010-07-08</td>\n",
" <td>True</td>\n",
" <td>51.526378</td>\n",
" <td>false</td>\n",
" <td>-0.078131</td>\n",
" <td>Shoreditch High Street, Shoreditch</td>\n",
" <td>41</td>\n",
" <td>41</td>\n",
" <td>0</td>\n",
" <td>None</td>\n",
" <td>False</td>\n",
" <td>003445</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>566</td>\n",
" <td>2012-03-05</td>\n",
" <td>True</td>\n",
" <td>51.509158</td>\n",
" <td>false</td>\n",
" <td>-0.224103</td>\n",
" <td>Westfield Ariel Way, White City</td>\n",
" <td>42</td>\n",
" <td>42</td>\n",
" <td>0</td>\n",
" <td>None</td>\n",
" <td>False</td>\n",
" <td>200141</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>601</td>\n",
" <td>None</td>\n",
" <td>True</td>\n",
" <td>51.514767</td>\n",
" <td>false</td>\n",
" <td>-0.225787</td>\n",
" <td>BBC White City, White City</td>\n",
" <td>34</td>\n",
" <td>36</td>\n",
" <td>0</td>\n",
" <td>None</td>\n",
" <td>False</td>\n",
" <td>200136</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>718</td>\n",
" <td>2013-11-20</td>\n",
" <td>True</td>\n",
" <td>51.535717</td>\n",
" <td>false</td>\n",
" <td>-0.060292</td>\n",
" <td>Ada Street, Hackney Central</td>\n",
" <td>45</td>\n",
" <td>45</td>\n",
" <td>0</td>\n",
" <td>None</td>\n",
" <td>False</td>\n",
" <td>300040</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>811</td>\n",
" <td>2016-07-26</td>\n",
" <td>True</td>\n",
" <td>51.505703</td>\n",
" <td>false</td>\n",
" <td>-0.027773</td>\n",
" <td>Westferry Circus, Canary Wharf</td>\n",
" <td>35</td>\n",
" <td>35</td>\n",
" <td>0</td>\n",
" <td>None</td>\n",
" <td>False</td>\n",
" <td>300228</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" id install_date installed latitude locked longitude \\\n",
"0 39 2010-07-08 True 51.526378 false -0.078131 \n",
"1 566 2012-03-05 True 51.509158 false -0.224103 \n",
"2 601 None True 51.514767 false -0.225787 \n",
"3 718 2013-11-20 True 51.535717 false -0.060292 \n",
"4 811 2016-07-26 True 51.505703 false -0.027773 \n",
"\n",
" name bikes_count docks_count nbEmptyDocks \\\n",
"0 Shoreditch High Street, Shoreditch 41 41 0 \n",
"1 Westfield Ariel Way, White City 42 42 0 \n",
"2 BBC White City, White City 34 36 0 \n",
"3 Ada Street, Hackney Central 45 45 0 \n",
"4 Westferry Circus, Canary Wharf 35 35 0 \n",
"\n",
" removal_date temporary terminal_name \n",
"0 None False 003445 \n",
"1 None False 200141 \n",
"2 None False 200136 \n",
"3 None False 300040 \n",
"4 None False 300228 "
]
},
"metadata": {
"tags": []
},
"execution_count": 7
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "JpgTYNiGK4bz",
"colab_type": "code",
"colab": {},
"outputId": "381fc371-62b6-49be-c3bc-1020e982a10f"
},
"source": [
"%%bigquery\n",
"SELECT\n",
" start_station_name,\n",
" end_station_name,\n",
" count(1) cnt,\n",
" MIN(duration) as min_duration,\n",
" AVG(duration) as avg_duration,\n",
" MAX(duration) as max_duration,\n",
" MAX(end_station_docks_count) as docks_count\n",
"FROM\n",
" `google.com:pso-bq-gis-demo.gis_demo.london_cycle`\n",
"WHERE\n",
" is_same_station IS false\n",
"GROUP BY 1, 2\n",
"ORDER BY 3 desc\n",
"LIMIT 100"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>start_station_name</th>\n",
" <th>end_station_name</th>\n",
" <th>cnt</th>\n",
" <th>min_duration</th>\n",
" <th>avg_duration</th>\n",
" <th>max_duration</th>\n",
" <th>docks_count</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Hyde Park Corner, Hyde Park</td>\n",
" <td>Triangle Car Park, Hyde Park</td>\n",
" <td>2426</td>\n",
" <td>240</td>\n",
" <td>1804.105523</td>\n",
" <td>60540</td>\n",
" <td>27</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Triangle Car Park, Hyde Park</td>\n",
" <td>Hyde Park Corner, Hyde Park</td>\n",
" <td>2236</td>\n",
" <td>240</td>\n",
" <td>1716.144902</td>\n",
" <td>19920</td>\n",
" <td>28</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Black Lion Gate, Kensington Gardens</td>\n",
" <td>Hyde Park Corner, Hyde Park</td>\n",
" <td>2189</td>\n",
" <td>480</td>\n",
" <td>2091.585199</td>\n",
" <td>80520</td>\n",
" <td>28</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Black Lion Gate, Kensington Gardens</td>\n",
" <td>Palace Gate, Kensington Gardens</td>\n",
" <td>2175</td>\n",
" <td>60</td>\n",
" <td>1348.937931</td>\n",
" <td>226800</td>\n",
" <td>13</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Hyde Park Corner, Hyde Park</td>\n",
" <td>Albert Gate, Hyde Park</td>\n",
" <td>2168</td>\n",
" <td>60</td>\n",
" <td>2574.990775</td>\n",
" <td>15060</td>\n",
" <td>28</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>Albert Gate, Hyde Park</td>\n",
" <td>Hyde Park Corner, Hyde Park</td>\n",
" <td>1957</td>\n",
" <td>60</td>\n",
" <td>2600.602964</td>\n",
" <td>22440</td>\n",
" <td>28</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>94</th>\n",
" <td>Hop Exchange, The Borough</td>\n",
" <td>Bankside Mix, Bankside</td>\n",
" <td>653</td>\n",
" <td>60</td>\n",
" <td>242.388974</td>\n",
" <td>7680</td>\n",
" <td>60</td>\n",
" </tr>\n",
" <tr>\n",
" <th>95</th>\n",
" <td>Waterloo Station 3, Waterloo</td>\n",
" <td>Wormwood Street, Liverpool Street</td>\n",
" <td>651</td>\n",
" <td>480</td>\n",
" <td>1027.926267</td>\n",
" <td>14700</td>\n",
" <td>16</td>\n",
" </tr>\n",
" <tr>\n",
" <th>96</th>\n",
" <td>Queen's Gate, Kensington Gardens</td>\n",
" <td>Park Lane , Hyde Park</td>\n",
" <td>650</td>\n",
" <td>600</td>\n",
" <td>2130.738462</td>\n",
" <td>16440</td>\n",
" <td>28</td>\n",
" </tr>\n",
" <tr>\n",
" <th>97</th>\n",
" <td>Waterloo Station 3, Waterloo</td>\n",
" <td>Cheapside, Bank</td>\n",
" <td>649</td>\n",
" <td>480</td>\n",
" <td>779.722650</td>\n",
" <td>2040</td>\n",
" <td>43</td>\n",
" </tr>\n",
" <tr>\n",
" <th>98</th>\n",
" <td>Great Marlborough Street, Soho</td>\n",
" <td>Belgrove Street , King's Cross</td>\n",
" <td>647</td>\n",
" <td>480</td>\n",
" <td>713.508501</td>\n",
" <td>10740</td>\n",
" <td>48</td>\n",
" </tr>\n",
" <tr>\n",
" <th>99</th>\n",
" <td>Serpentine Car Park, Hyde Park</td>\n",
" <td>Park Lane , Hyde Park</td>\n",
" <td>640</td>\n",
" <td>420</td>\n",
" <td>1803.937500</td>\n",
" <td>13980</td>\n",
" <td>28</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>100 rows × 7 columns</p>\n",
"</div>"
],
"text/plain": [
" start_station_name end_station_name \\\n",
"0 Hyde Park Corner, Hyde Park Triangle Car Park, Hyde Park \n",
"1 Triangle Car Park, Hyde Park Hyde Park Corner, Hyde Park \n",
"2 Black Lion Gate, Kensington Gardens Hyde Park Corner, Hyde Park \n",
"3 Black Lion Gate, Kensington Gardens Palace Gate, Kensington Gardens \n",
"4 Hyde Park Corner, Hyde Park Albert Gate, Hyde Park \n",
"5 Albert Gate, Hyde Park Hyde Park Corner, Hyde Park \n",
".. ... ... \n",
"94 Hop Exchange, The Borough Bankside Mix, Bankside \n",
"95 Waterloo Station 3, Waterloo Wormwood Street, Liverpool Street \n",
"96 Queen's Gate, Kensington Gardens Park Lane , Hyde Park \n",
"97 Waterloo Station 3, Waterloo Cheapside, Bank \n",
"98 Great Marlborough Street, Soho Belgrove Street , King's Cross \n",
"99 Serpentine Car Park, Hyde Park Park Lane , Hyde Park \n",
"\n",
" cnt min_duration avg_duration max_duration docks_count \n",
"0 2426 240 1804.105523 60540 27 \n",
"1 2236 240 1716.144902 19920 28 \n",
"2 2189 480 2091.585199 80520 28 \n",
"3 2175 60 1348.937931 226800 13 \n",
"4 2168 60 2574.990775 15060 28 \n",
"5 1957 60 2600.602964 22440 28 \n",
".. ... ... ... ... ... \n",
"94 653 60 242.388974 7680 60 \n",
"95 651 480 1027.926267 14700 16 \n",
"96 650 600 2130.738462 16440 28 \n",
"97 649 480 779.722650 2040 43 \n",
"98 647 480 713.508501 10740 48 \n",
"99 640 420 1803.937500 13980 28 \n",
"\n",
"[100 rows x 7 columns]"
]
},
"metadata": {
"tags": []
},
"execution_count": 8
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "J3McoT_qK4b2",
"colab_type": "code",
"colab": {}
},
"source": [
"%%bigquery most_popular_paths\n",
"WITH \n",
" most_popular_paths AS (\n",
" SELECT\n",
" start_station_name,\n",
" end_station_name,\n",
" count(1) cnt,\n",
" AVG(duration) as avg_duration,\n",
" MAX(duration) as max_duration,\n",
" MAX(end_station_docks_count) as docks_count\n",
" FROM\n",
" `google.com:pso-bq-gis-demo.gis_demo.london_cycle`\n",
" WHERE\n",
" is_same_station IS false\n",
" GROUP BY 1, 2\n",
" ORDER BY 3 desc\n",
" LIMIT 100\n",
" ),\n",
" stations AS (\n",
" SELECT\n",
" name,\n",
" ST_GEOGPOINT(longitude,latitude) as geometry\n",
" FROM\n",
" `google.com:pso-bq-gis-demo.gis_demo.cycle_stations`\n",
" )\n",
"SELECT\n",
" ST_ASGEOJSON(ST_MAKELINE(b.geometry,c.geometry)) line,\n",
" ST_ASGEOJSON(c.geometry) as end_geog,\n",
" a.*\n",
"FROM\n",
" most_popular_paths a\n",
"JOIN\n",
" stations b\n",
"ON\n",
" a.start_station_name = b.name\n",
"JOIN\n",
" stations c\n",
"ON\n",
" a.end_station_name = c.name"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "JvyaWvv9K4b4",
"colab_type": "code",
"colab": {},
"outputId": "34e0c4b8-89ac-452c-ef85-02d7e816cd74"
},
"source": [
"most_popular_paths.head()"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>line</th>\n",
" <th>end_geog</th>\n",
" <th>start_station_name</th>\n",
" <th>end_station_name</th>\n",
" <th>cnt</th>\n",
" <th>avg_duration</th>\n",
" <th>max_duration</th>\n",
" <th>docks_count</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>{ \"type\": \"LineString\", \"coordinates\": [ [-0.1...</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.17027955...</td>\n",
" <td>Hyde Park Corner, Hyde Park</td>\n",
" <td>Triangle Car Park, Hyde Park</td>\n",
" <td>2426</td>\n",
" <td>1804.105523</td>\n",
" <td>60540</td>\n",
" <td>27</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>{ \"type\": \"LineString\", \"coordinates\": [ [-0.1...</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.15352093...</td>\n",
" <td>Triangle Car Park, Hyde Park</td>\n",
" <td>Hyde Park Corner, Hyde Park</td>\n",
" <td>2236</td>\n",
" <td>1716.144902</td>\n",
" <td>19920</td>\n",
" <td>28</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>{ \"type\": \"LineString\", \"coordinates\": [ [-0.1...</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.15352093...</td>\n",
" <td>Black Lion Gate, Kensington Gardens</td>\n",
" <td>Hyde Park Corner, Hyde Park</td>\n",
" <td>2189</td>\n",
" <td>2091.585199</td>\n",
" <td>80520</td>\n",
" <td>28</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>{ \"type\": \"LineString\", \"coordinates\": [ [-0.1...</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.18440022...</td>\n",
" <td>Black Lion Gate, Kensington Gardens</td>\n",
" <td>Palace Gate, Kensington Gardens</td>\n",
" <td>2175</td>\n",
" <td>1348.937931</td>\n",
" <td>226800</td>\n",
" <td>13</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>{ \"type\": \"LineString\", \"coordinates\": [ [-0.1...</td>\n",
" <td>{ \"type\": \"Point\", \"coordinates\": [-0.15845608...</td>\n",
" <td>Hyde Park Corner, Hyde Park</td>\n",
" <td>Albert Gate, Hyde Park</td>\n",
" <td>2168</td>\n",
" <td>2574.990775</td>\n",
" <td>15060</td>\n",
" <td>28</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" line \\\n",
"0 { \"type\": \"LineString\", \"coordinates\": [ [-0.1... \n",
"1 { \"type\": \"LineString\", \"coordinates\": [ [-0.1... \n",
"2 { \"type\": \"LineString\", \"coordinates\": [ [-0.1... \n",
"3 { \"type\": \"LineString\", \"coordinates\": [ [-0.1... \n",
"4 { \"type\": \"LineString\", \"coordinates\": [ [-0.1... \n",
"\n",
" end_geog \\\n",
"0 { \"type\": \"Point\", \"coordinates\": [-0.17027955... \n",
"1 { \"type\": \"Point\", \"coordinates\": [-0.15352093... \n",
"2 { \"type\": \"Point\", \"coordinates\": [-0.15352093... \n",
"3 { \"type\": \"Point\", \"coordinates\": [-0.18440022... \n",
"4 { \"type\": \"Point\", \"coordinates\": [-0.15845608... \n",
"\n",
" start_station_name end_station_name cnt \\\n",
"0 Hyde Park Corner, Hyde Park Triangle Car Park, Hyde Park 2426 \n",
"1 Triangle Car Park, Hyde Park Hyde Park Corner, Hyde Park 2236 \n",
"2 Black Lion Gate, Kensington Gardens Hyde Park Corner, Hyde Park 2189 \n",
"3 Black Lion Gate, Kensington Gardens Palace Gate, Kensington Gardens 2175 \n",
"4 Hyde Park Corner, Hyde Park Albert Gate, Hyde Park 2168 \n",
"\n",
" avg_duration max_duration docks_count \n",
"0 1804.105523 60540 27 \n",
"1 1716.144902 19920 28 \n",
"2 2091.585199 80520 28 \n",
"3 1348.937931 226800 13 \n",
"4 2574.990775 15060 28 "
]
},
"metadata": {
"tags": []
},
"execution_count": 10
}
]
},
{
"cell_type": "code",
"metadata": {
"jupyter": {
"source_hidden": true
},
"id": "rA8xIq52K4b8",
"colab_type": "code",
"colab": {},
"outputId": "a40b04d2-ab5c-46f4-8651-71754c7990c4"
},
"source": [
"def style_function(feature):\n",
" return {\n",
" 'fillColor': '#ffaf00',\n",
" 'color': 'blue',\n",
" 'weight': 2,\n",
" 'dashArray': '7, 7'\n",
" }\n",
"\n",
"\n",
"def highlight_function(feature):\n",
" return {\n",
" 'fillColor': '#ffaf00',\n",
" 'color': 'green',\n",
" 'weight': 4,\n",
" 'dashArray': '5, 5'\n",
" }\n",
"\n",
"\n",
"m = folium.Map(location=[51.5060338196204, -0.128345361445949], \n",
" tiles='CartoDB positron', zoom_start=12)\n",
"\n",
"# Add Paths to map\n",
"path_feature_group = folium.FeatureGroup(name='Paths')\n",
"\n",
"# Add Stations\n",
"station_feature_group = folium.FeatureGroup(name='Stations')\n",
"\n",
"for idx, data in most_popular_paths.iterrows():\n",
" line = geojson.Feature(geometry=geojson.loads(data['line']),\n",
" properties=data[['start_station_name','end_station_name', 'cnt']].to_dict())\n",
" folium.GeoJson(\n",
" line,\n",
" overlay=True,\n",
" style_function=style_function,\n",
" highlight_function=highlight_function,\n",
" tooltip=folium.GeoJsonTooltip(fields=['start_station_name','end_station_name', 'cnt'],localize=True)\n",
" ).add_to(path_feature_group)\n",
"\n",
"end_stations = most_popular_paths.groupby(['end_station_name', 'end_geog'])['cnt'].sum().reset_index() \n",
"\n",
"for idx, data in end_stations.iterrows():\n",
" folium.Circle(\n",
" location=geojson.loads(data['end_geog'])['coordinates'][::-1],\n",
" radius=data['cnt']/40,\n",
" tooltip=\"{}, {} trips\".format(data['end_station_name'], data['cnt']),\n",
" color='crimson',\n",
" fill=True,\n",
" fill_color='crimson'\n",
" ).add_to(station_feature_group)\n",
" \n",
"path_feature_group.add_to(m)\n",
"station_feature_group.add_to(m)\n",
"\n",
"folium.LayerControl().add_to(m)\n",
" \n",
"m"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVM9ZmFsc2U7IExfTk9fVE9VQ0g9ZmFsc2U7IExfRElTQUJMRV8zRD1mYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS40LjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NvZGUuanF1ZXJ5LmNvbS9qcXVlcnktMS4xMi40Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS40LjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdjZG4uZ2l0aGFjay5jb20vcHl0aG9uLXZpc3VhbGl6YXRpb24vZm9saXVtL21hc3Rlci9mb2xpdW0vdGVtcGxhdGVzL2xlYWZsZXQuYXdlc29tZS5yb3RhdGUuY3NzIi8+CiAgICA8c3R5bGU+aHRtbCwgYm9keSB7d2lkdGg6IDEwMCU7aGVpZ2h0OiAxMDAlO21hcmdpbjogMDtwYWRkaW5nOiAwO308L3N0eWxlPgogICAgPHN0eWxlPiNtYXAge3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO3JpZ2h0OjA7bGVmdDowO308L3N0eWxlPgogICAgCiAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLAogICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgIDxzdHlsZT4jbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDEwMC4wJTsKICAgICAgICBoZWlnaHQ6IDEwMC4wJTsKICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgIHRvcDogMC4wJTsKICAgICAgICB9CiAgICA8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgPGRpdiBjbGFzcz0iZm9saXVtLW1hcCIgaWQ9Im1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYyIgPjwvZGl2Pgo8L2JvZHk+CjxzY3JpcHQ+ICAgIAogICAgCiAgICAKICAgICAgICB2YXIgYm91bmRzID0gbnVsbDsKICAgIAoKICAgIHZhciBtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMgPSBMLm1hcCgKICAgICAgICAnbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjJywgewogICAgICAgIGNlbnRlcjogWzUxLjUwNjAzMzgxOTYyMDQsIC0wLjEyODM0NTM2MTQ0NTk0OV0sCiAgICAgICAgem9vbTogMTIsCiAgICAgICAgbWF4Qm91bmRzOiBib3VuZHMsCiAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3LAogICAgICAgIHpvb21Db250cm9sOiB0cnVlLAogICAgICAgIH0pOwoKCiAgICAKICAgIHZhciB0aWxlX2xheWVyX2FiNmQwM2E5MmViNzRlMTI4OGIyOTVhMzNjZmM3NDAxID0gTC50aWxlTGF5ZXIoCiAgICAgICAgJ2h0dHBzOi8vY2FydG9kYi1iYXNlbWFwcy17c30uZ2xvYmFsLnNzbC5mYXN0bHkubmV0L2xpZ2h0X2FsbC97en0ve3h9L3t5fS5wbmcnLAogICAgICAgIHsKICAgICAgICAiYXR0cmlidXRpb24iOiBudWxsLAogICAgICAgICJkZXRlY3RSZXRpbmEiOiBmYWxzZSwKICAgICAgICAibWF4TmF0aXZlWm9vbSI6IDE4LAogICAgICAgICJtYXhab29tIjogMTgsCiAgICAgICAgIm1pblpvb20iOiAwLAogICAgICAgICJub1dyYXAiOiBmYWxzZSwKICAgICAgICAib3BhY2l0eSI6IDEsCiAgICAgICAgInN1YmRvbWFpbnMiOiAiYWJjIiwKICAgICAgICAidG1zIjogZmFsc2UKfSkuYWRkVG8obWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjKTsKICAgIAogICAgICAgICAgICB2YXIgZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSA9IEwuZmVhdHVyZUdyb3VwKAogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uXzJhNmI4M2Y0ZjU2MTRkN2Q5MmVmNmFhNGIwNmZkNDkyX29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl8yYTZiODNmNGY1NjE0ZDdkOTJlZjZhYTRiMDZmZDQ5MiA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMTUzNTIwOTM1LCA1MS41MDMxMTc5OV0sIFstMC4xNzAyNzk1NTUsIDUxLjUwNjQ1MTc5XV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgInByb3BlcnRpZXMiOiB7ImNudCI6IDI0MjYsICJlbmRfc3RhdGlvbl9uYW1lIjogIlRyaWFuZ2xlIENhciBQYXJrLCBIeWRlIFBhcmsiLCAiaGlnaGxpZ2h0IjogeyJjb2xvciI6ICJncmVlbiIsICJkYXNoQXJyYXkiOiAiNSwgNSIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiA0fSwgInN0YXJ0X3N0YXRpb25fbmFtZSI6ICJIeWRlIFBhcmsgQ29ybmVyLCBIeWRlIFBhcmsiLCAic3R5bGUiOiB7ImNvbG9yIjogImJsdWUiLCAiZGFzaEFycmF5IjogIjcsIDciLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogMn19LCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl8yYTZiODNmNGY1NjE0ZDdkOTJlZjZhYTRiMDZmZDQ5Ml9vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICB9CiAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2I4MDcyMDQwYTJkODQ1NmQ5ODlkZGI1MDNiYjQ3YjE5ICk7CiAgICAgICAgZ2VvX2pzb25fMmE2YjgzZjRmNTYxNGQ3ZDkyZWY2YWE0YjA2ZmQ0OTIuc2V0U3R5bGUoZnVuY3Rpb24oZmVhdHVyZSkge3JldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGU7fSk7CiAgICAgICAgCiAgICAKICAgICAgICBnZW9fanNvbl8yYTZiODNmNGY1NjE0ZDdkOTJlZjZhYTRiMDZmZDQ5Mi5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgZnVuY3Rpb24obGF5ZXIpewogICAgICAgICAgICAvLyBDb252ZXJ0IG5vbi1wcmltaXRpdmUgdG8gU3RyaW5nLgogICAgICAgICAgICBsZXQgaGFuZGxlT2JqZWN0ID0gKGZlYXR1cmUpPT50eXBlb2YoZmVhdHVyZSk9PSdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgOiBmZWF0dXJlOwogICAgICAgICAgICBsZXQgZmllbGRzID0gWydzdGFydF9zdGF0aW9uX25hbWUnLCAnZW5kX3N0YXRpb25fbmFtZScsICdjbnQnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAnPHRhYmxlPicgKwogICAgICAgICAgICBTdHJpbmcoCiAgICAgICAgICAgICAgICBmaWVsZHMubWFwKAogICAgICAgICAgICAgICAgY29sdW1ubmFtZT0+CiAgICAgICAgICAgICAgICAgICAgYDx0ciBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPgogICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0icGFkZGluZzogNHB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgJHsgY29sdW1ubmFtZS50b0xvY2FsZVN0cmluZygpfQogICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiA0cHg7Ij4ke2hhbmRsZU9iamVjdChsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbY29sdW1ubmFtZV0pCiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlU3RyaW5nKCl9PC90ZD48L3RyPmAKICAgICAgICAgICAgICAgICkuam9pbignJykpCiAgICAgICAgICAgICAgICArJzwvdGFibGU+JwogICAgICAgICAgICB9LCB7InN0aWNreSI6IHRydWV9KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBnZW9fanNvbl80MDc1NzQwNThmNDc0NjBlYjhkZGQ5NzJiMzJlZGY4M19vbkVhY2hGZWF0dXJlID0gZnVuY3Rpb24gb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICAgICAgbGF5ZXIub24oewogICAgICAgICAgICAgICAgICAgIG1vdXNlb3V0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5zdHlsZSk7fSwKICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXI6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLmhpZ2hsaWdodCk7fSwKICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMuZml0Qm91bmRzKGUudGFyZ2V0LmdldEJvdW5kcygpKTt9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICB2YXIgZ2VvX2pzb25fNDA3NTc0MDU4ZjQ3NDYwZWI4ZGRkOTcyYjMyZWRmODMgPSBMLmdlb0pzb24oCiAgICAgICAgICAgIHsiZmVhdHVyZXMiOiBbeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy0wLjE3MDI3OTU1NSwgNTEuNTA2NDUxNzldLCBbLTAuMTUzNTIwOTM1LCA1MS41MDMxMTc5OV1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiAyMjM2LCAiZW5kX3N0YXRpb25fbmFtZSI6ICJIeWRlIFBhcmsgQ29ybmVyLCBIeWRlIFBhcmsiLCAiaGlnaGxpZ2h0IjogeyJjb2xvciI6ICJncmVlbiIsICJkYXNoQXJyYXkiOiAiNSwgNSIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiA0fSwgInN0YXJ0X3N0YXRpb25fbmFtZSI6ICJUcmlhbmdsZSBDYXIgUGFyaywgSHlkZSBQYXJrIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fNDA3NTc0MDU4ZjQ3NDYwZWI4ZGRkOTcyYjMyZWRmODNfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uXzQwNzU3NDA1OGY0NzQ2MGViOGRkZDk3MmIzMmVkZjgzLnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fNDA3NTc0MDU4ZjQ3NDYwZWI4ZGRkOTcyYjMyZWRmODMuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fNWU3MGE2MjcwMzExNGM0MjhhNjU1YTljYThjZGVkYjVfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uXzVlNzBhNjI3MDMxMTRjNDI4YTY1NWE5Y2E4Y2RlZGI1ID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4xODc4NDI3MTcsIDUxLjUwOTkwODM3XSwgWy0wLjE1MzUyMDkzNSwgNTEuNTAzMTE3OTldXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogMjE4OSwgImVuZF9zdGF0aW9uX25hbWUiOiAiSHlkZSBQYXJrIENvcm5lciwgSHlkZSBQYXJrIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiQmxhY2sgTGlvbiBHYXRlLCBLZW5zaW5ndG9uIEdhcmRlbnMiLCAic3R5bGUiOiB7ImNvbG9yIjogImJsdWUiLCAiZGFzaEFycmF5IjogIjcsIDciLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogMn19LCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl81ZTcwYTYyNzAzMTE0YzQyOGE2NTVhOWNhOGNkZWRiNV9vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICB9CiAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2I4MDcyMDQwYTJkODQ1NmQ5ODlkZGI1MDNiYjQ3YjE5ICk7CiAgICAgICAgZ2VvX2pzb25fNWU3MGE2MjcwMzExNGM0MjhhNjU1YTljYThjZGVkYjUuc2V0U3R5bGUoZnVuY3Rpb24oZmVhdHVyZSkge3JldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGU7fSk7CiAgICAgICAgCiAgICAKICAgICAgICBnZW9fanNvbl81ZTcwYTYyNzAzMTE0YzQyOGE2NTVhOWNhOGNkZWRiNS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgZnVuY3Rpb24obGF5ZXIpewogICAgICAgICAgICAvLyBDb252ZXJ0IG5vbi1wcmltaXRpdmUgdG8gU3RyaW5nLgogICAgICAgICAgICBsZXQgaGFuZGxlT2JqZWN0ID0gKGZlYXR1cmUpPT50eXBlb2YoZmVhdHVyZSk9PSdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgOiBmZWF0dXJlOwogICAgICAgICAgICBsZXQgZmllbGRzID0gWydzdGFydF9zdGF0aW9uX25hbWUnLCAnZW5kX3N0YXRpb25fbmFtZScsICdjbnQnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAnPHRhYmxlPicgKwogICAgICAgICAgICBTdHJpbmcoCiAgICAgICAgICAgICAgICBmaWVsZHMubWFwKAogICAgICAgICAgICAgICAgY29sdW1ubmFtZT0+CiAgICAgICAgICAgICAgICAgICAgYDx0ciBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPgogICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0icGFkZGluZzogNHB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgJHsgY29sdW1ubmFtZS50b0xvY2FsZVN0cmluZygpfQogICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiA0cHg7Ij4ke2hhbmRsZU9iamVjdChsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbY29sdW1ubmFtZV0pCiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlU3RyaW5nKCl9PC90ZD48L3RyPmAKICAgICAgICAgICAgICAgICkuam9pbignJykpCiAgICAgICAgICAgICAgICArJzwvdGFibGU+JwogICAgICAgICAgICB9LCB7InN0aWNreSI6IHRydWV9KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBnZW9fanNvbl8zNDYwOTRmYzFkYWI0NDRhOWFiMTQ0ZDk0YzA0N2NjOF9vbkVhY2hGZWF0dXJlID0gZnVuY3Rpb24gb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICAgICAgbGF5ZXIub24oewogICAgICAgICAgICAgICAgICAgIG1vdXNlb3V0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5zdHlsZSk7fSwKICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXI6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLmhpZ2hsaWdodCk7fSwKICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMuZml0Qm91bmRzKGUudGFyZ2V0LmdldEJvdW5kcygpKTt9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICB2YXIgZ2VvX2pzb25fMzQ2MDk0ZmMxZGFiNDQ0YTlhYjE0NGQ5NGMwNDdjYzggPSBMLmdlb0pzb24oCiAgICAgICAgICAgIHsiZmVhdHVyZXMiOiBbeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy0wLjE4Nzg0MjcxNywgNTEuNTA5OTA4MzddLCBbLTAuMTg0NDAwMjIxLCA1MS41MDIwNDIzOF1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiAyMTc1LCAiZW5kX3N0YXRpb25fbmFtZSI6ICJQYWxhY2UgR2F0ZSwgS2Vuc2luZ3RvbiBHYXJkZW5zIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiQmxhY2sgTGlvbiBHYXRlLCBLZW5zaW5ndG9uIEdhcmRlbnMiLCAic3R5bGUiOiB7ImNvbG9yIjogImJsdWUiLCAiZGFzaEFycmF5IjogIjcsIDciLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogMn19LCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl8zNDYwOTRmYzFkYWI0NDRhOWFiMTQ0ZDk0YzA0N2NjOF9vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICB9CiAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2I4MDcyMDQwYTJkODQ1NmQ5ODlkZGI1MDNiYjQ3YjE5ICk7CiAgICAgICAgZ2VvX2pzb25fMzQ2MDk0ZmMxZGFiNDQ0YTlhYjE0NGQ5NGMwNDdjYzguc2V0U3R5bGUoZnVuY3Rpb24oZmVhdHVyZSkge3JldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGU7fSk7CiAgICAgICAgCiAgICAKICAgICAgICBnZW9fanNvbl8zNDYwOTRmYzFkYWI0NDRhOWFiMTQ0ZDk0YzA0N2NjOC5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgZnVuY3Rpb24obGF5ZXIpewogICAgICAgICAgICAvLyBDb252ZXJ0IG5vbi1wcmltaXRpdmUgdG8gU3RyaW5nLgogICAgICAgICAgICBsZXQgaGFuZGxlT2JqZWN0ID0gKGZlYXR1cmUpPT50eXBlb2YoZmVhdHVyZSk9PSdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgOiBmZWF0dXJlOwogICAgICAgICAgICBsZXQgZmllbGRzID0gWydzdGFydF9zdGF0aW9uX25hbWUnLCAnZW5kX3N0YXRpb25fbmFtZScsICdjbnQnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAnPHRhYmxlPicgKwogICAgICAgICAgICBTdHJpbmcoCiAgICAgICAgICAgICAgICBmaWVsZHMubWFwKAogICAgICAgICAgICAgICAgY29sdW1ubmFtZT0+CiAgICAgICAgICAgICAgICAgICAgYDx0ciBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPgogICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0icGFkZGluZzogNHB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgJHsgY29sdW1ubmFtZS50b0xvY2FsZVN0cmluZygpfQogICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiA0cHg7Ij4ke2hhbmRsZU9iamVjdChsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbY29sdW1ubmFtZV0pCiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlU3RyaW5nKCl9PC90ZD48L3RyPmAKICAgICAgICAgICAgICAgICkuam9pbignJykpCiAgICAgICAgICAgICAgICArJzwvdGFibGU+JwogICAgICAgICAgICB9LCB7InN0aWNreSI6IHRydWV9KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBnZW9fanNvbl9jZjBhMmI3YzJiNzM0MjRjYmMyODk1NDg2NjAwZjcyMF9vbkVhY2hGZWF0dXJlID0gZnVuY3Rpb24gb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICAgICAgbGF5ZXIub24oewogICAgICAgICAgICAgICAgICAgIG1vdXNlb3V0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5zdHlsZSk7fSwKICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXI6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLmhpZ2hsaWdodCk7fSwKICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMuZml0Qm91bmRzKGUudGFyZ2V0LmdldEJvdW5kcygpKTt9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICB2YXIgZ2VvX2pzb25fY2YwYTJiN2MyYjczNDI0Y2JjMjg5NTQ4NjYwMGY3MjAgPSBMLmdlb0pzb24oCiAgICAgICAgICAgIHsiZmVhdHVyZXMiOiBbeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy0wLjE1MzUyMDkzNSwgNTEuNTAzMTE3OTldLCBbLTAuMTU4NDU2MDg5LCA1MS41MDI5NTM3OV1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiAyMTY4LCAiZW5kX3N0YXRpb25fbmFtZSI6ICJBbGJlcnQgR2F0ZSwgSHlkZSBQYXJrIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiSHlkZSBQYXJrIENvcm5lciwgSHlkZSBQYXJrIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fY2YwYTJiN2MyYjczNDI0Y2JjMjg5NTQ4NjYwMGY3MjBfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uX2NmMGEyYjdjMmI3MzQyNGNiYzI4OTU0ODY2MDBmNzIwLnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fY2YwYTJiN2MyYjczNDI0Y2JjMjg5NTQ4NjYwMGY3MjAuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fYTNmZTk4NjJhZWVhNGYwMmJkYzg0NjUyNjllZTdiNmVfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uX2EzZmU5ODYyYWVlYTRmMDJiZGM4NDY1MjY5ZWU3YjZlID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4xNTg0NTYwODksIDUxLjUwMjk1Mzc5XSwgWy0wLjE1MzUyMDkzNSwgNTEuNTAzMTE3OTldXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogMTk1NywgImVuZF9zdGF0aW9uX25hbWUiOiAiSHlkZSBQYXJrIENvcm5lciwgSHlkZSBQYXJrIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiQWxiZXJ0IEdhdGUsIEh5ZGUgUGFyayIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uX2EzZmU5ODYyYWVlYTRmMDJiZGM4NDY1MjY5ZWU3YjZlX29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl9hM2ZlOTg2MmFlZWE0ZjAyYmRjODQ2NTI2OWVlN2I2ZS5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uX2EzZmU5ODYyYWVlYTRmMDJiZGM4NDY1MjY5ZWU3YjZlLmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uXzBmZjRhMDIyNGIwYjQ4ZGNhMjI0OWI1MWY0MGFlYThmX29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl8wZmY0YTAyMjRiMGI0OGRjYTIyNDliNTFmNDBhZWE4ZiA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMTUzNTIwOTM1LCA1MS41MDMxMTc5OV0sIFstMC4xODc4NDI3MTcsIDUxLjUwOTkwODM3XV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgInByb3BlcnRpZXMiOiB7ImNudCI6IDE4OTEsICJlbmRfc3RhdGlvbl9uYW1lIjogIkJsYWNrIExpb24gR2F0ZSwgS2Vuc2luZ3RvbiBHYXJkZW5zIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiSHlkZSBQYXJrIENvcm5lciwgSHlkZSBQYXJrIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fMGZmNGEwMjI0YjBiNDhkY2EyMjQ5YjUxZjQwYWVhOGZfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uXzBmZjRhMDIyNGIwYjQ4ZGNhMjI0OWI1MWY0MGFlYThmLnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fMGZmNGEwMjI0YjBiNDhkY2EyMjQ5YjUxZjQwYWVhOGYuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fZTZiMGI1MWE5NjEwNDk3MWI5ZjY2NjUwZjRlMjNhNzZfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uX2U2YjBiNTFhOTYxMDQ5NzFiOWY2NjY1MGY0ZTIzYTc2ID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4xODQ0MDAyMjEsIDUxLjUwMjA0MjM4XSwgWy0wLjE4Nzg0MjcxNywgNTEuNTA5OTA4MzddXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogMTc5NSwgImVuZF9zdGF0aW9uX25hbWUiOiAiQmxhY2sgTGlvbiBHYXRlLCBLZW5zaW5ndG9uIEdhcmRlbnMiLCAiaGlnaGxpZ2h0IjogeyJjb2xvciI6ICJncmVlbiIsICJkYXNoQXJyYXkiOiAiNSwgNSIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiA0fSwgInN0YXJ0X3N0YXRpb25fbmFtZSI6ICJQYWxhY2UgR2F0ZSwgS2Vuc2luZ3RvbiBHYXJkZW5zIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fZTZiMGI1MWE5NjEwNDk3MWI5ZjY2NjUwZjRlMjNhNzZfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uX2U2YjBiNTFhOTYxMDQ5NzFiOWY2NjY1MGY0ZTIzYTc2LnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fZTZiMGI1MWE5NjEwNDk3MWI5ZjY2NjUwZjRlMjNhNzYuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fN2RlZjU0Y2FjMzc3NDNhODgyNGE2ODNkOGQ2MjBjMmVfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uXzdkZWY1NGNhYzM3NzQzYTg4MjRhNjgzZDhkNjIwYzJlID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4xNTM1MjA5MzUsIDUxLjUwMzExNzk5XSwgWy0wLjE3MzA2MDMyLCA1MS41MDUwMTRdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogMTc5MCwgImVuZF9zdGF0aW9uX25hbWUiOiAiU2VycGVudGluZSBDYXIgUGFyaywgSHlkZSBQYXJrIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiSHlkZSBQYXJrIENvcm5lciwgSHlkZSBQYXJrIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fN2RlZjU0Y2FjMzc3NDNhODgyNGE2ODNkOGQ2MjBjMmVfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uXzdkZWY1NGNhYzM3NzQzYTg4MjRhNjgzZDhkNjIwYzJlLnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fN2RlZjU0Y2FjMzc3NDNhODgyNGE2ODNkOGQ2MjBjMmUuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fMzlkMGU5ZjY1NmUyNDk0Mzk1MWViMDI3Y2UzMjZlOGFfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uXzM5ZDBlOWY2NTZlMjQ5NDM5NTFlYjAyN2NlMzI2ZThhID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4yMDE5NjgsIDUxLjQ3NTA4OV0sIFstMC4yMDg0ODUyOTMsIDUxLjQ3ODkzOTMxXV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgInByb3BlcnRpZXMiOiB7ImNudCI6IDE2MDYsICJlbmRfc3RhdGlvbl9uYW1lIjogIlN0LiBQZXRlcidzIFRlcnJhY2UsIEZ1bGhhbSIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIlBhcnNvbnMgR3JlZW4gU3RhdGlvbiwgUGFyc29ucyBHcmVlbiIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uXzM5ZDBlOWY2NTZlMjQ5NDM5NTFlYjAyN2NlMzI2ZThhX29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl8zOWQwZTlmNjU2ZTI0OTQzOTUxZWIwMjdjZTMyNmU4YS5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uXzM5ZDBlOWY2NTZlMjQ5NDM5NTFlYjAyN2NlMzI2ZThhLmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uXzM4N2YwMTljYzliMTRjZWZhODA3ZDI0OTkyMmYxOWMyX29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl8zODdmMDE5Y2M5YjE0Y2VmYTgwN2QyNDk5MjJmMTljMiA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMDE1NzE3NjE0LCA1MS41NDkzNjldLCBbLTAuMDEwNTEwNTY1LCA1MS41NDA5NF1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiAxNTczLCAiZW5kX3N0YXRpb25fbmFtZSI6ICJBcXVhdGljIENlbnRyZSwgUXVlZW4gRWxpemFiZXRoIE9seW1waWMgUGFyayIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIkxlZSBWYWxsZXkgVmVsb1BhcmssIFF1ZWVuIEVsaXphYmV0aCBPbHltcGljIFBhcmsiLCAic3R5bGUiOiB7ImNvbG9yIjogImJsdWUiLCAiZGFzaEFycmF5IjogIjcsIDciLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogMn19LCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl8zODdmMDE5Y2M5YjE0Y2VmYTgwN2QyNDk5MjJmMTljMl9vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICB9CiAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2I4MDcyMDQwYTJkODQ1NmQ5ODlkZGI1MDNiYjQ3YjE5ICk7CiAgICAgICAgZ2VvX2pzb25fMzg3ZjAxOWNjOWIxNGNlZmE4MDdkMjQ5OTIyZjE5YzIuc2V0U3R5bGUoZnVuY3Rpb24oZmVhdHVyZSkge3JldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGU7fSk7CiAgICAgICAgCiAgICAKICAgICAgICBnZW9fanNvbl8zODdmMDE5Y2M5YjE0Y2VmYTgwN2QyNDk5MjJmMTljMi5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgZnVuY3Rpb24obGF5ZXIpewogICAgICAgICAgICAvLyBDb252ZXJ0IG5vbi1wcmltaXRpdmUgdG8gU3RyaW5nLgogICAgICAgICAgICBsZXQgaGFuZGxlT2JqZWN0ID0gKGZlYXR1cmUpPT50eXBlb2YoZmVhdHVyZSk9PSdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgOiBmZWF0dXJlOwogICAgICAgICAgICBsZXQgZmllbGRzID0gWydzdGFydF9zdGF0aW9uX25hbWUnLCAnZW5kX3N0YXRpb25fbmFtZScsICdjbnQnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAnPHRhYmxlPicgKwogICAgICAgICAgICBTdHJpbmcoCiAgICAgICAgICAgICAgICBmaWVsZHMubWFwKAogICAgICAgICAgICAgICAgY29sdW1ubmFtZT0+CiAgICAgICAgICAgICAgICAgICAgYDx0ciBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPgogICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0icGFkZGluZzogNHB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgJHsgY29sdW1ubmFtZS50b0xvY2FsZVN0cmluZygpfQogICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiA0cHg7Ij4ke2hhbmRsZU9iamVjdChsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbY29sdW1ubmFtZV0pCiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlU3RyaW5nKCl9PC90ZD48L3RyPmAKICAgICAgICAgICAgICAgICkuam9pbignJykpCiAgICAgICAgICAgICAgICArJzwvdGFibGU+JwogICAgICAgICAgICB9LCB7InN0aWNreSI6IHRydWV9KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBnZW9fanNvbl8yOTgyMzVjNTc3ZDA0NDg5ODQyNGE4ZWEzZmJhMzQ2OV9vbkVhY2hGZWF0dXJlID0gZnVuY3Rpb24gb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICAgICAgbGF5ZXIub24oewogICAgICAgICAgICAgICAgICAgIG1vdXNlb3V0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5zdHlsZSk7fSwKICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXI6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLmhpZ2hsaWdodCk7fSwKICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMuZml0Qm91bmRzKGUudGFyZ2V0LmdldEJvdW5kcygpKTt9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICB2YXIgZ2VvX2pzb25fMjk4MjM1YzU3N2QwNDQ4OTg0MjRhOGVhM2ZiYTM0NjkgPSBMLmdlb0pzb24oCiAgICAgICAgICAgIHsiZmVhdHVyZXMiOiBbeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy0wLjE4Nzg0MjcxNywgNTEuNTA5OTA4MzddLCBbLTAuMTU4NDU2MDg5LCA1MS41MDI5NTM3OV1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiAxNTY5LCAiZW5kX3N0YXRpb25fbmFtZSI6ICJBbGJlcnQgR2F0ZSwgSHlkZSBQYXJrIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiQmxhY2sgTGlvbiBHYXRlLCBLZW5zaW5ndG9uIEdhcmRlbnMiLCAic3R5bGUiOiB7ImNvbG9yIjogImJsdWUiLCAiZGFzaEFycmF5IjogIjcsIDciLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogMn19LCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl8yOTgyMzVjNTc3ZDA0NDg5ODQyNGE4ZWEzZmJhMzQ2OV9vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICB9CiAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2I4MDcyMDQwYTJkODQ1NmQ5ODlkZGI1MDNiYjQ3YjE5ICk7CiAgICAgICAgZ2VvX2pzb25fMjk4MjM1YzU3N2QwNDQ4OTg0MjRhOGVhM2ZiYTM0Njkuc2V0U3R5bGUoZnVuY3Rpb24oZmVhdHVyZSkge3JldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGU7fSk7CiAgICAgICAgCiAgICAKICAgICAgICBnZW9fanNvbl8yOTgyMzVjNTc3ZDA0NDg5ODQyNGE4ZWEzZmJhMzQ2OS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgZnVuY3Rpb24obGF5ZXIpewogICAgICAgICAgICAvLyBDb252ZXJ0IG5vbi1wcmltaXRpdmUgdG8gU3RyaW5nLgogICAgICAgICAgICBsZXQgaGFuZGxlT2JqZWN0ID0gKGZlYXR1cmUpPT50eXBlb2YoZmVhdHVyZSk9PSdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgOiBmZWF0dXJlOwogICAgICAgICAgICBsZXQgZmllbGRzID0gWydzdGFydF9zdGF0aW9uX25hbWUnLCAnZW5kX3N0YXRpb25fbmFtZScsICdjbnQnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAnPHRhYmxlPicgKwogICAgICAgICAgICBTdHJpbmcoCiAgICAgICAgICAgICAgICBmaWVsZHMubWFwKAogICAgICAgICAgICAgICAgY29sdW1ubmFtZT0+CiAgICAgICAgICAgICAgICAgICAgYDx0ciBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPgogICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0icGFkZGluZzogNHB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgJHsgY29sdW1ubmFtZS50b0xvY2FsZVN0cmluZygpfQogICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiA0cHg7Ij4ke2hhbmRsZU9iamVjdChsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbY29sdW1ubmFtZV0pCiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlU3RyaW5nKCl9PC90ZD48L3RyPmAKICAgICAgICAgICAgICAgICkuam9pbignJykpCiAgICAgICAgICAgICAgICArJzwvdGFibGU+JwogICAgICAgICAgICB9LCB7InN0aWNreSI6IHRydWV9KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBnZW9fanNvbl83OWFkNjAxNmI1Yjk0YTAyOWI0NmE0MzYwM2Y0ZTg3NV9vbkVhY2hGZWF0dXJlID0gZnVuY3Rpb24gb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICAgICAgbGF5ZXIub24oewogICAgICAgICAgICAgICAgICAgIG1vdXNlb3V0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5zdHlsZSk7fSwKICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXI6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLmhpZ2hsaWdodCk7fSwKICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMuZml0Qm91bmRzKGUudGFyZ2V0LmdldEJvdW5kcygpKTt9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICB2YXIgZ2VvX2pzb25fNzlhZDYwMTZiNWI5NGEwMjliNDZhNDM2MDNmNGU4NzUgPSBMLmdlb0pzb24oCiAgICAgICAgICAgIHsiZmVhdHVyZXMiOiBbeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy0wLjE1MzUyMDkzNSwgNTEuNTAzMTE3OTldLCBbLTAuMTU3Mjc1NjM2LCA1MS41MTAwMTcyXV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgInByb3BlcnRpZXMiOiB7ImNudCI6IDE0NzAsICJlbmRfc3RhdGlvbl9uYW1lIjogIlBhcmsgTGFuZSAsIEh5ZGUgUGFyayIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIkh5ZGUgUGFyayBDb3JuZXIsIEh5ZGUgUGFyayIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uXzc5YWQ2MDE2YjViOTRhMDI5YjQ2YTQzNjAzZjRlODc1X29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl83OWFkNjAxNmI1Yjk0YTAyOWI0NmE0MzYwM2Y0ZTg3NS5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uXzc5YWQ2MDE2YjViOTRhMDI5YjQ2YTQzNjAzZjRlODc1LmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uX2U3MTI5MzEzNzcxNDQxNjJhMmEzNWVmMjQyMDM0OTY1X29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl9lNzEyOTMxMzc3MTQ0MTYyYTJhMzVlZjI0MjAzNDk2NSA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMTg0NDAwMjIxLCA1MS41MDIwNDIzOF0sIFstMC4xNTM1MjA5MzUsIDUxLjUwMzExNzk5XV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgInByb3BlcnRpZXMiOiB7ImNudCI6IDE0NTUsICJlbmRfc3RhdGlvbl9uYW1lIjogIkh5ZGUgUGFyayBDb3JuZXIsIEh5ZGUgUGFyayIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIlBhbGFjZSBHYXRlLCBLZW5zaW5ndG9uIEdhcmRlbnMiLCAic3R5bGUiOiB7ImNvbG9yIjogImJsdWUiLCAiZGFzaEFycmF5IjogIjcsIDciLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogMn19LCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl9lNzEyOTMxMzc3MTQ0MTYyYTJhMzVlZjI0MjAzNDk2NV9vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICB9CiAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2I4MDcyMDQwYTJkODQ1NmQ5ODlkZGI1MDNiYjQ3YjE5ICk7CiAgICAgICAgZ2VvX2pzb25fZTcxMjkzMTM3NzE0NDE2MmEyYTM1ZWYyNDIwMzQ5NjUuc2V0U3R5bGUoZnVuY3Rpb24oZmVhdHVyZSkge3JldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGU7fSk7CiAgICAgICAgCiAgICAKICAgICAgICBnZW9fanNvbl9lNzEyOTMxMzc3MTQ0MTYyYTJhMzVlZjI0MjAzNDk2NS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgZnVuY3Rpb24obGF5ZXIpewogICAgICAgICAgICAvLyBDb252ZXJ0IG5vbi1wcmltaXRpdmUgdG8gU3RyaW5nLgogICAgICAgICAgICBsZXQgaGFuZGxlT2JqZWN0ID0gKGZlYXR1cmUpPT50eXBlb2YoZmVhdHVyZSk9PSdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgOiBmZWF0dXJlOwogICAgICAgICAgICBsZXQgZmllbGRzID0gWydzdGFydF9zdGF0aW9uX25hbWUnLCAnZW5kX3N0YXRpb25fbmFtZScsICdjbnQnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAnPHRhYmxlPicgKwogICAgICAgICAgICBTdHJpbmcoCiAgICAgICAgICAgICAgICBmaWVsZHMubWFwKAogICAgICAgICAgICAgICAgY29sdW1ubmFtZT0+CiAgICAgICAgICAgICAgICAgICAgYDx0ciBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPgogICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0icGFkZGluZzogNHB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgJHsgY29sdW1ubmFtZS50b0xvY2FsZVN0cmluZygpfQogICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiA0cHg7Ij4ke2hhbmRsZU9iamVjdChsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbY29sdW1ubmFtZV0pCiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlU3RyaW5nKCl9PC90ZD48L3RyPmAKICAgICAgICAgICAgICAgICkuam9pbignJykpCiAgICAgICAgICAgICAgICArJzwvdGFibGU+JwogICAgICAgICAgICB9LCB7InN0aWNreSI6IHRydWV9KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBnZW9fanNvbl9kNjY2ZjIwM2NjOWY0ODkzODg3NDZlMzYxNmNmNDRhNF9vbkVhY2hGZWF0dXJlID0gZnVuY3Rpb24gb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICAgICAgbGF5ZXIub24oewogICAgICAgICAgICAgICAgICAgIG1vdXNlb3V0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5zdHlsZSk7fSwKICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXI6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLmhpZ2hsaWdodCk7fSwKICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMuZml0Qm91bmRzKGUudGFyZ2V0LmdldEJvdW5kcygpKTt9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICB2YXIgZ2VvX2pzb25fZDY2NmYyMDNjYzlmNDg5Mzg4NzQ2ZTM2MTZjZjQ0YTQgPSBMLmdlb0pzb24oCiAgICAgICAgICAgIHsiZmVhdHVyZXMiOiBbeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy0wLjAxMTg4OTQ4MiwgNTEuNTM4NzE4XSwgWy0wLjAxMDUxMDU2NSwgNTEuNTQwOTRdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogMTM5MCwgImVuZF9zdGF0aW9uX25hbWUiOiAiQXF1YXRpYyBDZW50cmUsIFF1ZWVuIEVsaXphYmV0aCBPbHltcGljIFBhcmsiLCAiaGlnaGxpZ2h0IjogeyJjb2xvciI6ICJncmVlbiIsICJkYXNoQXJyYXkiOiAiNSwgNSIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiA0fSwgInN0YXJ0X3N0YXRpb25fbmFtZSI6ICJQb2RpdW0sIFF1ZWVuIEVsaXphYmV0aCBPbHltcGljIFBhcmsiLCAic3R5bGUiOiB7ImNvbG9yIjogImJsdWUiLCAiZGFzaEFycmF5IjogIjcsIDciLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogMn19LCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl9kNjY2ZjIwM2NjOWY0ODkzODg3NDZlMzYxNmNmNDRhNF9vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICB9CiAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2I4MDcyMDQwYTJkODQ1NmQ5ODlkZGI1MDNiYjQ3YjE5ICk7CiAgICAgICAgZ2VvX2pzb25fZDY2NmYyMDNjYzlmNDg5Mzg4NzQ2ZTM2MTZjZjQ0YTQuc2V0U3R5bGUoZnVuY3Rpb24oZmVhdHVyZSkge3JldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGU7fSk7CiAgICAgICAgCiAgICAKICAgICAgICBnZW9fanNvbl9kNjY2ZjIwM2NjOWY0ODkzODg3NDZlMzYxNmNmNDRhNC5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgZnVuY3Rpb24obGF5ZXIpewogICAgICAgICAgICAvLyBDb252ZXJ0IG5vbi1wcmltaXRpdmUgdG8gU3RyaW5nLgogICAgICAgICAgICBsZXQgaGFuZGxlT2JqZWN0ID0gKGZlYXR1cmUpPT50eXBlb2YoZmVhdHVyZSk9PSdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgOiBmZWF0dXJlOwogICAgICAgICAgICBsZXQgZmllbGRzID0gWydzdGFydF9zdGF0aW9uX25hbWUnLCAnZW5kX3N0YXRpb25fbmFtZScsICdjbnQnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAnPHRhYmxlPicgKwogICAgICAgICAgICBTdHJpbmcoCiAgICAgICAgICAgICAgICBmaWVsZHMubWFwKAogICAgICAgICAgICAgICAgY29sdW1ubmFtZT0+CiAgICAgICAgICAgICAgICAgICAgYDx0ciBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPgogICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0icGFkZGluZzogNHB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgJHsgY29sdW1ubmFtZS50b0xvY2FsZVN0cmluZygpfQogICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiA0cHg7Ij4ke2hhbmRsZU9iamVjdChsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbY29sdW1ubmFtZV0pCiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlU3RyaW5nKCl9PC90ZD48L3RyPmAKICAgICAgICAgICAgICAgICkuam9pbignJykpCiAgICAgICAgICAgICAgICArJzwvdGFibGU+JwogICAgICAgICAgICB9LCB7InN0aWNreSI6IHRydWV9KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBnZW9fanNvbl82MGIxZGRkOTZlNDk0MWUyYTNlNGQxYmQ5MThiNmNkN19vbkVhY2hGZWF0dXJlID0gZnVuY3Rpb24gb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICAgICAgbGF5ZXIub24oewogICAgICAgICAgICAgICAgICAgIG1vdXNlb3V0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5zdHlsZSk7fSwKICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXI6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLmhpZ2hsaWdodCk7fSwKICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMuZml0Qm91bmRzKGUudGFyZ2V0LmdldEJvdW5kcygpKTt9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICB2YXIgZ2VvX2pzb25fNjBiMWRkZDk2ZTQ5NDFlMmEzZTRkMWJkOTE4YjZjZDcgPSBMLmdlb0pzb24oCiAgICAgICAgICAgIHsiZmVhdHVyZXMiOiBbeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy0wLjE1NzI3NTYzNiwgNTEuNTEwMDE3Ml0sIFstMC4xNTM1MjA5MzUsIDUxLjUwMzExNzk5XV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgInByb3BlcnRpZXMiOiB7ImNudCI6IDEzNjYsICJlbmRfc3RhdGlvbl9uYW1lIjogIkh5ZGUgUGFyayBDb3JuZXIsIEh5ZGUgUGFyayIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIlBhcmsgTGFuZSAsIEh5ZGUgUGFyayIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uXzYwYjFkZGQ5NmU0OTQxZTJhM2U0ZDFiZDkxOGI2Y2Q3X29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl82MGIxZGRkOTZlNDk0MWUyYTNlNGQxYmQ5MThiNmNkNy5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uXzYwYjFkZGQ5NmU0OTQxZTJhM2U0ZDFiZDkxOGI2Y2Q3LmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uXzEzOTEwMGI3MTlhNDQyMzE4YjliMDkzOTllMDU1NDg3X29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl8xMzkxMDBiNzE5YTQ0MjMxOGI5YjA5Mzk5ZTA1NTQ4NyA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMTczMDYwMzIsIDUxLjUwNTAxNF0sIFstMC4xNTM1MjA5MzUsIDUxLjUwMzExNzk5XV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgInByb3BlcnRpZXMiOiB7ImNudCI6IDEzNjMsICJlbmRfc3RhdGlvbl9uYW1lIjogIkh5ZGUgUGFyayBDb3JuZXIsIEh5ZGUgUGFyayIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIlNlcnBlbnRpbmUgQ2FyIFBhcmssIEh5ZGUgUGFyayIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uXzEzOTEwMGI3MTlhNDQyMzE4YjliMDkzOTllMDU1NDg3X29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl8xMzkxMDBiNzE5YTQ0MjMxOGI5YjA5Mzk5ZTA1NTQ4Ny5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uXzEzOTEwMGI3MTlhNDQyMzE4YjliMDkzOTllMDU1NDg3LmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uXzc1MDdiZjY0MjM0NTQwYmFhNmYzN2ZkOTg1M2I1YzllX29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl83NTA3YmY2NDIzNDU0MGJhYTZmMzdmZDk4NTNiNWM5ZSA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMTU4NDU2MDg5LCA1MS41MDI5NTM3OV0sIFstMC4xNTcyNzU2MzYsIDUxLjUxMDAxNzJdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogMTMzNCwgImVuZF9zdGF0aW9uX25hbWUiOiAiUGFyayBMYW5lICwgSHlkZSBQYXJrIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiQWxiZXJ0IEdhdGUsIEh5ZGUgUGFyayIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uXzc1MDdiZjY0MjM0NTQwYmFhNmYzN2ZkOTg1M2I1YzllX29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl83NTA3YmY2NDIzNDU0MGJhYTZmMzdmZDk4NTNiNWM5ZS5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uXzc1MDdiZjY0MjM0NTQwYmFhNmYzN2ZkOTg1M2I1YzllLmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uX2RjMmEzYTQ4NTUzNDQ2NjE5MGRkM2JjZWZiZDUwNmNhX29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl9kYzJhM2E0ODU1MzQ0NjYxOTBkZDNiY2VmYmQ1MDZjYSA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMTc5ODU0MTg0Mzg5MSwgNTEuNTAxNzE1NDM3Mzg2N10sIFstMC4xNTM1MjA5MzUsIDUxLjUwMzExNzk5XV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgInByb3BlcnRpZXMiOiB7ImNudCI6IDEzMzEsICJlbmRfc3RhdGlvbl9uYW1lIjogIkh5ZGUgUGFyayBDb3JuZXIsIEh5ZGUgUGFyayIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIlF1ZWVuJ3MgR2F0ZSwgS2Vuc2luZ3RvbiBHYXJkZW5zIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fZGMyYTNhNDg1NTM0NDY2MTkwZGQzYmNlZmJkNTA2Y2Ffb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uX2RjMmEzYTQ4NTUzNDQ2NjE5MGRkM2JjZWZiZDUwNmNhLnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fZGMyYTNhNDg1NTM0NDY2MTkwZGQzYmNlZmJkNTA2Y2EuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fZGFkZGM5MjNlMWM1NGRiNDhiN2Y5YjhiNjIwNzQ1OGJfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uX2RhZGRjOTIzZTFjNTRkYjQ4YjdmOWI4YjYyMDc0NThiID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4wMTA1MTA1NjUsIDUxLjU0MDk0XSwgWy0wLjAxNTcxNzYxNCwgNTEuNTQ5MzY5XV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgInByb3BlcnRpZXMiOiB7ImNudCI6IDEzMDYsICJlbmRfc3RhdGlvbl9uYW1lIjogIkxlZSBWYWxsZXkgVmVsb1BhcmssIFF1ZWVuIEVsaXphYmV0aCBPbHltcGljIFBhcmsiLCAiaGlnaGxpZ2h0IjogeyJjb2xvciI6ICJncmVlbiIsICJkYXNoQXJyYXkiOiAiNSwgNSIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiA0fSwgInN0YXJ0X3N0YXRpb25fbmFtZSI6ICJBcXVhdGljIENlbnRyZSwgUXVlZW4gRWxpemFiZXRoIE9seW1waWMgUGFyayIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uX2RhZGRjOTIzZTFjNTRkYjQ4YjdmOWI4YjYyMDc0NThiX29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl9kYWRkYzkyM2UxYzU0ZGI0OGI3ZjliOGI2MjA3NDU4Yi5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uX2RhZGRjOTIzZTFjNTRkYjQ4YjdmOWI4YjYyMDc0NThiLmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uXzc5NjU4ZDYwNTk3YjQ5NDVhOWIxY2ZmMTRjMmJhMjQwX29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl83OTY1OGQ2MDU5N2I0OTQ1YTliMWNmZjE0YzJiYTI0MCA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMTU3Mjc1NjM2LCA1MS41MTAwMTcyXSwgWy0wLjE3MDI3OTU1NSwgNTEuNTA2NDUxNzldXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogMTI3OCwgImVuZF9zdGF0aW9uX25hbWUiOiAiVHJpYW5nbGUgQ2FyIFBhcmssIEh5ZGUgUGFyayIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIlBhcmsgTGFuZSAsIEh5ZGUgUGFyayIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uXzc5NjU4ZDYwNTk3YjQ5NDVhOWIxY2ZmMTRjMmJhMjQwX29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl83OTY1OGQ2MDU5N2I0OTQ1YTliMWNmZjE0YzJiYTI0MC5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uXzc5NjU4ZDYwNTk3YjQ5NDVhOWIxY2ZmMTRjMmJhMjQwLmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uXzk5ZDM2Y2U5MTViNTQ2ZWI5MWYyNGVjNzY2NjViNzMyX29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl85OWQzNmNlOTE1YjU0NmViOTFmMjRlYzc2NjY1YjczMiA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMDEwNTEwNTY1LCA1MS41NDA5NF0sIFstMC4wMTE4ODk0ODIsIDUxLjUzODcxOF1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiAxMjc1LCAiZW5kX3N0YXRpb25fbmFtZSI6ICJQb2RpdW0sIFF1ZWVuIEVsaXphYmV0aCBPbHltcGljIFBhcmsiLCAiaGlnaGxpZ2h0IjogeyJjb2xvciI6ICJncmVlbiIsICJkYXNoQXJyYXkiOiAiNSwgNSIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiA0fSwgInN0YXJ0X3N0YXRpb25fbmFtZSI6ICJBcXVhdGljIENlbnRyZSwgUXVlZW4gRWxpemFiZXRoIE9seW1waWMgUGFyayIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uXzk5ZDM2Y2U5MTViNTQ2ZWI5MWYyNGVjNzY2NjViNzMyX29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl85OWQzNmNlOTE1YjU0NmViOTFmMjRlYzc2NjY1YjczMi5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uXzk5ZDM2Y2U5MTViNTQ2ZWI5MWYyNGVjNzY2NjViNzMyLmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uXzdhYjVjYzFjNmU0YjQ2NzU5YWQ2YTEzYWU5MjBiNWQzX29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl83YWI1Y2MxYzZlNGI0Njc1OWFkNmExM2FlOTIwYjVkMyA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMTU4NDU2MDg5LCA1MS41MDI5NTM3OV0sIFstMC4xODc4NDI3MTcsIDUxLjUwOTkwODM3XV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgInByb3BlcnRpZXMiOiB7ImNudCI6IDEyNjAsICJlbmRfc3RhdGlvbl9uYW1lIjogIkJsYWNrIExpb24gR2F0ZSwgS2Vuc2luZ3RvbiBHYXJkZW5zIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiQWxiZXJ0IEdhdGUsIEh5ZGUgUGFyayIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uXzdhYjVjYzFjNmU0YjQ2NzU5YWQ2YTEzYWU5MjBiNWQzX29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl83YWI1Y2MxYzZlNGI0Njc1OWFkNmExM2FlOTIwYjVkMy5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uXzdhYjVjYzFjNmU0YjQ2NzU5YWQ2YTEzYWU5MjBiNWQzLmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uXzRjYzY0ZmJkOWYxODQwNDc5MTU2MDFkM2FjYTcxOWU0X29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl80Y2M2NGZiZDlmMTg0MDQ3OTE1NjAxZDNhY2E3MTllNCA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMTcwMjc5NTU1LCA1MS41MDY0NTE3OV0sIFstMC4xNTcyNzU2MzYsIDUxLjUxMDAxNzJdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogMTIyMCwgImVuZF9zdGF0aW9uX25hbWUiOiAiUGFyayBMYW5lICwgSHlkZSBQYXJrIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiVHJpYW5nbGUgQ2FyIFBhcmssIEh5ZGUgUGFyayIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uXzRjYzY0ZmJkOWYxODQwNDc5MTU2MDFkM2FjYTcxOWU0X29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl80Y2M2NGZiZDlmMTg0MDQ3OTE1NjAxZDNhY2E3MTllNC5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uXzRjYzY0ZmJkOWYxODQwNDc5MTU2MDFkM2FjYTcxOWU0LmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uX2MyMDJjM2QxOTQzYTRmNjI5OWU5MmM1M2JlMWQwNzU3X29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl9jMjAyYzNkMTk0M2E0ZjYyOTllOTJjNTNiZTFkMDc1NyA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMjA4NDg1MjkzLCA1MS40Nzg5MzkzMV0sIFstMC4yMDE5NjgsIDUxLjQ3NTA4OV1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiAxMTk2LCAiZW5kX3N0YXRpb25fbmFtZSI6ICJQYXJzb25zIEdyZWVuIFN0YXRpb24sIFBhcnNvbnMgR3JlZW4iLCAiaGlnaGxpZ2h0IjogeyJjb2xvciI6ICJncmVlbiIsICJkYXNoQXJyYXkiOiAiNSwgNSIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiA0fSwgInN0YXJ0X3N0YXRpb25fbmFtZSI6ICJTdC4gUGV0ZXIncyBUZXJyYWNlLCBGdWxoYW0iLCAic3R5bGUiOiB7ImNvbG9yIjogImJsdWUiLCAiZGFzaEFycmF5IjogIjcsIDciLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogMn19LCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl9jMjAyYzNkMTk0M2E0ZjYyOTllOTJjNTNiZTFkMDc1N19vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICB9CiAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2I4MDcyMDQwYTJkODQ1NmQ5ODlkZGI1MDNiYjQ3YjE5ICk7CiAgICAgICAgZ2VvX2pzb25fYzIwMmMzZDE5NDNhNGY2Mjk5ZTkyYzUzYmUxZDA3NTcuc2V0U3R5bGUoZnVuY3Rpb24oZmVhdHVyZSkge3JldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGU7fSk7CiAgICAgICAgCiAgICAKICAgICAgICBnZW9fanNvbl9jMjAyYzNkMTk0M2E0ZjYyOTllOTJjNTNiZTFkMDc1Ny5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgZnVuY3Rpb24obGF5ZXIpewogICAgICAgICAgICAvLyBDb252ZXJ0IG5vbi1wcmltaXRpdmUgdG8gU3RyaW5nLgogICAgICAgICAgICBsZXQgaGFuZGxlT2JqZWN0ID0gKGZlYXR1cmUpPT50eXBlb2YoZmVhdHVyZSk9PSdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgOiBmZWF0dXJlOwogICAgICAgICAgICBsZXQgZmllbGRzID0gWydzdGFydF9zdGF0aW9uX25hbWUnLCAnZW5kX3N0YXRpb25fbmFtZScsICdjbnQnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAnPHRhYmxlPicgKwogICAgICAgICAgICBTdHJpbmcoCiAgICAgICAgICAgICAgICBmaWVsZHMubWFwKAogICAgICAgICAgICAgICAgY29sdW1ubmFtZT0+CiAgICAgICAgICAgICAgICAgICAgYDx0ciBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPgogICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0icGFkZGluZzogNHB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgJHsgY29sdW1ubmFtZS50b0xvY2FsZVN0cmluZygpfQogICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiA0cHg7Ij4ke2hhbmRsZU9iamVjdChsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbY29sdW1ubmFtZV0pCiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlU3RyaW5nKCl9PC90ZD48L3RyPmAKICAgICAgICAgICAgICAgICkuam9pbignJykpCiAgICAgICAgICAgICAgICArJzwvdGFibGU+JwogICAgICAgICAgICB9LCB7InN0aWNreSI6IHRydWV9KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBnZW9fanNvbl9hNzhlZjNiZDJlMTI0OGM3OTI2MTYxZjliMzA0OTY3ZF9vbkVhY2hGZWF0dXJlID0gZnVuY3Rpb24gb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICAgICAgbGF5ZXIub24oewogICAgICAgICAgICAgICAgICAgIG1vdXNlb3V0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5zdHlsZSk7fSwKICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXI6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLmhpZ2hsaWdodCk7fSwKICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMuZml0Qm91bmRzKGUudGFyZ2V0LmdldEJvdW5kcygpKTt9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICB2YXIgZ2VvX2pzb25fYTc4ZWYzYmQyZTEyNDhjNzkyNjE2MWY5YjMwNDk2N2QgPSBMLmdlb0pzb24oCiAgICAgICAgICAgIHsiZmVhdHVyZXMiOiBbeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy0wLjE1MzUyMDkzNSwgNTEuNTAzMTE3OTldLCBbLTAuMTc5ODU0MTg0Mzg5MSwgNTEuNTAxNzE1NDM3Mzg2N11dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiAxMTcyLCAiZW5kX3N0YXRpb25fbmFtZSI6ICJRdWVlbidzIEdhdGUsIEtlbnNpbmd0b24gR2FyZGVucyIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIkh5ZGUgUGFyayBDb3JuZXIsIEh5ZGUgUGFyayIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uX2E3OGVmM2JkMmUxMjQ4Yzc5MjYxNjFmOWIzMDQ5NjdkX29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl9hNzhlZjNiZDJlMTI0OGM3OTI2MTYxZjliMzA0OTY3ZC5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uX2E3OGVmM2JkMmUxMjQ4Yzc5MjYxNjFmOWIzMDQ5NjdkLmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uX2Y5MTc1M2Q0M2I3MTRjNmQ5Y2NjOTgxNmM4NDk1YThmX29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl9mOTE3NTNkNDNiNzE0YzZkOWNjYzk4MTZjODQ5NWE4ZiA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMTEyODI0MDgsIDUxLjUwMzc5MTY4XSwgWy0wLjA5ODg1MDkxNSwgNTEuNTE1NDE4Nl1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiAxMTAzLCAiZW5kX3N0YXRpb25fbmFtZSI6ICJOZXdnYXRlIFN0cmVldCAsIFN0LiBQYXVsJ3MiLCAiaGlnaGxpZ2h0IjogeyJjb2xvciI6ICJncmVlbiIsICJkYXNoQXJyYXkiOiAiNSwgNSIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiA0fSwgInN0YXJ0X3N0YXRpb25fbmFtZSI6ICJXYXRlcmxvbyBTdGF0aW9uIDMsIFdhdGVybG9vIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fZjkxNzUzZDQzYjcxNGM2ZDljY2M5ODE2Yzg0OTVhOGZfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uX2Y5MTc1M2Q0M2I3MTRjNmQ5Y2NjOTgxNmM4NDk1YThmLnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fZjkxNzUzZDQzYjcxNGM2ZDljY2M5ODE2Yzg0OTVhOGYuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fMTJjMWIwYWRiY2RhNDgxZDgwMDRhNjhlNWZjM2VjNmNfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uXzEyYzFiMGFkYmNkYTQ4MWQ4MDA0YTY4ZTVmYzNlYzZjID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4wMTA1MTA1NjUsIDUxLjU0MDk0XSwgWy0wLjAyMTYzMDM1OSwgNTEuNTQwMzExNV1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiAxMDk2LCAiZW5kX3N0YXRpb25fbmFtZSI6ICJNb25pZXIgUm9hZCwgSGFja25leSBXaWNrIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiQXF1YXRpYyBDZW50cmUsIFF1ZWVuIEVsaXphYmV0aCBPbHltcGljIFBhcmsiLCAic3R5bGUiOiB7ImNvbG9yIjogImJsdWUiLCAiZGFzaEFycmF5IjogIjcsIDciLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogMn19LCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl8xMmMxYjBhZGJjZGE0ODFkODAwNGE2OGU1ZmMzZWM2Y19vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICB9CiAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2I4MDcyMDQwYTJkODQ1NmQ5ODlkZGI1MDNiYjQ3YjE5ICk7CiAgICAgICAgZ2VvX2pzb25fMTJjMWIwYWRiY2RhNDgxZDgwMDRhNjhlNWZjM2VjNmMuc2V0U3R5bGUoZnVuY3Rpb24oZmVhdHVyZSkge3JldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGU7fSk7CiAgICAgICAgCiAgICAKICAgICAgICBnZW9fanNvbl8xMmMxYjBhZGJjZGE0ODFkODAwNGE2OGU1ZmMzZWM2Yy5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgZnVuY3Rpb24obGF5ZXIpewogICAgICAgICAgICAvLyBDb252ZXJ0IG5vbi1wcmltaXRpdmUgdG8gU3RyaW5nLgogICAgICAgICAgICBsZXQgaGFuZGxlT2JqZWN0ID0gKGZlYXR1cmUpPT50eXBlb2YoZmVhdHVyZSk9PSdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgOiBmZWF0dXJlOwogICAgICAgICAgICBsZXQgZmllbGRzID0gWydzdGFydF9zdGF0aW9uX25hbWUnLCAnZW5kX3N0YXRpb25fbmFtZScsICdjbnQnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAnPHRhYmxlPicgKwogICAgICAgICAgICBTdHJpbmcoCiAgICAgICAgICAgICAgICBmaWVsZHMubWFwKAogICAgICAgICAgICAgICAgY29sdW1ubmFtZT0+CiAgICAgICAgICAgICAgICAgICAgYDx0ciBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPgogICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0icGFkZGluZzogNHB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgJHsgY29sdW1ubmFtZS50b0xvY2FsZVN0cmluZygpfQogICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiA0cHg7Ij4ke2hhbmRsZU9iamVjdChsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbY29sdW1ubmFtZV0pCiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlU3RyaW5nKCl9PC90ZD48L3RyPmAKICAgICAgICAgICAgICAgICkuam9pbignJykpCiAgICAgICAgICAgICAgICArJzwvdGFibGU+JwogICAgICAgICAgICB9LCB7InN0aWNreSI6IHRydWV9KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBnZW9fanNvbl8wNDY2Y2UxYzI4OTk0NGFmODU5NTdlYTc0MDM0YmZmZl9vbkVhY2hGZWF0dXJlID0gZnVuY3Rpb24gb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICAgICAgbGF5ZXIub24oewogICAgICAgICAgICAgICAgICAgIG1vdXNlb3V0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5zdHlsZSk7fSwKICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXI6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLmhpZ2hsaWdodCk7fSwKICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMuZml0Qm91bmRzKGUudGFyZ2V0LmdldEJvdW5kcygpKTt9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICB2YXIgZ2VvX2pzb25fMDQ2NmNlMWMyODk5NDRhZjg1OTU3ZWE3NDAzNGJmZmYgPSBMLmdlb0pzb24oCiAgICAgICAgICAgIHsiZmVhdHVyZXMiOiBbeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy0wLjE3MDI3OTU1NSwgNTEuNTA2NDUxNzldLCBbLTAuMTg3ODQyNzE3LCA1MS41MDk5MDgzN11dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiAxMDk0LCAiZW5kX3N0YXRpb25fbmFtZSI6ICJCbGFjayBMaW9uIEdhdGUsIEtlbnNpbmd0b24gR2FyZGVucyIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIlRyaWFuZ2xlIENhciBQYXJrLCBIeWRlIFBhcmsiLCAic3R5bGUiOiB7ImNvbG9yIjogImJsdWUiLCAiZGFzaEFycmF5IjogIjcsIDciLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogMn19LCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl8wNDY2Y2UxYzI4OTk0NGFmODU5NTdlYTc0MDM0YmZmZl9vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICB9CiAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2I4MDcyMDQwYTJkODQ1NmQ5ODlkZGI1MDNiYjQ3YjE5ICk7CiAgICAgICAgZ2VvX2pzb25fMDQ2NmNlMWMyODk5NDRhZjg1OTU3ZWE3NDAzNGJmZmYuc2V0U3R5bGUoZnVuY3Rpb24oZmVhdHVyZSkge3JldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGU7fSk7CiAgICAgICAgCiAgICAKICAgICAgICBnZW9fanNvbl8wNDY2Y2UxYzI4OTk0NGFmODU5NTdlYTc0MDM0YmZmZi5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgZnVuY3Rpb24obGF5ZXIpewogICAgICAgICAgICAvLyBDb252ZXJ0IG5vbi1wcmltaXRpdmUgdG8gU3RyaW5nLgogICAgICAgICAgICBsZXQgaGFuZGxlT2JqZWN0ID0gKGZlYXR1cmUpPT50eXBlb2YoZmVhdHVyZSk9PSdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgOiBmZWF0dXJlOwogICAgICAgICAgICBsZXQgZmllbGRzID0gWydzdGFydF9zdGF0aW9uX25hbWUnLCAnZW5kX3N0YXRpb25fbmFtZScsICdjbnQnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAnPHRhYmxlPicgKwogICAgICAgICAgICBTdHJpbmcoCiAgICAgICAgICAgICAgICBmaWVsZHMubWFwKAogICAgICAgICAgICAgICAgY29sdW1ubmFtZT0+CiAgICAgICAgICAgICAgICAgICAgYDx0ciBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPgogICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0icGFkZGluZzogNHB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgJHsgY29sdW1ubmFtZS50b0xvY2FsZVN0cmluZygpfQogICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiA0cHg7Ij4ke2hhbmRsZU9iamVjdChsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbY29sdW1ubmFtZV0pCiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlU3RyaW5nKCl9PC90ZD48L3RyPmAKICAgICAgICAgICAgICAgICkuam9pbignJykpCiAgICAgICAgICAgICAgICArJzwvdGFibGU+JwogICAgICAgICAgICB9LCB7InN0aWNreSI6IHRydWV9KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBnZW9fanNvbl8yMTdkMWU0MTU3OGE0NTVhOGJkMDg5NjIwNjBlNjJhZF9vbkVhY2hGZWF0dXJlID0gZnVuY3Rpb24gb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICAgICAgbGF5ZXIub24oewogICAgICAgICAgICAgICAgICAgIG1vdXNlb3V0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5zdHlsZSk7fSwKICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXI6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLmhpZ2hsaWdodCk7fSwKICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMuZml0Qm91bmRzKGUudGFyZ2V0LmdldEJvdW5kcygpKTt9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICB2YXIgZ2VvX2pzb25fMjE3ZDFlNDE1NzhhNDU1YThiZDA4OTYyMDYwZTYyYWQgPSBMLmdlb0pzb24oCiAgICAgICAgICAgIHsiZmVhdHVyZXMiOiBbeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy0wLjE3OTg1NDE4NDM4OTEsIDUxLjUwMTcxNTQzNzM4NjddLCBbLTAuMTg3ODQyNzE3LCA1MS41MDk5MDgzN11dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiAxMDgxLCAiZW5kX3N0YXRpb25fbmFtZSI6ICJCbGFjayBMaW9uIEdhdGUsIEtlbnNpbmd0b24gR2FyZGVucyIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIlF1ZWVuJ3MgR2F0ZSwgS2Vuc2luZ3RvbiBHYXJkZW5zIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fMjE3ZDFlNDE1NzhhNDU1YThiZDA4OTYyMDYwZTYyYWRfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uXzIxN2QxZTQxNTc4YTQ1NWE4YmQwODk2MjA2MGU2MmFkLnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fMjE3ZDFlNDE1NzhhNDU1YThiZDA4OTYyMDYwZTYyYWQuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fZGFkNjFiYWIzYTlkNDE1MTk4YzRiNzkzYzMwNGRhOTNfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uX2RhZDYxYmFiM2E5ZDQxNTE5OGM0Yjc5M2MzMDRkYTkzID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4xNTM1MjA5MzUsIDUxLjUwMzExNzk5XSwgWy0wLjE4NDQwMDIyMSwgNTEuNTAyMDQyMzhdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogMTA3NiwgImVuZF9zdGF0aW9uX25hbWUiOiAiUGFsYWNlIEdhdGUsIEtlbnNpbmd0b24gR2FyZGVucyIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIkh5ZGUgUGFyayBDb3JuZXIsIEh5ZGUgUGFyayIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uX2RhZDYxYmFiM2E5ZDQxNTE5OGM0Yjc5M2MzMDRkYTkzX29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl9kYWQ2MWJhYjNhOWQ0MTUxOThjNGI3OTNjMzA0ZGE5My5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uX2RhZDYxYmFiM2E5ZDQxNTE5OGM0Yjc5M2MzMDRkYTkzLmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uXzdjYTZlOGRmYTdjODQwYWZiYzE0MjFjOTVlMjNmMzVkX29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl83Y2E2ZThkZmE3Yzg0MGFmYmMxNDIxYzk1ZTIzZjM1ZCA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMTU4NDU2MDg5LCA1MS41MDI5NTM3OV0sIFstMC4xNzAyNzk1NTUsIDUxLjUwNjQ1MTc5XV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgInByb3BlcnRpZXMiOiB7ImNudCI6IDEwNjQsICJlbmRfc3RhdGlvbl9uYW1lIjogIlRyaWFuZ2xlIENhciBQYXJrLCBIeWRlIFBhcmsiLCAiaGlnaGxpZ2h0IjogeyJjb2xvciI6ICJncmVlbiIsICJkYXNoQXJyYXkiOiAiNSwgNSIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiA0fSwgInN0YXJ0X3N0YXRpb25fbmFtZSI6ICJBbGJlcnQgR2F0ZSwgSHlkZSBQYXJrIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fN2NhNmU4ZGZhN2M4NDBhZmJjMTQyMWM5NWUyM2YzNWRfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uXzdjYTZlOGRmYTdjODQwYWZiYzE0MjFjOTVlMjNmMzVkLnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fN2NhNmU4ZGZhN2M4NDBhZmJjMTQyMWM5NWUyM2YzNWQuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fN2MwMjA1ODczM2RhNGNlZGI3M2M3MGExNTU3ZTMyOWFfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uXzdjMDIwNTg3MzNkYTRjZWRiNzNjNzBhMTU1N2UzMjlhID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4xMjM2MTY4MjQsIDUxLjUyOTk0MzcxXSwgWy0wLjExNjU1LCA1MS41MTgyNF1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiAxMDE5LCAiZW5kX3N0YXRpb25fbmFtZSI6ICJSZWQgTGlvbiBTdHJlZXQsIEhvbGJvcm4iLCAiaGlnaGxpZ2h0IjogeyJjb2xvciI6ICJncmVlbiIsICJkYXNoQXJyYXkiOiAiNSwgNSIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiA0fSwgInN0YXJ0X3N0YXRpb25fbmFtZSI6ICJCZWxncm92ZSBTdHJlZXQgLCBLaW5nJ3MgQ3Jvc3MiLCAic3R5bGUiOiB7ImNvbG9yIjogImJsdWUiLCAiZGFzaEFycmF5IjogIjcsIDciLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogMn19LCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl83YzAyMDU4NzMzZGE0Y2VkYjczYzcwYTE1NTdlMzI5YV9vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICB9CiAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2I4MDcyMDQwYTJkODQ1NmQ5ODlkZGI1MDNiYjQ3YjE5ICk7CiAgICAgICAgZ2VvX2pzb25fN2MwMjA1ODczM2RhNGNlZGI3M2M3MGExNTU3ZTMyOWEuc2V0U3R5bGUoZnVuY3Rpb24oZmVhdHVyZSkge3JldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGU7fSk7CiAgICAgICAgCiAgICAKICAgICAgICBnZW9fanNvbl83YzAyMDU4NzMzZGE0Y2VkYjczYzcwYTE1NTdlMzI5YS5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgZnVuY3Rpb24obGF5ZXIpewogICAgICAgICAgICAvLyBDb252ZXJ0IG5vbi1wcmltaXRpdmUgdG8gU3RyaW5nLgogICAgICAgICAgICBsZXQgaGFuZGxlT2JqZWN0ID0gKGZlYXR1cmUpPT50eXBlb2YoZmVhdHVyZSk9PSdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgOiBmZWF0dXJlOwogICAgICAgICAgICBsZXQgZmllbGRzID0gWydzdGFydF9zdGF0aW9uX25hbWUnLCAnZW5kX3N0YXRpb25fbmFtZScsICdjbnQnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAnPHRhYmxlPicgKwogICAgICAgICAgICBTdHJpbmcoCiAgICAgICAgICAgICAgICBmaWVsZHMubWFwKAogICAgICAgICAgICAgICAgY29sdW1ubmFtZT0+CiAgICAgICAgICAgICAgICAgICAgYDx0ciBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPgogICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0icGFkZGluZzogNHB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgJHsgY29sdW1ubmFtZS50b0xvY2FsZVN0cmluZygpfQogICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiA0cHg7Ij4ke2hhbmRsZU9iamVjdChsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbY29sdW1ubmFtZV0pCiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlU3RyaW5nKCl9PC90ZD48L3RyPmAKICAgICAgICAgICAgICAgICkuam9pbignJykpCiAgICAgICAgICAgICAgICArJzwvdGFibGU+JwogICAgICAgICAgICB9LCB7InN0aWNreSI6IHRydWV9KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBnZW9fanNvbl8xZjRlNGE1Yzg4MWQ0ZmEyYjA3NGIzYTJlODY1OGExZF9vbkVhY2hGZWF0dXJlID0gZnVuY3Rpb24gb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICAgICAgbGF5ZXIub24oewogICAgICAgICAgICAgICAgICAgIG1vdXNlb3V0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5zdHlsZSk7fSwKICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXI6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLmhpZ2hsaWdodCk7fSwKICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMuZml0Qm91bmRzKGUudGFyZ2V0LmdldEJvdW5kcygpKTt9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICB2YXIgZ2VvX2pzb25fMWY0ZTRhNWM4ODFkNGZhMmIwNzRiM2EyZTg2NThhMWQgPSBMLmdlb0pzb24oCiAgICAgICAgICAgIHsiZmVhdHVyZXMiOiBbeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy0wLjExNjU1LCA1MS41MTgyNF0sIFstMC4xMjM2MTY4MjQsIDUxLjUyOTk0MzcxXV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgInByb3BlcnRpZXMiOiB7ImNudCI6IDEwMDYsICJlbmRfc3RhdGlvbl9uYW1lIjogIkJlbGdyb3ZlIFN0cmVldCAsIEtpbmcncyBDcm9zcyIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIlJlZCBMaW9uIFN0cmVldCwgSG9sYm9ybiIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uXzFmNGU0YTVjODgxZDRmYTJiMDc0YjNhMmU4NjU4YTFkX29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl8xZjRlNGE1Yzg4MWQ0ZmEyYjA3NGIzYTJlODY1OGExZC5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uXzFmNGU0YTVjODgxZDRmYTJiMDc0YjNhMmU4NjU4YTFkLmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uX2VkNWI2ZjM4YjRkZjRkMGRhZGZlNGJhYTYxMjRjYzA3X29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl9lZDViNmYzOGI0ZGY0ZDBkYWRmZTRiYWE2MTI0Y2MwNyA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMTEyODI0MDgsIDUxLjUwMzc5MTY4XSwgWy0wLjA5OTE0MTQwOCwgNTEuNTEyNDg0NDVdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogMTAwMSwgImVuZF9zdGF0aW9uX25hbWUiOiAiR29kbGltYW4gU3RyZWV0LCBTdC4gUGF1bCdzIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiV2F0ZXJsb28gU3RhdGlvbiAzLCBXYXRlcmxvbyIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uX2VkNWI2ZjM4YjRkZjRkMGRhZGZlNGJhYTYxMjRjYzA3X29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl9lZDViNmYzOGI0ZGY0ZDBkYWRmZTRiYWE2MTI0Y2MwNy5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uX2VkNWI2ZjM4YjRkZjRkMGRhZGZlNGJhYTYxMjRjYzA3LmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uXzgyZTkwZTVjNGJmZTRjODdhYWNlYzcxM2VmZWQ0NzQ4X29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl84MmU5MGU1YzRiZmU0Yzg3YWFjZWM3MTNlZmVkNDc0OCA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMTU3Mjc1NjM2LCA1MS41MTAwMTcyXSwgWy0wLjE1ODQ1NjA4OSwgNTEuNTAyOTUzNzldXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogOTg4LCAiZW5kX3N0YXRpb25fbmFtZSI6ICJBbGJlcnQgR2F0ZSwgSHlkZSBQYXJrIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiUGFyayBMYW5lICwgSHlkZSBQYXJrIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fODJlOTBlNWM0YmZlNGM4N2FhY2VjNzEzZWZlZDQ3NDhfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uXzgyZTkwZTVjNGJmZTRjODdhYWNlYzcxM2VmZWQ0NzQ4LnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fODJlOTBlNWM0YmZlNGM4N2FhY2VjNzEzZWZlZDQ3NDguYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fMmY0OWNmYWE3NWUzNDNiNGIyZTZjNzMxMWE3Y2FiMzFfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uXzJmNDljZmFhNzVlMzQzYjRiMmU2YzczMTFhN2NhYjMxID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4yMTUwODcwOTIsIDUxLjQ5MDIxNzYyXSwgWy0wLjIxNDQyODM3OCwgNTEuNDg2MDYyMDZdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogOTUyLCAiZW5kX3N0YXRpb25fbmFtZSI6ICJHcmV5aG91bmQgUm9hZCwgSGFtbWVyc21pdGgiLCAiaGlnaGxpZ2h0IjogeyJjb2xvciI6ICJncmVlbiIsICJkYXNoQXJyYXkiOiAiNSwgNSIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiA0fSwgInN0YXJ0X3N0YXRpb25fbmFtZSI6ICJCYXJvbnMgQ291cnQgU3RhdGlvbiwgV2VzdCBLZW5zaW5ndG9uIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fMmY0OWNmYWE3NWUzNDNiNGIyZTZjNzMxMWE3Y2FiMzFfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uXzJmNDljZmFhNzVlMzQzYjRiMmU2YzczMTFhN2NhYjMxLnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fMmY0OWNmYWE3NWUzNDNiNGIyZTZjNzMxMWE3Y2FiMzEuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fNGRhNDIzMzc4MDA5NDA3YzkxYTFhYWRjNzVlMzM2NmZfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uXzRkYTQyMzM3ODAwOTQwN2M5MWExYWFkYzc1ZTMzNjZmID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4xNzAyNzk1NTUsIDUxLjUwNjQ1MTc5XSwgWy0wLjE1ODQ1NjA4OSwgNTEuNTAyOTUzNzldXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogOTI4LCAiZW5kX3N0YXRpb25fbmFtZSI6ICJBbGJlcnQgR2F0ZSwgSHlkZSBQYXJrIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiVHJpYW5nbGUgQ2FyIFBhcmssIEh5ZGUgUGFyayIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uXzRkYTQyMzM3ODAwOTQwN2M5MWExYWFkYzc1ZTMzNjZmX29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl80ZGE0MjMzNzgwMDk0MDdjOTFhMWFhZGM3NWUzMzY2Zi5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uXzRkYTQyMzM3ODAwOTQwN2M5MWExYWFkYzc1ZTMzNjZmLmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uX2JlMDYxMTUwN2EyNzQ2ODRiMjg5YTZlYTM3MmY4MDllX29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl9iZTA2MTE1MDdhMjc0Njg0YjI4OWE2ZWEzNzJmODA5ZSA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMTE2Mjc5LCA1MS41MjQ1NjRdLCBbLTAuMTIzNjE2ODI0LCA1MS41Mjk5NDM3MV1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiA5MTAsICJlbmRfc3RhdGlvbl9uYW1lIjogIkJlbGdyb3ZlIFN0cmVldCAsIEtpbmcncyBDcm9zcyIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIldyZW4gU3RyZWV0LCBIb2xib3JuIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fYmUwNjExNTA3YTI3NDY4NGIyODlhNmVhMzcyZjgwOWVfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uX2JlMDYxMTUwN2EyNzQ2ODRiMjg5YTZlYTM3MmY4MDllLnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fYmUwNjExNTA3YTI3NDY4NGIyODlhNmVhMzcyZjgwOWUuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fMGYzNTMxYTE2ZDIyNDJkYjg4NTYyMmQ5NDA2MTUyMjBfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uXzBmMzUzMWExNmQyMjQyZGI4ODU2MjJkOTQwNjE1MjIwID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4xMjM2MTY4MjQsIDUxLjUyOTk0MzcxXSwgWy0wLjA5ODg1MDkxNSwgNTEuNTE1NDE4Nl1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiA5MDQsICJlbmRfc3RhdGlvbl9uYW1lIjogIk5ld2dhdGUgU3RyZWV0ICwgU3QuIFBhdWwncyIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIkJlbGdyb3ZlIFN0cmVldCAsIEtpbmcncyBDcm9zcyIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uXzBmMzUzMWExNmQyMjQyZGI4ODU2MjJkOTQwNjE1MjIwX29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl8wZjM1MzFhMTZkMjI0MmRiODg1NjIyZDk0MDYxNTIyMC5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uXzBmMzUzMWExNmQyMjQyZGI4ODU2MjJkOTQwNjE1MjIwLmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uXzU3ODQzMzM5YzI4NDRjOTNhY2Q1YjkxYzI1ZTE0ZGMyX29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl81Nzg0MzMzOWMyODQ0YzkzYWNkNWI5MWMyNWUxNGRjMiA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMDY2OTEsIDUxLjUwNzEzMV0sIFstMC4wNTc1NDQsIDUxLjUwNDc0OV1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJwcm9wZXJ0aWVzIjogeyJjbnQiOiA4ODcsICJlbmRfc3RhdGlvbl9uYW1lIjogIldhcHBpbmcgTGFuZSwgV2FwcGluZyIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIk5lc2hhbSBTdHJlZXQsIFdhcHBpbmciLCAic3R5bGUiOiB7ImNvbG9yIjogImJsdWUiLCAiZGFzaEFycmF5IjogIjcsIDciLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogMn19LCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl81Nzg0MzMzOWMyODQ0YzkzYWNkNWI5MWMyNWUxNGRjMl9vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICB9CiAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2I4MDcyMDQwYTJkODQ1NmQ5ODlkZGI1MDNiYjQ3YjE5ICk7CiAgICAgICAgZ2VvX2pzb25fNTc4NDMzMzljMjg0NGM5M2FjZDViOTFjMjVlMTRkYzIuc2V0U3R5bGUoZnVuY3Rpb24oZmVhdHVyZSkge3JldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGU7fSk7CiAgICAgICAgCiAgICAKICAgICAgICBnZW9fanNvbl81Nzg0MzMzOWMyODQ0YzkzYWNkNWI5MWMyNWUxNGRjMi5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgZnVuY3Rpb24obGF5ZXIpewogICAgICAgICAgICAvLyBDb252ZXJ0IG5vbi1wcmltaXRpdmUgdG8gU3RyaW5nLgogICAgICAgICAgICBsZXQgaGFuZGxlT2JqZWN0ID0gKGZlYXR1cmUpPT50eXBlb2YoZmVhdHVyZSk9PSdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgOiBmZWF0dXJlOwogICAgICAgICAgICBsZXQgZmllbGRzID0gWydzdGFydF9zdGF0aW9uX25hbWUnLCAnZW5kX3N0YXRpb25fbmFtZScsICdjbnQnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAnPHRhYmxlPicgKwogICAgICAgICAgICBTdHJpbmcoCiAgICAgICAgICAgICAgICBmaWVsZHMubWFwKAogICAgICAgICAgICAgICAgY29sdW1ubmFtZT0+CiAgICAgICAgICAgICAgICAgICAgYDx0ciBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPgogICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0icGFkZGluZzogNHB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgJHsgY29sdW1ubmFtZS50b0xvY2FsZVN0cmluZygpfQogICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiA0cHg7Ij4ke2hhbmRsZU9iamVjdChsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbY29sdW1ubmFtZV0pCiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlU3RyaW5nKCl9PC90ZD48L3RyPmAKICAgICAgICAgICAgICAgICkuam9pbignJykpCiAgICAgICAgICAgICAgICArJzwvdGFibGU+JwogICAgICAgICAgICB9LCB7InN0aWNreSI6IHRydWV9KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBnZW9fanNvbl9mNWQ3Y2JiZjZkOTc0M2U3YjM5ZDUzYWM5OGUyNjA0Zl9vbkVhY2hGZWF0dXJlID0gZnVuY3Rpb24gb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICAgICAgbGF5ZXIub24oewogICAgICAgICAgICAgICAgICAgIG1vdXNlb3V0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5zdHlsZSk7fSwKICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXI6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLmhpZ2hsaWdodCk7fSwKICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMuZml0Qm91bmRzKGUudGFyZ2V0LmdldEJvdW5kcygpKTt9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICB2YXIgZ2VvX2pzb25fZjVkN2NiYmY2ZDk3NDNlN2IzOWQ1M2FjOThlMjYwNGYgPSBMLmdlb0pzb24oCiAgICAgICAgICAgIHsiZmVhdHVyZXMiOiBbeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy0wLjEyMzYxNjgyNCwgNTEuNTI5OTQzNzFdLCBbLTAuMTE2Mjc5LCA1MS41MjQ1NjRdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogODgyLCAiZW5kX3N0YXRpb25fbmFtZSI6ICJXcmVuIFN0cmVldCwgSG9sYm9ybiIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIkJlbGdyb3ZlIFN0cmVldCAsIEtpbmcncyBDcm9zcyIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uX2Y1ZDdjYmJmNmQ5NzQzZTdiMzlkNTNhYzk4ZTI2MDRmX29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl9mNWQ3Y2JiZjZkOTc0M2U3YjM5ZDUzYWM5OGUyNjA0Zi5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uX2Y1ZDdjYmJmNmQ5NzQzZTdiMzlkNTNhYzk4ZTI2MDRmLmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uXzE4OWIzYzMxN2ZiNzQ5NzZhMzFiOGZkN2FiN2RiMzYyX29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl8xODliM2MzMTdmYjc0OTc2YTMxYjhmZDdhYjdkYjM2MiA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMDIxNjMwMzU5LCA1MS41NDAzMTE1XSwgWy0wLjAxMDUxMDU2NSwgNTEuNTQwOTRdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogODYyLCAiZW5kX3N0YXRpb25fbmFtZSI6ICJBcXVhdGljIENlbnRyZSwgUXVlZW4gRWxpemFiZXRoIE9seW1waWMgUGFyayIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIk1vbmllciBSb2FkLCBIYWNrbmV5IFdpY2siLCAic3R5bGUiOiB7ImNvbG9yIjogImJsdWUiLCAiZGFzaEFycmF5IjogIjcsIDciLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogMn19LCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl8xODliM2MzMTdmYjc0OTc2YTMxYjhmZDdhYjdkYjM2Ml9vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICB9CiAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2I4MDcyMDQwYTJkODQ1NmQ5ODlkZGI1MDNiYjQ3YjE5ICk7CiAgICAgICAgZ2VvX2pzb25fMTg5YjNjMzE3ZmI3NDk3NmEzMWI4ZmQ3YWI3ZGIzNjIuc2V0U3R5bGUoZnVuY3Rpb24oZmVhdHVyZSkge3JldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGU7fSk7CiAgICAgICAgCiAgICAKICAgICAgICBnZW9fanNvbl8xODliM2MzMTdmYjc0OTc2YTMxYjhmZDdhYjdkYjM2Mi5iaW5kVG9vbHRpcCgKICAgICAgICAgICAgZnVuY3Rpb24obGF5ZXIpewogICAgICAgICAgICAvLyBDb252ZXJ0IG5vbi1wcmltaXRpdmUgdG8gU3RyaW5nLgogICAgICAgICAgICBsZXQgaGFuZGxlT2JqZWN0ID0gKGZlYXR1cmUpPT50eXBlb2YoZmVhdHVyZSk9PSdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgOiBmZWF0dXJlOwogICAgICAgICAgICBsZXQgZmllbGRzID0gWydzdGFydF9zdGF0aW9uX25hbWUnLCAnZW5kX3N0YXRpb25fbmFtZScsICdjbnQnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAnPHRhYmxlPicgKwogICAgICAgICAgICBTdHJpbmcoCiAgICAgICAgICAgICAgICBmaWVsZHMubWFwKAogICAgICAgICAgICAgICAgY29sdW1ubmFtZT0+CiAgICAgICAgICAgICAgICAgICAgYDx0ciBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPgogICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0icGFkZGluZzogNHB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgJHsgY29sdW1ubmFtZS50b0xvY2FsZVN0cmluZygpfQogICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiA0cHg7Ij4ke2hhbmRsZU9iamVjdChsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbY29sdW1ubmFtZV0pCiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlU3RyaW5nKCl9PC90ZD48L3RyPmAKICAgICAgICAgICAgICAgICkuam9pbignJykpCiAgICAgICAgICAgICAgICArJzwvdGFibGU+JwogICAgICAgICAgICB9LCB7InN0aWNreSI6IHRydWV9KTsKICAgICAgICAKICAgIAogICAgICAgICAgICBnZW9fanNvbl85NTc4OTRlMjMwYjY0ZWQ4YmVkZThmNDllYzBkNWNiY19vbkVhY2hGZWF0dXJlID0gZnVuY3Rpb24gb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICAgICAgbGF5ZXIub24oewogICAgICAgICAgICAgICAgICAgIG1vdXNlb3V0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5zdHlsZSk7fSwKICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXI6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLmhpZ2hsaWdodCk7fSwKICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBfZmM4NzllOWQ3ZjI1NGY4NWIwNTNlMmJlMzRkNWY0ZGMuZml0Qm91bmRzKGUudGFyZ2V0LmdldEJvdW5kcygpKTt9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICB2YXIgZ2VvX2pzb25fOTU3ODk0ZTIzMGI2NGVkOGJlZGU4ZjQ5ZWMwZDVjYmMgPSBMLmdlb0pzb24oCiAgICAgICAgICAgIHsiZmVhdHVyZXMiOiBbeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy0wLjE3NDU1NCwgNTEuNDk5OTE3XSwgWy0wLjE3Mzg4MSwgNTEuNDk0NDEyXV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgInByb3BlcnRpZXMiOiB7ImNudCI6IDg1OSwgImVuZF9zdGF0aW9uX25hbWUiOiAiU291dGggS2Vuc2luZ3RvbiBTdGF0aW9uLCBTb3V0aCBLZW5zaW5ndG9uIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiRXhoaWJpdGlvbiBSb2FkLCBLbmlnaHRzYnJpZGdlIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fOTU3ODk0ZTIzMGI2NGVkOGJlZGU4ZjQ5ZWMwZDVjYmNfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uXzk1Nzg5NGUyMzBiNjRlZDhiZWRlOGY0OWVjMGQ1Y2JjLnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgZ2VvX2pzb25fOTU3ODk0ZTIzMGI2NGVkOGJlZGU4ZjQ5ZWMwZDVjYmMuYmluZFRvb2x0aXAoCiAgICAgICAgICAgIGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgICAgLy8gQ29udmVydCBub24tcHJpbWl0aXZlIHRvIFN0cmluZy4KICAgICAgICAgICAgbGV0IGhhbmRsZU9iamVjdCA9IChmZWF0dXJlKT0+dHlwZW9mKGZlYXR1cmUpPT0nb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpIDogZmVhdHVyZTsKICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsnc3RhcnRfc3RhdGlvbl9uYW1lJywgJ2VuZF9zdGF0aW9uX25hbWUnLCAnY250J107CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJzx0YWJsZT4nICsKICAgICAgICAgICAgU3RyaW5nKAogICAgICAgICAgICAgICAgZmllbGRzLm1hcCgKICAgICAgICAgICAgICAgIGNvbHVtbm5hbWU9PgogICAgICAgICAgICAgICAgICAgIGA8dHIgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij4KICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDRweDsgcGFkZGluZy1yaWdodDogMTBweDsiPgogICAgICAgICAgICAgICAgICAgICR7IGNvbHVtbm5hbWUudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogNHB4OyI+JHtoYW5kbGVPYmplY3QobGF5ZXIuZmVhdHVyZS5wcm9wZXJ0aWVzW2NvbHVtbm5hbWVdKQogICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZVN0cmluZygpfTwvdGQ+PC90cj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpKQogICAgICAgICAgICAgICAgKyc8L3RhYmxlPicKICAgICAgICAgICAgfSwgeyJzdGlja3kiOiB0cnVlfSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgZ2VvX2pzb25fNDIyMzU1MDkwMzM3NGE1NDhhNzUxNGFlMGQ2MjZmODBfb25FYWNoRmVhdHVyZSA9IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgICAgICBtb3VzZW91dDogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpO30sCiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldFN0eWxlKGUudGFyZ2V0LmZlYXR1cmUucHJvcGVydGllcy5oaWdobGlnaHQpO30sCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ZjODc5ZTlkN2YyNTRmODViMDUzZTJiZTM0ZDVmNGRjLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7fQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uXzQyMjM1NTA5MDMzNzRhNTQ4YTc1MTRhZTBkNjI2ZjgwID0gTC5nZW9Kc29uKAogICAgICAgICAgICB7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stMC4xOTY0MjIsIDUxLjUwOTM1MzQyXSwgWy0wLjIwMjYwODYxMiwgNTEuNTE2MzIwOTVdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogODU1LCAiZW5kX3N0YXRpb25fbmFtZSI6ICJBbGwgU2FpbnRzIENodXJjaCwgUG9ydG9iZWxsbyIsICJoaWdobGlnaHQiOiB7ImNvbG9yIjogImdyZWVuIiwgImRhc2hBcnJheSI6ICI1LCA1IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDR9LCAic3RhcnRfc3RhdGlvbl9uYW1lIjogIk5vdHRpbmcgSGlsbCBHYXRlIFN0YXRpb24sIE5vdHRpbmcgSGlsbCIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uXzQyMjM1NTA5MDMzNzRhNTQ4YTc1MTRhZTBkNjI2ZjgwX29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl80MjIzNTUwOTAzMzc0YTU0OGE3NTE0YWUwZDYyNmY4MC5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uXzQyMjM1NTA5MDMzNzRhNTQ4YTc1MTRhZTBkNjI2ZjgwLmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uXzNmYzkzMWQ3NTkwMDQ5OWZhOGY1MGU4ODMzMTUwNWU4X29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl8zZmM5MzFkNzU5MDA0OTlmYThmNTBlODgzMzE1MDVlOCA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMDIxNjMwMzU5LCA1MS41NDAzMTE1XSwgWy0wLjAwNDgxLCA1MS41NDE3OTNdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAicHJvcGVydGllcyI6IHsiY250IjogODQ0LCAiZW5kX3N0YXRpb25fbmFtZSI6ICJTdHJhdGZvcmQgU3RhdGlvbiwgU3RyYXRmb3JkIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiTW9uaWVyIFJvYWQsIEhhY2tuZXkgV2ljayIsICJzdHlsZSI6IHsiY29sb3IiOiAiYmx1ZSIsICJkYXNoQXJyYXkiOiAiNywgNyIsICJmaWxsQ29sb3IiOiAiI2ZmYWYwMCIsICJ3ZWlnaHQiOiAyfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uXzNmYzkzMWQ3NTkwMDQ5OWZhOGY1MGU4ODMzMTUwNWU4X29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIH0KICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfYjgwNzIwNDBhMmQ4NDU2ZDk4OWRkYjUwM2JiNDdiMTkgKTsKICAgICAgICBnZW9fanNvbl8zZmM5MzFkNzU5MDA0OTlmYThmNTBlODgzMzE1MDVlOC5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIGdlb19qc29uXzNmYzkzMWQ3NTkwMDQ5OWZhOGY1MGU4ODMzMTUwNWU4LmJpbmRUb29sdGlwKAogICAgICAgICAgICBmdW5jdGlvbihsYXllcil7CiAgICAgICAgICAgIC8vIENvbnZlcnQgbm9uLXByaW1pdGl2ZSB0byBTdHJpbmcuCiAgICAgICAgICAgIGxldCBoYW5kbGVPYmplY3QgPSAoZmVhdHVyZSk9PnR5cGVvZihmZWF0dXJlKT09J29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSA6IGZlYXR1cmU7CiAgICAgICAgICAgIGxldCBmaWVsZHMgPSBbJ3N0YXJ0X3N0YXRpb25fbmFtZScsICdlbmRfc3RhdGlvbl9uYW1lJywgJ2NudCddOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICc8dGFibGU+JyArCiAgICAgICAgICAgIFN0cmluZygKICAgICAgICAgICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgICAgICAgICBjb2x1bW5uYW1lPT4KICAgICAgICAgICAgICAgICAgICBgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiA0cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAkeyBjb2x1bW5uYW1lLnRvTG9jYWxlU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDRweDsiPiR7aGFuZGxlT2JqZWN0KGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tjb2x1bW5uYW1lXSkKICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVTdHJpbmcoKX08L3RkPjwvdHI+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKSkKICAgICAgICAgICAgICAgICsnPC90YWJsZT4nCiAgICAgICAgICAgIH0sIHsic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIGdlb19qc29uXzY1YjFkMzYwY2Y4ZDQ4YjI5ODgwNjMzM2Y3MDBkMWEwX29uRWFjaEZlYXR1cmUgPSBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICAgICAgbW91c2VvdXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0U3R5bGUoZS50YXJnZXQuZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTt9LAogICAgICAgICAgICAgICAgICAgIG1vdXNlb3ZlcjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRTdHlsZShlLnRhcmdldC5mZWF0dXJlLnByb3BlcnRpZXMuaGlnaGxpZ2h0KTt9LAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mYzg3OWU5ZDdmMjU0Zjg1YjA1M2UyYmUzNGQ1ZjRkYy5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpO30KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl82NWIxZDM2MGNmOGQ0OGIyOTg4MDYzMzNmNzAwZDFhMCA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTAuMTIzNjE2ODI0LCA1MS41Mjk5NDM3MV0sIFstMC4xMzIzMjg4MzcsIDUxLjUxNTYzMTQ0XV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgInByb3BlcnRpZXMiOiB7ImNudCI6IDg0MCwgImVuZF9zdGF0aW9uX25hbWUiOiAiU29obyBTcXVhcmUgLCBTb2hvIiwgImhpZ2hsaWdodCI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZGFzaEFycmF5IjogIjUsIDUiLCAiZmlsbENvbG9yIjogIiNmZmFmMDAiLCAid2VpZ2h0IjogNH0sICJzdGFydF9zdGF0aW9uX25hbWUiOiAiQmVsZ3JvdmUgU3RyZWV0ICwgS2luZydzIENyb3NzIiwgInN0eWxlIjogeyJjb2xvciI6ICJibHVlIiwgImRhc2hBcnJheSI6ICI3LCA3IiwgImZpbGxDb2xvciI6ICIjZmZhZjAwIiwgIndlaWdodCI6IDJ9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fNjViMWQzNjBjZjhkNDhiMjk4ODA2MzMzZjcwMGQxYTBfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgfQogICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9iODA3MjA0MGEyZDg0NTZkOTg5ZGRiNTAzYmI0N2IxOSApOwogICAgICAgIGdlb19qc29uXzY1YjFkMzYwY2Y4ZDQ4YjI5ODgwNjMzM2Y3MDBkMWEwLnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAg
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment