Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save Sarikachima/0f0f1407f6445271a5be03aadeb545cd to your computer and use it in GitHub Desktop.
Save Sarikachima/0f0f1407f6445271a5be03aadeb545cd to your computer and use it in GitHub Desktop.
Created on Skills Network Labs
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a href=\"https://cognitiveclass.ai\"><img src = \"https://ibm.box.com/shared/static/9gegpsmnsoo25ikkbl4qzlvlyjbgxs5x.png\" width = 400> </a>\n",
"\n",
"<h1 align=center><font size = 5>Segmenting and Clustering Neighborhoods in New York City</font></h1>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Introduction\n",
"\n",
"In this lab, you will learn how to convert addresses into their equivalent latitude and longitude values. Also, you will use the Foursquare API to explore neighborhoods in New York City. You will use the **explore** function to get the most common venue categories in each neighborhood, and then use this feature to group the neighborhoods into clusters. You will use the *k*-means clustering algorithm to complete this task. Finally, you will use the Folium library to visualize the neighborhoods in New York City and their emerging clusters."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Table of Contents\n",
"\n",
"<div class=\"alert alert-block alert-info\" style=\"margin-top: 20px\">\n",
"\n",
"<font size = 3>\n",
"\n",
"1. <a href=\"#item1\">Download and Explore Dataset</a>\n",
"\n",
"2. <a href=\"#item2\">Explore Neighborhoods in New York City</a>\n",
"\n",
"3. <a href=\"#item3\">Analyze Each Neighborhood</a>\n",
"\n",
"4. <a href=\"#item4\">Cluster Neighborhoods</a>\n",
"\n",
"5. <a href=\"#item5\">Examine Clusters</a> \n",
"</font>\n",
"</div>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Before we get the data and start exploring it, let's download all the dependencies that we will need."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Libraries imported.\n"
]
}
],
"source": [
"import numpy as np # library to handle data in a vectorized manner\n",
"\n",
"import pandas as pd # library for data analsysis\n",
"pd.set_option('display.max_columns', None)\n",
"pd.set_option('display.max_rows', None)\n",
"\n",
"import json # library to handle JSON files\n",
"\n",
"#!conda install -c conda-forge geopy --yes # uncomment this line if you haven't completed the Foursquare API lab\n",
"from geopy.geocoders import Nominatim # convert an address into latitude and longitude values\n",
"\n",
"import requests # library to handle requests\n",
"from pandas.io.json import json_normalize # tranform JSON file into a pandas dataframe\n",
"\n",
"# Matplotlib and associated plotting modules\n",
"import matplotlib.cm as cm\n",
"import matplotlib.colors as colors\n",
"\n",
"# import k-means from clustering stage\n",
"from sklearn.cluster import KMeans\n",
"\n",
"#!conda install -c conda-forge folium=0.5.0 --yes # uncomment this line if you haven't completed the Foursquare API lab\n",
"import folium # map rendering library\n",
"\n",
"print('Libraries imported.')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a id='item1'></a>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1. Download and Explore Dataset"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Neighborhood has a total of 5 boroughs and 306 neighborhoods. In order to segement the neighborhoods and explore them, we will essentially need a dataset that contains the 5 boroughs and the neighborhoods that exist in each borough as well as the the latitude and logitude coordinates of each neighborhood. \n",
"\n",
"Luckily, this dataset exists for free on the web. Feel free to try to find this dataset on your own, but here is the link to the dataset: https://geo.nyu.edu/catalog/nyu_2451_34572"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For your convenience, I downloaded the files and placed it on the server, so you can simply run a `wget` command and access the data. So let's go ahead and do that."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
},
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Data downloaded!\n"
]
}
],
"source": [
"!wget -q -O 'newyork_data.json' https://cocl.us/new_york_dataset\n",
"print('Data downloaded!')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Load and explore the data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next, let's load the data."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [],
"source": [
"with open('newyork_data.json') as json_data:\n",
" newyork_data = json.load(json_data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's take a quick look at the data."
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"{'type': 'FeatureCollection',\n",
" 'totalFeatures': 306,\n",
" 'features': [{'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.1',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84720052054902, 40.89470517661]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Wakefield',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Wakefield',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.84720052054902,\n",
" 40.89470517661,\n",
" -73.84720052054902,\n",
" 40.89470517661]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.2',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.82993910812398, 40.87429419303012]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Co-op City',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Co-op',\n",
" 'annoline2': 'City',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.82993910812398,\n",
" 40.87429419303012,\n",
" -73.82993910812398,\n",
" 40.87429419303012]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.3',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.82780644716412, 40.887555677350775]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Eastchester',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Eastchester',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.82780644716412,\n",
" 40.887555677350775,\n",
" -73.82780644716412,\n",
" 40.887555677350775]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.4',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90564259591682, 40.89543742690383]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Fieldston',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Fieldston',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.90564259591682,\n",
" 40.89543742690383,\n",
" -73.90564259591682,\n",
" 40.89543742690383]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.5',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.9125854610857, 40.890834493891305]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Riverdale',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Riverdale',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.9125854610857,\n",
" 40.890834493891305,\n",
" -73.9125854610857,\n",
" 40.890834493891305]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.6',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90281798724604, 40.88168737120521]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Kingsbridge',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Kingsbridge',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.90281798724604,\n",
" 40.88168737120521,\n",
" -73.90281798724604,\n",
" 40.88168737120521]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.7',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91065965862981, 40.87655077879964]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Marble Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Marble',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.91065965862981,\n",
" 40.87655077879964,\n",
" -73.91065965862981,\n",
" 40.87655077879964]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.8',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.86731496814176, 40.89827261213805]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Woodlawn',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Woodlawn',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.86731496814176,\n",
" 40.89827261213805,\n",
" -73.86731496814176,\n",
" 40.89827261213805]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.9',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8793907395681, 40.87722415599446]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Norwood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Norwood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.8793907395681,\n",
" 40.87722415599446,\n",
" -73.8793907395681,\n",
" 40.87722415599446]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.10',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85744642974207, 40.88103887819211]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Williamsbridge',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Williamsbridge',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.85744642974207,\n",
" 40.88103887819211,\n",
" -73.85744642974207,\n",
" 40.88103887819211]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.11',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.83579759808117, 40.866858107252696]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Baychester',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Baychester',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.83579759808117,\n",
" 40.866858107252696,\n",
" -73.83579759808117,\n",
" 40.866858107252696]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.12',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85475564017999, 40.85741349808865]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Pelham Parkway',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Pelham Parkway',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.85475564017999,\n",
" 40.85741349808865,\n",
" -73.85475564017999,\n",
" 40.85741349808865]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.13',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.78648845267413, 40.84724670491813]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'City Island',\n",
" 'stacked': 2,\n",
" 'annoline1': 'City',\n",
" 'annoline2': 'Island',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.78648845267413,\n",
" 40.84724670491813,\n",
" -73.78648845267413,\n",
" 40.84724670491813]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.14',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8855121841913, 40.870185164975325]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bedford Park',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Bedford',\n",
" 'annoline2': 'Park',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.8855121841913,\n",
" 40.870185164975325,\n",
" -73.8855121841913,\n",
" 40.870185164975325]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.15',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.9104159619131, 40.85572707719664]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'University Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'University',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.9104159619131,\n",
" 40.85572707719664,\n",
" -73.9104159619131,\n",
" 40.85572707719664]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.16',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91967159119565, 40.84789792606271]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Morris Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Morris',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.91967159119565,\n",
" 40.84789792606271,\n",
" -73.91967159119565,\n",
" 40.84789792606271]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.17',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.89642655981623, 40.86099679638654]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Fordham',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Fordham',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.89642655981623,\n",
" 40.86099679638654,\n",
" -73.89642655981623,\n",
" 40.86099679638654]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.18',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.88735617532338, 40.84269615786053]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'East Tremont',\n",
" 'stacked': 2,\n",
" 'annoline1': 'East',\n",
" 'annoline2': 'Tremont',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.88735617532338,\n",
" 40.84269615786053,\n",
" -73.88735617532338,\n",
" 40.84269615786053]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.19',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.87774474910545, 40.83947505672653]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'West Farms',\n",
" 'stacked': 2,\n",
" 'annoline1': 'West',\n",
" 'annoline2': 'Farms',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.87774474910545,\n",
" 40.83947505672653,\n",
" -73.87774474910545,\n",
" 40.83947505672653]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.20',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.9261020935813, 40.836623010706056]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'High Bridge',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Highbridge',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.9261020935813,\n",
" 40.836623010706056,\n",
" -73.9261020935813,\n",
" 40.836623010706056]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.21',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90942160757436, 40.819754370594936]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Melrose',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Melrose',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.90942160757436,\n",
" 40.819754370594936,\n",
" -73.90942160757436,\n",
" 40.819754370594936]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.22',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91609987487575, 40.80623874935177]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Mott Haven',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Mott Haven',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.91609987487575,\n",
" 40.80623874935177,\n",
" -73.91609987487575,\n",
" 40.80623874935177]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.23',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91322139386135, 40.801663627756206]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Port Morris',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Port',\n",
" 'annoline2': 'Morris',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.91322139386135,\n",
" 40.801663627756206,\n",
" -73.91322139386135,\n",
" 40.801663627756206]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.24',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8957882009446, 40.81509904545822]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Longwood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Longwood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.8957882009446,\n",
" 40.81509904545822,\n",
" -73.8957882009446,\n",
" 40.81509904545822]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.25',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.88331505955291, 40.80972987938709]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Hunts Point',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Hunts',\n",
" 'annoline2': 'Point',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.88331505955291,\n",
" 40.80972987938709,\n",
" -73.88331505955291,\n",
" 40.80972987938709]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.26',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90150648943059, 40.82359198585534]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Morrisania',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Morrisania',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.90150648943059,\n",
" 40.82359198585534,\n",
" -73.90150648943059,\n",
" 40.82359198585534]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.27',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.86574609554924, 40.821012197914015]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Soundview',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Soundview',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.86574609554924,\n",
" 40.821012197914015,\n",
" -73.86574609554924,\n",
" 40.821012197914015]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.28',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85414416189266, 40.80655112003589]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Clason Point',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Clason',\n",
" 'annoline2': 'Point',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.85414416189266,\n",
" 40.80655112003589,\n",
" -73.85414416189266,\n",
" 40.80655112003589]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.29',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.81635002158441, 40.81510925804005]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Throgs Neck',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Throgs Neck',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.81635002158441,\n",
" 40.81510925804005,\n",
" -73.81635002158441,\n",
" 40.81510925804005]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.30',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8240992675385, 40.844245936947374]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Country Club',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Country',\n",
" 'annoline2': 'Club',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.8240992675385,\n",
" 40.844245936947374,\n",
" -73.8240992675385,\n",
" 40.844245936947374]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.31',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85600310535783, 40.837937822267286]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Parkchester',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Parkchester',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.85600310535783,\n",
" 40.837937822267286,\n",
" -73.85600310535783,\n",
" 40.837937822267286]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.32',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84219407604444, 40.8406194964327]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Westchester Square',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Westchester',\n",
" 'annoline2': 'Square',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.84219407604444,\n",
" 40.8406194964327,\n",
" -73.84219407604444,\n",
" 40.8406194964327]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.33',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8662991807561, 40.84360847124718]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Van Nest',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Van',\n",
" 'annoline2': 'Nest',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.8662991807561,\n",
" 40.84360847124718,\n",
" -73.8662991807561,\n",
" 40.84360847124718]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.34',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85040178030421, 40.847549063536334]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Morris Park',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Morris Park',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.85040178030421,\n",
" 40.847549063536334,\n",
" -73.85040178030421,\n",
" 40.847549063536334]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.35',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.88845196134804, 40.85727710073895]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Belmont',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Belmont',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.88845196134804,\n",
" 40.85727710073895,\n",
" -73.88845196134804,\n",
" 40.85727710073895]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.36',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91719048210393, 40.88139497727086]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Spuyten Duyvil',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Spuyten',\n",
" 'annoline2': 'Duyvil',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.91719048210393,\n",
" 40.88139497727086,\n",
" -73.91719048210393,\n",
" 40.88139497727086]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.37',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90453054908927, 40.90854282950666]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'North Riverdale',\n",
" 'stacked': 2,\n",
" 'annoline1': 'North',\n",
" 'annoline2': 'Riverdale',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.90453054908927,\n",
" 40.90854282950666,\n",
" -73.90453054908927,\n",
" 40.90854282950666]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.38',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8320737824047, 40.85064140940335]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Pelham Bay',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Pelham',\n",
" 'annoline2': 'Bay',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.8320737824047,\n",
" 40.85064140940335,\n",
" -73.8320737824047,\n",
" 40.85064140940335]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.39',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.82620275994073, 40.82657951686922]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Schuylerville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Schuylerville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.82620275994073,\n",
" 40.82657951686922,\n",
" -73.82620275994073,\n",
" 40.82657951686922]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.40',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.81388514428619, 40.821986118163494]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Edgewater Park',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Edgewater',\n",
" 'annoline2': 'Park',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.81388514428619,\n",
" 40.821986118163494,\n",
" -73.81388514428619,\n",
" 40.821986118163494]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.41',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84802729582735, 40.819014376988314]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Castle Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Castle',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.84802729582735,\n",
" 40.819014376988314,\n",
" -73.84802729582735,\n",
" 40.819014376988314]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.42',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.86332361652777, 40.87137078192371]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Olinville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Olinville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.86332361652777,\n",
" 40.87137078192371,\n",
" -73.86332361652777,\n",
" 40.87137078192371]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.43',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84161194831223, 40.86296562477998]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Pelham Gardens',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Pelham',\n",
" 'annoline2': 'Gardens',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.84161194831223,\n",
" 40.86296562477998,\n",
" -73.84161194831223,\n",
" 40.86296562477998]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.44',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91558941773444, 40.83428380733851]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Concourse',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Concourse',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.91558941773444,\n",
" 40.83428380733851,\n",
" -73.91558941773444,\n",
" 40.83428380733851]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.45',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85053524451935, 40.82977429787161]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Unionport',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Unionport',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.85053524451935,\n",
" 40.82977429787161,\n",
" -73.85053524451935,\n",
" 40.82977429787161]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.46',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84808271877168, 40.88456130303732]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Edenwald',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Edenwald',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.84808271877168,\n",
" 40.88456130303732,\n",
" -73.84808271877168,\n",
" 40.88456130303732]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.47',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.03062069353813, 40.625801065010656]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bay Ridge',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bay Ridge',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-74.03062069353813,\n",
" 40.625801065010656,\n",
" -74.03062069353813,\n",
" 40.625801065010656]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.48',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99517998380729, 40.61100890202044]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bensonhurst',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bensonhurst',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.99517998380729,\n",
" 40.61100890202044,\n",
" -73.99517998380729,\n",
" 40.61100890202044]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.49',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.01031618527784, 40.64510294925429]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Sunset Park',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Sunset',\n",
" 'annoline2': 'Park',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-74.01031618527784,\n",
" 40.64510294925429,\n",
" -74.01031618527784,\n",
" 40.64510294925429]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.50',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95424093127393, 40.7302009848647]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Greenpoint',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Greenpoint',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95424093127393,\n",
" 40.7302009848647,\n",
" -73.95424093127393,\n",
" 40.7302009848647]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.51',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.97347087708445, 40.59526001306593]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Gravesend',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Gravesend',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.97347087708445,\n",
" 40.59526001306593,\n",
" -73.97347087708445,\n",
" 40.59526001306593]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.52',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96509448785336, 40.57682506566604]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Brighton Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Brighton',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.96509448785336,\n",
" 40.57682506566604,\n",
" -73.96509448785336,\n",
" 40.57682506566604]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.53',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94318640482979, 40.58689012678384]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Sheepshead Bay',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Sheepshead',\n",
" 'annoline2': 'Bay',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.94318640482979,\n",
" 40.58689012678384,\n",
" -73.94318640482979,\n",
" 40.58689012678384]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.54',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95743840559939, 40.61443251335098]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Manhattan Terrace',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Manhattan',\n",
" 'annoline2': 'Terrace',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95743840559939,\n",
" 40.61443251335098,\n",
" -73.95743840559939,\n",
" 40.61443251335098]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.55',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95840106533903, 40.63632589026677]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Flatbush',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Flatbush',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95840106533903,\n",
" 40.63632589026677,\n",
" -73.95840106533903,\n",
" 40.63632589026677]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.56',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94329119073582, 40.67082917695294]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Crown Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Crown',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.94329119073582,\n",
" 40.67082917695294,\n",
" -73.94329119073582,\n",
" 40.67082917695294]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.57',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93610256185836, 40.64171776668961]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'East Flatbush',\n",
" 'stacked': 1,\n",
" 'annoline1': 'East Flatbush',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.93610256185836,\n",
" 40.64171776668961,\n",
" -73.93610256185836,\n",
" 40.64171776668961]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.58',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98042110559474, 40.642381958003526]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Kensington',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Kensington',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.98042110559474,\n",
" 40.642381958003526,\n",
" -73.98042110559474,\n",
" 40.642381958003526]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.59',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98007340430172, 40.65694583575104]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Windsor Terrace',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Windsor',\n",
" 'annoline2': 'Terrace',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.98007340430172,\n",
" 40.65694583575104,\n",
" -73.98007340430172,\n",
" 40.65694583575104]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.60',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.9648592426269, 40.676822262254724]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Prospect Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Prospect',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.9648592426269,\n",
" 40.676822262254724,\n",
" -73.9648592426269,\n",
" 40.676822262254724]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.61',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91023536176607, 40.66394994339755]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Brownsville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Brownsville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.91023536176607,\n",
" 40.66394994339755,\n",
" -73.91023536176607,\n",
" 40.66394994339755]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.62',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95811529220927, 40.70714439344251]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Williamsburg',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Williamsburg',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95811529220927,\n",
" 40.70714439344251,\n",
" -73.95811529220927,\n",
" 40.70714439344251]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.63',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.92525797487045, 40.69811611017901]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bushwick',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bushwick',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.92525797487045,\n",
" 40.69811611017901,\n",
" -73.92525797487045,\n",
" 40.69811611017901]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.64',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94178488690297, 40.687231607720456]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bedford Stuyvesant',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bedford Stuyvesant',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.94178488690297,\n",
" 40.687231607720456,\n",
" -73.94178488690297,\n",
" 40.687231607720456]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.65',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99378225496424, 40.695863722724084]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Brooklyn Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Brooklyn',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.99378225496424,\n",
" 40.695863722724084,\n",
" -73.99378225496424,\n",
" 40.695863722724084]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.66',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99856139218463, 40.687919722485574]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Cobble Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Cobble',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.99856139218463,\n",
" 40.687919722485574,\n",
" -73.99856139218463,\n",
" 40.687919722485574]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.67',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99465372828006, 40.680540231076485]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Carroll Gardens',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Carroll',\n",
" 'annoline2': 'Gardens',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.99465372828006,\n",
" 40.680540231076485,\n",
" -73.99465372828006,\n",
" 40.680540231076485]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.68',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.0127589747356, 40.676253230250886]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Red Hook',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Red',\n",
" 'annoline2': 'Hook',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-74.0127589747356,\n",
" 40.676253230250886,\n",
" -74.0127589747356,\n",
" 40.676253230250886]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.69',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99444087145339, 40.673931143187154]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Gowanus',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Gowanus',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.99444087145339,\n",
" 40.673931143187154,\n",
" -73.99444087145339,\n",
" 40.673931143187154]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.70',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.97290574369092, 40.68852726018977]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Fort Greene',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Fort',\n",
" 'annoline2': 'Greene',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.97290574369092,\n",
" 40.68852726018977,\n",
" -73.97290574369092,\n",
" 40.68852726018977]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.71',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.97705030183924, 40.67232052268197]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Park Slope',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Park',\n",
" 'annoline2': 'Slope',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.97705030183924,\n",
" 40.67232052268197,\n",
" -73.97705030183924,\n",
" 40.67232052268197]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.72',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.87661596457296, 40.68239101144211]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Cypress Hills',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Cypress',\n",
" 'annoline2': 'Hills',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.87661596457296,\n",
" 40.68239101144211,\n",
" -73.87661596457296,\n",
" 40.68239101144211]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.73',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.88069863917366, 40.669925700847045]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'East New York',\n",
" 'stacked': 1,\n",
" 'annoline1': 'East New York',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.88069863917366,\n",
" 40.669925700847045,\n",
" -73.88069863917366,\n",
" 40.669925700847045]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.74',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.87936970045875, 40.64758905230874]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Starrett City',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Starrett',\n",
" 'annoline2': 'City',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.87936970045875,\n",
" 40.64758905230874,\n",
" -73.87936970045875,\n",
" 40.64758905230874]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.75',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90209269778966, 40.63556432797428]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Canarsie',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Canarsie',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.90209269778966,\n",
" 40.63556432797428,\n",
" -73.90209269778966,\n",
" 40.63556432797428]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.76',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.92911302644674, 40.630446043757466]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Flatlands',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Flatlands',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.92911302644674,\n",
" 40.630446043757466,\n",
" -73.92911302644674,\n",
" 40.630446043757466]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.77',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90818571777423, 40.606336421685626]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Mill Island',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Mill',\n",
" 'annoline2': 'Island',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.90818571777423,\n",
" 40.606336421685626,\n",
" -73.90818571777423,\n",
" 40.606336421685626]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.78',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94353722891886, 40.57791350308657]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Manhattan Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Manhattan',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.94353722891886,\n",
" 40.57791350308657,\n",
" -73.94353722891886,\n",
" 40.57791350308657]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.79',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98868295821637, 40.57429256471601]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Coney Island',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Coney Island',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.98868295821637,\n",
" 40.57429256471601,\n",
" -73.98868295821637,\n",
" 40.57429256471601]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.80',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99875221443519, 40.59951870282238]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bath Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Bath',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.99875221443519,\n",
" 40.59951870282238,\n",
" -73.99875221443519,\n",
" 40.59951870282238]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.81',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99049823044811, 40.633130512758015]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Borough Park',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Borough',\n",
" 'annoline2': 'Park',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.99049823044811,\n",
" 40.633130512758015,\n",
" -73.99049823044811,\n",
" 40.633130512758015]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.82',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.01931375636022, 40.619219457722636]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Dyker Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Dyker',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-74.01931375636022,\n",
" 40.619219457722636,\n",
" -74.01931375636022,\n",
" 40.619219457722636]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.83',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93010170691196, 40.590848433902046]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Gerritsen Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Gerritsen',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.93010170691196,\n",
" 40.590848433902046,\n",
" -73.93010170691196,\n",
" 40.590848433902046]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.84',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93134404108497, 40.609747779894604]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Marine Park',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Marine Park',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.93134404108497,\n",
" 40.609747779894604,\n",
" -73.93134404108497,\n",
" 40.609747779894604]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.85',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96784306216367, 40.693229421881504]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Clinton Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Clinton',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.96784306216367,\n",
" 40.693229421881504,\n",
" -73.96784306216367,\n",
" 40.693229421881504]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.86',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.0078731120024, 40.57637537890224]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Sea Gate',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Sea',\n",
" 'annoline2': 'Gate',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-74.0078731120024,\n",
" 40.57637537890224,\n",
" -74.0078731120024,\n",
" 40.57637537890224]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.87',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98346337431099, 40.69084402109802]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Downtown',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Downtown',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.98346337431099,\n",
" 40.69084402109802,\n",
" -73.98346337431099,\n",
" 40.69084402109802]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.88',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98374824115798, 40.685682912091444]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Boerum Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Boerum',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.98374824115798,\n",
" 40.685682912091444,\n",
" -73.98374824115798,\n",
" 40.685682912091444]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.89',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95489867077713, 40.658420017469815]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Prospect Lefferts Gardens',\n",
" 'stacked': 3,\n",
" 'annoline1': 'Prospect',\n",
" 'annoline2': 'Lefferts',\n",
" 'annoline3': 'Gardens',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95489867077713,\n",
" 40.658420017469815,\n",
" -73.95489867077713,\n",
" 40.658420017469815]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.90',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91306831787395, 40.678402554795355]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Ocean Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Ocean',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.91306831787395,\n",
" 40.678402554795355,\n",
" -73.91306831787395,\n",
" 40.678402554795355]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.91',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.86797598081334, 40.67856995727479]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'City Line',\n",
" 'stacked': 2,\n",
" 'annoline1': 'City',\n",
" 'annoline2': 'Line',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.86797598081334,\n",
" 40.67856995727479,\n",
" -73.86797598081334,\n",
" 40.67856995727479]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.92',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.89855633630317, 40.61514955045308]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bergen Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Bergen',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.89855633630317,\n",
" 40.61514955045308,\n",
" -73.89855633630317,\n",
" 40.61514955045308]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.93',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95759523489838, 40.62559589869843]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Midwood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Midwood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95759523489838,\n",
" 40.62559589869843,\n",
" -73.95759523489838,\n",
" 40.62559589869843]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.94',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96261316716048, 40.647008603185185]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Prospect Park South',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Prospect',\n",
" 'annoline2': 'Park South',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.96261316716048,\n",
" 40.647008603185185,\n",
" -73.96261316716048,\n",
" 40.647008603185185]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.95',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91607483951324, 40.62384524478419]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Georgetown',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Georgetown',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.91607483951324,\n",
" 40.62384524478419,\n",
" -73.91607483951324,\n",
" 40.62384524478419]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.96',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93885815269195, 40.70849241041548]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'East Williamsburg',\n",
" 'stacked': 2,\n",
" 'annoline1': 'East',\n",
" 'annoline2': 'Williamsburg',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.93885815269195,\n",
" 40.70849241041548,\n",
" -73.93885815269195,\n",
" 40.70849241041548]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.97',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95880857587582, 40.714822906532014]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'North Side',\n",
" 'stacked': 1,\n",
" 'annoline1': 'North Side',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95880857587582,\n",
" 40.714822906532014,\n",
" -73.95880857587582,\n",
" 40.714822906532014]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.98',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95800095153331, 40.71086147265064]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'South Side',\n",
" 'stacked': 1,\n",
" 'annoline1': 'South Side',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95800095153331,\n",
" 40.71086147265064,\n",
" -73.95800095153331,\n",
" 40.71086147265064]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.99',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96836678035541, 40.61305976667942]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Ocean Parkway',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Ocean',\n",
" 'annoline2': 'Parkway',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.96836678035541,\n",
" 40.61305976667942,\n",
" -73.96836678035541,\n",
" 40.61305976667942]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.100',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.03197914537984, 40.61476812694226]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Fort Hamilton',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Fort',\n",
" 'annoline2': 'Hamilton',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-74.03197914537984,\n",
" 40.61476812694226,\n",
" -74.03197914537984,\n",
" 40.61476812694226]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.101',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99427936255978, 40.71561842231432]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Chinatown',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Chinatown',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.99427936255978,\n",
" 40.71561842231432,\n",
" -73.99427936255978,\n",
" 40.71561842231432]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.102',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93690027985234, 40.85190252555305]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Washington Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Washington',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.93690027985234,\n",
" 40.85190252555305,\n",
" -73.93690027985234,\n",
" 40.85190252555305]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.103',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.92121042203897, 40.86768396449915]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Inwood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Inwood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.92121042203897,\n",
" 40.86768396449915,\n",
" -73.92121042203897,\n",
" 40.86768396449915]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.104',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94968791883366, 40.823604284811935]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Hamilton Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Hamilton',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.94968791883366,\n",
" 40.823604284811935,\n",
" -73.94968791883366,\n",
" 40.823604284811935]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.105',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.9573853935188, 40.8169344294978]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Manhattanville',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Manhattanville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.9573853935188,\n",
" 40.8169344294978,\n",
" -73.9573853935188,\n",
" 40.8169344294978]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.106',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94321112603905, 40.81597606742414]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Central Harlem',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Central',\n",
" 'annoline2': 'Harlem',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.94321112603905,\n",
" 40.81597606742414,\n",
" -73.94321112603905,\n",
" 40.81597606742414]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.107',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94418223148524, 40.79224946663033]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'East Harlem',\n",
" 'stacked': 2,\n",
" 'annoline1': 'East',\n",
" 'annoline2': 'Harlem',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.94418223148524,\n",
" 40.79224946663033,\n",
" -73.94418223148524,\n",
" 40.79224946663033]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.108',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96050763135, 40.775638573301805]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Upper East Side',\n",
" 'stacked': 3,\n",
" 'annoline1': 'Upper',\n",
" 'annoline2': 'East',\n",
" 'annoline3': 'Side',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.96050763135,\n",
" 40.775638573301805,\n",
" -73.96050763135,\n",
" 40.775638573301805]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.109',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94711784471826, 40.775929849884875]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Yorkville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Yorkville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.94711784471826,\n",
" 40.775929849884875,\n",
" -73.94711784471826,\n",
" 40.775929849884875]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.110',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.9588596881376, 40.76811265828733]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Lenox Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Lenox',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.9588596881376,\n",
" 40.76811265828733,\n",
" -73.9588596881376,\n",
" 40.76811265828733]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.111',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94916769227953, 40.76215960576283]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Roosevelt Island',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Roosevelt Island',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 56,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.94916769227953,\n",
" 40.76215960576283,\n",
" -73.94916769227953,\n",
" 40.76215960576283]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.112',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.97705923630603, 40.787657998534854]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Upper West Side',\n",
" 'stacked': 3,\n",
" 'annoline1': 'Upper',\n",
" 'annoline2': 'West',\n",
" 'annoline3': 'Side',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.97705923630603,\n",
" 40.787657998534854,\n",
" -73.97705923630603,\n",
" 40.787657998534854]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.113',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98533777001262, 40.77352888942166]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Lincoln Square',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Lincoln',\n",
" 'annoline2': 'Square',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.98533777001262,\n",
" 40.77352888942166,\n",
" -73.98533777001262,\n",
" 40.77352888942166]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.114',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99611936309479, 40.75910089146212]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Clinton',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Clinton',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.99611936309479,\n",
" 40.75910089146212,\n",
" -73.99611936309479,\n",
" 40.75910089146212]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.115',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98166882730304, 40.75469110270623]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Midtown',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Midtown',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.98166882730304,\n",
" 40.75469110270623,\n",
" -73.98166882730304,\n",
" 40.75469110270623]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.116',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.97833207924127, 40.748303077252174]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Murray Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Murray',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.97833207924127,\n",
" 40.748303077252174,\n",
" -73.97833207924127,\n",
" 40.748303077252174]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.117',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.00311633472813, 40.744034706747975]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Chelsea',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Chelsea',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-74.00311633472813,\n",
" 40.744034706747975,\n",
" -74.00311633472813,\n",
" 40.744034706747975]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.118',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99991402945902, 40.72693288536128]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Greenwich Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Greenwich',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.99991402945902,\n",
" 40.72693288536128,\n",
" -73.99991402945902,\n",
" 40.72693288536128]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.119',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98222616506416, 40.727846777270244]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'East Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'East',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.98222616506416,\n",
" 40.727846777270244,\n",
" -73.98222616506416,\n",
" 40.727846777270244]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.120',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98089031999291, 40.71780674892765]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Lower East Side',\n",
" 'stacked': 3,\n",
" 'annoline1': 'Lower',\n",
" 'annoline2': 'East',\n",
" 'annoline3': 'Side',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.98089031999291,\n",
" 40.71780674892765,\n",
" -73.98089031999291,\n",
" 40.71780674892765]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.121',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.01068328559087, 40.721521967443216]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Tribeca',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Tribeca',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-74.01068328559087,\n",
" 40.721521967443216,\n",
" -74.01068328559087,\n",
" 40.721521967443216]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.122',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99730467208073, 40.71932379395907]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Little Italy',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Little',\n",
" 'annoline2': 'Italy',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.99730467208073,\n",
" 40.71932379395907,\n",
" -73.99730467208073,\n",
" 40.71932379395907]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.123',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.00065666959759, 40.72218384131794]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Soho',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Soho',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-74.00065666959759,\n",
" 40.72218384131794,\n",
" -74.00065666959759,\n",
" 40.72218384131794]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.124',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.00617998126812, 40.73443393572434]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'West Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'West',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-74.00617998126812,\n",
" 40.73443393572434,\n",
" -74.00617998126812,\n",
" 40.73443393572434]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.125',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96428617740655, 40.797307041702865]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Manhattan Valley',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Manhattan',\n",
" 'annoline2': 'Valley',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.96428617740655,\n",
" 40.797307041702865,\n",
" -73.96428617740655,\n",
" 40.797307041702865]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.126',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96389627905332, 40.807999738165826]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Morningside Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Morningside',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.96389627905332,\n",
" 40.807999738165826,\n",
" -73.96389627905332,\n",
" 40.807999738165826]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.127',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98137594833541, 40.737209832715]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Gramercy',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Gramercy',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.98137594833541,\n",
" 40.737209832715,\n",
" -73.98137594833541,\n",
" 40.737209832715]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.128',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.01686930508617, 40.71193198394565]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Battery Park City',\n",
" 'stacked': 3,\n",
" 'annoline1': 'Battery',\n",
" 'annoline2': 'Park',\n",
" 'annoline3': 'City',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-74.01686930508617,\n",
" 40.71193198394565,\n",
" -74.01686930508617,\n",
" 40.71193198394565]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.129',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.0106654452127, 40.70710710727048]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Financial District',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Financial',\n",
" 'annoline2': 'District',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-74.0106654452127,\n",
" 40.70710710727048,\n",
" -74.0106654452127,\n",
" 40.70710710727048]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.130',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91565374304234, 40.76850859335492]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Astoria',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Astoria',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.91565374304234,\n",
" 40.76850859335492,\n",
" -73.91565374304234,\n",
" 40.76850859335492]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.131',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90184166838284, 40.74634908860222]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Woodside',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Woodside',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.90184166838284,\n",
" 40.74634908860222,\n",
" -73.90184166838284,\n",
" 40.74634908860222]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.132',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.88282109164365, 40.75198138007367]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Jackson Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Jackson',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.88282109164365,\n",
" 40.75198138007367,\n",
" -73.88282109164365,\n",
" 40.75198138007367]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.133',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.88165622288388, 40.744048505122024]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Elmhurst',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Elmhurst',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.88165622288388,\n",
" 40.744048505122024,\n",
" -73.88165622288388,\n",
" 40.744048505122024]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.134',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8381376460028, 40.65422527738487]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Howard Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Howard',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.8381376460028,\n",
" 40.65422527738487,\n",
" -73.8381376460028,\n",
" 40.65422527738487]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.135',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85682497345258, 40.74238175015667]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Corona',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Corona',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.85682497345258,\n",
" 40.74238175015667,\n",
" -73.85682497345258,\n",
" 40.74238175015667]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.136',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84447500788983, 40.72526378216503]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Forest Hills',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Forest',\n",
" 'annoline2': 'Hills',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.84447500788983,\n",
" 40.72526378216503,\n",
" -73.84447500788983,\n",
" 40.72526378216503]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.137',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.82981905825703, 40.7051790354148]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Kew Gardens',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Kew',\n",
" 'annoline2': 'Gardens',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.82981905825703,\n",
" 40.7051790354148,\n",
" -73.82981905825703,\n",
" 40.7051790354148]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.138',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.83183321446887, 40.69794731471763]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Richmond Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Richmond',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.83183321446887,\n",
" 40.69794731471763,\n",
" -73.83183321446887,\n",
" 40.69794731471763]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.139',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.83177300329582, 40.76445419697846]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Flushing',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Flushing',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.83177300329582,\n",
" 40.76445419697846,\n",
" -73.83177300329582,\n",
" 40.76445419697846]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.140',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93920223915505, 40.75021734610528]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Long Island City',\n",
" 'stacked': 3,\n",
" 'annoline1': 'Long',\n",
" 'annoline2': 'Island',\n",
" 'annoline3': 'City',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.93920223915505,\n",
" 40.75021734610528,\n",
" -73.93920223915505,\n",
" 40.75021734610528]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.141',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.92691617561577, 40.74017628351924]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Sunnyside',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Sunnyside',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.92691617561577,\n",
" 40.74017628351924,\n",
" -73.92691617561577,\n",
" 40.74017628351924]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.142',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.86704147658772, 40.76407323883091]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'East Elmhurst',\n",
" 'stacked': 2,\n",
" 'annoline1': 'East',\n",
" 'annoline2': 'Elmhurst',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.86704147658772,\n",
" 40.76407323883091,\n",
" -73.86704147658772,\n",
" 40.76407323883091]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.143',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.89621713626859, 40.725427374093606]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Maspeth',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Maspeth',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.89621713626859,\n",
" 40.725427374093606,\n",
" -73.89621713626859,\n",
" 40.725427374093606]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.144',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90143517559589, 40.70832315613858]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Ridgewood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Ridgewood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.90143517559589,\n",
" 40.70832315613858,\n",
" -73.90143517559589,\n",
" 40.70832315613858]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.145',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.87074167435605, 40.70276242967838]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Glendale',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Glendale',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.87074167435605,\n",
" 40.70276242967838,\n",
" -73.87074167435605,\n",
" 40.70276242967838]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.146',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8578268690537, 40.72897409480735]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Rego Park',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Rego Park',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.8578268690537,\n",
" 40.72897409480735,\n",
" -73.8578268690537,\n",
" 40.72897409480735]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.147',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8581104655432, 40.68988687915789]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Woodhaven',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Woodhaven',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.8581104655432,\n",
" 40.68988687915789,\n",
" -73.8581104655432,\n",
" 40.68988687915789]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.148',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84320266173447, 40.680708468265415]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Ozone Park',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Ozone Park',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.84320266173447,\n",
" 40.680708468265415,\n",
" -73.84320266173447,\n",
" 40.680708468265415]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.149',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.80986478649041, 40.66854957767195]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'South Ozone Park',\n",
" 'stacked': 2,\n",
" 'annoline1': 'South',\n",
" 'annoline2': 'Ozone Park',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.80986478649041,\n",
" 40.66854957767195,\n",
" -73.80986478649041,\n",
" 40.66854957767195]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.150',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84304528896125, 40.784902749260205]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'College Point',\n",
" 'stacked': 2,\n",
" 'annoline1': 'College',\n",
" 'annoline2': 'Point',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.84304528896125,\n",
" 40.784902749260205,\n",
" -73.84304528896125,\n",
" 40.784902749260205]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.151',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.81420216610863, 40.78129076602694]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Whitestone',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Whitestone',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.81420216610863,\n",
" 40.78129076602694,\n",
" -73.81420216610863,\n",
" 40.78129076602694]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.152',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.7742736306867, 40.76604063281064]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bayside',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bayside',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.7742736306867,\n",
" 40.76604063281064,\n",
" -73.7742736306867,\n",
" 40.76604063281064]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.153',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.79176243728061, 40.76172954903262]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Auburndale',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Auburndale',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.79176243728061,\n",
" 40.76172954903262,\n",
" -73.79176243728061,\n",
" 40.76172954903262]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.154',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.7388977558074, 40.7708261928267]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Little Neck',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Little',\n",
" 'annoline2': 'Neck',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.7388977558074,\n",
" 40.7708261928267,\n",
" -73.7388977558074,\n",
" 40.7708261928267]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.155',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.7424982072733, 40.76684609790763]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Douglaston',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Douglaston',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.7424982072733,\n",
" 40.76684609790763,\n",
" -73.7424982072733,\n",
" 40.76684609790763]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.156',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.71548118999145, 40.74944079974332]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Glen Oaks',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Glen',\n",
" 'annoline2': 'Oaks',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.71548118999145,\n",
" 40.74944079974332,\n",
" -73.71548118999145,\n",
" 40.74944079974332]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.157',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.72012814826903, 40.72857318176675]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bellerose',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bellerose',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.72012814826903,\n",
" 40.72857318176675,\n",
" -73.72012814826903,\n",
" 40.72857318176675]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.158',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.82087764933566, 40.722578244228046]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Kew Gardens Hills',\n",
" 'stacked': 3,\n",
" 'annoline1': 'Kew',\n",
" 'annoline2': 'Gardens',\n",
" 'annoline3': 'Hills',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.82087764933566,\n",
" 40.722578244228046,\n",
" -73.82087764933566,\n",
" 40.722578244228046]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.159',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.78271337003264, 40.7343944653313]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Fresh Meadows',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Fresh',\n",
" 'annoline2': 'Meadows',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.78271337003264,\n",
" 40.7343944653313,\n",
" -73.78271337003264,\n",
" 40.7343944653313]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.160',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.81174822458634, 40.71093547252271]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Briarwood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Briarwood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.81174822458634,\n",
" 40.71093547252271,\n",
" -73.81174822458634,\n",
" 40.71093547252271]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.161',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.79690165888289, 40.70465736068717]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Jamaica Center',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Jamaica',\n",
" 'annoline2': 'Center',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.79690165888289,\n",
" 40.70465736068717,\n",
" -73.79690165888289,\n",
" 40.70465736068717]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.162',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.75494976234332, 40.74561857141855]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Oakland Gardens',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Oakland',\n",
" 'annoline2': 'Gardens',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.75494976234332,\n",
" 40.74561857141855,\n",
" -73.75494976234332,\n",
" 40.74561857141855]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.163',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.73871484578424, 40.718893092167356]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Queens Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Queens',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.73871484578424,\n",
" 40.718893092167356,\n",
" -73.73871484578424,\n",
" 40.718893092167356]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.164',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.75925009335594, 40.71124344191904]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Hollis',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Hollis',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.75925009335594,\n",
" 40.71124344191904,\n",
" -73.75925009335594,\n",
" 40.71124344191904]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.165',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.7904261313554, 40.696911253789885]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'South Jamaica',\n",
" 'stacked': 1,\n",
" 'annoline1': 'South Jamaica',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.7904261313554,\n",
" 40.696911253789885,\n",
" -73.7904261313554,\n",
" 40.696911253789885]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.166',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.75867603727717, 40.69444538522359]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'St. Albans',\n",
" 'stacked': 1,\n",
" 'annoline1': 'St. Albans',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.75867603727717,\n",
" 40.69444538522359,\n",
" -73.75867603727717,\n",
" 40.69444538522359]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.167',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.77258787620906, 40.67521139591733]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Rochdale',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Rochdale',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.77258787620906,\n",
" 40.67521139591733,\n",
" -73.77258787620906,\n",
" 40.67521139591733]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.168',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.76042092682287, 40.666230490368584]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Springfield Gardens',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Springfield',\n",
" 'annoline2': 'Gardens',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.76042092682287,\n",
" 40.666230490368584,\n",
" -73.76042092682287,\n",
" 40.666230490368584]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.169',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.73526873708026, 40.692774639160845]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Cambria Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Cambria',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.73526873708026,\n",
" 40.692774639160845,\n",
" -73.73526873708026,\n",
" 40.692774639160845]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.170',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.73526079428278, 40.659816433428084]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Rosedale',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Rosedale',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.73526079428278,\n",
" 40.659816433428084,\n",
" -73.73526079428278,\n",
" 40.659816433428084]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.171',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.75497968043872, 40.603134432500894]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Far Rockaway',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Far Rockaway',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.75497968043872,\n",
" 40.603134432500894,\n",
" -73.75497968043872,\n",
" 40.603134432500894]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.172',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8200548911032, 40.60302658351238]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Broad Channel',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Broad',\n",
" 'annoline2': 'Channel',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.8200548911032,\n",
" 40.60302658351238,\n",
" -73.8200548911032,\n",
" 40.60302658351238]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.173',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.92551196994168, 40.55740128845452]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Breezy Point',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Breezy',\n",
" 'annoline2': 'Point',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.92551196994168,\n",
" 40.55740128845452,\n",
" -73.92551196994168,\n",
" 40.55740128845452]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.174',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90228960391673, 40.775923015642896]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Steinway',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Steinway',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.90228960391673,\n",
" 40.775923015642896,\n",
" -73.90228960391673,\n",
" 40.775923015642896]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.175',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.80436451720988, 40.79278140360048]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Beechhurst',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Beechhurst',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.80436451720988,\n",
" 40.79278140360048,\n",
" -73.80436451720988,\n",
" 40.79278140360048]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.176',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.7768022262158, 40.782842806245554]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bay Terrace',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Bay',\n",
" 'annoline2': 'Terrace',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.7768022262158,\n",
" 40.782842806245554,\n",
" -73.7768022262158,\n",
" 40.782842806245554]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.177',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.77613282391705, 40.595641807368494]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Edgemere',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Edgemere',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.77613282391705,\n",
" 40.595641807368494,\n",
" -73.77613282391705,\n",
" 40.595641807368494]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.178',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.79199233136943, 40.58914394372971]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Arverne',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Arverne',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.79199233136943,\n",
" 40.58914394372971,\n",
" -73.79199233136943,\n",
" 40.58914394372971]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.179',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.82236121088751, 40.582801696845586]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Rockaway Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Rockaway',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.82236121088751,\n",
" 40.582801696845586,\n",
" -73.82236121088751,\n",
" 40.582801696845586]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.180',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85754672410827, 40.572036730217015]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Neponsit',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Neponsit',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.85754672410827,\n",
" 40.572036730217015,\n",
" -73.85754672410827,\n",
" 40.572036730217015]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.181',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.81276269135866, 40.764126122614066]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Murray Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Murray',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.81276269135866,\n",
" 40.764126122614066,\n",
" -73.81276269135866,\n",
" 40.764126122614066]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.182',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.70884705889246, 40.741378421945434]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Floral Park',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Floral Park',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.70884705889246,\n",
" 40.741378421945434,\n",
" -73.70884705889246,\n",
" 40.741378421945434]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.183',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.76714166714729, 40.7209572076444]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Holliswood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Holliswood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.76714166714729,\n",
" 40.7209572076444,\n",
" -73.76714166714729,\n",
" 40.7209572076444]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.184',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.7872269693666, 40.71680483014613]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Jamaica Estates',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Jamaica',\n",
" 'annoline2': 'Estates',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.7872269693666,\n",
" 40.71680483014613,\n",
" -73.7872269693666,\n",
" 40.71680483014613]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.185',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.82580915110559, 40.7445723092867]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Queensboro Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Queensboro',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.82580915110559,\n",
" 40.7445723092867,\n",
" -73.82580915110559,\n",
" 40.7445723092867]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.186',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.79760300912672, 40.723824901829204]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Hillcrest',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Hillcrest',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.79760300912672,\n",
" 40.723824901829204,\n",
" -73.79760300912672,\n",
" 40.723824901829204]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.187',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93157506072878, 40.761704526054146]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Ravenswood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Ravenswood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.93157506072878,\n",
" 40.761704526054146,\n",
" -73.93157506072878,\n",
" 40.761704526054146]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.188',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84963782402441, 40.66391841925139]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Lindenwood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Lindenwood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.84963782402441,\n",
" 40.66391841925139,\n",
" -73.84963782402441,\n",
" 40.66391841925139]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.189',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.74025607989822, 40.66788389660247]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Laurelton',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Laurelton',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.74025607989822,\n",
" 40.66788389660247,\n",
" -73.74025607989822,\n",
" 40.66788389660247]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.190',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8625247141374, 40.736074570830795]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Lefrak City',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Lefrak',\n",
" 'annoline2': 'City',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.8625247141374,\n",
" 40.736074570830795,\n",
" -73.8625247141374,\n",
" 40.736074570830795]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.191',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8540175039252, 40.57615556543109]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Belle Harbor',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Belle Harbor',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.8540175039252,\n",
" 40.57615556543109,\n",
" -73.8540175039252,\n",
" 40.57615556543109]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.192',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84153370226186, 40.58034295646131]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Rockaway Park',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Rockaway Park',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.84153370226186,\n",
" 40.58034295646131,\n",
" -73.84153370226186,\n",
" 40.58034295646131]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.193',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.79664750844047, 40.59771061565768]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Somerville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Somerville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.79664750844047,\n",
" 40.59771061565768,\n",
" -73.79664750844047,\n",
" 40.59771061565768]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.194',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.75175310731153, 40.66000322733613]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Brookville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Brookville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.75175310731153,\n",
" 40.66000322733613,\n",
" -73.75175310731153,\n",
" 40.66000322733613]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.195',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.73889198912481, 40.73301404027834]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bellaire',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bellaire',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.73889198912481,\n",
" 40.73301404027834,\n",
" -73.73889198912481,\n",
" 40.73301404027834]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.196',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85751790676447, 40.7540709990489]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'North Corona',\n",
" 'stacked': 2,\n",
" 'annoline1': 'North',\n",
" 'annoline2': 'Corona',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.85751790676447,\n",
" 40.7540709990489,\n",
" -73.85751790676447,\n",
" 40.7540709990489]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.197',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8410221123401, 40.7146110815117]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Forest Hills Gardens',\n",
" 'stacked': 3,\n",
" 'annoline1': 'Forest',\n",
" 'annoline2': 'Hills',\n",
" 'annoline3': 'Gardens',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.8410221123401,\n",
" 40.7146110815117,\n",
" -73.8410221123401,\n",
" 40.7146110815117]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.198',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.07935312512797, 40.6449815710044]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'St. George',\n",
" 'stacked': 2,\n",
" 'annoline1': 'St.',\n",
" 'annoline2': 'George',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.07935312512797,\n",
" 40.6449815710044,\n",
" -74.07935312512797,\n",
" 40.6449815710044]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.199',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.08701650516625, 40.64061455913511]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'New Brighton',\n",
" 'stacked': 2,\n",
" 'annoline1': 'New',\n",
" 'annoline2': 'Brighton',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.08701650516625,\n",
" 40.64061455913511,\n",
" -74.08701650516625,\n",
" 40.64061455913511]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.200',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.07790192660066, 40.62692762538176]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Stapleton',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Stapleton',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.07790192660066,\n",
" 40.62692762538176,\n",
" -74.07790192660066,\n",
" 40.62692762538176]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.201',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.06980526716141, 40.61530494652761]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Rosebank',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Rosebank',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.06980526716141,\n",
" 40.61530494652761,\n",
" -74.06980526716141,\n",
" 40.61530494652761]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.202',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.1071817826561, 40.63187892654607]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'West Brighton',\n",
" 'stacked': 2,\n",
" 'annoline1': 'West',\n",
" 'annoline2': 'Brighton',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.1071817826561,\n",
" 40.63187892654607,\n",
" -74.1071817826561,\n",
" 40.63187892654607]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.203',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.08724819983729, 40.624184791313006]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Grymes Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Grymes',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.08724819983729,\n",
" 40.624184791313006,\n",
" -74.08724819983729,\n",
" 40.624184791313006]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.204',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.1113288180088, 40.59706851814673]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Todt Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Todt',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.1113288180088,\n",
" 40.59706851814673,\n",
" -74.1113288180088,\n",
" 40.59706851814673]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.205',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.0795529253982, 40.58024741350956]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'South Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'South',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.0795529253982,\n",
" 40.58024741350956,\n",
" -74.0795529253982,\n",
" 40.58024741350956]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.206',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.12943426797008, 40.63366930554365]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Port Richmond',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Port',\n",
" 'annoline2': 'Richmond',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.12943426797008,\n",
" 40.63366930554365,\n",
" -74.12943426797008,\n",
" 40.63366930554365]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.207',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.15008537046981, 40.632546390481124]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': \"Mariner's Harbor\",\n",
" 'stacked': 2,\n",
" 'annoline1': \"Mariner's\",\n",
" 'annoline2': 'Harbor',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.15008537046981,\n",
" 40.632546390481124,\n",
" -74.15008537046981,\n",
" 40.632546390481124]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.208',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.17464532993542, 40.63968297845542]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Port Ivory',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Port',\n",
" 'annoline2': 'Ivory',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.17464532993542,\n",
" 40.63968297845542,\n",
" -74.17464532993542,\n",
" 40.63968297845542]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.209',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.11918058534842, 40.61333593766742]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Castleton Corners',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Castleton',\n",
" 'annoline2': 'Corners',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.11918058534842,\n",
" 40.61333593766742,\n",
" -74.11918058534842,\n",
" 40.61333593766742]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.210',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.16496031329827, 40.594252379161695]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'New Springville',\n",
" 'stacked': 2,\n",
" 'annoline1': 'New',\n",
" 'annoline2': 'Springville',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.16496031329827,\n",
" 40.594252379161695,\n",
" -74.16496031329827,\n",
" 40.594252379161695]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.211',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.19073717538116, 40.58631375103281]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Travis',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Travis',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.19073717538116,\n",
" 40.58631375103281,\n",
" -74.19073717538116,\n",
" 40.58631375103281]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.212',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.1164794360638, 40.57257231820632]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'New Dorp',\n",
" 'stacked': 2,\n",
" 'annoline1': 'New',\n",
" 'annoline2': 'Dorp',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.1164794360638,\n",
" 40.57257231820632,\n",
" -74.1164794360638,\n",
" 40.57257231820632]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.213',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.12156593771896, 40.5584622432888]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Oakwood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Oakwood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.12156593771896,\n",
" 40.5584622432888,\n",
" -74.12156593771896,\n",
" 40.5584622432888]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.214',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.14932381490992, 40.549480228713605]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Great Kills',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Great',\n",
" 'annoline2': 'Kills',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.14932381490992,\n",
" 40.549480228713605,\n",
" -74.14932381490992,\n",
" 40.549480228713605]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.215',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.1643308041936, 40.542230747450745]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Eltingville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Eltingville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.1643308041936,\n",
" 40.542230747450745,\n",
" -74.1643308041936,\n",
" 40.542230747450745]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.216',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.17854866165878, 40.53811417474507]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Annadale',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Annadale',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.17854866165878,\n",
" 40.53811417474507,\n",
" -74.17854866165878,\n",
" 40.53811417474507]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.217',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.20524582480326, 40.541967622888755]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Woodrow',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Woodrow',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.20524582480326,\n",
" 40.541967622888755,\n",
" -74.20524582480326,\n",
" 40.541967622888755]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.218',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.24656934235283, 40.50533376115642]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Tottenville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Tottenville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.24656934235283,\n",
" 40.50533376115642,\n",
" -74.24656934235283,\n",
" 40.50533376115642]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.219',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.08055351790115, 40.637316067110326]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Tompkinsville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Tompkinsville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.08055351790115,\n",
" 40.637316067110326,\n",
" -74.08055351790115,\n",
" 40.637316067110326]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.220',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.09629029235458, 40.61919310792676]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Silver Lake',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Silver',\n",
" 'annoline2': 'Lake',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.09629029235458,\n",
" 40.61919310792676,\n",
" -74.09629029235458,\n",
" 40.61919310792676]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.221',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.0971255217853, 40.61276015756489]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Sunnyside',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Sunnyside',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.0971255217853,\n",
" 40.61276015756489,\n",
" -74.0971255217853,\n",
" 40.61276015756489]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.222',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96101312466779, 40.643675183340974]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Ditmas Park',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Ditmas',\n",
" 'annoline2': 'Park',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.96101312466779,\n",
" 40.643675183340974,\n",
" -73.96101312466779,\n",
" 40.643675183340974]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.223',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93718680559314, 40.66094656188111]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Wingate',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Wingate',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.93718680559314,\n",
" 40.66094656188111,\n",
" -73.93718680559314,\n",
" 40.66094656188111]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.224',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.92688212616955, 40.655572313280764]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Rugby',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Rugby',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.92688212616955,\n",
" 40.655572313280764,\n",
" -73.92688212616955,\n",
" 40.655572313280764]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.225',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.08015734936296, 40.60919044434558]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Park Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Park',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.08015734936296,\n",
" 40.60919044434558,\n",
" -74.08015734936296,\n",
" 40.60919044434558]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.226',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.13304143951704, 40.62109047275409]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Westerleigh',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Westerleigh',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.13304143951704,\n",
" 40.62109047275409,\n",
" -74.13304143951704,\n",
" 40.62109047275409]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.227',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.15315246387762, 40.620171512231884]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Graniteville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Graniteville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.15315246387762,\n",
" 40.620171512231884,\n",
" -74.15315246387762,\n",
" 40.620171512231884]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.228',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.16510420241124, 40.63532509911492]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Arlington',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Arlington',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.16510420241124,\n",
" 40.63532509911492,\n",
" -74.16510420241124,\n",
" 40.63532509911492]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.229',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.06712363225574, 40.596312571276734]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Arrochar',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Arrochar',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.06712363225574,\n",
" 40.596312571276734,\n",
" -74.06712363225574,\n",
" 40.596312571276734]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.230',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.0766743627905, 40.59826835959991]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Grasmere',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Grasmere',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.0766743627905,\n",
" 40.59826835959991,\n",
" -74.0766743627905,\n",
" 40.59826835959991]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.231',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.08751118005578, 40.59632891379513]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Old Town',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Old',\n",
" 'annoline2': 'Town',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.08751118005578,\n",
" 40.59632891379513,\n",
" -74.08751118005578,\n",
" 40.59632891379513]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.232',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.09639905312521, 40.588672948199275]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Dongan Hills',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Dongan',\n",
" 'annoline2': 'Hills',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.09639905312521,\n",
" 40.588672948199275,\n",
" -74.09639905312521,\n",
" 40.588672948199275]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.233',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.09348266303591, 40.57352690574283]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Midland Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Midland',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.09348266303591,\n",
" 40.57352690574283,\n",
" -74.09348266303591,\n",
" 40.57352690574283]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.234',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.10585598545434, 40.57621558711788]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Grant City',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Grant',\n",
" 'annoline2': 'City',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.10585598545434,\n",
" 40.57621558711788,\n",
" -74.10585598545434,\n",
" 40.57621558711788]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.235',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.10432707469124, 40.56425549307335]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'New Dorp Beach',\n",
" 'stacked': 3,\n",
" 'annoline1': 'New',\n",
" 'annoline2': 'Dorp',\n",
" 'annoline3': 'Beach',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.10432707469124,\n",
" 40.56425549307335,\n",
" -74.10432707469124,\n",
" 40.56425549307335]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.236',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.13916622175768, 40.55398800858462]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bay Terrace',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Bay',\n",
" 'annoline2': 'Terrace',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.13916622175768,\n",
" 40.55398800858462,\n",
" -74.13916622175768,\n",
" 40.55398800858462]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.237',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.19174105747814, 40.531911920489605]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Huguenot',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Huguenot',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.19174105747814,\n",
" 40.531911920489605,\n",
" -74.19174105747814,\n",
" 40.531911920489605]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.238',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.21983106616777, 40.524699376118136]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Pleasant Plains',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Pleasant',\n",
" 'annoline2': 'Plains',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.21983106616777,\n",
" 40.524699376118136,\n",
" -74.21983106616777,\n",
" 40.524699376118136]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.239',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.22950350260027, 40.50608165346305]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Butler Manor',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Butler',\n",
" 'annoline2': 'Manor',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.22950350260027,\n",
" 40.50608165346305,\n",
" -74.22950350260027,\n",
" 40.50608165346305]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.240',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.23215775896526, 40.53053148283314]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Charleston',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Charleston',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.23215775896526,\n",
" 40.53053148283314,\n",
" -74.23215775896526,\n",
" 40.53053148283314]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.241',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.21572851113952, 40.54940400650072]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Rossville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Rossville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.21572851113952,\n",
" 40.54940400650072,\n",
" -74.21572851113952,\n",
" 40.54940400650072]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.242',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.18588674583893, 40.54928582278321]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Arden Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Arden',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.18588674583893,\n",
" 40.54928582278321,\n",
" -74.18588674583893,\n",
" 40.54928582278321]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.243',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.17079414786092, 40.555295236173194]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Greenridge',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Greenridge',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.17079414786092,\n",
" 40.555295236173194,\n",
" -74.17079414786092,\n",
" 40.555295236173194]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.244',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.15902208156601, 40.58913894875281]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Heartland Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Heartland',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.15902208156601,\n",
" 40.58913894875281,\n",
" -74.15902208156601,\n",
" 40.58913894875281]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.245',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.1895604551969, 40.59472602746295]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Chelsea',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Chelsea',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.1895604551969,\n",
" 40.59472602746295,\n",
" -74.1895604551969,\n",
" 40.59472602746295]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.246',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.18725638381567, 40.60577868452358]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bloomfield',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bloomfield',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.18725638381567,\n",
" 40.60577868452358,\n",
" -74.18725638381567,\n",
" 40.60577868452358]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.247',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.15940948657122, 40.6095918004203]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bulls Head',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Bulls',\n",
" 'annoline2': 'Head',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.15940948657122,\n",
" 40.6095918004203,\n",
" -74.15940948657122,\n",
" 40.6095918004203]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.248',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95325646837112, 40.7826825671257]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Carnegie Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Carnegie',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.95325646837112,\n",
" 40.7826825671257,\n",
" -73.95325646837112,\n",
" 40.7826825671257]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.249',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98843368023597, 40.72325901885768]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Noho',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Noho',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.98843368023597,\n",
" 40.72325901885768,\n",
" -73.98843368023597,\n",
" 40.72325901885768]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.250',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.00541529873355, 40.71522892046282]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Civic Center',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Civic',\n",
" 'annoline2': 'Center',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-74.00541529873355,\n",
" 40.71522892046282,\n",
" -74.00541529873355,\n",
" 40.71522892046282]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.251',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98871313285247, 40.7485096643122]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Midtown South',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Midtown',\n",
" 'annoline2': 'South',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.98871313285247,\n",
" 40.7485096643122,\n",
" -73.98871313285247,\n",
" 40.7485096643122]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.252',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.1340572986257, 40.56960594275505]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Richmond Town',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Richmond',\n",
" 'annoline2': 'Town',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.1340572986257,\n",
" 40.56960594275505,\n",
" -74.1340572986257,\n",
" 40.56960594275505]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.253',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.06667766061771, 40.60971934079284]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Shore Acres',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Shore',\n",
" 'annoline2': 'Acres',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.06667766061771,\n",
" 40.60971934079284,\n",
" -74.06667766061771,\n",
" 40.60971934079284]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.254',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.072642445484, 40.61917845202843]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Clifton',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Clifton',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.072642445484,\n",
" 40.61917845202843,\n",
" -74.072642445484,\n",
" 40.61917845202843]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.255',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.08402364740358, 40.6044731896879]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Concord',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Concord',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.08402364740358,\n",
" 40.6044731896879,\n",
" -74.08402364740358,\n",
" 40.6044731896879]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.256',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.09776206972522, 40.606794394801]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Emerson Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Emerson',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.09776206972522,\n",
" 40.606794394801,\n",
" -74.09776206972522,\n",
" 40.606794394801]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.257',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.09805062373887, 40.63563000681151]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Randall Manor',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Randall',\n",
" 'annoline2': 'Manor',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.09805062373887,\n",
" 40.63563000681151,\n",
" -74.09805062373887,\n",
" 40.63563000681151]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.258',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.18622331749823, 40.63843283794795]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Howland Hook',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Howland',\n",
" 'annoline2': 'Hook',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.18622331749823,\n",
" 40.63843283794795,\n",
" -74.18622331749823,\n",
" 40.63843283794795]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.259',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.1418167896889, 40.630146741193826]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Elm Park',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Elm',\n",
" 'annoline2': 'Park',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.1418167896889,\n",
" 40.630146741193826,\n",
" -74.1418167896889,\n",
" 40.630146741193826]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.260',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91665331978048, 40.652117451793494]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Remsen Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Remsen',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.91665331978048,\n",
" 40.652117451793494,\n",
" -73.91665331978048,\n",
" 40.652117451793494]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.261',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.88511776379292, 40.6627442796966]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'New Lots',\n",
" 'stacked': 2,\n",
" 'annoline1': 'New',\n",
" 'annoline2': 'Lots',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.88511776379292,\n",
" 40.6627442796966,\n",
" -73.88511776379292,\n",
" 40.6627442796966]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.262',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90233474295836, 40.63131755039667]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Paerdegat Basin',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Paerdegat',\n",
" 'annoline2': 'Basin',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.90233474295836,\n",
" 40.63131755039667,\n",
" -73.90233474295836,\n",
" 40.63131755039667]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.263',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91515391550404, 40.61597423962336]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Mill Basin',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Mill',\n",
" 'annoline2': 'Basin',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.91515391550404,\n",
" 40.61597423962336,\n",
" -73.91515391550404,\n",
" 40.61597423962336]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.264',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.79646462081593, 40.71145964370482]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Jamaica Hills',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Jamaica',\n",
" 'annoline2': 'Hills',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.79646462081593,\n",
" 40.71145964370482,\n",
" -73.79646462081593,\n",
" 40.71145964370482]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.265',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.79671678028349, 40.73350025429757]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Utopia',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Utopia',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.79671678028349,\n",
" 40.73350025429757,\n",
" -73.79671678028349,\n",
" 40.73350025429757]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.266',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.80486120040537, 40.73493618075478]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Pomonok',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Pomonok',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.80486120040537,\n",
" 40.73493618075478,\n",
" -73.80486120040537,\n",
" 40.73493618075478]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.267',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.89467996270574, 40.7703173929982]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Astoria Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Astoria',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.89467996270574,\n",
" 40.7703173929982,\n",
" -73.89467996270574,\n",
" 40.7703173929982]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.268',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90119903387667, 40.83142834161548]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Claremont Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Claremont',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.90119903387667,\n",
" 40.83142834161548,\n",
" -73.90119903387667,\n",
" 40.83142834161548]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.269',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91584652759009, 40.824780490842905]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Concourse Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Concourse',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.91584652759009,\n",
" 40.824780490842905,\n",
" -73.91584652759009,\n",
" 40.824780490842905]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.270',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91655551964419, 40.84382617671654]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Mount Eden',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Mount',\n",
" 'annoline2': 'Eden',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.91655551964419,\n",
" 40.84382617671654,\n",
" -73.91655551964419,\n",
" 40.84382617671654]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.271',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90829930881988, 40.84884160724665]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Mount Hope',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Mount',\n",
" 'annoline2': 'Hope',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.90829930881988,\n",
" 40.84884160724665,\n",
" -73.90829930881988,\n",
" 40.84884160724665]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.272',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96355614094303, 40.76028033131374]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Sutton Place',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Sutton',\n",
" 'annoline2': 'Place',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.96355614094303,\n",
" 40.76028033131374,\n",
" -73.96355614094303,\n",
" 40.76028033131374]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.273',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95386782130745, 40.743414090073536]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Hunters Point',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Hunters',\n",
" 'annoline2': 'Point',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.95386782130745,\n",
" 40.743414090073536,\n",
" -73.95386782130745,\n",
" 40.743414090073536]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.274',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96770824581834, 40.75204236950722]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Turtle Bay',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Turtle',\n",
" 'annoline2': 'Bay',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.96770824581834,\n",
" 40.75204236950722,\n",
" -73.96770824581834,\n",
" 40.75204236950722]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.275',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.97121928722265, 40.746917410740195]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Tudor City',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Tudor',\n",
" 'annoline2': 'City',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.97121928722265,\n",
" 40.746917410740195,\n",
" -73.97121928722265,\n",
" 40.746917410740195]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.276',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.97405170469203, 40.73099955477061]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Stuyvesant Town',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Stuyvesant',\n",
" 'annoline2': 'Town',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.97405170469203,\n",
" 40.73099955477061,\n",
" -73.97405170469203,\n",
" 40.73099955477061]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.277',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.9909471052826, 40.739673047638426]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Flatiron',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Flatiron',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.9909471052826,\n",
" 40.739673047638426,\n",
" -73.9909471052826,\n",
" 40.739673047638426]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.278',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91819286431682, 40.74565180608076]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Sunnyside Gardens',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Sunnyside',\n",
" 'annoline2': 'Gardens',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.91819286431682,\n",
" 40.74565180608076,\n",
" -73.91819286431682,\n",
" 40.74565180608076]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.279',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93244235260178, 40.73725071694497]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Blissville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Blissville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.93244235260178,\n",
" 40.73725071694497,\n",
" -73.93244235260178,\n",
" 40.73725071694497]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.280',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99550751888415, 40.70328109093014]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Fulton Ferry',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Fulton',\n",
" 'annoline2': 'Ferry',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.99550751888415,\n",
" 40.70328109093014,\n",
" -73.99550751888415,\n",
" 40.70328109093014]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.281',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98111603592393, 40.70332149882874]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Vinegar Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Vinegar',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.98111603592393,\n",
" 40.70332149882874,\n",
" -73.98111603592393,\n",
" 40.70332149882874]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.282',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93053108817338, 40.67503986503237]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Weeksville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Weeksville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.93053108817338,\n",
" 40.67503986503237,\n",
" -73.93053108817338,\n",
" 40.67503986503237]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.283',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90331684852599, 40.67786104769531]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Broadway Junction',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Broadway',\n",
" 'annoline2': 'Junction',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.90331684852599,\n",
" 40.67786104769531,\n",
" -73.90331684852599,\n",
" 40.67786104769531]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.284',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.9887528074504, 40.70317632822692]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Dumbo',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Dumbo',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.9887528074504,\n",
" 40.70317632822692,\n",
" -73.9887528074504,\n",
" 40.70317632822692]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.285',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.12059399718001, 40.60180957631444]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Manor Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Manor',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.12059399718001,\n",
" 40.60180957631444,\n",
" -74.12059399718001,\n",
" 40.60180957631444]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.286',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.13208447484298, 40.60370692627371]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Willowbrook',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Willowbrook',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.13208447484298,\n",
" 40.60370692627371,\n",
" -74.13208447484298,\n",
" 40.60370692627371]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.287',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.21776636068567, 40.541139922091766]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Sandy Ground',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Sandy',\n",
" 'annoline2': 'Ground',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.21776636068567,\n",
" 40.541139922091766,\n",
" -74.21776636068567,\n",
" 40.541139922091766]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.288',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.12727240604946, 40.579118742961214]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Egbertville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Egbertville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.12727240604946,\n",
" 40.579118742961214,\n",
" -74.12727240604946,\n",
" 40.579118742961214]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.289',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.89213760232822, 40.56737588957032]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Roxbury',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Roxbury',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.89213760232822,\n",
" 40.56737588957032,\n",
" -73.89213760232822,\n",
" 40.56737588957032]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.290',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95918459428702, 40.598525095137255]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Homecrest',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Homecrest',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95918459428702,\n",
" 40.598525095137255,\n",
" -73.95918459428702,\n",
" 40.598525095137255]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.291',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.88114319200604, 40.716414511158185]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Middle Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Middle',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.88114319200604,\n",
" 40.716414511158185,\n",
" -73.88114319200604,\n",
" 40.716414511158185]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.292',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.20152556457658, 40.52626406734812]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': \"Prince's Bay\",\n",
" 'stacked': 2,\n",
" 'annoline1': \"Prince's\",\n",
" 'annoline2': 'Bay',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.20152556457658,\n",
" 40.52626406734812,\n",
" -74.20152556457658,\n",
" 40.52626406734812]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.293',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.13792663771568, 40.57650629379489]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Lighthouse Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Lighthouse',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.13792663771568,\n",
" 40.57650629379489,\n",
" -74.13792663771568,\n",
" 40.57650629379489]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.294',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.22957080626941, 40.51954145748909]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Richmond Valley',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Richmond',\n",
" 'annoline2': 'Valley',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.22957080626941,\n",
" 40.51954145748909,\n",
" -74.22957080626941,\n",
" 40.51954145748909]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.295',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.82667757138641, 40.79060155670148]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Malba',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Malba',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.82667757138641,\n",
" 40.79060155670148,\n",
" -73.82667757138641,\n",
" 40.79060155670148]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.296',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.890345709872, 40.6819989345173]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Highland Park',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Highland',\n",
" 'annoline2': 'Park',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.890345709872,\n",
" 40.6819989345173,\n",
" -73.890345709872,\n",
" 40.6819989345173]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.297',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94841515328893, 40.60937770113766]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Madison',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Madison',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.94841515328893,\n",
" 40.60937770113766,\n",
" -73.94841515328893,\n",
" 40.60937770113766]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.298',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.86172577555115, 40.85272297633017]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bronxdale',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bronxdale',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.86172577555115,\n",
" 40.85272297633017,\n",
" -73.86172577555115,\n",
" 40.85272297633017]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.299',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85931863221647, 40.86578787802982]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Allerton',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Allerton',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.85931863221647,\n",
" 40.86578787802982,\n",
" -73.85931863221647,\n",
" 40.86578787802982]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.300',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90152264513144, 40.8703923914147]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Kingsbridge Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Kingsbridge',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.90152264513144,\n",
" 40.8703923914147,\n",
" -73.90152264513144,\n",
" 40.8703923914147]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.301',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94817709920184, 40.64692606658579]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Erasmus',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Erasmus',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.94817709920184,\n",
" 40.64692606658579,\n",
" -73.94817709920184,\n",
" 40.64692606658579]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.302',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.00011136202637, 40.75665808227519]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Hudson Yards',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Hudson',\n",
" 'annoline2': 'Yards',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-74.00011136202637,\n",
" 40.75665808227519,\n",
" -74.00011136202637,\n",
" 40.75665808227519]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.303',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.80553002968718, 40.58733774018741]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Hammels',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Hammels',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.80553002968718,\n",
" 40.58733774018741,\n",
" -73.80553002968718,\n",
" 40.58733774018741]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.304',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.76596781445627, 40.611321691283834]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bayswater',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bayswater',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.76596781445627,\n",
" 40.611321691283834,\n",
" -73.76596781445627,\n",
" 40.611321691283834]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.305',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94563070334091, 40.756091297094706]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Queensbridge',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Queensbridge',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.94563070334091,\n",
" 40.756091297094706,\n",
" -73.94563070334091,\n",
" 40.756091297094706]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.306',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.08173992211962, 40.61731079252983]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Fox Hills',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Fox',\n",
" 'annoline2': 'Hills',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.08173992211962,\n",
" 40.61731079252983,\n",
" -74.08173992211962,\n",
" 40.61731079252983]}}],\n",
" 'crs': {'type': 'name', 'properties': {'name': 'urn:ogc:def:crs:EPSG::4326'}},\n",
" 'bbox': [-74.2492599487305,\n",
" 40.5033187866211,\n",
" -73.7061614990234,\n",
" 40.9105606079102]}"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"newyork_data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Notice how all the relevant data is in the *features* key, which is basically a list of the neighborhoods. So, let's define a new variable that includes this data."
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [],
"source": [
"neighborhoods_data = newyork_data['features']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's take a look at the first item in this list."
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"{'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.1',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84720052054902, 40.89470517661]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Wakefield',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Wakefield',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.84720052054902,\n",
" 40.89470517661,\n",
" -73.84720052054902,\n",
" 40.89470517661]}}"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"neighborhoods_data[0]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Tranform the data into a *pandas* dataframe"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The next task is essentially transforming this data of nested Python dictionaries into a *pandas* dataframe. So let's start by creating an empty dataframe."
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [],
"source": [
"# define the dataframe columns\n",
"column_names = ['Borough', 'Neighborhood', 'Latitude', 'Longitude'] \n",
"\n",
"# instantiate the dataframe\n",
"neighborhoods = pd.DataFrame(columns=column_names)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Take a look at the empty dataframe to confirm that the columns are as intended."
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"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>Borough</th>\n",
" <th>Neighborhood</th>\n",
" <th>Latitude</th>\n",
" <th>Longitude</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
"Empty DataFrame\n",
"Columns: [Borough, Neighborhood, Latitude, Longitude]\n",
"Index: []"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"neighborhoods"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Then let's loop through the data and fill the dataframe one row at a time."
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [],
"source": [
"for data in neighborhoods_data:\n",
" borough = neighborhood_name = data['properties']['borough'] \n",
" neighborhood_name = data['properties']['name']\n",
" \n",
" neighborhood_latlon = data['geometry']['coordinates']\n",
" neighborhood_lat = neighborhood_latlon[1]\n",
" neighborhood_lon = neighborhood_latlon[0]\n",
" \n",
" neighborhoods = neighborhoods.append({'Borough': borough,\n",
" 'Neighborhood': neighborhood_name,\n",
" 'Latitude': neighborhood_lat,\n",
" 'Longitude': neighborhood_lon}, ignore_index=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Quickly examine the resulting dataframe."
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
},
"scrolled": true
},
"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>Borough</th>\n",
" <th>Neighborhood</th>\n",
" <th>Latitude</th>\n",
" <th>Longitude</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Bronx</td>\n",
" <td>Wakefield</td>\n",
" <td>40.894705</td>\n",
" <td>-73.847201</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Bronx</td>\n",
" <td>Co-op City</td>\n",
" <td>40.874294</td>\n",
" <td>-73.829939</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Bronx</td>\n",
" <td>Eastchester</td>\n",
" <td>40.887556</td>\n",
" <td>-73.827806</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Bronx</td>\n",
" <td>Fieldston</td>\n",
" <td>40.895437</td>\n",
" <td>-73.905643</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Bronx</td>\n",
" <td>Riverdale</td>\n",
" <td>40.890834</td>\n",
" <td>-73.912585</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Borough Neighborhood Latitude Longitude\n",
"0 Bronx Wakefield 40.894705 -73.847201\n",
"1 Bronx Co-op City 40.874294 -73.829939\n",
"2 Bronx Eastchester 40.887556 -73.827806\n",
"3 Bronx Fieldston 40.895437 -73.905643\n",
"4 Bronx Riverdale 40.890834 -73.912585"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"neighborhoods.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And make sure that the dataset has all 5 boroughs and 306 neighborhoods."
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The dataframe has 5 boroughs and 306 neighborhoods.\n"
]
}
],
"source": [
"print('The dataframe has {} boroughs and {} neighborhoods.'.format(\n",
" len(neighborhoods['Borough'].unique()),\n",
" neighborhoods.shape[0]\n",
" )\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Use geopy library to get the latitude and longitude values of New York City."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In order to define an instance of the geocoder, we need to define a user_agent. We will name our agent <em>ny_explorer</em>, as shown below."
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
},
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The geograpical coordinate of New York City are 40.7127281, -74.0060152.\n"
]
}
],
"source": [
"address = 'New York City, NY'\n",
"\n",
"geolocator = Nominatim(user_agent=\"ny_explorer\")\n",
"location = geolocator.geocode(address)\n",
"latitude = location.latitude\n",
"longitude = location.longitude\n",
"print('The geograpical coordinate of New York City are {}, {}.'.format(latitude, longitude))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Create a map of New York with neighborhoods superimposed on top."
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><span style=\"color:#565656\">Make this Notebook Trusted to load map: File -> Trust Notebook</span><iframe src=\"about:blank\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" data-html=PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNDAuNzEyNzI4MSwtNzQuMDA2MDE1Ml0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfYjZiMTRjZTRjMDM0NGExMTk2YzQ3MzMyMmQ2NWNkZDQgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIxNjMxOTAyMzhhNzRhNGNiOTg4ZjZjYjhmMGUxMTA5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODk0NzA1MTc2NjEsLTczLjg0NzIwMDUyMDU0OTAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgzODA3MWVhMzljMDRiZGViMDhlMmY4YjQzYjQ3YzZiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVhZTU4NWYxMjA2YzRmYTY5MzU2MjVlOWYxMWI1NDkzID0gJCgnPGRpdiBpZD0iaHRtbF81YWU1ODVmMTIwNmM0ZmE2OTM1NjI1ZTlmMTFiNTQ5MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2FrZWZpZWxkLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODM4MDcxZWEzOWMwNGJkZWIwOGUyZjhiNDNiNDdjNmIuc2V0Q29udGVudChodG1sXzVhZTU4NWYxMjA2YzRmYTY5MzU2MjVlOWYxMWI1NDkzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzIxNjMxOTAyMzhhNzRhNGNiOTg4ZjZjYjhmMGUxMTA5LmJpbmRQb3B1cChwb3B1cF84MzgwNzFlYTM5YzA0YmRlYjA4ZTJmOGI0M2I0N2M2Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMTc1YWIzM2QzMzk0OGRjYWY5MmM3Njc4ZGQyZDhjNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg3NDI5NDE5MzAzMDEyLC03My44Mjk5MzkxMDgxMjM5OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xODhmZTMyYjdlNjc0MTgzYThhNDhiNGQwZDA2YmJlZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kOGMwNTIxM2E3MTM0NjljYTI5MmI0YzdlMzY5ZTVmNiA9ICQoJzxkaXYgaWQ9Imh0bWxfZDhjMDUyMTNhNzEzNDY5Y2EyOTJiNGM3ZTM2OWU1ZjYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNvLW9wIENpdHksIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xODhmZTMyYjdlNjc0MTgzYThhNDhiNGQwZDA2YmJlZi5zZXRDb250ZW50KGh0bWxfZDhjMDUyMTNhNzEzNDY5Y2EyOTJiNGM3ZTM2OWU1ZjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjE3NWFiMzNkMzM5NDhkY2FmOTJjNzY3OGRkMmQ4YzYuYmluZFBvcHVwKHBvcHVwXzE4OGZlMzJiN2U2NzQxODNhOGE0OGI0ZDBkMDZiYmVmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE1NzhhNjUxMmQyYjQ2ZTFhZGFlZmMxYjg1OTU1MzZlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODg3NTU1Njc3MzUwNzc1LC03My44Mjc4MDY0NDcxNjQxMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82ODQ0NzVjYjAyNzM0ZmEzOWNmNjYyNzhiNTZlNzNlYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMjk3MTk3ODAwMzA0M2U3YTBmZmM3N2M3NjBmNWI0NSA9ICQoJzxkaXYgaWQ9Imh0bWxfZDI5NzE5NzgwMDMwNDNlN2EwZmZjNzdjNzYwZjViNDUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVhc3RjaGVzdGVyLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjg0NDc1Y2IwMjczNGZhMzljZjY2Mjc4YjU2ZTczZWEuc2V0Q29udGVudChodG1sX2QyOTcxOTc4MDAzMDQzZTdhMGZmYzc3Yzc2MGY1YjQ1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE1NzhhNjUxMmQyYjQ2ZTFhZGFlZmMxYjg1OTU1MzZlLmJpbmRQb3B1cChwb3B1cF82ODQ0NzVjYjAyNzM0ZmEzOWNmNjYyNzhiNTZlNzNlYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yM2M0ZTZmMmM1YWM0ZWRkYjFjNGQzNWJhNzA5NDBiZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg5NTQzNzQyNjkwMzgzLC03My45MDU2NDI1OTU5MTY4Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jODFlYzEzNDZiMWI0YTM3YmQ2NjRhOGFiNDU1YWJiZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMjQ2ZWNlZDYwYmE0Y2ZlYWZiY2FkNWZkMTFlN2U3NiA9ICQoJzxkaXYgaWQ9Imh0bWxfZjI0NmVjZWQ2MGJhNGNmZWFmYmNhZDVmZDExZTdlNzYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZpZWxkc3RvbiwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M4MWVjMTM0NmIxYjRhMzdiZDY2NGE4YWI0NTVhYmJlLnNldENvbnRlbnQoaHRtbF9mMjQ2ZWNlZDYwYmE0Y2ZlYWZiY2FkNWZkMTFlN2U3Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yM2M0ZTZmMmM1YWM0ZWRkYjFjNGQzNWJhNzA5NDBiZS5iaW5kUG9wdXAocG9wdXBfYzgxZWMxMzQ2YjFiNGEzN2JkNjY0YThhYjQ1NWFiYmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDI3ODZhZjVmNTU1NDhjY2ExYzk4YzM1ZjdlMjkzNzEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44OTA4MzQ0OTM4OTEzMDUsLTczLjkxMjU4NTQ2MTA4NTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2NlNDQ4MDExNjBiNDQ1ZWEyNDcyM2ZlNDAzZjZkZDMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjI4YWRjYTE5MmUzNDQ1ZTg4ODA1ODRmN2JkNTMwMWMgPSAkKCc8ZGl2IGlkPSJodG1sXzYyOGFkY2ExOTJlMzQ0NWU4ODgwNTg0ZjdiZDUzMDFjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SaXZlcmRhbGUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zY2U0NDgwMTE2MGI0NDVlYTI0NzIzZmU0MDNmNmRkMy5zZXRDb250ZW50KGh0bWxfNjI4YWRjYTE5MmUzNDQ1ZTg4ODA1ODRmN2JkNTMwMWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDI3ODZhZjVmNTU1NDhjY2ExYzk4YzM1ZjdlMjkzNzEuYmluZFBvcHVwKHBvcHVwXzNjZTQ0ODAxMTYwYjQ0NWVhMjQ3MjNmZTQwM2Y2ZGQzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhmNDI2ODRiMmQ3ODQxNzE4MWMxNTc2Mzk2ODQ4MmFlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODgxNjg3MzcxMjA1MjEsLTczLjkwMjgxNzk4NzI0NjA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFhNDAyNjkzOTI0MjRjNDQ5N2MyYWJjOTJhYmIxMWQxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc5OGQwODgxMzliODQ3ZWRiNjAzMDU0ZWM1MjA5NWQyID0gJCgnPGRpdiBpZD0iaHRtbF83OThkMDg4MTM5Yjg0N2VkYjYwMzA1NGVjNTIwOTVkMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+S2luZ3NicmlkZ2UsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xYTQwMjY5MzkyNDI0YzQ0OTdjMmFiYzkyYWJiMTFkMS5zZXRDb250ZW50KGh0bWxfNzk4ZDA4ODEzOWI4NDdlZGI2MDMwNTRlYzUyMDk1ZDIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGY0MjY4NGIyZDc4NDE3MTgxYzE1NzYzOTY4NDgyYWUuYmluZFBvcHVwKHBvcHVwXzFhNDAyNjkzOTI0MjRjNDQ5N2MyYWJjOTJhYmIxMWQxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JhMDU3MjJkZmM2NTQyMDU5YmZlYmFlNDJmYjVkNmViID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODc2NTUwNzc4Nzk5NjQsLTczLjkxMDY1OTY1ODYyOTgxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRiMzIyNzg4OWFmNDRjYzA4YjBiNzU2NWM5NjY0YmE1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFhMjk5ZDA0ZWFkZTQwM2I4YjEzN2Y2OTNiMWYzZjcyID0gJCgnPGRpdiBpZD0iaHRtbF8xYTI5OWQwNGVhZGU0MDNiOGIxMzdmNjkzYjFmM2Y3MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFyYmxlIEhpbGwsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGIzMjI3ODg5YWY0NGNjMDhiMGI3NTY1Yzk2NjRiYTUuc2V0Q29udGVudChodG1sXzFhMjk5ZDA0ZWFkZTQwM2I4YjEzN2Y2OTNiMWYzZjcyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JhMDU3MjJkZmM2NTQyMDU5YmZlYmFlNDJmYjVkNmViLmJpbmRQb3B1cChwb3B1cF80YjMyMjc4ODlhZjQ0Y2MwOGIwYjc1NjVjOTY2NGJhNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80OTU4ZmViNGI4MzE0ZGQzYjE4Nzc2ODQ5YmY0M2IyNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg5ODI3MjYxMjEzODA1LC03My44NjczMTQ5NjgxNDE3Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hNjY5Y2ZlNzBhYzA0ZjUxOTVkMGYxNGY5ODUyN2I0ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mNGJjMDlmZTdiMmY0MjBiODVmMmU0ZjNhYmE1MDBhYyA9ICQoJzxkaXYgaWQ9Imh0bWxfZjRiYzA5ZmU3YjJmNDIwYjg1ZjJlNGYzYWJhNTAwYWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldvb2RsYXduLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTY2OWNmZTcwYWMwNGY1MTk1ZDBmMTRmOTg1MjdiNGQuc2V0Q29udGVudChodG1sX2Y0YmMwOWZlN2IyZjQyMGI4NWYyZTRmM2FiYTUwMGFjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ5NThmZWI0YjgzMTRkZDNiMTg3NzY4NDliZjQzYjI1LmJpbmRQb3B1cChwb3B1cF9hNjY5Y2ZlNzBhYzA0ZjUxOTVkMGYxNGY5ODUyN2I0ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xZTM3NzgzZTRjOWM0Y2YxODA5NzU5M2E4YjA3NGY3NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg3NzIyNDE1NTk5NDQ2LC03My44NzkzOTA3Mzk1NjgxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZiMWRkMzk0YmIzZjRkMGViZWFiNThiNzNlMjNlNzAxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VkY2Q5ODU4MWNlYzQzNzhiMzQwM2RiZTEwMmQyMmRlID0gJCgnPGRpdiBpZD0iaHRtbF9lZGNkOTg1ODFjZWM0Mzc4YjM0MDNkYmUxMDJkMjJkZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tm9yd29vZCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZiMWRkMzk0YmIzZjRkMGViZWFiNThiNzNlMjNlNzAxLnNldENvbnRlbnQoaHRtbF9lZGNkOTg1ODFjZWM0Mzc4YjM0MDNkYmUxMDJkMjJkZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xZTM3NzgzZTRjOWM0Y2YxODA5NzU5M2E4YjA3NGY3NC5iaW5kUG9wdXAocG9wdXBfNmIxZGQzOTRiYjNmNGQwZWJlYWI1OGI3M2UyM2U3MDEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTMwNGIzMGYyYTk0NGRiNDkxNDU3MmFkNjBkZjc4NjkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44ODEwMzg4NzgxOTIxMSwtNzMuODU3NDQ2NDI5NzQyMDddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzg3MTdlM2M2NWY1NDkzOWFiOGNmYTg3NTg4ZGQ4NzkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGRjZTZkM2U0ZDc5NGFkNjgyNGM4MTAzNjA5OTJkYzUgPSAkKCc8ZGl2IGlkPSJodG1sX2RkY2U2ZDNlNGQ3OTRhZDY4MjRjODEwMzYwOTkyZGM1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XaWxsaWFtc2JyaWRnZSwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M4NzE3ZTNjNjVmNTQ5MzlhYjhjZmE4NzU4OGRkODc5LnNldENvbnRlbnQoaHRtbF9kZGNlNmQzZTRkNzk0YWQ2ODI0YzgxMDM2MDk5MmRjNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85MzA0YjMwZjJhOTQ0ZGI0OTE0NTcyYWQ2MGRmNzg2OS5iaW5kUG9wdXAocG9wdXBfYzg3MTdlM2M2NWY1NDkzOWFiOGNmYTg3NTg4ZGQ4NzkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDMzNWI5YzY5YTNjNDczMGE4YTcyYmM0OTFjZTczZjkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NjY4NTgxMDcyNTI2OTYsLTczLjgzNTc5NzU5ODA4MTE3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2UyZDRkMjY1NDdmYTQyMjc5YTI2ZDY0NzY3ZGE2ZjU1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VkZDZjNjg0M2NiYjRlY2U4MzkwMzVlZmM2ZDc5M2ZlID0gJCgnPGRpdiBpZD0iaHRtbF9lZGQ2YzY4NDNjYmI0ZWNlODM5MDM1ZWZjNmQ3OTNmZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF5Y2hlc3RlciwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UyZDRkMjY1NDdmYTQyMjc5YTI2ZDY0NzY3ZGE2ZjU1LnNldENvbnRlbnQoaHRtbF9lZGQ2YzY4NDNjYmI0ZWNlODM5MDM1ZWZjNmQ3OTNmZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80MzM1YjljNjlhM2M0NzMwYThhNzJiYzQ5MWNlNzNmOS5iaW5kUG9wdXAocG9wdXBfZTJkNGQyNjU0N2ZhNDIyNzlhMjZkNjQ3NjdkYTZmNTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzYyNmQxMDUxMWM1NDNhOTkyMDIwNzEwYmExMjFhZDIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NTc0MTM0OTgwODg2NSwtNzMuODU0NzU1NjQwMTc5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWJiMDcwNzM0ZmVmNDJlZWJhYWVkZjFhYzE3NmRjYmMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzhkZjY5MjQyMWFhNGFjODlhMDEyYTlhYmEzNjVmYzUgPSAkKCc8ZGl2IGlkPSJodG1sX2M4ZGY2OTI0MjFhYTRhYzg5YTAxMmE5YWJhMzY1ZmM1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QZWxoYW0gUGFya3dheSwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FiYjA3MDczNGZlZjQyZWViYWFlZGYxYWMxNzZkY2JjLnNldENvbnRlbnQoaHRtbF9jOGRmNjkyNDIxYWE0YWM4OWEwMTJhOWFiYTM2NWZjNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83NjI2ZDEwNTExYzU0M2E5OTIwMjA3MTBiYTEyMWFkMi5iaW5kUG9wdXAocG9wdXBfYWJiMDcwNzM0ZmVmNDJlZWJhYWVkZjFhYzE3NmRjYmMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmRjODBhMzc2NmI5NDRmMTkyNmM1ZmRhOWYwNmQyZGMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NDcyNDY3MDQ5MTgxMywtNzMuNzg2NDg4NDUyNjc0MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmNhMTViYTc2MjgzNDFmOTkyZmJmMjMwZDg0MGFjZTEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODc3YWNhNWNjNmYwNGZmYWJkNmEzN2IzNjBiN2U5NGMgPSAkKCc8ZGl2IGlkPSJodG1sXzg3N2FjYTVjYzZmMDRmZmFiZDZhMzdiMzYwYjdlOTRjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaXR5IElzbGFuZCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZjYTE1YmE3NjI4MzQxZjk5MmZiZjIzMGQ4NDBhY2UxLnNldENvbnRlbnQoaHRtbF84NzdhY2E1Y2M2ZjA0ZmZhYmQ2YTM3YjM2MGI3ZTk0Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mZGM4MGEzNzY2Yjk0NGYxOTI2YzVmZGE5ZjA2ZDJkYy5iaW5kUG9wdXAocG9wdXBfNmNhMTViYTc2MjgzNDFmOTkyZmJmMjMwZDg0MGFjZTEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMGU4MjExNWMwNmE4NGQyMTgwMDQ4NDQ2ZWYzZDEzNDggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NzAxODUxNjQ5NzUzMjUsLTczLjg4NTUxMjE4NDE5MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTE1NzVhM2NmZTc4NDBkMTk5N2VlOGYxODJmMTY0ZDcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzJhZGE4YTU1MjJlNDY1ZmI5MmEzMmY2YWE1YWMyZTkgPSAkKCc8ZGl2IGlkPSJodG1sXzMyYWRhOGE1NTIyZTQ2NWZiOTJhMzJmNmFhNWFjMmU5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CZWRmb3JkIFBhcmssIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lMTU3NWEzY2ZlNzg0MGQxOTk3ZWU4ZjE4MmYxNjRkNy5zZXRDb250ZW50KGh0bWxfMzJhZGE4YTU1MjJlNDY1ZmI5MmEzMmY2YWE1YWMyZTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMGU4MjExNWMwNmE4NGQyMTgwMDQ4NDQ2ZWYzZDEzNDguYmluZFBvcHVwKHBvcHVwX2UxNTc1YTNjZmU3ODQwZDE5OTdlZThmMTgyZjE2NGQ3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzliMTJjMWEzYThjNTQ2OGU4MDZmNGQwMGEyYWEzMmQ1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODU1NzI3MDc3MTk2NjQsLTczLjkxMDQxNTk2MTkxMzFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTc5ZjEyZTBkMzg0NDEwODk0MTQ2ZDU4ZmZjNWQ1YWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWNkMWZjZjM0NGFhNGFjYmI0YjJkN2Q4NjlmMzZjNzYgPSAkKCc8ZGl2IGlkPSJodG1sX2FjZDFmY2YzNDRhYTRhY2JiNGIyZDdkODY5ZjM2Yzc2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Vbml2ZXJzaXR5IEhlaWdodHMsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hNzlmMTJlMGQzODQ0MTA4OTQxNDZkNThmZmM1ZDVhZS5zZXRDb250ZW50KGh0bWxfYWNkMWZjZjM0NGFhNGFjYmI0YjJkN2Q4NjlmMzZjNzYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWIxMmMxYTNhOGM1NDY4ZTgwNmY0ZDAwYTJhYTMyZDUuYmluZFBvcHVwKHBvcHVwX2E3OWYxMmUwZDM4NDQxMDg5NDE0NmQ1OGZmYzVkNWFlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc0YjM3MTk2Mjc2OTQ5MDM4ZTk1YWZiZDA4YjNmNDE0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODQ3ODk3OTI2MDYyNzEsLTczLjkxOTY3MTU5MTE5NTY1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzkyMTdkOTZiMmNiZTQ2MjVhNjdkNzkwMjJlZDA3MGM2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhlYjk1ZjlmODgxMzQ0ODA5MjU5ZmIxNmQ0NDBlYjY1ID0gJCgnPGRpdiBpZD0iaHRtbF84ZWI5NWY5Zjg4MTM0NDgwOTI1OWZiMTZkNDQwZWI2NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW9ycmlzIEhlaWdodHMsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85MjE3ZDk2YjJjYmU0NjI1YTY3ZDc5MDIyZWQwNzBjNi5zZXRDb250ZW50KGh0bWxfOGViOTVmOWY4ODEzNDQ4MDkyNTlmYjE2ZDQ0MGViNjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzRiMzcxOTYyNzY5NDkwMzhlOTVhZmJkMDhiM2Y0MTQuYmluZFBvcHVwKHBvcHVwXzkyMTdkOTZiMmNiZTQ2MjVhNjdkNzkwMjJlZDA3MGM2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2MwNzc4YzJkYmNlNjRjOTI5NmFlZjlmNTdkMTgzNDBiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODYwOTk2Nzk2Mzg2NTQsLTczLjg5NjQyNjU1OTgxNjIzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNjZGRmNzNjNjAyYjQzMDBiZWJlNDQwMTBmNzU0ODgwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E3YzYyZDhkZTVkNDRjMjA4NTE1MTY2OWExMzdmNjhiID0gJCgnPGRpdiBpZD0iaHRtbF9hN2M2MmQ4ZGU1ZDQ0YzIwODUxNTE2NjlhMTM3ZjY4YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Rm9yZGhhbSwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNjZGRmNzNjNjAyYjQzMDBiZWJlNDQwMTBmNzU0ODgwLnNldENvbnRlbnQoaHRtbF9hN2M2MmQ4ZGU1ZDQ0YzIwODUxNTE2NjlhMTM3ZjY4Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jMDc3OGMyZGJjZTY0YzkyOTZhZWY5ZjU3ZDE4MzQwYi5iaW5kUG9wdXAocG9wdXBfM2NkZGY3M2M2MDJiNDMwMGJlYmU0NDAxMGY3NTQ4ODApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWQzNzE1NDBmZmM1NGVmMzgwZmU2MGQ5YzlhNGYzZTQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NDI2OTYxNTc4NjA1MywtNzMuODg3MzU2MTc1MzIzMzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDE1MzMxMDkzZTc3NDcyYWI1ZTA0YzczMTQ2ODIyZDggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjM1MDUzMWMwYzIwNDM4MTlmNzZlODA3NWZlYjc3MDYgPSAkKCc8ZGl2IGlkPSJodG1sXzIzNTA1MzFjMGMyMDQzODE5Zjc2ZTgwNzVmZWI3NzA2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FYXN0IFRyZW1vbnQsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMTUzMzEwOTNlNzc0NzJhYjVlMDRjNzMxNDY4MjJkOC5zZXRDb250ZW50KGh0bWxfMjM1MDUzMWMwYzIwNDM4MTlmNzZlODA3NWZlYjc3MDYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWQzNzE1NDBmZmM1NGVmMzgwZmU2MGQ5YzlhNGYzZTQuYmluZFBvcHVwKHBvcHVwXzAxNTMzMTA5M2U3NzQ3MmFiNWUwNGM3MzE0NjgyMmQ4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZmYjQ5ODNjNjZjOTQ0ZDdiZGMzM2IyZjA2MjQ3MDI5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODM5NDc1MDU2NzI2NTMsLTczLjg3Nzc0NDc0OTEwNTQ1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FmZGU2ZTVlOTMyYzRhNjQ4ZjA0OWFmMzI4Nzg1MzAyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VkZTg4MmQ4MGRmZDQ1MmE4YTNiOGNhODZkZGMyNWJiID0gJCgnPGRpdiBpZD0iaHRtbF9lZGU4ODJkODBkZmQ0NTJhOGEzYjhjYTg2ZGRjMjViYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2VzdCBGYXJtcywgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FmZGU2ZTVlOTMyYzRhNjQ4ZjA0OWFmMzI4Nzg1MzAyLnNldENvbnRlbnQoaHRtbF9lZGU4ODJkODBkZmQ0NTJhOGEzYjhjYTg2ZGRjMjViYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82ZmI0OTgzYzY2Yzk0NGQ3YmRjMzNiMmYwNjI0NzAyOS5iaW5kUG9wdXAocG9wdXBfYWZkZTZlNWU5MzJjNGE2NDhmMDQ5YWYzMjg3ODUzMDIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjZjYjA1MjM5NGQ0NGEzMDkzYjAzMzIwOTFjYWY5N2IgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MzY2MjMwMTA3MDYwNTYsLTczLjkyNjEwMjA5MzU4MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTExODY3MDNiMzMwNDNkMGE5YjFiOWQ3OGI2OTQ0YmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWYwMTlmMmE3ODc1NGI2NGI2NzcwMjIwN2ExYjY5YjcgPSAkKCc8ZGl2IGlkPSJodG1sXzlmMDE5ZjJhNzg3NTRiNjRiNjc3MDIyMDdhMWI2OWI3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IaWdoICBCcmlkZ2UsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lMTE4NjcwM2IzMzA0M2QwYTliMWI5ZDc4YjY5NDRiZC5zZXRDb250ZW50KGh0bWxfOWYwMTlmMmE3ODc1NGI2NGI2NzcwMjIwN2ExYjY5YjcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjZjYjA1MjM5NGQ0NGEzMDkzYjAzMzIwOTFjYWY5N2IuYmluZFBvcHVwKHBvcHVwX2UxMTg2NzAzYjMzMDQzZDBhOWIxYjlkNzhiNjk0NGJkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU1MGRlZjc1NGQ2MzQ3M2ViZTU3NTNmZmJiNzk4NzIxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODE5NzU0MzcwNTk0OTM2LC03My45MDk0MjE2MDc1NzQzNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yMmRmMGVjYzBhZjg0NTRmYjU4YmVmZGNmNmY1N2RhYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zN2Q1NGQwNDAwNzE0OGE0YjY5ZmVmMTFlNWU4NGYxMiA9ICQoJzxkaXYgaWQ9Imh0bWxfMzdkNTRkMDQwMDcxNDhhNGI2OWZlZjExZTVlODRmMTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1lbHJvc2UsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yMmRmMGVjYzBhZjg0NTRmYjU4YmVmZGNmNmY1N2RhYy5zZXRDb250ZW50KGh0bWxfMzdkNTRkMDQwMDcxNDhhNGI2OWZlZjExZTVlODRmMTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTUwZGVmNzU0ZDYzNDczZWJlNTc1M2ZmYmI3OTg3MjEuYmluZFBvcHVwKHBvcHVwXzIyZGYwZWNjMGFmODQ1NGZiNThiZWZkY2Y2ZjU3ZGFjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA1M2NhNTljYjhkNjRjZjlhMjJkYTQ0MDdmOTE1MWIzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODA2MjM4NzQ5MzUxNzcsLTczLjkxNjA5OTg3NDg3NTc1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y4OTI0YWY4NzVjMDQ3NTdhNGI3MWE2ZjZjNzRmNDgzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg4Zjc3ZWYyYmVjODRmNzdiNjFkNjI5MDJmYTQxYzY2ID0gJCgnPGRpdiBpZD0iaHRtbF84OGY3N2VmMmJlYzg0Zjc3YjYxZDYyOTAyZmE0MWM2NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW90dCBIYXZlbiwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y4OTI0YWY4NzVjMDQ3NTdhNGI3MWE2ZjZjNzRmNDgzLnNldENvbnRlbnQoaHRtbF84OGY3N2VmMmJlYzg0Zjc3YjYxZDYyOTAyZmE0MWM2Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wNTNjYTU5Y2I4ZDY0Y2Y5YTIyZGE0NDA3ZjkxNTFiMy5iaW5kUG9wdXAocG9wdXBfZjg5MjRhZjg3NWMwNDc1N2E0YjcxYTZmNmM3NGY0ODMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzgzNGRkZGQ4MzA0NDRiM2I4MTQ0MDIyNDIzOGNkNjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MDE2NjM2Mjc3NTYyMDYsLTczLjkxMzIyMTM5Mzg2MTM1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RlYTljOTI3Y2IwZTRlZjg4ZDdjYWFmY2VjMGVhMmY2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY2MWE1YTQ3MzJkZTQ0NzliOTA5NDMxOWY2N2UzMzM4ID0gJCgnPGRpdiBpZD0iaHRtbF82NjFhNWE0NzMyZGU0NDc5YjkwOTQzMTlmNjdlMzMzOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UG9ydCBNb3JyaXMsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kZWE5YzkyN2NiMGU0ZWY4OGQ3Y2FhZmNlYzBlYTJmNi5zZXRDb250ZW50KGh0bWxfNjYxYTVhNDczMmRlNDQ3OWI5MDk0MzE5ZjY3ZTMzMzgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzgzNGRkZGQ4MzA0NDRiM2I4MTQ0MDIyNDIzOGNkNjMuYmluZFBvcHVwKHBvcHVwX2RlYTljOTI3Y2IwZTRlZjg4ZDdjYWFmY2VjMGVhMmY2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNlMzcyZmFiNjAwNDQzN2FiMjcwNDMyYTNjZDVlNWY0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODE1MDk5MDQ1NDU4MjIsLTczLjg5NTc4ODIwMDk0NDZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTU1ZjM2ZDhiNjZlNDgyMThkOTgwNTQ5MmZlNDJjOTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWYwN2ZkOGQ1NWQ0NDM3M2JmOTQxOTQ2MDliMmJiMzUgPSAkKCc8ZGl2IGlkPSJodG1sX2FmMDdmZDhkNTVkNDQzNzNiZjk0MTk0NjA5YjJiYjM1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Mb25nd29vZCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU1NWYzNmQ4YjY2ZTQ4MjE4ZDk4MDU0OTJmZTQyYzkyLnNldENvbnRlbnQoaHRtbF9hZjA3ZmQ4ZDU1ZDQ0MzczYmY5NDE5NDYwOWIyYmIzNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zZTM3MmZhYjYwMDQ0MzdhYjI3MDQzMmEzY2Q1ZTVmNC5iaW5kUG9wdXAocG9wdXBfNTU1ZjM2ZDhiNjZlNDgyMThkOTgwNTQ5MmZlNDJjOTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGU0MjM1MDNmYzM5NDU4NThiNWVmNThlNTg0YmU0MWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MDk3Mjk4NzkzODcwOSwtNzMuODgzMzE1MDU5NTUyOTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDQzYTk3MGNkNGE4NDJjNzllMDRkOTY4ODFiOTIwODMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTliYzI4YzhmMmRlNDA4ZGI4N2RmODg4MzQ1OTE1MjAgPSAkKCc8ZGl2IGlkPSJodG1sX2U5YmMyOGM4ZjJkZTQwOGRiODdkZjg4ODM0NTkxNTIwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IdW50cyBQb2ludCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ0M2E5NzBjZDRhODQyYzc5ZTA0ZDk2ODgxYjkyMDgzLnNldENvbnRlbnQoaHRtbF9lOWJjMjhjOGYyZGU0MDhkYjg3ZGY4ODgzNDU5MTUyMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kZTQyMzUwM2ZjMzk0NTg1OGI1ZWY1OGU1ODRiZTQxYy5iaW5kUG9wdXAocG9wdXBfNDQzYTk3MGNkNGE4NDJjNzllMDRkOTY4ODFiOTIwODMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTg4YTRkZmRiOGRhNDVjYmIyMTBiNjkwYTliMWZkYzQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MjM1OTE5ODU4NTUzNCwtNzMuOTAxNTA2NDg5NDMwNTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmNkODJmNTczYWEwNGNiYjkzNjRkY2RkOWM3MTU3ZDMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDA0MWI1MGRmNWExNDY3OWI2OGM5ZDA0NTY1N2EyYTUgPSAkKCc8ZGl2IGlkPSJodG1sXzQwNDFiNTBkZjVhMTQ2NzliNjhjOWQwNDU2NTdhMmE1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Nb3JyaXNhbmlhLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmNkODJmNTczYWEwNGNiYjkzNjRkY2RkOWM3MTU3ZDMuc2V0Q29udGVudChodG1sXzQwNDFiNTBkZjVhMTQ2NzliNjhjOWQwNDU2NTdhMmE1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzU4OGE0ZGZkYjhkYTQ1Y2JiMjEwYjY5MGE5YjFmZGM0LmJpbmRQb3B1cChwb3B1cF8yY2Q4MmY1NzNhYTA0Y2JiOTM2NGRjZGQ5YzcxNTdkMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mN2Q5YTk5ZTM3ZGU0YThmODM1ZjRiN2RlYmU2OWJkOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgyMTAxMjE5NzkxNDAxNSwtNzMuODY1NzQ2MDk1NTQ5MjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWU2MjQzOTg5ODdmNDRhMDliZjEwZDA5NTYxZjkxZTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTE0NGM2NzBlNmYwNDVjZmFlYjljYzFhY2JjMzAxNDUgPSAkKCc8ZGl2IGlkPSJodG1sXzkxNDRjNjcwZTZmMDQ1Y2ZhZWI5Y2MxYWNiYzMwMTQ1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Tb3VuZHZpZXcsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xZTYyNDM5ODk4N2Y0NGEwOWJmMTBkMDk1NjFmOTFlNi5zZXRDb250ZW50KGh0bWxfOTE0NGM2NzBlNmYwNDVjZmFlYjljYzFhY2JjMzAxNDUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjdkOWE5OWUzN2RlNGE4ZjgzNWY0YjdkZWJlNjliZDguYmluZFBvcHVwKHBvcHVwXzFlNjI0Mzk4OTg3ZjQ0YTA5YmYxMGQwOTU2MWY5MWU2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I5NmM3YjgyOWUwZTQ3NTQ5YWUzYmExNjllNWI0ZTBkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODA2NTUxMTIwMDM1ODksLTczLjg1NDE0NDE2MTg5MjY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzlhMWFiYWJmNmI2YTQ5OGY5MDQzNTY3ZTE1YTA0MDg0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FlN2EwNzY2YTc3MDQzNjA4NWE0ZDZjN2QzZDA0OTU3ID0gJCgnPGRpdiBpZD0iaHRtbF9hZTdhMDc2NmE3NzA0MzYwODVhNGQ2YzdkM2QwNDk1NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2xhc29uIFBvaW50LCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWExYWJhYmY2YjZhNDk4ZjkwNDM1NjdlMTVhMDQwODQuc2V0Q29udGVudChodG1sX2FlN2EwNzY2YTc3MDQzNjA4NWE0ZDZjN2QzZDA0OTU3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2I5NmM3YjgyOWUwZTQ3NTQ5YWUzYmExNjllNWI0ZTBkLmJpbmRQb3B1cChwb3B1cF85YTFhYmFiZjZiNmE0OThmOTA0MzU2N2UxNWEwNDA4NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84YTkyYzY4N2JlMmE0MThkYmYyOWYxNTUyZjk0ODc5YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgxNTEwOTI1ODA0MDA1LC03My44MTYzNTAwMjE1ODQ0MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hYzNmZjY5Yjg3MmI0MjI3OTA1MjJjYWY5NzM1YTc0MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lZTdiNTU2OTE1MjQ0ZWRjOTg3ZTdiZWY3NTYxMGQ1ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfZWU3YjU1NjkxNTI0NGVkYzk4N2U3YmVmNzU2MTBkNWUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRocm9ncyBOZWNrLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWMzZmY2OWI4NzJiNDIyNzkwNTIyY2FmOTczNWE3NDMuc2V0Q29udGVudChodG1sX2VlN2I1NTY5MTUyNDRlZGM5ODdlN2JlZjc1NjEwZDVlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhhOTJjNjg3YmUyYTQxOGRiZjI5ZjE1NTJmOTQ4NzlhLmJpbmRQb3B1cChwb3B1cF9hYzNmZjY5Yjg3MmI0MjI3OTA1MjJjYWY5NzM1YTc0Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mNGVjYzdmNmMxZjQ0YzhlODY5NTA2ZTMzYzg3YTE4MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg0NDI0NTkzNjk0NzM3NCwtNzMuODI0MDk5MjY3NTM4NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNzFlM2Y1NzAwMTQ0YTY1OGYyZjJiODYyMTlmZmRiYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hMzEzZWUxNzc4ZDk0N2IzYTBlMDExYjM5NTY5OTc0YyA9ICQoJzxkaXYgaWQ9Imh0bWxfYTMxM2VlMTc3OGQ5NDdiM2EwZTAxMWIzOTU2OTk3NGMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNvdW50cnkgQ2x1YiwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA3MWUzZjU3MDAxNDRhNjU4ZjJmMmI4NjIxOWZmZGJjLnNldENvbnRlbnQoaHRtbF9hMzEzZWUxNzc4ZDk0N2IzYTBlMDExYjM5NTY5OTc0Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mNGVjYzdmNmMxZjQ0YzhlODY5NTA2ZTMzYzg3YTE4Mi5iaW5kUG9wdXAocG9wdXBfMDcxZTNmNTcwMDE0NGE2NThmMmYyYjg2MjE5ZmZkYmMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmE3ZTI3ZTU0ZjM4NDRlODhlZTRiYTcyNDg2Mjg3NGUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44Mzc5Mzc4MjIyNjcyODYsLTczLjg1NjAwMzEwNTM1NzgzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM2YWI5MWIxMjI5ZjQwYjJiNTczY2U4MjdiM2Q0MTA4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIwOWUwOTU2YmMyZjRiNDNiNjFkZTc3YTE2ZThlYjY5ID0gJCgnPGRpdiBpZD0iaHRtbF8yMDllMDk1NmJjMmY0YjQzYjYxZGU3N2ExNmU4ZWI2OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGFya2NoZXN0ZXIsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zNmFiOTFiMTIyOWY0MGIyYjU3M2NlODI3YjNkNDEwOC5zZXRDb250ZW50KGh0bWxfMjA5ZTA5NTZiYzJmNGI0M2I2MWRlNzdhMTZlOGViNjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmE3ZTI3ZTU0ZjM4NDRlODhlZTRiYTcyNDg2Mjg3NGUuYmluZFBvcHVwKHBvcHVwXzM2YWI5MWIxMjI5ZjQwYjJiNTczY2U4MjdiM2Q0MTA4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E2YWRiMThlMTU1ZDQxMzNiMmUxOWE2MGJiMGMwNjljID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODQwNjE5NDk2NDMyNywtNzMuODQyMTk0MDc2MDQ0NDRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGIzZmY3NjYzNmFiNDQwZjgwNmQ3MjA1NGYyMjU2ZGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWMwYTYzYWVlNzdkNGIzNWE1NmY5ZWZjM2M2N2ZhYmMgPSAkKCc8ZGl2IGlkPSJodG1sXzljMGE2M2FlZTc3ZDRiMzVhNTZmOWVmYzNjNjdmYWJjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZXN0Y2hlc3RlciBTcXVhcmUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84YjNmZjc2NjM2YWI0NDBmODA2ZDcyMDU0ZjIyNTZkYS5zZXRDb250ZW50KGh0bWxfOWMwYTYzYWVlNzdkNGIzNWE1NmY5ZWZjM2M2N2ZhYmMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTZhZGIxOGUxNTVkNDEzM2IyZTE5YTYwYmIwYzA2OWMuYmluZFBvcHVwKHBvcHVwXzhiM2ZmNzY2MzZhYjQ0MGY4MDZkNzIwNTRmMjI1NmRhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE1MWViOGJlZGI4NzRhM2ZhNWY2YjFkY2FkYmUyNWM4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODQzNjA4NDcxMjQ3MTgsLTczLjg2NjI5OTE4MDc1NjFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDFjMDMwNWI2NzgzNDUxYjgyMDkzNGQwZjQ3NjdkNTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDY0ODhhZDMyNWFmNGMyMGJlMDhiNGMzMmE5MmFkNmQgPSAkKCc8ZGl2IGlkPSJodG1sXzQ2NDg4YWQzMjVhZjRjMjBiZTA4YjRjMzJhOTJhZDZkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WYW4gTmVzdCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAxYzAzMDViNjc4MzQ1MWI4MjA5MzRkMGY0NzY3ZDUzLnNldENvbnRlbnQoaHRtbF80NjQ4OGFkMzI1YWY0YzIwYmUwOGI0YzMyYTkyYWQ2ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xNTFlYjhiZWRiODc0YTNmYTVmNmIxZGNhZGJlMjVjOC5iaW5kUG9wdXAocG9wdXBfMDFjMDMwNWI2NzgzNDUxYjgyMDkzNGQwZjQ3NjdkNTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjVkYTExNWRiZGIzNDA2MGJhMTczZGJhOWFkZmEwYTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NDc1NDkwNjM1MzYzMzQsLTczLjg1MDQwMTc4MDMwNDIxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgyNTE0YjQyNzgyYjQ5M2ZiYzg3ODcyY2M1ZWRlMTQxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY4YzQ4MzJiMDg1OTRkYmE4ZmUyYTI3MDEyYzRiYzg5ID0gJCgnPGRpdiBpZD0iaHRtbF82OGM0ODMyYjA4NTk0ZGJhOGZlMmEyNzAxMmM0YmM4OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW9ycmlzIFBhcmssIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MjUxNGI0Mjc4MmI0OTNmYmM4Nzg3MmNjNWVkZTE0MS5zZXRDb250ZW50KGh0bWxfNjhjNDgzMmIwODU5NGRiYThmZTJhMjcwMTJjNGJjODkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjVkYTExNWRiZGIzNDA2MGJhMTczZGJhOWFkZmEwYTAuYmluZFBvcHVwKHBvcHVwXzgyNTE0YjQyNzgyYjQ5M2ZiYzg3ODcyY2M1ZWRlMTQxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU4OWE1YWMwOTJiMDQwNTRhNzc0NDczMjJkNjM1MDI4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODU3Mjc3MTAwNzM4OTUsLTczLjg4ODQ1MTk2MTM0ODA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJmZTIxZWU0Y2IzZTRiYTVhNmU5Y2M1OTI0OTgwNjZhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzUyMzI5OWZkMWM2ODQ5YjU4Yjg1YTNhNjJlMmRkZDQyID0gJCgnPGRpdiBpZD0iaHRtbF81MjMyOTlmZDFjNjg0OWI1OGI4NWEzYTYyZTJkZGQ0MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmVsbW9udCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJmZTIxZWU0Y2IzZTRiYTVhNmU5Y2M1OTI0OTgwNjZhLnNldENvbnRlbnQoaHRtbF81MjMyOTlmZDFjNjg0OWI1OGI4NWEzYTYyZTJkZGQ0Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81ODlhNWFjMDkyYjA0MDU0YTc3NDQ3MzIyZDYzNTAyOC5iaW5kUG9wdXAocG9wdXBfMmZlMjFlZTRjYjNlNGJhNWE2ZTljYzU5MjQ5ODA2NmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjg1ODA1YmVlMjJkNDM2NDg1YjQ3OWViMGFiOTQ1YTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44ODEzOTQ5NzcyNzA4NiwtNzMuOTE3MTkwNDgyMTAzOTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmZiNjkzMDNmOTQxNDZjMmJjM2RjMDdjYmZjNDRkZWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjAwYTY1MTg0M2E5NGIyYTgxZWNmMTcxNmYzNmU5MmEgPSAkKCc8ZGl2IGlkPSJodG1sX2YwMGE2NTE4NDNhOTRiMmE4MWVjZjE3MTZmMzZlOTJhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TcHV5dGVuIER1eXZpbCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZmYjY5MzAzZjk0MTQ2YzJiYzNkYzA3Y2JmYzQ0ZGVjLnNldENvbnRlbnQoaHRtbF9mMDBhNjUxODQzYTk0YjJhODFlY2YxNzE2ZjM2ZTkyYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mODU4MDViZWUyMmQ0MzY0ODViNDc5ZWIwYWI5NDVhMi5iaW5kUG9wdXAocG9wdXBfZmZiNjkzMDNmOTQxNDZjMmJjM2RjMDdjYmZjNDRkZWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTM1MGJkN2RlM2Y1NDNkNmFhN2IyNGEwOTQ0MjE4M2UgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC45MDg1NDI4Mjk1MDY2NiwtNzMuOTA0NTMwNTQ5MDg5MjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTkzMDg1ZGZhMzk5NGFhMGJiNmU4MGUxOGMyOGE1MjYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTg2ZjQyNDk0NjYxNDMzMmE1NjkzMzQ1NzkzMDA5NjggPSAkKCc8ZGl2IGlkPSJodG1sX2U4NmY0MjQ5NDY2MTQzMzJhNTY5MzM0NTc5MzAwOTY4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob3J0aCBSaXZlcmRhbGUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xOTMwODVkZmEzOTk0YWEwYmI2ZTgwZTE4YzI4YTUyNi5zZXRDb250ZW50KGh0bWxfZTg2ZjQyNDk0NjYxNDMzMmE1NjkzMzQ1NzkzMDA5NjgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTM1MGJkN2RlM2Y1NDNkNmFhN2IyNGEwOTQ0MjE4M2UuYmluZFBvcHVwKHBvcHVwXzE5MzA4NWRmYTM5OTRhYTBiYjZlODBlMThjMjhhNTI2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZmN2MxOWJhNTkwNjRhNmM4ODMwNWE4OGY2MzNlNTc2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODUwNjQxNDA5NDAzMzUsLTczLjgzMjA3Mzc4MjQwNDddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTgwM2QzOGU5ZDBiNDRjNWFjNTNjZjhmZmUyMTE5ODkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzYzNGMzMWU0M2ZkNDM0MGJjMjJjNTQ2OTY2NjM4NmQgPSAkKCc8ZGl2IGlkPSJodG1sXzc2MzRjMzFlNDNmZDQzNDBiYzIyYzU0Njk2NjYzODZkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QZWxoYW0gQmF5LCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTgwM2QzOGU5ZDBiNDRjNWFjNTNjZjhmZmUyMTE5ODkuc2V0Q29udGVudChodG1sXzc2MzRjMzFlNDNmZDQzNDBiYzIyYzU0Njk2NjYzODZkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZmN2MxOWJhNTkwNjRhNmM4ODMwNWE4OGY2MzNlNTc2LmJpbmRQb3B1cChwb3B1cF8xODAzZDM4ZTlkMGI0NGM1YWM1M2NmOGZmZTIxMTk4OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yOGY3MDViNjI3OGQ0OWVkYmM4NWJhZTZhZDJhZWExNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgyNjU3OTUxNjg2OTIyLC03My44MjYyMDI3NTk5NDA3M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85ZWUzN2RlZmUxNDc0YTI0YWRlMDFhZDkxNWFlNjQxZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lOGIwNDg5OTQyNDI0MGI4OWIyOTM0OWMxMzAxMzQ4NyA9ICQoJzxkaXYgaWQ9Imh0bWxfZThiMDQ4OTk0MjQyNDBiODliMjkzNDljMTMwMTM0ODciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNjaHV5bGVydmlsbGUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85ZWUzN2RlZmUxNDc0YTI0YWRlMDFhZDkxNWFlNjQxZS5zZXRDb250ZW50KGh0bWxfZThiMDQ4OTk0MjQyNDBiODliMjkzNDljMTMwMTM0ODcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjhmNzA1YjYyNzhkNDllZGJjODViYWU2YWQyYWVhMTYuYmluZFBvcHVwKHBvcHVwXzllZTM3ZGVmZTE0NzRhMjRhZGUwMWFkOTE1YWU2NDFlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY4MjBjN2ZjZjgyZTRkNTA4MGRlNjU5MTVjOTEyODI0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODIxOTg2MTE4MTYzNDk0LC03My44MTM4ODUxNDQyODYxOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNWUzNGQ1NDg0NTQ0NzZlYTRkNjRhNGJlMmIzYjk3OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xMmQyYWFkMjI1NWE0NWM4YjA4ZDEyOTY3MGYxY2YyOSA9ICQoJzxkaXYgaWQ9Imh0bWxfMTJkMmFhZDIyNTVhNDVjOGIwOGQxMjk2NzBmMWNmMjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVkZ2V3YXRlciBQYXJrLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDVlMzRkNTQ4NDU0NDc2ZWE0ZDY0YTRiZTJiM2I5Nzguc2V0Q29udGVudChodG1sXzEyZDJhYWQyMjU1YTQ1YzhiMDhkMTI5NjcwZjFjZjI5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY4MjBjN2ZjZjgyZTRkNTA4MGRlNjU5MTVjOTEyODI0LmJpbmRQb3B1cChwb3B1cF8wNWUzNGQ1NDg0NTQ0NzZlYTRkNjRhNGJlMmIzYjk3OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81ZDJlZGZhMjAyZTM0NjI0OTRjMGRjMzY3NTdhMmM1ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgxOTAxNDM3Njk4ODMxNCwtNzMuODQ4MDI3Mjk1ODI3MzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmQ2MDhhY2M3NWZjNDFmMjk3OGE2YjY1NzFkZTI2MTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjVhYTRlNzA1OWZhNDIxM2I2OWQ2NGUwZDMxMjMyYWYgPSAkKCc8ZGl2IGlkPSJodG1sX2I1YWE0ZTcwNTlmYTQyMTNiNjlkNjRlMGQzMTIzMmFmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DYXN0bGUgSGlsbCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZkNjA4YWNjNzVmYzQxZjI5NzhhNmI2NTcxZGUyNjE1LnNldENvbnRlbnQoaHRtbF9iNWFhNGU3MDU5ZmE0MjEzYjY5ZDY0ZTBkMzEyMzJhZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81ZDJlZGZhMjAyZTM0NjI0OTRjMGRjMzY3NTdhMmM1ZC5iaW5kUG9wdXAocG9wdXBfNmQ2MDhhY2M3NWZjNDFmMjk3OGE2YjY1NzFkZTI2MTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjcyNjI1ZDI4ZWM4NDVhZjhhNWU4YTI0NTllZTdhMWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NzEzNzA3ODE5MjM3MSwtNzMuODYzMzIzNjE2NTI3NzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmUxM2FmNzJhNGJjNGRmNjg5NzE0NWQ1ZDMyNjU2MGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDc3MGNmZjUxNjMxNGM2MjkzOTgzZGEzMzEzNjU2MjEgPSAkKCc8ZGl2IGlkPSJodG1sXzQ3NzBjZmY1MTYzMTRjNjI5Mzk4M2RhMzMxMzY1NjIxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PbGludmlsbGUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ZTEzYWY3MmE0YmM0ZGY2ODk3MTQ1ZDVkMzI2NTYwYS5zZXRDb250ZW50KGh0bWxfNDc3MGNmZjUxNjMxNGM2MjkzOTgzZGEzMzEzNjU2MjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjcyNjI1ZDI4ZWM4NDVhZjhhNWU4YTI0NTllZTdhMWYuYmluZFBvcHVwKHBvcHVwXzZlMTNhZjcyYTRiYzRkZjY4OTcxNDVkNWQzMjY1NjBhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNjOWI3ZGQ5YWMzMzQ3OWU5MWY0Njk3NmQ2Zjk0ZjY2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODYyOTY1NjI0Nzc5OTgsLTczLjg0MTYxMTk0ODMxMjIzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY2YWRmMDRjNjI4MzRjOTE4NzYxNjVlNTVhZTI5YzQ0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdjNjM5NWI2NzQ1NjQyNTg5ZTUzMmQ4N2JhNDRkODExID0gJCgnPGRpdiBpZD0iaHRtbF83YzYzOTViNjc0NTY0MjU4OWU1MzJkODdiYTQ0ZDgxMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGVsaGFtIEdhcmRlbnMsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82NmFkZjA0YzYyODM0YzkxODc2MTY1ZTU1YWUyOWM0NC5zZXRDb250ZW50KGh0bWxfN2M2Mzk1YjY3NDU2NDI1ODllNTMyZDg3YmE0NGQ4MTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2M5YjdkZDlhYzMzNDc5ZTkxZjQ2OTc2ZDZmOTRmNjYuYmluZFBvcHVwKHBvcHVwXzY2YWRmMDRjNjI4MzRjOTE4NzYxNjVlNTVhZTI5YzQ0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JjYjNlOTk0YTU4YTRkZDFhMWVjYjg3NjFkNmQyN2M5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODM0MjgzODA3MzM4NTEsLTczLjkxNTU4OTQxNzczNDQ0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA1ZGZiNmIzNzBjMTRhZTlhN2FjZTNlZGJhOTliM2U5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFhNjRhNGE2Yjk5MjQ3ODZhM2FjZmVhNmVhMDY0ZTUwID0gJCgnPGRpdiBpZD0iaHRtbF8xYTY0YTRhNmI5OTI0Nzg2YTNhY2ZlYTZlYTA2NGU1MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q29uY291cnNlLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDVkZmI2YjM3MGMxNGFlOWE3YWNlM2VkYmE5OWIzZTkuc2V0Q29udGVudChodG1sXzFhNjRhNGE2Yjk5MjQ3ODZhM2FjZmVhNmVhMDY0ZTUwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JjYjNlOTk0YTU4YTRkZDFhMWVjYjg3NjFkNmQyN2M5LmJpbmRQb3B1cChwb3B1cF8wNWRmYjZiMzcwYzE0YWU5YTdhY2UzZWRiYTk5YjNlOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lZTM1ODhjMTdiZGI0ZDFkOTRmNGRhMDg0MGU5NTUzMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgyOTc3NDI5Nzg3MTYxLC03My44NTA1MzUyNDQ1MTkzNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xMjhlMmMxNWFkYmM0ZGRiOWQ0ZDM1M2NhM2I3MDUyNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xNzIxM2QyNzYwY2Y0ZGE1YTdmMTkxOGEzYjc3MTlmNSA9ICQoJzxkaXYgaWQ9Imh0bWxfMTcyMTNkMjc2MGNmNGRhNWE3ZjE5MThhM2I3NzE5ZjUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlVuaW9ucG9ydCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzEyOGUyYzE1YWRiYzRkZGI5ZDRkMzUzY2EzYjcwNTI0LnNldENvbnRlbnQoaHRtbF8xNzIxM2QyNzYwY2Y0ZGE1YTdmMTkxOGEzYjc3MTlmNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lZTM1ODhjMTdiZGI0ZDFkOTRmNGRhMDg0MGU5NTUzMC5iaW5kUG9wdXAocG9wdXBfMTI4ZTJjMTVhZGJjNGRkYjlkNGQzNTNjYTNiNzA1MjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWUyZGY3ZjE4MTg2NDE1NWI2Yzc0OWI5YTNmMDhiN2MgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44ODQ1NjEzMDMwMzczMiwtNzMuODQ4MDgyNzE4NzcxNjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTdlM2Y0MTYwYzdlNGJlNWFmZjNkYWU1NTYwZThiOTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjBjNWU2Nzg2ZWY0NDI4MmI2MzkyZTg4M2M4MzNmMTIgPSAkKCc8ZGl2IGlkPSJodG1sX2YwYzVlNjc4NmVmNDQyODJiNjM5MmU4ODNjODMzZjEyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FZGVud2FsZCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E3ZTNmNDE2MGM3ZTRiZTVhZmYzZGFlNTU2MGU4Yjk0LnNldENvbnRlbnQoaHRtbF9mMGM1ZTY3ODZlZjQ0MjgyYjYzOTJlODgzYzgzM2YxMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81ZTJkZjdmMTgxODY0MTU1YjZjNzQ5YjlhM2YwOGI3Yy5iaW5kUG9wdXAocG9wdXBfYTdlM2Y0MTYwYzdlNGJlNWFmZjNkYWU1NTYwZThiOTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGEzZGM1ZDViMWUzNDM0OTg1NGMyODQ5NmNlMWQ3ODQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MjU4MDEwNjUwMTA2NTYsLTc0LjAzMDYyMDY5MzUzODEzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJiODBkM2Y0ODRmZTRjYzc5NTEzMzNhZDVhZmIzOTM2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdiNGEzOWJlZjhkOTQ1MGU5Zjg2MmVlYTc0MTBiNjliID0gJCgnPGRpdiBpZD0iaHRtbF83YjRhMzliZWY4ZDk0NTBlOWY4NjJlZWE3NDEwYjY5YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF5IFJpZGdlLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmI4MGQzZjQ4NGZlNGNjNzk1MTMzM2FkNWFmYjM5MzYuc2V0Q29udGVudChodG1sXzdiNGEzOWJlZjhkOTQ1MGU5Zjg2MmVlYTc0MTBiNjliKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RhM2RjNWQ1YjFlMzQzNDk4NTRjMjg0OTZjZTFkNzg0LmJpbmRQb3B1cChwb3B1cF8yYjgwZDNmNDg0ZmU0Y2M3OTUxMzMzYWQ1YWZiMzkzNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80MGRkNWViNmU5MmE0MjdhOTM4MTg1MTBlOWQ1YmIyNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxMTAwODkwMjAyMDQ0LC03My45OTUxNzk5ODM4MDcyOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zNTExNGJiMDE1NTc0YjM1YWI5MmY5YmJmNTg3MGY1ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83NWJjMWQ3NDYwZjM0ZjIwODZmODA4MTJlZTljZTE4OSA9ICQoJzxkaXYgaWQ9Imh0bWxfNzViYzFkNzQ2MGYzNGYyMDg2ZjgwODEyZWU5Y2UxODkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJlbnNvbmh1cnN0LCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzUxMTRiYjAxNTU3NGIzNWFiOTJmOWJiZjU4NzBmNWYuc2V0Q29udGVudChodG1sXzc1YmMxZDc0NjBmMzRmMjA4NmY4MDgxMmVlOWNlMTg5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQwZGQ1ZWI2ZTkyYTQyN2E5MzgxODUxMGU5ZDViYjI2LmJpbmRQb3B1cChwb3B1cF8zNTExNGJiMDE1NTc0YjM1YWI5MmY5YmJmNTg3MGY1Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jMGNhZDk4ZjUxMGU0ZmI0OTE1NzdlNDEwYTE3MzRkOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0NTEwMjk0OTI1NDI5LC03NC4wMTAzMTYxODUyNzc4NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jNjcwMTBlMmVlZjM0MmM5OGYyOTc3M2UxZWY4ODhkNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85NzQzZjNmZDg0NDg0ZWYwOTg2NzExZDUxYjg3MDhmOCA9ICQoJzxkaXYgaWQ9Imh0bWxfOTc0M2YzZmQ4NDQ4NGVmMDk4NjcxMWQ1MWI4NzA4ZjgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN1bnNldCBQYXJrLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzY3MDEwZTJlZWYzNDJjOThmMjk3NzNlMWVmODg4ZDcuc2V0Q29udGVudChodG1sXzk3NDNmM2ZkODQ0ODRlZjA5ODY3MTFkNTFiODcwOGY4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2MwY2FkOThmNTEwZTRmYjQ5MTU3N2U0MTBhMTczNGQ5LmJpbmRQb3B1cChwb3B1cF9jNjcwMTBlMmVlZjM0MmM5OGYyOTc3M2UxZWY4ODhkNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82M2ZhOGUwODhjZGM0YmJkYjU5OTZkNzYwMjEyNGU0ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczMDIwMDk4NDg2NDcsLTczLjk1NDI0MDkzMTI3MzkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk5MjM0YmJkMzQzYjQ1MDZhYzQ4YWQwMDFhNjQ3MzA4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc5ZDU1NDQ3MWFhMTQxZDE4NjRlMDkxOGFkMmRjYTlhID0gJCgnPGRpdiBpZD0iaHRtbF83OWQ1NTQ0NzFhYTE0MWQxODY0ZTA5MThhZDJkY2E5YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+R3JlZW5wb2ludCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk5MjM0YmJkMzQzYjQ1MDZhYzQ4YWQwMDFhNjQ3MzA4LnNldENvbnRlbnQoaHRtbF83OWQ1NTQ0NzFhYTE0MWQxODY0ZTA5MThhZDJkY2E5YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82M2ZhOGUwODhjZGM0YmJkYjU5OTZkNzYwMjEyNGU0ZC5iaW5kUG9wdXAocG9wdXBfOTkyMzRiYmQzNDNiNDUwNmFjNDhhZDAwMWE2NDczMDgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzJjNTRlNzE4NWY2NDhlNmFjNDAwZmJhYzY5OGQ2Y2IgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41OTUyNjAwMTMwNjU5MywtNzMuOTczNDcwODc3MDg0NDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzNjMDUwZGZlNGFkNDAyZGE4OTA5MGIyYjFkYTA4OTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTc3YmQ3M2Y1YzA1NDRmMWE3MWZlMGYwNWYzNzA1MWYgPSAkKCc8ZGl2IGlkPSJodG1sXzU3N2JkNzNmNWMwNTQ0ZjFhNzFmZTBmMDVmMzcwNTFmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmF2ZXNlbmQsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83M2MwNTBkZmU0YWQ0MDJkYTg5MDkwYjJiMWRhMDg5Mi5zZXRDb250ZW50KGh0bWxfNTc3YmQ3M2Y1YzA1NDRmMWE3MWZlMGYwNWYzNzA1MWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzJjNTRlNzE4NWY2NDhlNmFjNDAwZmJhYzY5OGQ2Y2IuYmluZFBvcHVwKHBvcHVwXzczYzA1MGRmZTRhZDQwMmRhODkwOTBiMmIxZGEwODkyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ0Nzc4YmFlYTllNzQ4Mzk5ODc5NWQ3ZDkyMjIzYzJiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTc2ODI1MDY1NjY2MDQsLTczLjk2NTA5NDQ4Nzg1MzM2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUzZDhjODQyODY5YzRjMDhiMWI4MWVmNTk2M2VkYmE0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzgyOGFjNmZhYzVhZTQ5N2FhMWIxMTkzNzUzNDhhZTE3ID0gJCgnPGRpdiBpZD0iaHRtbF84MjhhYzZmYWM1YWU0OTdhYTFiMTE5Mzc1MzQ4YWUxNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJpZ2h0b24gQmVhY2gsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81M2Q4Yzg0Mjg2OWM0YzA4YjFiODFlZjU5NjNlZGJhNC5zZXRDb250ZW50KGh0bWxfODI4YWM2ZmFjNWFlNDk3YWExYjExOTM3NTM0OGFlMTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDQ3NzhiYWVhOWU3NDgzOTk4Nzk1ZDdkOTIyMjNjMmIuYmluZFBvcHVwKHBvcHVwXzUzZDhjODQyODY5YzRjMDhiMWI4MWVmNTk2M2VkYmE0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZhYTVmMDY1NzNiMzQzZDBhYTdlMWEyYTQzMzM0YzhhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTg2ODkwMTI2NzgzODQsLTczLjk0MzE4NjQwNDgyOTc5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VkMjA1YTA3OTg1YzRjZDg4YTViOTQxYWJhZWZhMjFkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM0ZGYyODgyMzY5MTRkNjJhNmEwZTFkM2Q4YTQ1NDkzID0gJCgnPGRpdiBpZD0iaHRtbF8zNGRmMjg4MjM2OTE0ZDYyYTZhMGUxZDNkOGE0NTQ5MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U2hlZXBzaGVhZCBCYXksIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lZDIwNWEwNzk4NWM0Y2Q4OGE1Yjk0MWFiYWVmYTIxZC5zZXRDb250ZW50KGh0bWxfMzRkZjI4ODIzNjkxNGQ2MmE2YTBlMWQzZDhhNDU0OTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmFhNWYwNjU3M2IzNDNkMGFhN2UxYTJhNDMzMzRjOGEuYmluZFBvcHVwKHBvcHVwX2VkMjA1YTA3OTg1YzRjZDg4YTViOTQxYWJhZWZhMjFkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg5YTljM2E2NGNkMTRmMzE4NjM2MDMwMjIwNWRmZGQyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjE0NDMyNTEzMzUwOTgsLTczLjk1NzQzODQwNTU5OTM5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U3YzQyNmFlMjIxNzQ1NGQ4YmIzNGM4NDYwNzA2ZTczID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA5MDAxNzY3ZDRjNjQ2MjE5YzY3YTNlM2UyNjE0ZDg0ID0gJCgnPGRpdiBpZD0iaHRtbF8wOTAwMTc2N2Q0YzY0NjIxOWM2N2EzZTNlMjYxNGQ4NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFuaGF0dGFuIFRlcnJhY2UsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lN2M0MjZhZTIyMTc0NTRkOGJiMzRjODQ2MDcwNmU3My5zZXRDb250ZW50KGh0bWxfMDkwMDE3NjdkNGM2NDYyMTljNjdhM2UzZTI2MTRkODQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODlhOWMzYTY0Y2QxNGYzMTg2MzYwMzAyMjA1ZGZkZDIuYmluZFBvcHVwKHBvcHVwX2U3YzQyNmFlMjIxNzQ1NGQ4YmIzNGM4NDYwNzA2ZTczKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JkNmRjZjMzYjEzOTRkYThiNjc2YjM4ODZhODFlZGU0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjM2MzI1ODkwMjY2NzcsLTczLjk1ODQwMTA2NTMzOTAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUxMTNlMzY3OWEzYjQ1OWRiNzc4NzM1Y2I1OTcwMTYwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc0YjEyMGRlMDVjMjQxN2JiYjEwM2Q0YzQ3NTYwM2ZlID0gJCgnPGRpdiBpZD0iaHRtbF83NGIxMjBkZTA1YzI0MTdiYmIxMDNkNGM0NzU2MDNmZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RmxhdGJ1c2gsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MTEzZTM2NzlhM2I0NTlkYjc3ODczNWNiNTk3MDE2MC5zZXRDb250ZW50KGh0bWxfNzRiMTIwZGUwNWMyNDE3YmJiMTAzZDRjNDc1NjAzZmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmQ2ZGNmMzNiMTM5NGRhOGI2NzZiMzg4NmE4MWVkZTQuYmluZFBvcHVwKHBvcHVwXzUxMTNlMzY3OWEzYjQ1OWRiNzc4NzM1Y2I1OTcwMTYwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2QzNjRiZDJiNjJjMjQwMDU5YmJkOWUyNmQxNzQ1YjUyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjcwODI5MTc2OTUyOTQsLTczLjk0MzI5MTE5MDczNTgyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhlZTA1OGEwZjQ2YTQyYjE5NjYyZGUyM2IyM2E5NWJkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBmZjliMTdmNzNkMDQyOTBiOWRkMGMxYzg4ZDE3ZmM4ID0gJCgnPGRpdiBpZD0iaHRtbF8wZmY5YjE3ZjczZDA0MjkwYjlkZDBjMWM4OGQxN2ZjOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q3Jvd24gSGVpZ2h0cywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhlZTA1OGEwZjQ2YTQyYjE5NjYyZGUyM2IyM2E5NWJkLnNldENvbnRlbnQoaHRtbF8wZmY5YjE3ZjczZDA0MjkwYjlkZDBjMWM4OGQxN2ZjOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kMzY0YmQyYjYyYzI0MDA1OWJiZDllMjZkMTc0NWI1Mi5iaW5kUG9wdXAocG9wdXBfOGVlMDU4YTBmNDZhNDJiMTk2NjJkZTIzYjIzYTk1YmQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzE1MmJkNTJiMDAxNDFhYzhhNThmODE1N2UyZGI3MTQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NDE3MTc3NjY2ODk2MSwtNzMuOTM2MTAyNTYxODU4MzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2VmY2U3YWU2NDA2NGQyN2I3NGU1OWFiZWUyYzk5OTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGNjMjRlYzBjMGQ0NGVjOGFlOTg1MDdiNDdjOTRhY2UgPSAkKCc8ZGl2IGlkPSJodG1sXzRjYzI0ZWMwYzBkNDRlYzhhZTk4NTA3YjQ3Yzk0YWNlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FYXN0IEZsYXRidXNoLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2VmY2U3YWU2NDA2NGQyN2I3NGU1OWFiZWUyYzk5OTMuc2V0Q29udGVudChodG1sXzRjYzI0ZWMwYzBkNDRlYzhhZTk4NTA3YjQ3Yzk0YWNlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzMxNTJiZDUyYjAwMTQxYWM4YTU4ZjgxNTdlMmRiNzE0LmJpbmRQb3B1cChwb3B1cF83ZWZjZTdhZTY0MDY0ZDI3Yjc0ZTU5YWJlZTJjOTk5Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xZTZiMjhmMGY0MWM0MWVkYWU0YmM0NGYzY2I3ZWE3OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0MjM4MTk1ODAwMzUyNiwtNzMuOTgwNDIxMTA1NTk0NzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDUwMTA2MzE3ZWMwNGZkYWI5M2Y3ZTM2Mjg1OGFjY2IgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjI3MGI1ZjA0NjI5NDE5Njk3ODIzMDc1NTYyYmE4YzMgPSAkKCc8ZGl2IGlkPSJodG1sXzYyNzBiNWYwNDYyOTQxOTY5NzgyMzA3NTU2MmJhOGMzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5LZW5zaW5ndG9uLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDUwMTA2MzE3ZWMwNGZkYWI5M2Y3ZTM2Mjg1OGFjY2Iuc2V0Q29udGVudChodG1sXzYyNzBiNWYwNDYyOTQxOTY5NzgyMzA3NTU2MmJhOGMzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzFlNmIyOGYwZjQxYzQxZWRhZTRiYzQ0ZjNjYjdlYTc5LmJpbmRQb3B1cChwb3B1cF9kNTAxMDYzMTdlYzA0ZmRhYjkzZjdlMzYyODU4YWNjYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iMDcyOTdhZTg0MWQ0MTJkYWUxNjNlODA2MWJiODhkNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY1Njk0NTgzNTc1MTA0LC03My45ODAwNzM0MDQzMDE3Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81ODUxNmZjMTIzMDQ0OTdmYTNlMTY3ZjgwNTE1OWJkNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81NWU2NjJiYTQxOTI0Mjc0OTExZmE0NmNhYmEzMTgwMyA9ICQoJzxkaXYgaWQ9Imh0bWxfNTVlNjYyYmE0MTkyNDI3NDkxMWZhNDZjYWJhMzE4MDMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldpbmRzb3IgVGVycmFjZSwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU4NTE2ZmMxMjMwNDQ5N2ZhM2UxNjdmODA1MTU5YmQ0LnNldENvbnRlbnQoaHRtbF81NWU2NjJiYTQxOTI0Mjc0OTExZmE0NmNhYmEzMTgwMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iMDcyOTdhZTg0MWQ0MTJkYWUxNjNlODA2MWJiODhkNS5iaW5kUG9wdXAocG9wdXBfNTg1MTZmYzEyMzA0NDk3ZmEzZTE2N2Y4MDUxNTliZDQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGMyMjVlYTljMGY5NDUwY2FlMjhiMjFjNmNhMWU5ZGIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NzY4MjIyNjIyNTQ3MjQsLTczLjk2NDg1OTI0MjYyNjldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjVkODIzNGU0MjMxNDBkMGFmNWM3ZTIzYmM0YzdmMWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmRmZWYzZjYyNmEwNGVjNTkzZTNmNzE4NzI0M2JiYTUgPSAkKCc8ZGl2IGlkPSJodG1sXzZkZmVmM2Y2MjZhMDRlYzU5M2UzZjcxODcyNDNiYmE1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Qcm9zcGVjdCBIZWlnaHRzLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjVkODIzNGU0MjMxNDBkMGFmNWM3ZTIzYmM0YzdmMWIuc2V0Q29udGVudChodG1sXzZkZmVmM2Y2MjZhMDRlYzU5M2UzZjcxODcyNDNiYmE1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhjMjI1ZWE5YzBmOTQ1MGNhZTI4YjIxYzZjYTFlOWRiLmJpbmRQb3B1cChwb3B1cF82NWQ4MjM0ZTQyMzE0MGQwYWY1YzdlMjNiYzRjN2YxYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81NzVhZGM1MjVhNzk0OWJlODBlMWI3ZTE1NTc3NDdjYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY2Mzk0OTk0MzM5NzU1LC03My45MTAyMzUzNjE3NjYwN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hM2IwMmExYWRmNzU0YTAxOWIzZjk5YmM1MmVmMDFhMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mZTE1OGUzMjcyMmQ0MDViYjZmNWRkNmY0MmQzZWY4YiA9ICQoJzxkaXYgaWQ9Imh0bWxfZmUxNThlMzI3MjJkNDA1YmI2ZjVkZDZmNDJkM2VmOGIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJyb3duc3ZpbGxlLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTNiMDJhMWFkZjc1NGEwMTliM2Y5OWJjNTJlZjAxYTAuc2V0Q29udGVudChodG1sX2ZlMTU4ZTMyNzIyZDQwNWJiNmY1ZGQ2ZjQyZDNlZjhiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzU3NWFkYzUyNWE3OTQ5YmU4MGUxYjdlMTU1Nzc0N2NiLmJpbmRQb3B1cChwb3B1cF9hM2IwMmExYWRmNzU0YTAxOWIzZjk5YmM1MmVmMDFhMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wNGEwNzE4N2Y4MTI0MWZkYmM2NjcyOWY2YWUxZDkwOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcwNzE0NDM5MzQ0MjUxLC03My45NTgxMTUyOTIyMDkyN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xNTQzMzZlY2VmMzI0OTdmOTU3YWFjZmMzZTEyZjQ1YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zMTdjYjFjOTAzZmU0MDhjOTI5YjNiYzllMGRiZTQ4ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfMzE3Y2IxYzkwM2ZlNDA4YzkyOWIzYmM5ZTBkYmU0OGUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldpbGxpYW1zYnVyZywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE1NDMzNmVjZWYzMjQ5N2Y5NTdhYWNmYzNlMTJmNDVjLnNldENvbnRlbnQoaHRtbF8zMTdjYjFjOTAzZmU0MDhjOTI5YjNiYzllMGRiZTQ4ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wNGEwNzE4N2Y4MTI0MWZkYmM2NjcyOWY2YWUxZDkwOS5iaW5kUG9wdXAocG9wdXBfMTU0MzM2ZWNlZjMyNDk3Zjk1N2FhY2ZjM2UxMmY0NWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWE5ODY0YjlmMzBiNDY0MDhjZjgzZjRkYmNhMGQ3YmUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42OTgxMTYxMTAxNzkwMSwtNzMuOTI1MjU3OTc0ODcwNDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2ZlNzFhMjIzOTRiNDQ5OWFiYzhkNDIwNDM5MTIyYzkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTQ5M2ZhZWU4OGFlNDMwNTgyYTc0ZDJhOTMxNzZjZWIgPSAkKCc8ZGl2IGlkPSJodG1sXzU0OTNmYWVlODhhZTQzMDU4MmE3NGQyYTkzMTc2Y2ViIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CdXNod2ljaywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdmZTcxYTIyMzk0YjQ0OTlhYmM4ZDQyMDQzOTEyMmM5LnNldENvbnRlbnQoaHRtbF81NDkzZmFlZTg4YWU0MzA1ODJhNzRkMmE5MzE3NmNlYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81YTk4NjRiOWYzMGI0NjQwOGNmODNmNGRiY2EwZDdiZS5iaW5kUG9wdXAocG9wdXBfN2ZlNzFhMjIzOTRiNDQ5OWFiYzhkNDIwNDM5MTIyYzkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWFhOWIyZmVjOWJiNDA4ZjgwZDczMDMzNmJkYTAwMWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42ODcyMzE2MDc3MjA0NTYsLTczLjk0MTc4NDg4NjkwMjk3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MzOGNlZjliOTZmMDQ5NTI5ZTZjMmIzY2JiMzQ4MWY0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdmYmU4OTE3Mzg0MzQ0MWI5NjY1YmU5MTQwZTQzNzBkID0gJCgnPGRpdiBpZD0iaHRtbF83ZmJlODkxNzM4NDM0NDFiOTY2NWJlOTE0MGU0MzcwZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmVkZm9yZCBTdHV5dmVzYW50LCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzM4Y2VmOWI5NmYwNDk1MjllNmMyYjNjYmIzNDgxZjQuc2V0Q29udGVudChodG1sXzdmYmU4OTE3Mzg0MzQ0MWI5NjY1YmU5MTQwZTQzNzBkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2FhYTliMmZlYzliYjQwOGY4MGQ3MzAzMzZiZGEwMDFjLmJpbmRQb3B1cChwb3B1cF9jMzhjZWY5Yjk2ZjA0OTUyOWU2YzJiM2NiYjM0ODFmNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80ZTlhMzM5YmE2N2Y0NzVhOWRhYTIzNzg2ZTdiMTU4NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY5NTg2MzcyMjcyNDA4NCwtNzMuOTkzNzgyMjU0OTY0MjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDU1ZDQ2ZTBlOTliNGNjZWJlZjhlNWQ4MmI4ZDFiODQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzNiN2E1NGVhMDhmNDQ3ODk5ZDkwMjlhYTZmOTI0MDkgPSAkKCc8ZGl2IGlkPSJodG1sXzczYjdhNTRlYTA4ZjQ0Nzg5OWQ5MDI5YWE2ZjkyNDA5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ccm9va2x5biBIZWlnaHRzLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDU1ZDQ2ZTBlOTliNGNjZWJlZjhlNWQ4MmI4ZDFiODQuc2V0Q29udGVudChodG1sXzczYjdhNTRlYTA4ZjQ0Nzg5OWQ5MDI5YWE2ZjkyNDA5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzRlOWEzMzliYTY3ZjQ3NWE5ZGFhMjM3ODZlN2IxNTg1LmJpbmRQb3B1cChwb3B1cF9kNTVkNDZlMGU5OWI0Y2NlYmVmOGU1ZDgyYjhkMWI4NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMDUyMjUyZGQ4NmY0Y2EwOGQyNzBjMzkxOGUxNWI3YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY4NzkxOTcyMjQ4NTU3NCwtNzMuOTk4NTYxMzkyMTg0NjNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTJhZGUyMGQ0ZTk4NDQ5MWFhNDY1OTAzNGM0MDI1MzIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmY0MGIyNWY5YTI2NDk1Njg0MzdkMDc1MjA3YTAwMTAgPSAkKCc8ZGl2IGlkPSJodG1sX2JmNDBiMjVmOWEyNjQ5NTY4NDM3ZDA3NTIwN2EwMDEwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Db2JibGUgSGlsbCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzUyYWRlMjBkNGU5ODQ0OTFhYTQ2NTkwMzRjNDAyNTMyLnNldENvbnRlbnQoaHRtbF9iZjQwYjI1ZjlhMjY0OTU2ODQzN2QwNzUyMDdhMDAxMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mMDUyMjUyZGQ4NmY0Y2EwOGQyNzBjMzkxOGUxNWI3YS5iaW5kUG9wdXAocG9wdXBfNTJhZGUyMGQ0ZTk4NDQ5MWFhNDY1OTAzNGM0MDI1MzIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODYyNjQ0ZThjNzVlNGJiNmFiYzYwZGJkMTJjN2YzZmIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42ODA1NDAyMzEwNzY0ODUsLTczLjk5NDY1MzcyODI4MDA2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU3OGZmOTlkODlkOTQxNDU4YTI2OTZjZThjOTA1MTI2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzUxZTE2ZjJjYzA2NDRjZWNhZWE1OGQ3MzVmODQ1ZGI2ID0gJCgnPGRpdiBpZD0iaHRtbF81MWUxNmYyY2MwNjQ0Y2VjYWVhNThkNzM1Zjg0NWRiNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2Fycm9sbCBHYXJkZW5zLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTc4ZmY5OWQ4OWQ5NDE0NThhMjY5NmNlOGM5MDUxMjYuc2V0Q29udGVudChodG1sXzUxZTE2ZjJjYzA2NDRjZWNhZWE1OGQ3MzVmODQ1ZGI2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg2MjY0NGU4Yzc1ZTRiYjZhYmM2MGRiZDEyYzdmM2ZiLmJpbmRQb3B1cChwb3B1cF81NzhmZjk5ZDg5ZDk0MTQ1OGEyNjk2Y2U4YzkwNTEyNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wNjYzMTYwMTdiZTQ0ODZkODE4MDVlMmU0NTUyODFjZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY3NjI1MzIzMDI1MDg4NiwtNzQuMDEyNzU4OTc0NzM1Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zMzM1OTU1OWY2Yzk0MGEwOTYzY2Q5MDIzZWMxMzk4MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83YTBlZjkyZTdlMDM0NjFkYTRkNzhmZDFlODU4ZDBiZiA9ICQoJzxkaXYgaWQ9Imh0bWxfN2EwZWY5MmU3ZTAzNDYxZGE0ZDc4ZmQxZTg1OGQwYmYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJlZCBIb29rLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzMzNTk1NTlmNmM5NDBhMDk2M2NkOTAyM2VjMTM5ODEuc2V0Q29udGVudChodG1sXzdhMGVmOTJlN2UwMzQ2MWRhNGQ3OGZkMWU4NThkMGJmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA2NjMxNjAxN2JlNDQ4NmQ4MTgwNWUyZTQ1NTI4MWNkLmJpbmRQb3B1cChwb3B1cF8zMzM1OTU1OWY2Yzk0MGEwOTYzY2Q5MDIzZWMxMzk4MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iYmJkYjk1YTJmNmE0NTNhOTE2YjE2ZDQ3YTNiMzkwMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY3MzkzMTE0MzE4NzE1NCwtNzMuOTk0NDQwODcxNDUzMzldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTg0NTk2NzgwZTg5NGEwMjk4MjA2OWQ3OGYzNmE4ZjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTk1YmJhM2Y3MGY5NGE1ODhhNzliMzNhYjAwYTVmYmMgPSAkKCc8ZGl2IGlkPSJodG1sX2U5NWJiYTNmNzBmOTRhNTg4YTc5YjMzYWIwMGE1ZmJjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Hb3dhbnVzLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTg0NTk2NzgwZTg5NGEwMjk4MjA2OWQ3OGYzNmE4ZjUuc2V0Q29udGVudChodG1sX2U5NWJiYTNmNzBmOTRhNTg4YTc5YjMzYWIwMGE1ZmJjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JiYmRiOTVhMmY2YTQ1M2E5MTZiMTZkNDdhM2IzOTAzLmJpbmRQb3B1cChwb3B1cF9hODQ1OTY3ODBlODk0YTAyOTgyMDY5ZDc4ZjM2YThmNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83ODEwNWI2NTA0ZWI0MDY3YWZhMzdkYzJjZTg4YzZhNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY4ODUyNzI2MDE4OTc3LC03My45NzI5MDU3NDM2OTA5Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMDMxYWU4NDUwMzY0ODNjODY2ZDVmZWRmMzBkNzliMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82OTllYWQ2NDc5YWI0MjhjYWI2ZWFjYWJjZjdlMTMwMCA9ICQoJzxkaXYgaWQ9Imh0bWxfNjk5ZWFkNjQ3OWFiNDI4Y2FiNmVhY2FiY2Y3ZTEzMDAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZvcnQgR3JlZW5lLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjAzMWFlODQ1MDM2NDgzYzg2NmQ1ZmVkZjMwZDc5YjEuc2V0Q29udGVudChodG1sXzY5OWVhZDY0NzlhYjQyOGNhYjZlYWNhYmNmN2UxMzAwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzc4MTA1YjY1MDRlYjQwNjdhZmEzN2RjMmNlODhjNmE2LmJpbmRQb3B1cChwb3B1cF9iMDMxYWU4NDUwMzY0ODNjODY2ZDVmZWRmMzBkNzliMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80ZWQzYmU4NDYzY2M0YmI5OGNiYzgyODhhNDhjZDJhOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY3MjMyMDUyMjY4MTk3LC03My45NzcwNTAzMDE4MzkyNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84YTMwNWE3N2U2YjQ0NGUxOTdjYTI3MTczYjNhNWQyMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iYmU1MzAwZTAxYjk0N2E5YjA3MTM1MDVjZWE1ZDgwNiA9ICQoJzxkaXYgaWQ9Imh0bWxfYmJlNTMwMGUwMWI5NDdhOWIwNzEzNTA1Y2VhNWQ4MDYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBhcmsgU2xvcGUsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84YTMwNWE3N2U2YjQ0NGUxOTdjYTI3MTczYjNhNWQyMC5zZXRDb250ZW50KGh0bWxfYmJlNTMwMGUwMWI5NDdhOWIwNzEzNTA1Y2VhNWQ4MDYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGVkM2JlODQ2M2NjNGJiOThjYmM4Mjg4YTQ4Y2QyYTguYmluZFBvcHVwKHBvcHVwXzhhMzA1YTc3ZTZiNDQ0ZTE5N2NhMjcxNzNiM2E1ZDIwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IwOTgxZDlhMDQ1MjQ2ZjJiOTc3ODA5Mzk5ZjRlZGNkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjgyMzkxMDExNDQyMTEsLTczLjg3NjYxNTk2NDU3Mjk2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY5MzJmNDcwMjAwMjQyYmI5N2IyNzg4YTg0NGRkMWU5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzljZmVkOTNjNWEwODQ2ZjZhODBmZTBhYWFiODhjNDA5ID0gJCgnPGRpdiBpZD0iaHRtbF85Y2ZlZDkzYzVhMDg0NmY2YTgwZmUwYWFhYjg4YzQwOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q3lwcmVzcyBIaWxscywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY5MzJmNDcwMjAwMjQyYmI5N2IyNzg4YTg0NGRkMWU5LnNldENvbnRlbnQoaHRtbF85Y2ZlZDkzYzVhMDg0NmY2YTgwZmUwYWFhYjg4YzQwOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iMDk4MWQ5YTA0NTI0NmYyYjk3NzgwOTM5OWY0ZWRjZC5iaW5kUG9wdXAocG9wdXBfNjkzMmY0NzAyMDAyNDJiYjk3YjI3ODhhODQ0ZGQxZTkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWY0ODBlMzU2MWI0NDQ1MjgwYmI3ZDgyNWMxOGU1ZmIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42Njk5MjU3MDA4NDcwNDUsLTczLjg4MDY5ODYzOTE3MzY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FlMDdkNTAxMjM3ODQ4YzRhZTQ0ZmRjMzUxYTk0YWIzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzlmNzAwYWJiZTA5MzQxYjFiODA3YTk2NDA5YTQxM2JhID0gJCgnPGRpdiBpZD0iaHRtbF85ZjcwMGFiYmUwOTM0MWIxYjgwN2E5NjQwOWE0MTNiYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWFzdCBOZXcgWW9yaywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FlMDdkNTAxMjM3ODQ4YzRhZTQ0ZmRjMzUxYTk0YWIzLnNldENvbnRlbnQoaHRtbF85ZjcwMGFiYmUwOTM0MWIxYjgwN2E5NjQwOWE0MTNiYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xZjQ4MGUzNTYxYjQ0NDUyODBiYjdkODI1YzE4ZTVmYi5iaW5kUG9wdXAocG9wdXBfYWUwN2Q1MDEyMzc4NDhjNGFlNDRmZGMzNTFhOTRhYjMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDhkODQ3OGMyYTdiNDcxYThhNzFjMzJkZTliNzliMzIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NDc1ODkwNTIzMDg3NCwtNzMuODc5MzY5NzAwNDU4NzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTdkYTUxNzdkMDg0NGNmY2ExNDU2MDhiNGRhZTZkNGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGMzMWMwNTg2MWE4NDZjN2EyOWU1MjVlNDk0YjE0MTMgPSAkKCc8ZGl2IGlkPSJodG1sXzRjMzFjMDU4NjFhODQ2YzdhMjllNTI1ZTQ5NGIxNDEzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdGFycmV0dCBDaXR5LCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTdkYTUxNzdkMDg0NGNmY2ExNDU2MDhiNGRhZTZkNGIuc2V0Q29udGVudChodG1sXzRjMzFjMDU4NjFhODQ2YzdhMjllNTI1ZTQ5NGIxNDEzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ4ZDg0NzhjMmE3YjQ3MWE4YTcxYzMyZGU5Yjc5YjMyLmJpbmRQb3B1cChwb3B1cF81N2RhNTE3N2QwODQ0Y2ZjYTE0NTYwOGI0ZGFlNmQ0Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81YTU4ODY0OGI4YmE0NDczYWIwNDY2ZmRkYmY3ZWMzYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYzNTU2NDMyNzk3NDI4LC03My45MDIwOTI2OTc3ODk2Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xYzZhNjM5NjBhOTY0OTFjOWRhOGQxZGY1ODBjNDVlMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jM2Q5MDYwNDI2ZmE0MjFjODAxZDY0MDhkZWM4MjRhMCA9ICQoJzxkaXYgaWQ9Imh0bWxfYzNkOTA2MDQyNmZhNDIxYzgwMWQ2NDA4ZGVjODI0YTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNhbmFyc2llLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWM2YTYzOTYwYTk2NDkxYzlkYThkMWRmNTgwYzQ1ZTAuc2V0Q29udGVudChodG1sX2MzZDkwNjA0MjZmYTQyMWM4MDFkNjQwOGRlYzgyNGEwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzVhNTg4NjQ4YjhiYTQ0NzNhYjA0NjZmZGRiZjdlYzNhLmJpbmRQb3B1cChwb3B1cF8xYzZhNjM5NjBhOTY0OTFjOWRhOGQxZGY1ODBjNDVlMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wMmNiZGUzYzUwOTA0NzExOWE2MTA0MWQ4MDRmYTE5MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYzMDQ0NjA0Mzc1NzQ2NiwtNzMuOTI5MTEzMDI2NDQ2NzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWEwYzQyMjJiNTg5NGJhNTlhYzg3NWJiODNhZjhkZGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjc1M2NiN2FiNWQ3NGY1ZmIyMjc5NWY1ZWU4MzlkYzYgPSAkKCc8ZGl2IGlkPSJodG1sX2Y3NTNjYjdhYjVkNzRmNWZiMjI3OTVmNWVlODM5ZGM2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GbGF0bGFuZHMsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85YTBjNDIyMmI1ODk0YmE1OWFjODc1YmI4M2FmOGRkYS5zZXRDb250ZW50KGh0bWxfZjc1M2NiN2FiNWQ3NGY1ZmIyMjc5NWY1ZWU4MzlkYzYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDJjYmRlM2M1MDkwNDcxMTlhNjEwNDFkODA0ZmExOTAuYmluZFBvcHVwKHBvcHVwXzlhMGM0MjIyYjU4OTRiYTU5YWM4NzViYjgzYWY4ZGRhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E3YmVkMzhhZjk1NTRjYzU4M2QwMzBiOGRmNmE1M2VjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA2MzM2NDIxNjg1NjI2LC03My45MDgxODU3MTc3NzQyM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mMmUxY2EzOTA3Y2M0Yjc1YTA5NzdiN2RjMzkwMTQ1ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wNDg5M2NjMzg2MmM0NjBiOTgxNjkzNzA3YzAyYWRkNiA9ICQoJzxkaXYgaWQ9Imh0bWxfMDQ4OTNjYzM4NjJjNDYwYjk4MTY5MzcwN2MwMmFkZDYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1pbGwgSXNsYW5kLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjJlMWNhMzkwN2NjNGI3NWEwOTc3YjdkYzM5MDE0NWYuc2V0Q29udGVudChodG1sXzA0ODkzY2MzODYyYzQ2MGI5ODE2OTM3MDdjMDJhZGQ2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2E3YmVkMzhhZjk1NTRjYzU4M2QwMzBiOGRmNmE1M2VjLmJpbmRQb3B1cChwb3B1cF9mMmUxY2EzOTA3Y2M0Yjc1YTA5NzdiN2RjMzkwMTQ1Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jMjYwZmJmZGU4ZDM0ODZhYWJjZDQ0YWVjMTEwYmU1NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU3NzkxMzUwMzA4NjU3LC03My45NDM1MzcyMjg5MTg4Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wY2JlOTRkOWNkNGU0MGNiODYzMDMxOWM5MTU0ZDk0YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMzdmMDg4OTc1OTY0YjkwOTQwNzhjZjYxMGIyNjYzZCA9ICQoJzxkaXYgaWQ9Imh0bWxfZjM3ZjA4ODk3NTk2NGI5MDk0MDc4Y2Y2MTBiMjY2M2QiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1hbmhhdHRhbiBCZWFjaCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBjYmU5NGQ5Y2Q0ZTQwY2I4NjMwMzE5YzkxNTRkOTRhLnNldENvbnRlbnQoaHRtbF9mMzdmMDg4OTc1OTY0YjkwOTQwNzhjZjYxMGIyNjYzZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jMjYwZmJmZGU4ZDM0ODZhYWJjZDQ0YWVjMTEwYmU1NS5iaW5kUG9wdXAocG9wdXBfMGNiZTk0ZDljZDRlNDBjYjg2MzAzMTljOTE1NGQ5NGEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmJiZTJmYzhjMjRlNGMwYWFkMGNiYjMwY2NkMDk2YjcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41NzQyOTI1NjQ3MTYwMSwtNzMuOTg4NjgyOTU4MjE2MzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWY2ZmI5OGVjZmEyNGRmY2FmZjFjMTBmMmU3NDU1MTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzgwMTZkNzBjMDQwNDA5Nzk5MmM4ZTYxY2RmYjYyMGQgPSAkKCc8ZGl2IGlkPSJodG1sXzc4MDE2ZDcwYzA0MDQwOTc5OTJjOGU2MWNkZmI2MjBkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Db25leSBJc2xhbmQsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xZjZmYjk4ZWNmYTI0ZGZjYWZmMWMxMGYyZTc0NTUxNC5zZXRDb250ZW50KGh0bWxfNzgwMTZkNzBjMDQwNDA5Nzk5MmM4ZTYxY2RmYjYyMGQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmJiZTJmYzhjMjRlNGMwYWFkMGNiYjMwY2NkMDk2YjcuYmluZFBvcHVwKHBvcHVwXzFmNmZiOThlY2ZhMjRkZmNhZmYxYzEwZjJlNzQ1NTE0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNkYWI0ZDU0ZGU0OTRhMmRhYmJhMTU4MjVkMDY3NmI5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTk5NTE4NzAyODIyMzgsLTczLjk5ODc1MjIxNDQzNTE5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhlYWE2NDQ1MDg5MjQwYTQ4MTUxYmU2ZmE4NmY3NDcxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBjZjc5MGIxMjg4OTQzNzJhODlmZjE3MTgzNDRmMWI4ID0gJCgnPGRpdiBpZD0iaHRtbF8wY2Y3OTBiMTI4ODk0MzcyYTg5ZmYxNzE4MzQ0ZjFiOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF0aCBCZWFjaCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhlYWE2NDQ1MDg5MjQwYTQ4MTUxYmU2ZmE4NmY3NDcxLnNldENvbnRlbnQoaHRtbF8wY2Y3OTBiMTI4ODk0MzcyYTg5ZmYxNzE4MzQ0ZjFiOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zZGFiNGQ1NGRlNDk0YTJkYWJiYTE1ODI1ZDA2NzZiOS5iaW5kUG9wdXAocG9wdXBfOGVhYTY0NDUwODkyNDBhNDgxNTFiZTZmYTg2Zjc0NzEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmQzMGQzMTAwZDM0NDRmMmFlOGY5MTFlMjZkNTIwNDUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MzMxMzA1MTI3NTgwMTUsLTczLjk5MDQ5ODIzMDQ0ODExXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ1MTk3MjgyMDZmNzQyNTk4YzljODA1MGY3YWVlNzU3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JmYmIyOTM2NTViYTQ5NGE4ZjFlY2ZmOTFhNzE5YmE2ID0gJCgnPGRpdiBpZD0iaHRtbF9iZmJiMjkzNjU1YmE0OTRhOGYxZWNmZjkxYTcxOWJhNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Qm9yb3VnaCBQYXJrLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDUxOTcyODIwNmY3NDI1OThjOWM4MDUwZjdhZWU3NTcuc2V0Q29udGVudChodG1sX2JmYmIyOTM2NTViYTQ5NGE4ZjFlY2ZmOTFhNzE5YmE2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZkMzBkMzEwMGQzNDQ0ZjJhZThmOTExZTI2ZDUyMDQ1LmJpbmRQb3B1cChwb3B1cF80NTE5NzI4MjA2Zjc0MjU5OGM5YzgwNTBmN2FlZTc1Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83OTdlYWE1ZGM2OGU0NDY2YjQ0MWIzNTQxMDQwZjU5ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxOTIxOTQ1NzcyMjYzNiwtNzQuMDE5MzEzNzU2MzYwMjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzU5YWE0YWZiMTVmNDcwMjllNTAzZWY3YjMzNzJmYzkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWFmNzdjMjM2ZGViNDFlNjhkNWQ4MWNmMThhMDcyNjAgPSAkKCc8ZGl2IGlkPSJodG1sXzVhZjc3YzIzNmRlYjQxZTY4ZDVkODFjZjE4YTA3MjYwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EeWtlciBIZWlnaHRzLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzU5YWE0YWZiMTVmNDcwMjllNTAzZWY3YjMzNzJmYzkuc2V0Q29udGVudChodG1sXzVhZjc3YzIzNmRlYjQxZTY4ZDVkODFjZjE4YTA3MjYwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzc5N2VhYTVkYzY4ZTQ0NjZiNDQxYjM1NDEwNDBmNTlmLmJpbmRQb3B1cChwb3B1cF8zNTlhYTRhZmIxNWY0NzAyOWU1MDNlZjdiMzM3MmZjOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82MjE0NzZlNjE4NGQ0YjU5YTE0ZGRjZjUzNWQzOGM1MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU5MDg0ODQzMzkwMjA0NiwtNzMuOTMwMTAxNzA2OTExOTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGIxMTMzZWEwY2I4NDhiZDgwMTYzNjQ0ZTBhNDg5NzMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWM4MDFmNGUzZDY3NDExOGFlZTY5ZDYwZTVmMjJiYTkgPSAkKCc8ZGl2IGlkPSJodG1sXzVjODAxZjRlM2Q2NzQxMThhZWU2OWQ2MGU1ZjIyYmE5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HZXJyaXRzZW4gQmVhY2gsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80YjExMzNlYTBjYjg0OGJkODAxNjM2NDRlMGE0ODk3My5zZXRDb250ZW50KGh0bWxfNWM4MDFmNGUzZDY3NDExOGFlZTY5ZDYwZTVmMjJiYTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjIxNDc2ZTYxODRkNGI1OWExNGRkY2Y1MzVkMzhjNTEuYmluZFBvcHVwKHBvcHVwXzRiMTEzM2VhMGNiODQ4YmQ4MDE2MzY0NGUwYTQ4OTczKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzMzNTA1ZmQ0Yjg1NzRhNjU4MmIyYTBiNDFiZGQyNjUyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA5NzQ3Nzc5ODk0NjA0LC03My45MzEzNDQwNDEwODQ5N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zNjU3ZjgyNDVmNzE0NWNmYTgyZDNiMDIzMDgxYTRlYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85YzBiNmQ3YjBlYzM0YTdhYTU4MDZhMGViNzZkODAxMiA9ICQoJzxkaXYgaWQ9Imh0bWxfOWMwYjZkN2IwZWMzNGE3YWE1ODA2YTBlYjc2ZDgwMTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1hcmluZSBQYXJrLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzY1N2Y4MjQ1ZjcxNDVjZmE4MmQzYjAyMzA4MWE0ZWMuc2V0Q29udGVudChodG1sXzljMGI2ZDdiMGVjMzRhN2FhNTgwNmEwZWI3NmQ4MDEyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzMzNTA1ZmQ0Yjg1NzRhNjU4MmIyYTBiNDFiZGQyNjUyLmJpbmRQb3B1cChwb3B1cF8zNjU3ZjgyNDVmNzE0NWNmYTgyZDNiMDIzMDgxYTRlYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jNzQxY2Y2ODRkYjg0ZjkxODNjNGEyYmVjZDVlMmU2ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY5MzIyOTQyMTg4MTUwNCwtNzMuOTY3ODQzMDYyMTYzNjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjdjODg0OTFkYjdkNGZhN2IxNWIyNmQ1ZjNhZDE1NjYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzE4ZGJjZTlhMDA0NDNiZDk1MzliZmZiMzZjZmE1ZWQgPSAkKCc8ZGl2IGlkPSJodG1sXzMxOGRiY2U5YTAwNDQzYmQ5NTM5YmZmYjM2Y2ZhNWVkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGludG9uIEhpbGwsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mN2M4ODQ5MWRiN2Q0ZmE3YjE1YjI2ZDVmM2FkMTU2Ni5zZXRDb250ZW50KGh0bWxfMzE4ZGJjZTlhMDA0NDNiZDk1MzliZmZiMzZjZmE1ZWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzc0MWNmNjg0ZGI4NGY5MTgzYzRhMmJlY2Q1ZTJlNmUuYmluZFBvcHVwKHBvcHVwX2Y3Yzg4NDkxZGI3ZDRmYTdiMTViMjZkNWYzYWQxNTY2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzllOGE0ZjI3OGZjYTQxN2JhYmM2NmI0YzFiZDYzMDAwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTc2Mzc1Mzc4OTAyMjQsLTc0LjAwNzg3MzExMjAwMjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmFhMzZkZGJiMjhmNDZhODkyM2RiN2IzNDgzOWExYTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTIyNjNhZTM4YWE2NDZkM2E1NWZkN2RlY2VhYjE2M2QgPSAkKCc8ZGl2IGlkPSJodG1sX2EyMjYzYWUzOGFhNjQ2ZDNhNTVmZDdkZWNlYWIxNjNkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TZWEgR2F0ZSwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JhYTM2ZGRiYjI4ZjQ2YTg5MjNkYjdiMzQ4MzlhMWE0LnNldENvbnRlbnQoaHRtbF9hMjI2M2FlMzhhYTY0NmQzYTU1ZmQ3ZGVjZWFiMTYzZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85ZThhNGYyNzhmY2E0MTdiYWJjNjZiNGMxYmQ2MzAwMC5iaW5kUG9wdXAocG9wdXBfYmFhMzZkZGJiMjhmNDZhODkyM2RiN2IzNDgzOWExYTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWQyMGVlYWJmZGJjNDM0MGFjODFlMjg5ZmY0NDA2ZWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42OTA4NDQwMjEwOTgwMiwtNzMuOTgzNDYzMzc0MzEwOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjg5MzFhYjA4NjhlNDQ3YjljODIyY2I1M2UzOTJkZWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWVhNzY3MDcyODI2NGM2MmJhYThjYzhjYTUxYjY1YzggPSAkKCc8ZGl2IGlkPSJodG1sXzllYTc2NzA3MjgyNjRjNjJiYWE4Y2M4Y2E1MWI2NWM4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Eb3dudG93biwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI4OTMxYWIwODY4ZTQ0N2I5YzgyMmNiNTNlMzkyZGVlLnNldENvbnRlbnQoaHRtbF85ZWE3NjcwNzI4MjY0YzYyYmFhOGNjOGNhNTFiNjVjOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hZDIwZWVhYmZkYmM0MzQwYWM4MWUyODlmZjQ0MDZlZi5iaW5kUG9wdXAocG9wdXBfMjg5MzFhYjA4NjhlNDQ3YjljODIyY2I1M2UzOTJkZWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDlkNDhiYzgzYzI5NDJjNGI4MmUzNDRhY2E4NzA3Y2QgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42ODU2ODI5MTIwOTE0NDQsLTczLjk4Mzc0ODI0MTE1Nzk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E3NzQ3NWRkZWNkYzRhMjM4NzYwNmYwY2I2MGM0MTNmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZlNmE5YTJiNzFjNjRkMDFhMGUzNTI3OGU4ODQ4OTg4ID0gJCgnPGRpdiBpZD0iaHRtbF9mZTZhOWEyYjcxYzY0ZDAxYTBlMzUyNzhlODg0ODk4OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Qm9lcnVtIEhpbGwsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hNzc0NzVkZGVjZGM0YTIzODc2MDZmMGNiNjBjNDEzZi5zZXRDb250ZW50KGh0bWxfZmU2YTlhMmI3MWM2NGQwMWEwZTM1Mjc4ZTg4NDg5ODgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDlkNDhiYzgzYzI5NDJjNGI4MmUzNDRhY2E4NzA3Y2QuYmluZFBvcHVwKHBvcHVwX2E3NzQ3NWRkZWNkYzRhMjM4NzYwNmYwY2I2MGM0MTNmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc0NzM5YmRmZjlkYzRmOGFhMTE0MmE0MjY1MzdmMmMwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjU4NDIwMDE3NDY5ODE1LC03My45NTQ4OTg2NzA3NzcxM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zYTRlN2Y0NmVjOGY0YjVhOWYxMTQzNzczZGM3MzJmOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84NzExYTgwMTM4YmY0MjFkODg1NTdjOGFkMDRjZTc4MiA9ICQoJzxkaXYgaWQ9Imh0bWxfODcxMWE4MDEzOGJmNDIxZDg4NTU3YzhhZDA0Y2U3ODIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlByb3NwZWN0IExlZmZlcnRzIEdhcmRlbnMsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zYTRlN2Y0NmVjOGY0YjVhOWYxMTQzNzczZGM3MzJmOS5zZXRDb250ZW50KGh0bWxfODcxMWE4MDEzOGJmNDIxZDg4NTU3YzhhZDA0Y2U3ODIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzQ3MzliZGZmOWRjNGY4YWExMTQyYTQyNjUzN2YyYzAuYmluZFBvcHVwKHBvcHVwXzNhNGU3ZjQ2ZWM4ZjRiNWE5ZjExNDM3NzNkYzczMmY5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RjYTI4ZWYxYzE0OTQwMzk4ZTdiODgwYjAxOTc4NDY4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjc4NDAyNTU0Nzk1MzU1LC03My45MTMwNjgzMTc4NzM5NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85OTA3NmEzODkwMDA0YWU0OWQ0OTc3OTFlMTlkZGJiZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iOTgyNjI5MTRiZDQ0Yzc3OGRkN2I0ZTJiZWRkNzU2ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfYjk4MjYyOTE0YmQ0NGM3NzhkZDdiNGUyYmVkZDc1NmQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9jZWFuIEhpbGwsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85OTA3NmEzODkwMDA0YWU0OWQ0OTc3OTFlMTlkZGJiZi5zZXRDb250ZW50KGh0bWxfYjk4MjYyOTE0YmQ0NGM3NzhkZDdiNGUyYmVkZDc1NmQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGNhMjhlZjFjMTQ5NDAzOThlN2I4ODBiMDE5Nzg0NjguYmluZFBvcHVwKHBvcHVwXzk5MDc2YTM4OTAwMDRhZTQ5ZDQ5Nzc5MWUxOWRkYmJmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU4NTA3ZmViZDkwNzQ1NzhhZWQwNzZlZWE0ZGQxYWNmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjc4NTY5OTU3Mjc0NzksLTczLjg2Nzk3NTk4MDgxMzM0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJmMDcyOWMxMjY5ODQ3OWNiMDEzMGFlYzdhMWRjZDZhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I1ZmJiZDFmMWEzYzQ2Y2NhNDdlZmI2YmQ1ZjY3MGM4ID0gJCgnPGRpdiBpZD0iaHRtbF9iNWZiYmQxZjFhM2M0NmNjYTQ3ZWZiNmJkNWY2NzBjOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2l0eSBMaW5lLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmYwNzI5YzEyNjk4NDc5Y2IwMTMwYWVjN2ExZGNkNmEuc2V0Q29udGVudChodG1sX2I1ZmJiZDFmMWEzYzQ2Y2NhNDdlZmI2YmQ1ZjY3MGM4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzU4NTA3ZmViZDkwNzQ1NzhhZWQwNzZlZWE0ZGQxYWNmLmJpbmRQb3B1cChwb3B1cF8yZjA3MjljMTI2OTg0NzljYjAxMzBhZWM3YTFkY2Q2YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84Y2QzZTZlZTVkYWQ0Y2ZmYTk5YTUwZGE1MTI4ZGQyYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxNTE0OTU1MDQ1MzA4LC03My44OTg1NTYzMzYzMDMxN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jYWE5MzM5MmQ1NzM0NTk0OTBhOWIxNTg3NzczMDI4MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iMWNkYTY1ZGE2NTg0YWI0ODQ2MjVmYjEzNWRiMjk1NSA9ICQoJzxkaXYgaWQ9Imh0bWxfYjFjZGE2NWRhNjU4NGFiNDg0NjI1ZmIxMzVkYjI5NTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJlcmdlbiBCZWFjaCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NhYTkzMzkyZDU3MzQ1OTQ5MGE5YjE1ODc3NzMwMjgyLnNldENvbnRlbnQoaHRtbF9iMWNkYTY1ZGE2NTg0YWI0ODQ2MjVmYjEzNWRiMjk1NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84Y2QzZTZlZTVkYWQ0Y2ZmYTk5YTUwZGE1MTI4ZGQyYS5iaW5kUG9wdXAocG9wdXBfY2FhOTMzOTJkNTczNDU5NDkwYTliMTU4Nzc3MzAyODIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjcyYTU4NWUwOGY0NDM4MDljMzlhNjg5YmUwYzVmY2EgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MjU1OTU4OTg2OTg0MywtNzMuOTU3NTk1MjM0ODk4MzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWQxODYyYzYzODMwNGE0ZDkzNGQ4MTcxNWJiMjQ3NjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTI4MGRiMjRmYTQ1NDA4ZmI4YTU2NzhmMmY3ODc1ZTggPSAkKCc8ZGl2IGlkPSJodG1sX2UyODBkYjI0ZmE0NTQwOGZiOGE1Njc4ZjJmNzg3NWU4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NaWR3b29kLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWQxODYyYzYzODMwNGE0ZDkzNGQ4MTcxNWJiMjQ3Njcuc2V0Q29udGVudChodG1sX2UyODBkYjI0ZmE0NTQwOGZiOGE1Njc4ZjJmNzg3NWU4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY3MmE1ODVlMDhmNDQzODA5YzM5YTY4OWJlMGM1ZmNhLmJpbmRQb3B1cChwb3B1cF9lZDE4NjJjNjM4MzA0YTRkOTM0ZDgxNzE1YmIyNDc2Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mZjhkNjU4ZjYwMmY0ZGFjYWU5ODFjMjQ2ZjMwNDE2NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0NzAwODYwMzE4NTE4NSwtNzMuOTYyNjEzMTY3MTYwNDhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2M5OGEzYjJiZTM3NDdlOTllOGJiYTE1YTM2MDc0MWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2M4MTBiODU2ODY3NGU0NmJkNTY5MmYzMGIzYzgxZTYgPSAkKCc8ZGl2IGlkPSJodG1sXzNjODEwYjg1Njg2NzRlNDZiZDU2OTJmMzBiM2M4MWU2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Qcm9zcGVjdCBQYXJrIFNvdXRoLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2M5OGEzYjJiZTM3NDdlOTllOGJiYTE1YTM2MDc0MWYuc2V0Q29udGVudChodG1sXzNjODEwYjg1Njg2NzRlNDZiZDU2OTJmMzBiM2M4MWU2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZmOGQ2NThmNjAyZjRkYWNhZTk4MWMyNDZmMzA0MTY0LmJpbmRQb3B1cChwb3B1cF8zYzk4YTNiMmJlMzc0N2U5OWU4YmJhMTVhMzYwNzQxZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mZGNiNDlmYjUwN2U0Mzg3YmEzMTM1OGU2MDE5NzFhNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYyMzg0NTI0NDc4NDE5LC03My45MTYwNzQ4Mzk1MTMyNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kYzQ4MzlkMDA3MWY0ZjE4YWMwNTcxMDJkMDNhM2M3MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85NWVjMjFiZjY3ZGY0NDZhODRkZDMxMTE3ZjM2ZjU4NCA9ICQoJzxkaXYgaWQ9Imh0bWxfOTVlYzIxYmY2N2RmNDQ2YTg0ZGQzMTExN2YzNmY1ODQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdlb3JnZXRvd24sIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kYzQ4MzlkMDA3MWY0ZjE4YWMwNTcxMDJkMDNhM2M3MS5zZXRDb250ZW50KGh0bWxfOTVlYzIxYmY2N2RmNDQ2YTg0ZGQzMTExN2YzNmY1ODQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmRjYjQ5ZmI1MDdlNDM4N2JhMzEzNThlNjAxOTcxYTUuYmluZFBvcHVwKHBvcHVwX2RjNDgzOWQwMDcxZjRmMThhYzA1NzEwMmQwM2EzYzcxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg1Y2YxNWU3MjVkMDQ4Njg4ZGRlMDJlMTZiNzIwMzU0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzA4NDkyNDEwNDE1NDgsLTczLjkzODg1ODE1MjY5MTk1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2EwZWJiZDRkMDE2YTRlMDRhOTNlYTU1ZTQwNDI3YTZlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBhMDVhNTIyYTlkYTQzN2ZhMGE4MmUwMGJmMDQxZTQ3ID0gJCgnPGRpdiBpZD0iaHRtbF8wYTA1YTUyMmE5ZGE0MzdmYTBhODJlMDBiZjA0MWU0NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWFzdCBXaWxsaWFtc2J1cmcsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hMGViYmQ0ZDAxNmE0ZTA0YTkzZWE1NWU0MDQyN2E2ZS5zZXRDb250ZW50KGh0bWxfMGEwNWE1MjJhOWRhNDM3ZmEwYTgyZTAwYmYwNDFlNDcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODVjZjE1ZTcyNWQwNDg2ODhkZGUwMmUxNmI3MjAzNTQuYmluZFBvcHVwKHBvcHVwX2EwZWJiZDRkMDE2YTRlMDRhOTNlYTU1ZTQwNDI3YTZlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU2N2YzZGVkZGQ5ZTQ3OTBiNWRlNTMwOTgxZDhlNGVkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE0ODIyOTA2NTMyMDE0LC03My45NTg4MDg1NzU4NzU4Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xMDZiZmRkMTQyMjI0NmI3YjBlODc3NzE3ZDg3YzQ0MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81NjNjODc0MzU1MmM0MWJiODJmODZlODJiNGNlOWNlOCA9ICQoJzxkaXYgaWQ9Imh0bWxfNTYzYzg3NDM1NTJjNDFiYjgyZjg2ZTgyYjRjZTljZTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5vcnRoIFNpZGUsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xMDZiZmRkMTQyMjI0NmI3YjBlODc3NzE3ZDg3YzQ0My5zZXRDb250ZW50KGh0bWxfNTYzYzg3NDM1NTJjNDFiYjgyZjg2ZTgyYjRjZTljZTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTY3ZjNkZWRkZDllNDc5MGI1ZGU1MzA5ODFkOGU0ZWQuYmluZFBvcHVwKHBvcHVwXzEwNmJmZGQxNDIyMjQ2YjdiMGU4Nzc3MTdkODdjNDQzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE0ZWE2ZDg4OTQyMTRhNjBiMmNkNDhkMTBmNTM5NjFmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzEwODYxNDcyNjUwNjQsLTczLjk1ODAwMDk1MTUzMzMxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZkNDg2OGEzOGE0MTQyOWU4YmRjMzNhNDA1NDRjNWNiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRlYjM2MDcwMGZjNDRmNDRiZmRmYmMzMDNmMmJlZTFiID0gJCgnPGRpdiBpZD0iaHRtbF80ZWIzNjA3MDBmYzQ0ZjQ0YmZkZmJjMzAzZjJiZWUxYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U291dGggU2lkZSwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZkNDg2OGEzOGE0MTQyOWU4YmRjMzNhNDA1NDRjNWNiLnNldENvbnRlbnQoaHRtbF80ZWIzNjA3MDBmYzQ0ZjQ0YmZkZmJjMzAzZjJiZWUxYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xNGVhNmQ4ODk0MjE0YTYwYjJjZDQ4ZDEwZjUzOTYxZi5iaW5kUG9wdXAocG9wdXBfZmQ0ODY4YTM4YTQxNDI5ZThiZGMzM2E0MDU0NGM1Y2IpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjA3YzZlMjM1YTRjNDU3M2FmNTI1Yzg4MGM0MmQxZTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MTMwNTk3NjY2Nzk0MiwtNzMuOTY4MzY2NzgwMzU1NDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWJjMTE4YTE5NDhkNDM1MTk0NmNkMTcxZjMwYmU4YzEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODUwYjQ5N2Y5NmQzNDgwMTk0M2M0YzQ2Mjc3NTBjNzEgPSAkKCc8ZGl2IGlkPSJodG1sXzg1MGI0OTdmOTZkMzQ4MDE5NDNjNGM0NjI3NzUwYzcxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PY2VhbiBQYXJrd2F5LCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWJjMTE4YTE5NDhkNDM1MTk0NmNkMTcxZjMwYmU4YzEuc2V0Q29udGVudChodG1sXzg1MGI0OTdmOTZkMzQ4MDE5NDNjNGM0NjI3NzUwYzcxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2IwN2M2ZTIzNWE0YzQ1NzNhZjUyNWM4ODBjNDJkMWUyLmJpbmRQb3B1cChwb3B1cF8xYmMxMThhMTk0OGQ0MzUxOTQ2Y2QxNzFmMzBiZThjMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hNjgzMzg3YzU0Zjg0NjFjYmRkZTMwMWIyZjE2ZmE3NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxNDc2ODEyNjk0MjI2LC03NC4wMzE5NzkxNDUzNzk4NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81Zjk0MzEzNjJiNzk0MjFiOTUwMGNkYTkyOWEzODM2YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lNzQ1ZTM1Zjk0ZTc0ODI1OTU0NWU2Y2E1MTg5NDU0OSA9ICQoJzxkaXYgaWQ9Imh0bWxfZTc0NWUzNWY5NGU3NDgyNTk1NDVlNmNhNTE4OTQ1NDkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZvcnQgSGFtaWx0b24sIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81Zjk0MzEzNjJiNzk0MjFiOTUwMGNkYTkyOWEzODM2Yy5zZXRDb250ZW50KGh0bWxfZTc0NWUzNWY5NGU3NDgyNTk1NDVlNmNhNTE4OTQ1NDkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTY4MzM4N2M1NGY4NDYxY2JkZGUzMDFiMmYxNmZhNzUuYmluZFBvcHVwKHBvcHVwXzVmOTQzMTM2MmI3OTQyMWI5NTAwY2RhOTI5YTM4MzZjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRkZmRjMGZhZWE0NTQ5YjI5YjRiN2FkZGRjNDY0YWIzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE1NjE4NDIyMzE0MzIsLTczLjk5NDI3OTM2MjU1OTc4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMyZTU5ODc3MDcyYzQ3YzI4NDE2NGFhMjkzMzhlMGJlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk1MTA0ODZkMWUxYjQ0MzRiMGZkZTFhODY5NmFkODA3ID0gJCgnPGRpdiBpZD0iaHRtbF85NTEwNDg2ZDFlMWI0NDM0YjBmZGUxYTg2OTZhZDgwNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2hpbmF0b3duLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMyZTU5ODc3MDcyYzQ3YzI4NDE2NGFhMjkzMzhlMGJlLnNldENvbnRlbnQoaHRtbF85NTEwNDg2ZDFlMWI0NDM0YjBmZGUxYTg2OTZhZDgwNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80ZGZkYzBmYWVhNDU0OWIyOWI0YjdhZGRkYzQ2NGFiMy5iaW5kUG9wdXAocG9wdXBfMzJlNTk4NzcwNzJjNDdjMjg0MTY0YWEyOTMzOGUwYmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzVhODQzMjE0OGE1NGFkZDhhNzYzOTU3NmZkMDRmNjQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NTE5MDI1MjU1NTMwNSwtNzMuOTM2OTAwMjc5ODUyMzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmZjY2NhOWFhNzllNDQzYjhmZDI4YjBhZjQyYWZhZmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODRhYmQ1OWZmMzExNDc2N2JiZjJjZTU3MTQ2MmFjNmYgPSAkKCc8ZGl2IGlkPSJodG1sXzg0YWJkNTlmZjMxMTQ3NjdiYmYyY2U1NzE0NjJhYzZmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XYXNoaW5ndG9uIEhlaWdodHMsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmZjY2NhOWFhNzllNDQzYjhmZDI4YjBhZjQyYWZhZmQuc2V0Q29udGVudChodG1sXzg0YWJkNTlmZjMxMTQ3NjdiYmYyY2U1NzE0NjJhYzZmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzc1YTg0MzIxNDhhNTRhZGQ4YTc2Mzk1NzZmZDA0ZjY0LmJpbmRQb3B1cChwb3B1cF9mZmNjY2E5YWE3OWU0NDNiOGZkMjhiMGFmNDJhZmFmZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iZDI2ZGUyNDUwZTk0MTQ1OGFiZWNmMzliYWQyYmFmMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg2NzY4Mzk2NDQ5OTE1LC03My45MjEyMTA0MjIwMzg5N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83MDEyNGJiYjM3NTI0ODc1ODkzNzVkMmM4NWM1M2JmNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83YTBhYmE1M2Y3MDI0OTc0OTI2ZGM3ODRjMjUxYmE2MSA9ICQoJzxkaXYgaWQ9Imh0bWxfN2EwYWJhNTNmNzAyNDk3NDkyNmRjNzg0YzI1MWJhNjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPklud29vZCwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83MDEyNGJiYjM3NTI0ODc1ODkzNzVkMmM4NWM1M2JmNS5zZXRDb250ZW50KGh0bWxfN2EwYWJhNTNmNzAyNDk3NDkyNmRjNzg0YzI1MWJhNjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmQyNmRlMjQ1MGU5NDE0NThhYmVjZjM5YmFkMmJhZjAuYmluZFBvcHVwKHBvcHVwXzcwMTI0YmJiMzc1MjQ4NzU4OTM3NWQyYzg1YzUzYmY1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY0ZDQyZDEyMmVkZjRkMDg5ODRiMTgzMmFlNTZlN2I0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODIzNjA0Mjg0ODExOTM1LC03My45NDk2ODc5MTg4MzM2Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kMTIyMGM0ZWZkMmU0NDZjYTA2ZGUwMTY4YmE5NDNmMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wN2IxMTQ1ZjA3MjU0NGJhOTk0MzllMjg5ZjIwZTAxMiA9ICQoJzxkaXYgaWQ9Imh0bWxfMDdiMTE0NWYwNzI1NDRiYTk5NDM5ZTI4OWYyMGUwMTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhhbWlsdG9uIEhlaWdodHMsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDEyMjBjNGVmZDJlNDQ2Y2EwNmRlMDE2OGJhOTQzZjAuc2V0Q29udGVudChodG1sXzA3YjExNDVmMDcyNTQ0YmE5OTQzOWUyODlmMjBlMDEyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY0ZDQyZDEyMmVkZjRkMDg5ODRiMTgzMmFlNTZlN2I0LmJpbmRQb3B1cChwb3B1cF9kMTIyMGM0ZWZkMmU0NDZjYTA2ZGUwMTY4YmE5NDNmMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wYTBlYmU2OGRkYjM0NjQ5OGNkYTFhNDI4ODBkNGJkMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgxNjkzNDQyOTQ5NzgsLTczLjk1NzM4NTM5MzUxODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjE2NDIxYzcwN2NhNGYwODlmNzE3MTgxM2RiMmIyNTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzRmYmJmYTFkOTAyNDQ3MjkyYzVjM2U2YmY0YjVkODkgPSAkKCc8ZGl2IGlkPSJodG1sXzc0ZmJiZmExZDkwMjQ0NzI5MmM1YzNlNmJmNGI1ZDg5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYW5oYXR0YW52aWxsZSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mMTY0MjFjNzA3Y2E0ZjA4OWY3MTcxODEzZGIyYjI1OS5zZXRDb250ZW50KGh0bWxfNzRmYmJmYTFkOTAyNDQ3MjkyYzVjM2U2YmY0YjVkODkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMGEwZWJlNjhkZGIzNDY0OThjZGExYTQyODgwZDRiZDEuYmluZFBvcHVwKHBvcHVwX2YxNjQyMWM3MDdjYTRmMDg5ZjcxNzE4MTNkYjJiMjU5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA1YmU2OTc1MDMzMjRjNWE5OWQ3MmQ0MTVkZjlmNjZkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODE1OTc2MDY3NDI0MTQsLTczLjk0MzIxMTEyNjAzOTA1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg3ZDNmODQ3MTk2NjRjNGY5YTcxZTFjMTZlZTBjMGZlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y2NjIwN2ZhNDg2YTQwYzZiYTlmZjAyNWVmMjBjZTJkID0gJCgnPGRpdiBpZD0iaHRtbF9mNjYyMDdmYTQ4NmE0MGM2YmE5ZmYwMjVlZjIwY2UyZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2VudHJhbCBIYXJsZW0sIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODdkM2Y4NDcxOTY2NGM0ZjlhNzFlMWMxNmVlMGMwZmUuc2V0Q29udGVudChodG1sX2Y2NjIwN2ZhNDg2YTQwYzZiYTlmZjAyNWVmMjBjZTJkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA1YmU2OTc1MDMzMjRjNWE5OWQ3MmQ0MTVkZjlmNjZkLmJpbmRQb3B1cChwb3B1cF84N2QzZjg0NzE5NjY0YzRmOWE3MWUxYzE2ZWUwYzBmZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hMjEzYmVhZmE1OGY0NGQ3ODgwMzVmM2NmZjNkYjY3NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc5MjI0OTQ2NjYzMDMzLC03My45NDQxODIyMzE0ODUyNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lN2JmOGQzNjkwMzE0MzdmYmYwZWE0MTYxNGNhNzhlNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wMzA5YzFlZTYzNTk0NzE2ODc5NDExZjRkNjNmYjI2NyA9ICQoJzxkaXYgaWQ9Imh0bWxfMDMwOWMxZWU2MzU5NDcxNjg3OTQxMWY0ZDYzZmIyNjciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVhc3QgSGFybGVtLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U3YmY4ZDM2OTAzMTQzN2ZiZjBlYTQxNjE0Y2E3OGU0LnNldENvbnRlbnQoaHRtbF8wMzA5YzFlZTYzNTk0NzE2ODc5NDExZjRkNjNmYjI2Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hMjEzYmVhZmE1OGY0NGQ3ODgwMzVmM2NmZjNkYjY3NS5iaW5kUG9wdXAocG9wdXBfZTdiZjhkMzY5MDMxNDM3ZmJmMGVhNDE2MTRjYTc4ZTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTE0ZDMwMjQyZGQxNGY4NThiM2ZlMmJhODZlY2Y5MjggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NzU2Mzg1NzMzMDE4MDUsLTczLjk2MDUwNzYzMTM1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJhMmFkMTU5ZTAyZjQxODBiOWM4YzkxMGMwMjgzZjhhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RmODI3YjQwOGE1ZTRkOTRhMDU5YjBkYTIxZDMzMGI1ID0gJCgnPGRpdiBpZD0iaHRtbF9kZjgyN2I0MDhhNWU0ZDk0YTA1OWIwZGEyMWQzMzBiNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VXBwZXIgRWFzdCBTaWRlLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJhMmFkMTU5ZTAyZjQxODBiOWM4YzkxMGMwMjgzZjhhLnNldENvbnRlbnQoaHRtbF9kZjgyN2I0MDhhNWU0ZDk0YTA1OWIwZGEyMWQzMzBiNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85MTRkMzAyNDJkZDE0Zjg1OGIzZmUyYmE4NmVjZjkyOC5iaW5kUG9wdXAocG9wdXBfMmEyYWQxNTllMDJmNDE4MGI5YzhjOTEwYzAyODNmOGEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGViOTIzODU1ZDlhNGY0ZDg2YWRmNDhmNzJhMzJjZTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NzU5Mjk4NDk4ODQ4NzUsLTczLjk0NzExNzg0NDcxODI2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzliNWE1MmNhOTY5YjQxZGU4MjcwNDcwYTA0MTYzNDlhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg1N2UxOWJmMjYyZjRhODdiYmRhNDBmMDVjMjI2ZjI5ID0gJCgnPGRpdiBpZD0iaHRtbF84NTdlMTliZjI2MmY0YTg3YmJkYTQwZjA1YzIyNmYyOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WW9ya3ZpbGxlLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzliNWE1MmNhOTY5YjQxZGU4MjcwNDcwYTA0MTYzNDlhLnNldENvbnRlbnQoaHRtbF84NTdlMTliZjI2MmY0YTg3YmJkYTQwZjA1YzIyNmYyOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kZWI5MjM4NTVkOWE0ZjRkODZhZGY0OGY3MmEzMmNlNi5iaW5kUG9wdXAocG9wdXBfOWI1YTUyY2E5NjliNDFkZTgyNzA0NzBhMDQxNjM0OWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWY1YjZmNjAwOWUyNDM3M2E4ZTExOTg3OGYyY2ZkOTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjgxMTI2NTgyODczMywtNzMuOTU4ODU5Njg4MTM3Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zZDU4NWM2ODdlZGQ0ZDBlYmViNWNhNjM2NmJkNDVhYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81YzRjOGIxOGVkMDM0MGFmYjlhYTYyNDI4NThjZjMwYyA9ICQoJzxkaXYgaWQ9Imh0bWxfNWM0YzhiMThlZDAzNDBhZmI5YWE2MjQyODU4Y2YzMGMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxlbm94IEhpbGwsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2Q1ODVjNjg3ZWRkNGQwZWJlYjVjYTYzNjZiZDQ1YWEuc2V0Q29udGVudChodG1sXzVjNGM4YjE4ZWQwMzQwYWZiOWFhNjI0Mjg1OGNmMzBjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzlmNWI2ZjYwMDllMjQzNzNhOGUxMTk4NzhmMmNmZDk4LmJpbmRQb3B1cChwb3B1cF8zZDU4NWM2ODdlZGQ0ZDBlYmViNWNhNjM2NmJkNDVhYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84YzFmYzQ0ZGY1MGI0OWQ1YTA5NjBiNzlmNTY3MGI3ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2MjE1OTYwNTc2MjgzLC03My45NDkxNjc2OTIyNzk1M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xYTkxZjU5YWIzODE0YmFkYTJhODA5MTNmYTVjYWY1MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81YTRiMjkzNzgyZTU0ZGY3YWQ0ZjRiM2E2Y2MxMjM3OCA9ICQoJzxkaXYgaWQ9Imh0bWxfNWE0YjI5Mzc4MmU1NGRmN2FkNGY0YjNhNmNjMTIzNzgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJvb3NldmVsdCBJc2xhbmQsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWE5MWY1OWFiMzgxNGJhZGEyYTgwOTEzZmE1Y2FmNTEuc2V0Q29udGVudChodG1sXzVhNGIyOTM3ODJlNTRkZjdhZDRmNGIzYTZjYzEyMzc4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhjMWZjNDRkZjUwYjQ5ZDVhMDk2MGI3OWY1NjcwYjdkLmJpbmRQb3B1cChwb3B1cF8xYTkxZjU5YWIzODE0YmFkYTJhODA5MTNmYTVjYWY1MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iMjkzYWMzNDJkNmY0NTRhYjg3Y2FkMTBmZmRiNzgwZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc4NzY1Nzk5ODUzNDg1NCwtNzMuOTc3MDU5MjM2MzA2MDNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTQzMDc0MzY3ZmE2NDdhYmJlNGNlZGU4YzE4ZjkyZWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTU0NTE1N2Q5ZTljNDFlNDlhNjAzNmM2YTc2NWU5YjMgPSAkKCc8ZGl2IGlkPSJodG1sX2U1NDUxNTdkOWU5YzQxZTQ5YTYwMzZjNmE3NjVlOWIzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5VcHBlciBXZXN0IFNpZGUsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTQzMDc0MzY3ZmE2NDdhYmJlNGNlZGU4YzE4ZjkyZWMuc2V0Q29udGVudChodG1sX2U1NDUxNTdkOWU5YzQxZTQ5YTYwMzZjNmE3NjVlOWIzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2IyOTNhYzM0MmQ2ZjQ1NGFiODdjYWQxMGZmZGI3ODBlLmJpbmRQb3B1cChwb3B1cF81NDMwNzQzNjdmYTY0N2FiYmU0Y2VkZThjMThmOTJlYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85MWFkZWU0NjFlZDM0Njg5OWIxZTc2MzMyNjU3NTk4MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc3MzUyODg4OTQyMTY2LC03My45ODUzMzc3NzAwMTI2Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85MmRlYjFlNTc0Yjg0MjVlYmY2OTAyYjNhMjc1YTE3YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iMWI1Y2Y5NTM4MmQ0Nzk1YjAyOTE4ODBkZTc0NDliNSA9ICQoJzxkaXYgaWQ9Imh0bWxfYjFiNWNmOTUzODJkNDc5NWIwMjkxODgwZGU3NDQ5YjUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxpbmNvbG4gU3F1YXJlLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkyZGViMWU1NzRiODQyNWViZjY5MDJiM2EyNzVhMTdjLnNldENvbnRlbnQoaHRtbF9iMWI1Y2Y5NTM4MmQ0Nzk1YjAyOTE4ODBkZTc0NDliNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85MWFkZWU0NjFlZDM0Njg5OWIxZTc2MzMyNjU3NTk4MS5iaW5kUG9wdXAocG9wdXBfOTJkZWIxZTU3NGI4NDI1ZWJmNjkwMmIzYTI3NWExN2MpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODAxOGRlNjZmYjU1NGY0OWI4YTk3MTZiYjc3MWRjOTUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTkxMDA4OTE0NjIxMiwtNzMuOTk2MTE5MzYzMDk0NzldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmFmODA2NmRiOTk0NDcyYWJlYjAyYTMyYjA2NzZkMWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmI5ZmQ1Mjk5ODU3NDI3OWE1MGQ5OGE3NWI3MDNjNjUgPSAkKCc8ZGl2IGlkPSJodG1sX2ZiOWZkNTI5OTg1NzQyNzlhNTBkOThhNzViNzAzYzY1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGludG9uLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZhZjgwNjZkYjk5NDQ3MmFiZWIwMmEzMmIwNjc2ZDFmLnNldENvbnRlbnQoaHRtbF9mYjlmZDUyOTk4NTc0Mjc5YTUwZDk4YTc1YjcwM2M2NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84MDE4ZGU2NmZiNTU0ZjQ5YjhhOTcxNmJiNzcxZGM5NS5iaW5kUG9wdXAocG9wdXBfNmFmODA2NmRiOTk0NDcyYWJlYjAyYTMyYjA2NzZkMWYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmExNWFkZDg4N2UzNDdkNjgzNGE4MDNkYTNjMjRmMjggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTQ2OTExMDI3MDYyMywtNzMuOTgxNjY4ODI3MzAzMDRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWNmNjAxMGRiZTQyNDBjM2I3ZDA2N2YzOTFmZjExMDcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDlhOTdhZDMzYThiNGFjM2E2OTRjYzRhNzg3YTg3MWUgPSAkKCc8ZGl2IGlkPSJodG1sX2Q5YTk3YWQzM2E4YjRhYzNhNjk0Y2M0YTc4N2E4NzFlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NaWR0b3duLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FjZjYwMTBkYmU0MjQwYzNiN2QwNjdmMzkxZmYxMTA3LnNldENvbnRlbnQoaHRtbF9kOWE5N2FkMzNhOGI0YWMzYTY5NGNjNGE3ODdhODcxZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iYTE1YWRkODg3ZTM0N2Q2ODM0YTgwM2RhM2MyNGYyOC5iaW5kUG9wdXAocG9wdXBfYWNmNjAxMGRiZTQyNDBjM2I3ZDA2N2YzOTFmZjExMDcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2U1OGFiMjlmZWZiNDI1YmE4ZjhiZTI2MGMyZDFiMzUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NDgzMDMwNzcyNTIxNzQsLTczLjk3ODMzMjA3OTI0MTI3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA5MDhiNTMxYjczODQxNjVhNzcxNGYxYmMxM2Y0ZWMyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIzN2RkOWU0NzYxNTQwMDE4YmE1NzIxMzA5YjI2Nzg3ID0gJCgnPGRpdiBpZD0iaHRtbF8yMzdkZDllNDc2MTU0MDAxOGJhNTcyMTMwOWIyNjc4NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TXVycmF5IEhpbGwsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDkwOGI1MzFiNzM4NDE2NWE3NzE0ZjFiYzEzZjRlYzIuc2V0Q29udGVudChodG1sXzIzN2RkOWU0NzYxNTQwMDE4YmE1NzIxMzA5YjI2Nzg3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NlNThhYjI5ZmVmYjQyNWJhOGY4YmUyNjBjMmQxYjM1LmJpbmRQb3B1cChwb3B1cF8wOTA4YjUzMWI3Mzg0MTY1YTc3MTRmMWJjMTNmNGVjMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yNTVkNTdlZjYzOTk0MjQxODRhNDY3NjM3YzgyMzkzZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NDAzNDcwNjc0Nzk3NSwtNzQuMDAzMTE2MzM0NzI4MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDAyZmJjMzM3ZDFiNDYyYjg5YzA4NzM3NDA1MWUyNDEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDg2MThjOTQ0NjE5NGYxZDgwYjdlMzA4ZTA3ZWU2NGMgPSAkKCc8ZGl2IGlkPSJodG1sXzA4NjE4Yzk0NDYxOTRmMWQ4MGI3ZTMwOGUwN2VlNjRjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaGVsc2VhLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAwMmZiYzMzN2QxYjQ2MmI4OWMwODczNzQwNTFlMjQxLnNldENvbnRlbnQoaHRtbF8wODYxOGM5NDQ2MTk0ZjFkODBiN2UzMDhlMDdlZTY0Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yNTVkNTdlZjYzOTk0MjQxODRhNDY3NjM3YzgyMzkzZi5iaW5kUG9wdXAocG9wdXBfMDAyZmJjMzM3ZDFiNDYyYjg5YzA4NzM3NDA1MWUyNDEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGI4MjQ2MTkwY2MxNGI2MDk1MjYxODFmNWEyMTZjMWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjY5MzI4ODUzNjEyOCwtNzMuOTk5OTE0MDI5NDU5MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzVmYjZjNGRhMGM3NDgwOTlmZDI5MThmZjk0MTU0NWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGVlZjJlNWNmM2ExNGNhNjgxZDI0NDI4YWMyZjdmNjYgPSAkKCc8ZGl2IGlkPSJodG1sXzhlZWYyZTVjZjNhMTRjYTY4MWQyNDQyOGFjMmY3ZjY2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmVlbndpY2ggVmlsbGFnZSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zNWZiNmM0ZGEwYzc0ODA5OWZkMjkxOGZmOTQxNTQ1ZS5zZXRDb250ZW50KGh0bWxfOGVlZjJlNWNmM2ExNGNhNjgxZDI0NDI4YWMyZjdmNjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGI4MjQ2MTkwY2MxNGI2MDk1MjYxODFmNWEyMTZjMWYuYmluZFBvcHVwKHBvcHVwXzM1ZmI2YzRkYTBjNzQ4MDk5ZmQyOTE4ZmY5NDE1NDVlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQyNmU3MmI0ZTNjZjQwNzBiMmQ5OTYzNzMzMGM1ZWQ5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzI3ODQ2Nzc3MjcwMjQ0LC03My45ODIyMjYxNjUwNjQxNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hYTI4MThkM2M2M2I0YWJiOGM3MTZkNzY1YmY2ZDgzYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iY2UzNzlhZjlmZTc0YzFjYjg5ZDJiYzA0OTA3NzI2MiA9ICQoJzxkaXYgaWQ9Imh0bWxfYmNlMzc5YWY5ZmU3NGMxY2I4OWQyYmMwNDkwNzcyNjIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVhc3QgVmlsbGFnZSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hYTI4MThkM2M2M2I0YWJiOGM3MTZkNzY1YmY2ZDgzYy5zZXRDb250ZW50KGh0bWxfYmNlMzc5YWY5ZmU3NGMxY2I4OWQyYmMwNDkwNzcyNjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDI2ZTcyYjRlM2NmNDA3MGIyZDk5NjM3MzMwYzVlZDkuYmluZFBvcHVwKHBvcHVwX2FhMjgxOGQzYzYzYjRhYmI4YzcxNmQ3NjViZjZkODNjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzEzZjhhZmQ4YThlZDRlZmQ4MzQxZjBjNTNhOTQwNjc1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE3ODA2NzQ4OTI3NjUsLTczLjk4MDg5MDMxOTk5MjkxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E3Y2MzOTNmYWQ3YzQzMTc5OTE1ZjViZTYzNjE2N2I0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZlYmE4MWNlN2QzZjRjMzliM2I1Y2I0ZjllNmRhNWViID0gJCgnPGRpdiBpZD0iaHRtbF82ZWJhODFjZTdkM2Y0YzM5YjNiNWNiNGY5ZTZkYTVlYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TG93ZXIgRWFzdCBTaWRlLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E3Y2MzOTNmYWQ3YzQzMTc5OTE1ZjViZTYzNjE2N2I0LnNldENvbnRlbnQoaHRtbF82ZWJhODFjZTdkM2Y0YzM5YjNiNWNiNGY5ZTZkYTVlYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xM2Y4YWZkOGE4ZWQ0ZWZkODM0MWYwYzUzYTk0MDY3NS5iaW5kUG9wdXAocG9wdXBfYTdjYzM5M2ZhZDdjNDMxNzk5MTVmNWJlNjM2MTY3YjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTIxYmU4ZmZkMzlkNDI5MWJkN2MwYzAwYjIyMDA1NjEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjE1MjE5Njc0NDMyMTYsLTc0LjAxMDY4MzI4NTU5MDg3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzEzZGM0ZDM0ZTQ0NjQwZWViMDFmMzE5ZTkwNmM4MTg0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFiN2NhNzU0OWVhNTRlM2Y4NGRiZWI2ZWM3ZGM2MDg1ID0gJCgnPGRpdiBpZD0iaHRtbF8xYjdjYTc1NDllYTU0ZTNmODRkYmViNmVjN2RjNjA4NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VHJpYmVjYSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xM2RjNGQzNGU0NDY0MGVlYjAxZjMxOWU5MDZjODE4NC5zZXRDb250ZW50KGh0bWxfMWI3Y2E3NTQ5ZWE1NGUzZjg0ZGJlYjZlYzdkYzYwODUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTIxYmU4ZmZkMzlkNDI5MWJkN2MwYzAwYjIyMDA1NjEuYmluZFBvcHVwKHBvcHVwXzEzZGM0ZDM0ZTQ0NjQwZWViMDFmMzE5ZTkwNmM4MTg0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FiM2RhODg2ZGZkYzQxZGU4YjY0MTkzMTEzN2IwMzk5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE5MzIzNzkzOTU5MDcsLTczLjk5NzMwNDY3MjA4MDczXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzliZjI2OTg3MzJjMDRjNDE4YzVhZTdhNzk2NWZhZjYzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYwZDVjNWEwNjNlMjQ0ZTliNmU5MDNhZmJmZDZiYmJiID0gJCgnPGRpdiBpZD0iaHRtbF82MGQ1YzVhMDYzZTI0NGU5YjZlOTAzYWZiZmQ2YmJiYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGl0dGxlIEl0YWx5LCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzliZjI2OTg3MzJjMDRjNDE4YzVhZTdhNzk2NWZhZjYzLnNldENvbnRlbnQoaHRtbF82MGQ1YzVhMDYzZTI0NGU5YjZlOTAzYWZiZmQ2YmJiYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hYjNkYTg4NmRmZGM0MWRlOGI2NDE5MzExMzdiMDM5OS5iaW5kUG9wdXAocG9wdXBfOWJmMjY5ODczMmMwNGM0MThjNWFlN2E3OTY1ZmFmNjMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDExZjU4M2JhNDQ5NGViMTg2Y2FiODYzN2NhZmRhZTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjIxODM4NDEzMTc5NCwtNzQuMDAwNjU2NjY5NTk3NTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjQ3YzE1NjJhODdjNGI1NTk2Y2YwYWQ3OWZhMDY2MTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWFlODg1MTJmYjZmNDczZmIxMmNkMjM1NmJiNTExMzYgPSAkKCc8ZGl2IGlkPSJodG1sXzFhZTg4NTEyZmI2ZjQ3M2ZiMTJjZDIzNTZiYjUxMTM2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Tb2hvLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y0N2MxNTYyYTg3YzRiNTU5NmNmMGFkNzlmYTA2NjE5LnNldENvbnRlbnQoaHRtbF8xYWU4ODUxMmZiNmY0NzNmYjEyY2QyMzU2YmI1MTEzNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kMTFmNTgzYmE0NDk0ZWIxODZjYWI4NjM3Y2FmZGFlMC5iaW5kUG9wdXAocG9wdXBfZjQ3YzE1NjJhODdjNGI1NTk2Y2YwYWQ3OWZhMDY2MTkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWI1MTJjZWRiOGNhNDViM2E5MDc0Mjk3NGMxYTg1YjggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MzQ0MzM5MzU3MjQzNCwtNzQuMDA2MTc5OTgxMjY4MTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTVlMTAwZWRkYjRlNDU3YmI2ZDVmNDExOTk3ZThlMTEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTU3MDI5NjFhZjIyNDJhYTg0MDA5MTMzY2MxYWRhOWQgPSAkKCc8ZGl2IGlkPSJodG1sXzU1NzAyOTYxYWYyMjQyYWE4NDAwOTEzM2NjMWFkYTlkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZXN0IFZpbGxhZ2UsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTVlMTAwZWRkYjRlNDU3YmI2ZDVmNDExOTk3ZThlMTEuc2V0Q29udGVudChodG1sXzU1NzAyOTYxYWYyMjQyYWE4NDAwOTEzM2NjMWFkYTlkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzFiNTEyY2VkYjhjYTQ1YjNhOTA3NDI5NzRjMWE4NWI4LmJpbmRQb3B1cChwb3B1cF81NWUxMDBlZGRiNGU0NTdiYjZkNWY0MTE5OTdlOGUxMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kYjE4ZGVkYWQ2Zjk0N2Q0OTJkZjA0ZmE1MGNiYTcwYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc5NzMwNzA0MTcwMjg2NSwtNzMuOTY0Mjg2MTc3NDA2NTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDczODZlNTYwNWRiNDE0OGJmOWE1OTBmZjIxOGE2NTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjQ3M2EzMGY5YWU3NDRjNGFlZjI0NTgzMzA0MjY1YjUgPSAkKCc8ZGl2IGlkPSJodG1sXzY0NzNhMzBmOWFlNzQ0YzRhZWYyNDU4MzMwNDI2NWI1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYW5oYXR0YW4gVmFsbGV5LCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA3Mzg2ZTU2MDVkYjQxNDhiZjlhNTkwZmYyMThhNjUyLnNldENvbnRlbnQoaHRtbF82NDczYTMwZjlhZTc0NGM0YWVmMjQ1ODMzMDQyNjViNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kYjE4ZGVkYWQ2Zjk0N2Q0OTJkZjA0ZmE1MGNiYTcwYS5iaW5kUG9wdXAocG9wdXBfMDczODZlNTYwNWRiNDE0OGJmOWE1OTBmZjIxOGE2NTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTNjODg3YTE4YmI0NDIxNzhhYTY1OTE0YzY3MDZjMTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MDc5OTk3MzgxNjU4MjYsLTczLjk2Mzg5NjI3OTA1MzMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI0NTY3YzE4OGQ1YzRmNzM5MGRiMTZiNTdhOWIxNDZlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2YxZTUzODdhYjEwZjQyMDI4YmVmMjY3ZDA2MGVlMGY2ID0gJCgnPGRpdiBpZD0iaHRtbF9mMWU1Mzg3YWIxMGY0MjAyOGJlZjI2N2QwNjBlZTBmNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW9ybmluZ3NpZGUgSGVpZ2h0cywgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yNDU2N2MxODhkNWM0ZjczOTBkYjE2YjU3YTliMTQ2ZS5zZXRDb250ZW50KGh0bWxfZjFlNTM4N2FiMTBmNDIwMjhiZWYyNjdkMDYwZWUwZjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTNjODg3YTE4YmI0NDIxNzhhYTY1OTE0YzY3MDZjMTIuYmluZFBvcHVwKHBvcHVwXzI0NTY3YzE4OGQ1YzRmNzM5MGRiMTZiNTdhOWIxNDZlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JjOTcyZjYwOTgyOTRjYTFhMzE0MTgyMGVkZTFkZjg5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzM3MjA5ODMyNzE1LC03My45ODEzNzU5NDgzMzU0MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wODg3MjQzYTI2NmE0MzAwOGJhODE0NWQwODM4NTQwOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yN2IxM2I2MzJkMTE0Y2EzOWZiYWI1OWMxMTQ1YjdlYiA9ICQoJzxkaXYgaWQ9Imh0bWxfMjdiMTNiNjMyZDExNGNhMzlmYmFiNTljMTE0NWI3ZWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdyYW1lcmN5LCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA4ODcyNDNhMjY2YTQzMDA4YmE4MTQ1ZDA4Mzg1NDA5LnNldENvbnRlbnQoaHRtbF8yN2IxM2I2MzJkMTE0Y2EzOWZiYWI1OWMxMTQ1YjdlYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iYzk3MmY2MDk4Mjk0Y2ExYTMxNDE4MjBlZGUxZGY4OS5iaW5kUG9wdXAocG9wdXBfMDg4NzI0M2EyNjZhNDMwMDhiYTgxNDVkMDgzODU0MDkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWE1N2NlMWY2YzMyNDMyNTk0MGU0NmQ0YzNlZWJmNDkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTE5MzE5ODM5NDU2NSwtNzQuMDE2ODY5MzA1MDg2MTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODcyNDQ5MWI0M2MwNDViYmJmMDM2YWZkNzY4ZWRjMzcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTk2MGI2ODUxMGFkNDM4ZDlmMzEyNmFiMWNiYjRiOTcgPSAkKCc8ZGl2IGlkPSJodG1sXzE5NjBiNjg1MTBhZDQzOGQ5ZjMxMjZhYjFjYmI0Yjk3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CYXR0ZXJ5IFBhcmsgQ2l0eSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84NzI0NDkxYjQzYzA0NWJiYmYwMzZhZmQ3NjhlZGMzNy5zZXRDb250ZW50KGh0bWxfMTk2MGI2ODUxMGFkNDM4ZDlmMzEyNmFiMWNiYjRiOTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWE1N2NlMWY2YzMyNDMyNTk0MGU0NmQ0YzNlZWJmNDkuYmluZFBvcHVwKHBvcHVwXzg3MjQ0OTFiNDNjMDQ1YmJiZjAzNmFmZDc2OGVkYzM3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U0NzliMzcxMzVjOTRlMTE5ODA3NzI5OTQ5ZGVkMjRhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzA3MTA3MTA3MjcwNDgsLTc0LjAxMDY2NTQ0NTIxMjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGFiZmIxNjg5M2U1NGU3ZDk5MDJjOWQwYWEwZDg5ODYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDhmODY3NmJmZTYyNDIwZjlhNGE0MzM2OTRmOTgzZmUgPSAkKCc8ZGl2IGlkPSJodG1sXzQ4Zjg2NzZiZmU2MjQyMGY5YTRhNDMzNjk0Zjk4M2ZlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GaW5hbmNpYWwgRGlzdHJpY3QsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGFiZmIxNjg5M2U1NGU3ZDk5MDJjOWQwYWEwZDg5ODYuc2V0Q29udGVudChodG1sXzQ4Zjg2NzZiZmU2MjQyMGY5YTRhNDMzNjk0Zjk4M2ZlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U0NzliMzcxMzVjOTRlMTE5ODA3NzI5OTQ5ZGVkMjRhLmJpbmRQb3B1cChwb3B1cF80YWJmYjE2ODkzZTU0ZTdkOTkwMmM5ZDBhYTBkODk4Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jNTllZmM3M2NhYTM0MWI3ODkyZGI3MGM0MDViMmY1NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2ODUwODU5MzM1NDkyLC03My45MTU2NTM3NDMwNDIzNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kZDgwNzA3M2EzNGE0MDBhYjI1ZjI5M2FhNThmMjEwYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iYjhiNmYxM2I5Yzc0MTEwODg0YjM5MDM5YTk3NDhhMSA9ICQoJzxkaXYgaWQ9Imh0bWxfYmI4YjZmMTNiOWM3NDExMDg4NGIzOTAzOWE5NzQ4YTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFzdG9yaWEsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGQ4MDcwNzNhMzRhNDAwYWIyNWYyOTNhYTU4ZjIxMGEuc2V0Q29udGVudChodG1sX2JiOGI2ZjEzYjljNzQxMTA4ODRiMzkwMzlhOTc0OGExKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M1OWVmYzczY2FhMzQxYjc4OTJkYjcwYzQwNWIyZjU2LmJpbmRQb3B1cChwb3B1cF9kZDgwNzA3M2EzNGE0MDBhYjI1ZjI5M2FhNThmMjEwYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMjcyNGRiM2EwMGM0NDk1YTk4NjA5MzUxNmVkMmE3ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NjM0OTA4ODYwMjIyLC03My45MDE4NDE2NjgzODI4NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xNzMxNWJjYzVjZDI0YjE3YjBjNDlkOWFhYWVjZWNiOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82ZmZjNWE1M2NjNjM0NjgwYjk1MDIyZTUwMDk2NDkxMyA9ICQoJzxkaXYgaWQ9Imh0bWxfNmZmYzVhNTNjYzYzNDY4MGI5NTAyMmU1MDA5NjQ5MTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldvb2RzaWRlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE3MzE1YmNjNWNkMjRiMTdiMGM0OWQ5YWFhZWNlY2I5LnNldENvbnRlbnQoaHRtbF82ZmZjNWE1M2NjNjM0NjgwYjk1MDIyZTUwMDk2NDkxMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mMjcyNGRiM2EwMGM0NDk1YTk4NjA5MzUxNmVkMmE3ZC5iaW5kUG9wdXAocG9wdXBfMTczMTViY2M1Y2QyNGIxN2IwYzQ5ZDlhYWFlY2VjYjkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzA0YjBjZjcxMGM2NDc0NGIxMGNjNDQ0YjAxODQyZmEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTE5ODEzODAwNzM2NywtNzMuODgyODIxMDkxNjQzNjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDc2Yzg5MjkzNGU0NDdjZmFkYjU0ODBlODM3OWZlZWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWEwN2M5YzljODA1NDU0ZjhlNWI2NWIzNjkwMmVmZGMgPSAkKCc8ZGl2IGlkPSJodG1sX2VhMDdjOWM5YzgwNTQ1NGY4ZTViNjViMzY5MDJlZmRjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5KYWNrc29uIEhlaWdodHMsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDc2Yzg5MjkzNGU0NDdjZmFkYjU0ODBlODM3OWZlZWEuc2V0Q29udGVudChodG1sX2VhMDdjOWM5YzgwNTQ1NGY4ZTViNjViMzY5MDJlZmRjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzMwNGIwY2Y3MTBjNjQ3NDRiMTBjYzQ0NGIwMTg0MmZhLmJpbmRQb3B1cChwb3B1cF8wNzZjODkyOTM0ZTQ0N2NmYWRiNTQ4MGU4Mzc5ZmVlYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85OTVkNmI4YjE4MTY0NDNkYmVlMTUxMmYxMTg1ZGIyZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NDA0ODUwNTEyMjAyNCwtNzMuODgxNjU2MjIyODgzODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjg5NjBmNTRkZmM0NDdhOTg5ZGU2MTkxMGIxZTFiYWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTAxNDk1MWFkMGZlNDI3YTk0ZjYzODAxNDE5MzgwZTAgPSAkKCc8ZGl2IGlkPSJodG1sXzEwMTQ5NTFhZDBmZTQyN2E5NGY2MzgwMTQxOTM4MGUwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FbG1odXJzdCwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yODk2MGY1NGRmYzQ0N2E5ODlkZTYxOTEwYjFlMWJhYy5zZXRDb250ZW50KGh0bWxfMTAxNDk1MWFkMGZlNDI3YTk0ZjYzODAxNDE5MzgwZTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTk1ZDZiOGIxODE2NDQzZGJlZTE1MTJmMTE4NWRiMmYuYmluZFBvcHVwKHBvcHVwXzI4OTYwZjU0ZGZjNDQ3YTk4OWRlNjE5MTBiMWUxYmFjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NhMjdlOWJjMDg1ZDQwMjk5YjE1N2I2MjI4ZWNmNzhlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjU0MjI1Mjc3Mzg0ODcsLTczLjgzODEzNzY0NjAwMjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmJjMjhkNTJmYWFlNDY2NDgzOWNjYzE5ZTFjYTU3ZGQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTM4NGQyODM1NGM5NGJkYTg3MTg5ZGFjYzYzMDI5MjUgPSAkKCc8ZGl2IGlkPSJodG1sX2EzODRkMjgzNTRjOTRiZGE4NzE4OWRhY2M2MzAyOTI1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ib3dhcmQgQmVhY2gsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmJjMjhkNTJmYWFlNDY2NDgzOWNjYzE5ZTFjYTU3ZGQuc2V0Q29udGVudChodG1sX2EzODRkMjgzNTRjOTRiZGE4NzE4OWRhY2M2MzAyOTI1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NhMjdlOWJjMDg1ZDQwMjk5YjE1N2I2MjI4ZWNmNzhlLmJpbmRQb3B1cChwb3B1cF9iYmMyOGQ1MmZhYWU0NjY0ODM5Y2NjMTllMWNhNTdkZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80MzA1MTk1ODE5Nzc0MzA4YjE0Yzk4ODc2YzYzNzM0NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0MjM4MTc1MDE1NjY3LC03My44NTY4MjQ5NzM0NTI1OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yZmE4ZGNmMzk3MzA0OTA1OTM0M2JkNWMzNWQxMDNhMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83YWRmYWUzNjJkMTg0Y2E1OWViZDUxZjFmYzA1MWM5MyA9ICQoJzxkaXYgaWQ9Imh0bWxfN2FkZmFlMzYyZDE4NGNhNTllYmQ1MWYxZmMwNTFjOTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNvcm9uYSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZmE4ZGNmMzk3MzA0OTA1OTM0M2JkNWMzNWQxMDNhMi5zZXRDb250ZW50KGh0bWxfN2FkZmFlMzYyZDE4NGNhNTllYmQ1MWYxZmMwNTFjOTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDMwNTE5NTgxOTc3NDMwOGIxNGM5ODg3NmM2MzczNDYuYmluZFBvcHVwKHBvcHVwXzJmYThkY2YzOTczMDQ5MDU5MzQzYmQ1YzM1ZDEwM2EyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzEzMWUwNTA5MWVmZTQ4NDNiN2ExYzI3ODNlYjMxNDViID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzI1MjYzNzgyMTY1MDMsLTczLjg0NDQ3NTAwNzg4OTgzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MwNzM2MDFhODJlODRlOTRiMWEyMTQ3YWM2OWExMDJkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzcwNzcxYmE5MGQwMjRlZDBiNTE4Njk1ZjE5MTg3MTM3ID0gJCgnPGRpdiBpZD0iaHRtbF83MDc3MWJhOTBkMDI0ZWQwYjUxODY5NWYxOTE4NzEzNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Rm9yZXN0IEhpbGxzLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2MwNzM2MDFhODJlODRlOTRiMWEyMTQ3YWM2OWExMDJkLnNldENvbnRlbnQoaHRtbF83MDc3MWJhOTBkMDI0ZWQwYjUxODY5NWYxOTE4NzEzNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xMzFlMDUwOTFlZmU0ODQzYjdhMWMyNzgzZWIzMTQ1Yi5iaW5kUG9wdXAocG9wdXBfYzA3MzYwMWE4MmU4NGU5NGIxYTIxNDdhYzY5YTEwMmQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjRhYTAxNDFjN2Q1NGZkZWFlMjZlMjczYmFlMTk1ZTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MDUxNzkwMzU0MTQ4LC03My44Mjk4MTkwNTgyNTcwM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNWViNjE3YzdiM2E0NzZhYTJlM2I3NGQ3NzE5ZGRmMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84ZDU5MzczN2NmODY0YWVkOTc4ZTNjNzNkYzdlNzI3NCA9ICQoJzxkaXYgaWQ9Imh0bWxfOGQ1OTM3MzdjZjg2NGFlZDk3OGUzYzczZGM3ZTcyNzQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPktldyBHYXJkZW5zLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA1ZWI2MTdjN2IzYTQ3NmFhMmUzYjc0ZDc3MTlkZGYxLnNldENvbnRlbnQoaHRtbF84ZDU5MzczN2NmODY0YWVkOTc4ZTNjNzNkYzdlNzI3NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mNGFhMDE0MWM3ZDU0ZmRlYWUyNmUyNzNiYWUxOTVlOC5iaW5kUG9wdXAocG9wdXBfMDVlYjYxN2M3YjNhNDc2YWEyZTNiNzRkNzcxOWRkZjEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjY2YmFmZmYyNWUxNDdmNmJhMGQ4NzY2ZjEzZWE5MTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42OTc5NDczMTQ3MTc2MywtNzMuODMxODMzMjE0NDY4ODddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGE3NTZkNTNjNzA5NGQwNjg0NmU2NTY3NTMyODk2MDMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjdjMDg5ZDMwODJlNDdmNDk1MTlkNDgzNmQzYzQxMDkgPSAkKCc8ZGl2IGlkPSJodG1sX2I3YzA4OWQzMDgyZTQ3ZjQ5NTE5ZDQ4MzZkM2M0MTA5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SaWNobW9uZCBIaWxsLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRhNzU2ZDUzYzcwOTRkMDY4NDZlNjU2NzUzMjg5NjAzLnNldENvbnRlbnQoaHRtbF9iN2MwODlkMzA4MmU0N2Y0OTUxOWQ0ODM2ZDNjNDEwOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yNjZiYWZmZjI1ZTE0N2Y2YmEwZDg3NjZmMTNlYTkxMC5iaW5kUG9wdXAocG9wdXBfNGE3NTZkNTNjNzA5NGQwNjg0NmU2NTY3NTMyODk2MDMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDFjYzI5NTQxMDUzNDljMDkzNjY5ZWViMzllNjdmMzUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjQ0NTQxOTY5Nzg0NiwtNzMuODMxNzczMDAzMjk1ODJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmVkN2RkMGNlZTQ2NDJmOTlkMzAxN2YwOWJmYmVmOWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTlmMjI4MzE5MzcyNDI3MzlkNjYyNmVhNjBjYWZhMGYgPSAkKCc8ZGl2IGlkPSJodG1sX2E5ZjIyODMxOTM3MjQyNzM5ZDY2MjZlYTYwY2FmYTBmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GbHVzaGluZywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZWQ3ZGQwY2VlNDY0MmY5OWQzMDE3ZjA5YmZiZWY5ZS5zZXRDb250ZW50KGh0bWxfYTlmMjI4MzE5MzcyNDI3MzlkNjYyNmVhNjBjYWZhMGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDFjYzI5NTQxMDUzNDljMDkzNjY5ZWViMzllNjdmMzUuYmluZFBvcHVwKHBvcHVwXzJlZDdkZDBjZWU0NjQyZjk5ZDMwMTdmMDliZmJlZjllKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzkxM2JjYmM1ZjQ5ZDQxZGI5MTY4YzMzMjk4NjhkMTgzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzUwMjE3MzQ2MTA1MjgsLTczLjkzOTIwMjIzOTE1NTA1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E5OGEwZTM3ZWU2MzRiZDViZTExNDE5NzI1NWYyZDFkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdkMjk4NmY5Njg4ZjQyYjhhNzUzMWFmMjI5NmQ3Yjk1ID0gJCgnPGRpdiBpZD0iaHRtbF83ZDI5ODZmOTY4OGY0MmI4YTc1MzFhZjIyOTZkN2I5NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TG9uZyBJc2xhbmQgQ2l0eSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hOThhMGUzN2VlNjM0YmQ1YmUxMTQxOTcyNTVmMmQxZC5zZXRDb250ZW50KGh0bWxfN2QyOTg2Zjk2ODhmNDJiOGE3NTMxYWYyMjk2ZDdiOTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTEzYmNiYzVmNDlkNDFkYjkxNjhjMzMyOTg2OGQxODMuYmluZFBvcHVwKHBvcHVwX2E5OGEwZTM3ZWU2MzRiZDViZTExNDE5NzI1NWYyZDFkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzljMDg5ZTM3MDI0OTRkYTU5MjA0MTBhODExOGY3ZmIxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQwMTc2MjgzNTE5MjQsLTczLjkyNjkxNjE3NTYxNTc3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NhYTFhY2JkMzYwODQ5ZTM5MDAzZmMyYzRkZTJlMjc0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYwOTJkZGVhNGM5MzRmZWJhNWIwNjFlN2MxYTEwNzU0ID0gJCgnPGRpdiBpZD0iaHRtbF82MDkyZGRlYTRjOTM0ZmViYTViMDYxZTdjMWExMDc1NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3VubnlzaWRlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NhYTFhY2JkMzYwODQ5ZTM5MDAzZmMyYzRkZTJlMjc0LnNldENvbnRlbnQoaHRtbF82MDkyZGRlYTRjOTM0ZmViYTViMDYxZTdjMWExMDc1NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85YzA4OWUzNzAyNDk0ZGE1OTIwNDEwYTgxMThmN2ZiMS5iaW5kUG9wdXAocG9wdXBfY2FhMWFjYmQzNjA4NDllMzkwMDNmYzJjNGRlMmUyNzQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzE5MGE0NjJhZGFkNGFlY2I0MDYxOTE3NTU3NDI2MTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjQwNzMyMzg4MzA5MSwtNzMuODY3MDQxNDc2NTg3NzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDdjMjFhMjUxNWNkNDQzZmIxYTFkYzA5ZWE1YzA1MzcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTIxNTUyYzFkNGNlNGEzNjg2ZWIyYWUzNzcxOGE2YmIgPSAkKCc8ZGl2IGlkPSJodG1sXzkyMTU1MmMxZDRjZTRhMzY4NmViMmFlMzc3MThhNmJiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FYXN0IEVsbWh1cnN0LCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q3YzIxYTI1MTVjZDQ0M2ZiMWExZGMwOWVhNWMwNTM3LnNldENvbnRlbnQoaHRtbF85MjE1NTJjMWQ0Y2U0YTM2ODZlYjJhZTM3NzE4YTZiYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83MTkwYTQ2MmFkYWQ0YWVjYjQwNjE5MTc1NTc0MjYxOC5iaW5kUG9wdXAocG9wdXBfZDdjMjFhMjUxNWNkNDQzZmIxYTFkYzA5ZWE1YzA1MzcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGNlNDFiMmU4ODQ0NGJmNmJjOTg0ZmQ5MmFhY2Y1NjEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjU0MjczNzQwOTM2MDYsLTczLjg5NjIxNzEzNjI2ODU5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUyZmEwYTIzYmUxMjRhMmViMGRlMWRjZWI0NjU3YjRkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M4NzNiNDViYWU5OTRmZjY5Yjg2NWJkNGZhMTJiMjI4ID0gJCgnPGRpdiBpZD0iaHRtbF9jODczYjQ1YmFlOTk0ZmY2OWI4NjViZDRmYTEyYjIyOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFzcGV0aCwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MmZhMGEyM2JlMTI0YTJlYjBkZTFkY2ViNDY1N2I0ZC5zZXRDb250ZW50KGh0bWxfYzg3M2I0NWJhZTk5NGZmNjliODY1YmQ0ZmExMmIyMjgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGNlNDFiMmU4ODQ0NGJmNmJjOTg0ZmQ5MmFhY2Y1NjEuYmluZFBvcHVwKHBvcHVwXzUyZmEwYTIzYmUxMjRhMmViMGRlMWRjZWI0NjU3YjRkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhiMjg0MzdhZGRiMDQ3MTViZTUwMjQwM2Q0Nzk1M2EzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzA4MzIzMTU2MTM4NTgsLTczLjkwMTQzNTE3NTU5NTg5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE4MjliMDY5ZjQwODRjZDdhMjNkZjk1MDdhZmRkMzQ3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzUwYmQxMGY3MzlmNjQ1ZTJhM2UyNTQ2MTU5NTg2MmQzID0gJCgnPGRpdiBpZD0iaHRtbF81MGJkMTBmNzM5ZjY0NWUyYTNlMjU0NjE1OTU4NjJkMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UmlkZ2V3b29kLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE4MjliMDY5ZjQwODRjZDdhMjNkZjk1MDdhZmRkMzQ3LnNldENvbnRlbnQoaHRtbF81MGJkMTBmNzM5ZjY0NWUyYTNlMjU0NjE1OTU4NjJkMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84YjI4NDM3YWRkYjA0NzE1YmU1MDI0MDNkNDc5NTNhMy5iaW5kUG9wdXAocG9wdXBfMTgyOWIwNjlmNDA4NGNkN2EyM2RmOTUwN2FmZGQzNDcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWUzYWZhZmIwNTViNGY5ZGJjM2YzZGY4MWEzNzNkZTQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MDI3NjI0Mjk2NzgzOCwtNzMuODcwNzQxNjc0MzU2MDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTM4NzBkY2MwMDUxNGM3YTkxNzcxMWNkMWZiYzU5OTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzhhZjlkN2U4ZDM4NDg4ZTlhNGI0NzljNzcwNDIwYzMgPSAkKCc8ZGl2IGlkPSJodG1sX2M4YWY5ZDdlOGQzODQ4OGU5YTRiNDc5Yzc3MDQyMGMzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HbGVuZGFsZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81Mzg3MGRjYzAwNTE0YzdhOTE3NzExY2QxZmJjNTk5NC5zZXRDb250ZW50KGh0bWxfYzhhZjlkN2U4ZDM4NDg4ZTlhNGI0NzljNzcwNDIwYzMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWUzYWZhZmIwNTViNGY5ZGJjM2YzZGY4MWEzNzNkZTQuYmluZFBvcHVwKHBvcHVwXzUzODcwZGNjMDA1MTRjN2E5MTc3MTFjZDFmYmM1OTk0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzYyNGQ0ZDljYzI4MjRlMjBhZWVhMGU2ZWFjMTE0YzYxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzI4OTc0MDk0ODA3MzUsLTczLjg1NzgyNjg2OTA1MzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2I0ZWMyZGFiMzU3NDBjNjg1Yjg3NGIxMGNkNzNiOTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjNiY2E2YzM4MTU3NDFkNzg1ZWYzOWIwZGI2MDhjMmYgPSAkKCc8ZGl2IGlkPSJodG1sX2YzYmNhNmMzODE1NzQxZDc4NWVmMzliMGRiNjA4YzJmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SZWdvIFBhcmssIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2I0ZWMyZGFiMzU3NDBjNjg1Yjg3NGIxMGNkNzNiOTkuc2V0Q29udGVudChodG1sX2YzYmNhNmMzODE1NzQxZDc4NWVmMzliMGRiNjA4YzJmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzYyNGQ0ZDljYzI4MjRlMjBhZWVhMGU2ZWFjMTE0YzYxLmJpbmRQb3B1cChwb3B1cF8zYjRlYzJkYWIzNTc0MGM2ODViODc0YjEwY2Q3M2I5OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jN2VkOTJiYTkyOTk0OWQ4OGQwMjk3YzQ3Mzg5YTc3NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY4OTg4Njg3OTE1Nzg5LC03My44NTgxMTA0NjU1NDMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE4ZDVhMmRkZjdjZDRiZmI4MTk0MjQ3NTA4MWM4Yzc2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzgyZTg3ZDcyZTc1ZTRkZGY4MDZiN2JhNThlZGE5OGQ0ID0gJCgnPGRpdiBpZD0iaHRtbF84MmU4N2Q3MmU3NWU0ZGRmODA2YjdiYTU4ZWRhOThkNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V29vZGhhdmVuLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE4ZDVhMmRkZjdjZDRiZmI4MTk0MjQ3NTA4MWM4Yzc2LnNldENvbnRlbnQoaHRtbF84MmU4N2Q3MmU3NWU0ZGRmODA2YjdiYTU4ZWRhOThkNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jN2VkOTJiYTkyOTk0OWQ4OGQwMjk3YzQ3Mzg5YTc3Ny5iaW5kUG9wdXAocG9wdXBfMThkNWEyZGRmN2NkNGJmYjgxOTQyNDc1MDgxYzhjNzYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjg0MzU1OTI4MGQyNDgxMjlhNzBiMWU1MjJlNTNiZDggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42ODA3MDg0NjgyNjU0MTUsLTczLjg0MzIwMjY2MTczNDQ3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZlOGY2MTk4ZGQwYjRlMTE4NjNkNGVmZDcwODU1OTEzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I1YjcwNThkMGE4YTQ1MDg4ODU1YTdlNDc1MzFkNWU3ID0gJCgnPGRpdiBpZD0iaHRtbF9iNWI3MDU4ZDBhOGE0NTA4ODg1NWE3ZTQ3NTMxZDVlNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T3pvbmUgUGFyaywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ZThmNjE5OGRkMGI0ZTExODYzZDRlZmQ3MDg1NTkxMy5zZXRDb250ZW50KGh0bWxfYjViNzA1OGQwYThhNDUwODg4NTVhN2U0NzUzMWQ1ZTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjg0MzU1OTI4MGQyNDgxMjlhNzBiMWU1MjJlNTNiZDguYmluZFBvcHVwKHBvcHVwXzZlOGY2MTk4ZGQwYjRlMTE4NjNkNGVmZDcwODU1OTEzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JhZTMyNzVjNmM2ZTRkMmViODlmOTkzMWMwZmU0ODBlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjY4NTQ5NTc3NjcxOTUsLTczLjgwOTg2NDc4NjQ5MDQxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MzMzdmZThjOWNlNjRkMzQ4NGI4YTllZTI3MWI0YjllID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JiMzQ1MmFlOGFjYzQ0MGZhZTVmOTIxOGVlMWM5MTZjID0gJCgnPGRpdiBpZD0iaHRtbF9iYjM0NTJhZThhY2M0NDBmYWU1ZjkyMThlZTFjOTE2YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U291dGggT3pvbmUgUGFyaywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jMzM3ZmU4YzljZTY0ZDM0ODRiOGE5ZWUyNzFiNGI5ZS5zZXRDb250ZW50KGh0bWxfYmIzNDUyYWU4YWNjNDQwZmFlNWY5MjE4ZWUxYzkxNmMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmFlMzI3NWM2YzZlNGQyZWI4OWY5OTMxYzBmZTQ4MGUuYmluZFBvcHVwKHBvcHVwX2MzMzdmZThjOWNlNjRkMzQ4NGI4YTllZTI3MWI0YjllKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I4ODBhN2RhZmZiZDRiOWZiMzExZjM1YmI5ZWQ1N2Q0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzg0OTAyNzQ5MjYwMjA1LC03My44NDMwNDUyODg5NjEyNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81OThlNzVmZGVjNmI0NGQxYmY3Y2ZmMGU4NTdiZjY5NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81ZjdkZDNlM2ZmMDY0MWRkYmMyMzRhMGE5MzhiMmQyMiA9ICQoJzxkaXYgaWQ9Imh0bWxfNWY3ZGQzZTNmZjA2NDFkZGJjMjM0YTBhOTM4YjJkMjIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNvbGxlZ2UgUG9pbnQsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTk4ZTc1ZmRlYzZiNDRkMWJmN2NmZjBlODU3YmY2OTYuc2V0Q29udGVudChodG1sXzVmN2RkM2UzZmYwNjQxZGRiYzIzNGEwYTkzOGIyZDIyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2I4ODBhN2RhZmZiZDRiOWZiMzExZjM1YmI5ZWQ1N2Q0LmJpbmRQb3B1cChwb3B1cF81OThlNzVmZGVjNmI0NGQxYmY3Y2ZmMGU4NTdiZjY5Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NWQ0YmQ0MjA5Yjk0NGMxYjBlYTYzMDlkZjRiNTk5ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc4MTI5MDc2NjAyNjk0LC03My44MTQyMDIxNjYxMDg2M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85ZmZhNzU4Y2E1YjY0MzBiOTdjZDRiYTBjMzI2MDI0MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80NDgzMzNlNjcxMDI0ZTYzYjdjZjg3YzQyNzk1ZDM2NyA9ICQoJzxkaXYgaWQ9Imh0bWxfNDQ4MzMzZTY3MTAyNGU2M2I3Y2Y4N2M0Mjc5NWQzNjciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldoaXRlc3RvbmUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWZmYTc1OGNhNWI2NDMwYjk3Y2Q0YmEwYzMyNjAyNDAuc2V0Q29udGVudChodG1sXzQ0ODMzM2U2NzEwMjRlNjNiN2NmODdjNDI3OTVkMzY3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk1ZDRiZDQyMDliOTQ0YzFiMGVhNjMwOWRmNGI1OTllLmJpbmRQb3B1cChwb3B1cF85ZmZhNzU4Y2E1YjY0MzBiOTdjZDRiYTBjMzI2MDI0MCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iZDJjN2Q3MjhkNmM0OWQxYTNjZjJlOTVmYWNlMjgwOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2NjA0MDYzMjgxMDY0LC03My43NzQyNzM2MzA2ODY3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk5MTNiM2M3MThjZjQwZTZiOGE0YTk3NGNmMjQ3YjQ5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ5ODk3ZGI5YTE2MDQ4YmY4ODFiMDk0MTEyMGQ4ZGE4ID0gJCgnPGRpdiBpZD0iaHRtbF80OTg5N2RiOWExNjA0OGJmODgxYjA5NDExMjBkOGRhOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF5c2lkZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85OTEzYjNjNzE4Y2Y0MGU2YjhhNGE5NzRjZjI0N2I0OS5zZXRDb250ZW50KGh0bWxfNDk4OTdkYjlhMTYwNDhiZjg4MWIwOTQxMTIwZDhkYTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmQyYzdkNzI4ZDZjNDlkMWEzY2YyZTk1ZmFjZTI4MDkuYmluZFBvcHVwKHBvcHVwXzk5MTNiM2M3MThjZjQwZTZiOGE0YTk3NGNmMjQ3YjQ5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzYwOTQzZGMyMTgxOTQ4NzE4YWRhYWU2N2NlNTY5MGU5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzYxNzI5NTQ5MDMyNjIsLTczLjc5MTc2MjQzNzI4MDYxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2YzOTlkZjQyMWZlZjRkOTA5ZTVmYmJlNGExMzA0YWNhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzgwMzVhM2NkOWU3NDQxNmI4YzM2NzEzNGZkYjdmYjRlID0gJCgnPGRpdiBpZD0iaHRtbF84MDM1YTNjZDllNzQ0MTZiOGMzNjcxMzRmZGI3ZmI0ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXVidXJuZGFsZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mMzk5ZGY0MjFmZWY0ZDkwOWU1ZmJiZTRhMTMwNGFjYS5zZXRDb250ZW50KGh0bWxfODAzNWEzY2Q5ZTc0NDE2YjhjMzY3MTM0ZmRiN2ZiNGUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjA5NDNkYzIxODE5NDg3MThhZGFhZTY3Y2U1NjkwZTkuYmluZFBvcHVwKHBvcHVwX2YzOTlkZjQyMWZlZjRkOTA5ZTVmYmJlNGExMzA0YWNhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhhMGFhYjg4YTdkZjRjZmFhYmYwOWUyMjk3ZGRjNjcwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzcwODI2MTkyODI2NywtNzMuNzM4ODk3NzU1ODA3NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xY2E1OWZjOWZhZTg0YTAwOWY5MTExMWI4N2FiM2I0NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zMDBlYjMwZDExZDI0ZmZiODQyYWRiZWQ0ZTVlYWZlZSA9ICQoJzxkaXYgaWQ9Imh0bWxfMzAwZWIzMGQxMWQyNGZmYjg0MmFkYmVkNGU1ZWFmZWUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxpdHRsZSBOZWNrLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFjYTU5ZmM5ZmFlODRhMDA5ZjkxMTExYjg3YWIzYjQ1LnNldENvbnRlbnQoaHRtbF8zMDBlYjMwZDExZDI0ZmZiODQyYWRiZWQ0ZTVlYWZlZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84YTBhYWI4OGE3ZGY0Y2ZhYWJmMDllMjI5N2RkYzY3MC5iaW5kUG9wdXAocG9wdXBfMWNhNTlmYzlmYWU4NGEwMDlmOTExMTFiODdhYjNiNDUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWJmOTIyYjlkNmU1NDFjNjkyNjNiNGZlNzljZjg5Y2YgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjY4NDYwOTc5MDc2MywtNzMuNzQyNDk4MjA3MjczM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hYmU4NjUwNjlkZTg0YmM0OTA4MmRjM2MyNDg0N2Q4NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hN2U1YTNlNmE0YTk0ZTJhYWI5ZWU2MDc3YmYyZDg5NSA9ICQoJzxkaXYgaWQ9Imh0bWxfYTdlNWEzZTZhNGE5NGUyYWFiOWVlNjA3N2JmMmQ4OTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvdWdsYXN0b24sIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWJlODY1MDY5ZGU4NGJjNDkwODJkYzNjMjQ4NDdkODYuc2V0Q29udGVudChodG1sX2E3ZTVhM2U2YTRhOTRlMmFhYjllZTYwNzdiZjJkODk1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzFiZjkyMmI5ZDZlNTQxYzY5MjYzYjRmZTc5Y2Y4OWNmLmJpbmRQb3B1cChwb3B1cF9hYmU4NjUwNjlkZTg0YmM0OTA4MmRjM2MyNDg0N2Q4Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kZjgxZTk0OTQ0YjU0MGIyOTRmODFiZjhiYzgyMThmMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0OTQ0MDc5OTc0MzMyLC03My43MTU0ODExODk5OTE0NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iNWRlMWQ1NGE5MTE0MzE2ODI5YmQzNDk3MDM3M2IwZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81YTk0NGUzZmY3ZDY0YWNhOGE5ZDM5ZTE3ZWMyNDZjNiA9ICQoJzxkaXYgaWQ9Imh0bWxfNWE5NDRlM2ZmN2Q2NGFjYThhOWQzOWUxN2VjMjQ2YzYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdsZW4gT2FrcywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iNWRlMWQ1NGE5MTE0MzE2ODI5YmQzNDk3MDM3M2IwZS5zZXRDb250ZW50KGh0bWxfNWE5NDRlM2ZmN2Q2NGFjYThhOWQzOWUxN2VjMjQ2YzYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGY4MWU5NDk0NGI1NDBiMjk0ZjgxYmY4YmM4MjE4ZjMuYmluZFBvcHVwKHBvcHVwX2I1ZGUxZDU0YTkxMTQzMTY4MjliZDM0OTcwMzczYjBlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JhNjZlYjJmYTVhMDRkZTc5NjcwYjIxNWRlOTE2ZjcwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzI4NTczMTgxNzY2NzUsLTczLjcyMDEyODE0ODI2OTAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVjZTVhNDNiOGMzMDQyMzc4NDJhOTFiNzU4NjY1Mjk1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFkMTU4OWMzYTM2MzRiYjI4NzZkZDI1ZmI0YTBlMGIxID0gJCgnPGRpdiBpZD0iaHRtbF8xZDE1ODljM2EzNjM0YmIyODc2ZGQyNWZiNGEwZTBiMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmVsbGVyb3NlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzVjZTVhNDNiOGMzMDQyMzc4NDJhOTFiNzU4NjY1Mjk1LnNldENvbnRlbnQoaHRtbF8xZDE1ODljM2EzNjM0YmIyODc2ZGQyNWZiNGEwZTBiMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iYTY2ZWIyZmE1YTA0ZGU3OTY3MGIyMTVkZTkxNmY3MC5iaW5kUG9wdXAocG9wdXBfNWNlNWE0M2I4YzMwNDIzNzg0MmE5MWI3NTg2NjUyOTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmVmMmY5M2U0OTQ3NGYyOGE0ZmM4NGQwYmFkNTlkM2UgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjI1NzgyNDQyMjgwNDYsLTczLjgyMDg3NzY0OTMzNTY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZjYTQxZDFlYzdjZDQyMjdiOGE5NGY5ZmQ3NmY0NmZiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA4OWRmY2QzNDU1NTQ4NTZhNzk3ZGIxNDVjODk1M2M1ID0gJCgnPGRpdiBpZD0iaHRtbF8wODlkZmNkMzQ1NTU0ODU2YTc5N2RiMTQ1Yzg5NTNjNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+S2V3IEdhcmRlbnMgSGlsbHMsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmNhNDFkMWVjN2NkNDIyN2I4YTk0ZjlmZDc2ZjQ2ZmIuc2V0Q29udGVudChodG1sXzA4OWRmY2QzNDU1NTQ4NTZhNzk3ZGIxNDVjODk1M2M1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzZlZjJmOTNlNDk0NzRmMjhhNGZjODRkMGJhZDU5ZDNlLmJpbmRQb3B1cChwb3B1cF82Y2E0MWQxZWM3Y2Q0MjI3YjhhOTRmOWZkNzZmNDZmYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lOGExNDQxMGVkNWY0MzJkYmZhNGY4MDJjYzI5MGQ1YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczNDM5NDQ2NTMzMTMsLTczLjc4MjcxMzM3MDAzMjY0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2QxNjNiNjdjYzY5ZjQ2NTQ4OWY3YTRlY2FiMjQ2ZmFmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE0MDcwY2Q2OTNiYTQwYzViYjBjMjBkMGE4NWE4NWE4ID0gJCgnPGRpdiBpZD0iaHRtbF8xNDA3MGNkNjkzYmE0MGM1YmIwYzIwZDBhODVhODVhOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RnJlc2ggTWVhZG93cywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kMTYzYjY3Y2M2OWY0NjU0ODlmN2E0ZWNhYjI0NmZhZi5zZXRDb250ZW50KGh0bWxfMTQwNzBjZDY5M2JhNDBjNWJiMGMyMGQwYTg1YTg1YTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZThhMTQ0MTBlZDVmNDMyZGJmYTRmODAyY2MyOTBkNWEuYmluZFBvcHVwKHBvcHVwX2QxNjNiNjdjYzY5ZjQ2NTQ4OWY3YTRlY2FiMjQ2ZmFmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzcwODc4NzdmMzYwNzRhMjliN2ZhNzllYzVjZjdlNzM3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzEwOTM1NDcyNTIyNzEsLTczLjgxMTc0ODIyNDU4NjM0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VlYTQ2NzM4YmUzMjQ1MmM5ZWMyOTc3NTMwYmI2Njc1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NkNDRjYTE4ZDQwMDQ1NzY5OGUxNGUxODQ2NDZjZTFiID0gJCgnPGRpdiBpZD0iaHRtbF9jZDQ0Y2ExOGQ0MDA0NTc2OThlMTRlMTg0NjQ2Y2UxYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJpYXJ3b29kLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2VlYTQ2NzM4YmUzMjQ1MmM5ZWMyOTc3NTMwYmI2Njc1LnNldENvbnRlbnQoaHRtbF9jZDQ0Y2ExOGQ0MDA0NTc2OThlMTRlMTg0NjQ2Y2UxYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83MDg3ODc3ZjM2MDc0YTI5YjdmYTc5ZWM1Y2Y3ZTczNy5iaW5kUG9wdXAocG9wdXBfZWVhNDY3MzhiZTMyNDUyYzllYzI5Nzc1MzBiYjY2NzUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2M1NGI2ZThmODk1NDZhM2FlYTU3OGQ0YjIyMTY5ZTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MDQ2NTczNjA2ODcxNywtNzMuNzk2OTAxNjU4ODgyODldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDFiN2QwYzQ3YTY5NGM2N2JhMTBmNzU5YjRlMTQ1ZGUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjlhMDVjNGZjMmM2NDZmZThmYTNlMjllM2E4NzcxYTYgPSAkKCc8ZGl2IGlkPSJodG1sX2Y5YTA1YzRmYzJjNjQ2ZmU4ZmEzZTI5ZTNhODc3MWE2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5KYW1haWNhIENlbnRlciwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kMWI3ZDBjNDdhNjk0YzY3YmExMGY3NTliNGUxNDVkZS5zZXRDb250ZW50KGh0bWxfZjlhMDVjNGZjMmM2NDZmZThmYTNlMjllM2E4NzcxYTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2M1NGI2ZThmODk1NDZhM2FlYTU3OGQ0YjIyMTY5ZTcuYmluZFBvcHVwKHBvcHVwX2QxYjdkMGM0N2E2OTRjNjdiYTEwZjc1OWI0ZTE0NWRlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQxNWVlNjUwMTcxYjQ3NTQ5ZDA1NjU2ZTFlY2VmNDk0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQ1NjE4NTcxNDE4NTUsLTczLjc1NDk0OTc2MjM0MzMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU0ZDFhMjYxMjRlODQ3MTZiZGQ2NTM2NjA3NDYyYWE2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ExNzBiNzQ1ODhhNzQ1MjZhZmYwZDc0ZTkzMDU1OWVmID0gJCgnPGRpdiBpZD0iaHRtbF9hMTcwYjc0NTg4YTc0NTI2YWZmMGQ3NGU5MzA1NTllZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T2FrbGFuZCBHYXJkZW5zLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU0ZDFhMjYxMjRlODQ3MTZiZGQ2NTM2NjA3NDYyYWE2LnNldENvbnRlbnQoaHRtbF9hMTcwYjc0NTg4YTc0NTI2YWZmMGQ3NGU5MzA1NTllZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80MTVlZTY1MDE3MWI0NzU0OWQwNTY1NmUxZWNlZjQ5NC5iaW5kUG9wdXAocG9wdXBfNTRkMWEyNjEyNGU4NDcxNmJkZDY1MzY2MDc0NjJhYTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjkxYjFjMGUyYjdmNDExN2FlOTQ0MjRjMjJhOTRiZDEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTg4OTMwOTIxNjczNTYsLTczLjczODcxNDg0NTc4NDI0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VhZjExYzdjOTNhYTRkNWNhODhlZjA3Y2ZhYzRkZmNhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NlZDJlZTI4ZjVlNzQ2ZGZhNzExY2JmYzQ4YjNmMTExID0gJCgnPGRpdiBpZD0iaHRtbF9jZWQyZWUyOGY1ZTc0NmRmYTcxMWNiZmM0OGIzZjExMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UXVlZW5zIFZpbGxhZ2UsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWFmMTFjN2M5M2FhNGQ1Y2E4OGVmMDdjZmFjNGRmY2Euc2V0Q29udGVudChodG1sX2NlZDJlZTI4ZjVlNzQ2ZGZhNzExY2JmYzQ4YjNmMTExKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI5MWIxYzBlMmI3ZjQxMTdhZTk0NDI0YzIyYTk0YmQxLmJpbmRQb3B1cChwb3B1cF9lYWYxMWM3YzkzYWE0ZDVjYTg4ZWYwN2NmYWM0ZGZjYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85Mzk1NmU0NTdhZTE0YTc1OWQ3MDMyOTM4NDgxNzQ2YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcxMTI0MzQ0MTkxOTA0LC03My43NTkyNTAwOTMzNTU5NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lZWEyMTE5ODJmOWI0ZDBiOTc1MGUwYzY5NjA5MTZjOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lM2UyMzExNGY2YTU0ZDg1OWEyZTFiMmNjODhlYTk5OCA9ICQoJzxkaXYgaWQ9Imh0bWxfZTNlMjMxMTRmNmE1NGQ4NTlhMmUxYjJjYzg4ZWE5OTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhvbGxpcywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lZWEyMTE5ODJmOWI0ZDBiOTc1MGUwYzY5NjA5MTZjOS5zZXRDb250ZW50KGh0bWxfZTNlMjMxMTRmNmE1NGQ4NTlhMmUxYjJjYzg4ZWE5OTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTM5NTZlNDU3YWUxNGE3NTlkNzAzMjkzODQ4MTc0NmEuYmluZFBvcHVwKHBvcHVwX2VlYTIxMTk4MmY5YjRkMGI5NzUwZTBjNjk2MDkxNmM5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUzYzljNTAxMDE3YjRjYTNiYjVmYThlZWY1ZTRiNmRlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjk2OTExMjUzNzg5ODg1LC03My43OTA0MjYxMzEzNTU0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY5ZTkxZTQ0OWM2MTRmYzc4Y2E0OGM2MzdmMDNmODc3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2QzOTMxMDI5MTY0ODQ4NjFhMjcyMjg2MzE0ZmU4N2Y2ID0gJCgnPGRpdiBpZD0iaHRtbF9kMzkzMTAyOTE2NDg0ODYxYTI3MjI4NjMxNGZlODdmNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U291dGggSmFtYWljYSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82OWU5MWU0NDljNjE0ZmM3OGNhNDhjNjM3ZjAzZjg3Ny5zZXRDb250ZW50KGh0bWxfZDM5MzEwMjkxNjQ4NDg2MWEyNzIyODYzMTRmZTg3ZjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTNjOWM1MDEwMTdiNGNhM2JiNWZhOGVlZjVlNGI2ZGUuYmluZFBvcHVwKHBvcHVwXzY5ZTkxZTQ0OWM2MTRmYzc4Y2E0OGM2MzdmMDNmODc3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZkMzdkZDcxNGEzMDQwMDBhNzRjODE2ZDc1NjllNGUzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjk0NDQ1Mzg1MjIzNTksLTczLjc1ODY3NjAzNzI3NzE3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q1MWM5ZDA3ZTMzODQxYmRhMDVjMWIyNTgxMDQyNDY5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFjMmJmZjk5YzcwZjRmOWU5NDIxM2I5MmQ3YTI5YWEwID0gJCgnPGRpdiBpZD0iaHRtbF8xYzJiZmY5OWM3MGY0ZjllOTQyMTNiOTJkN2EyOWFhMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3QuIEFsYmFucywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kNTFjOWQwN2UzMzg0MWJkYTA1YzFiMjU4MTA0MjQ2OS5zZXRDb250ZW50KGh0bWxfMWMyYmZmOTljNzBmNGY5ZTk0MjEzYjkyZDdhMjlhYTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmQzN2RkNzE0YTMwNDAwMGE3NGM4MTZkNzU2OWU0ZTMuYmluZFBvcHVwKHBvcHVwX2Q1MWM5ZDA3ZTMzODQxYmRhMDVjMWIyNTgxMDQyNDY5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q4MDY3NjhkYTc2YjQ3MDU5ODc0Y2M3OTM2N2M1M2QzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjc1MjExMzk1OTE3MzMsLTczLjc3MjU4Nzg3NjIwOTA2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM0NjdiM2VkOTE4MzQ0ZjI5OThiNjc1NzhkY2E2M2Y0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I4Yzc1MTI5YzcyYjRlNzlhZWUwNDA5N2E2NzA5NjVlID0gJCgnPGRpdiBpZD0iaHRtbF9iOGM3NTEyOWM3MmI0ZTc5YWVlMDQwOTdhNjcwOTY1ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um9jaGRhbGUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzQ2N2IzZWQ5MTgzNDRmMjk5OGI2NzU3OGRjYTYzZjQuc2V0Q29udGVudChodG1sX2I4Yzc1MTI5YzcyYjRlNzlhZWUwNDA5N2E2NzA5NjVlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q4MDY3NjhkYTc2YjQ3MDU5ODc0Y2M3OTM2N2M1M2QzLmJpbmRQb3B1cChwb3B1cF8zNDY3YjNlZDkxODM0NGYyOTk4YjY3NTc4ZGNhNjNmNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81ZGU1NGFlM2FiZmY0M2NiODRlYTUzNmE5NjFlOGQ5YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY2NjIzMDQ5MDM2ODU4NCwtNzMuNzYwNDIwOTI2ODIyODddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzM0MzZkZGY1NThhNDZkMTk1MDZlMGVlM2UwM2QzMTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjc5OTgzODcyYjAyNDA0NGI5NjI0MzAxZWM4ZTY2NDUgPSAkKCc8ZGl2IGlkPSJodG1sXzI3OTk4Mzg3MmIwMjQwNDRiOTYyNDMwMWVjOGU2NjQ1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TcHJpbmdmaWVsZCBHYXJkZW5zLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2MzNDM2ZGRmNTU4YTQ2ZDE5NTA2ZTBlZTNlMDNkMzE1LnNldENvbnRlbnQoaHRtbF8yNzk5ODM4NzJiMDI0MDQ0Yjk2MjQzMDFlYzhlNjY0NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81ZGU1NGFlM2FiZmY0M2NiODRlYTUzNmE5NjFlOGQ5YS5iaW5kUG9wdXAocG9wdXBfYzM0MzZkZGY1NThhNDZkMTk1MDZlMGVlM2UwM2QzMTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDY3YTM3ZDZmZjJlNDU2YWFmOTQwZGZmYzc3NWUzY2MgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42OTI3NzQ2MzkxNjA4NDUsLTczLjczNTI2ODczNzA4MDI2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdkYTY0ZTdiOGRkNTRhYTRiZjVjMjA4N2EyZTNmYmM3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RiMjNjZjdjY2M3ZjQyYzdiZWMwMzQzNjU4YTJmM2I1ID0gJCgnPGRpdiBpZD0iaHRtbF9kYjIzY2Y3Y2NjN2Y0MmM3YmVjMDM0MzY1OGEyZjNiNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2FtYnJpYSBIZWlnaHRzLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdkYTY0ZTdiOGRkNTRhYTRiZjVjMjA4N2EyZTNmYmM3LnNldENvbnRlbnQoaHRtbF9kYjIzY2Y3Y2NjN2Y0MmM3YmVjMDM0MzY1OGEyZjNiNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wNjdhMzdkNmZmMmU0NTZhYWY5NDBkZmZjNzc1ZTNjYy5iaW5kUG9wdXAocG9wdXBfN2RhNjRlN2I4ZGQ1NGFhNGJmNWMyMDg3YTJlM2ZiYzcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2U5Y2ZkYmExYzNkNDcwMmIxNDhlMzk3YmE0YmMzY2UgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NTk4MTY0MzM0MjgwODQsLTczLjczNTI2MDc5NDI4Mjc4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2EyMDZmMDgwNDViNTRmMDhhNmZlOGNkYzkyZmM0YTllID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M5MTM0N2U0NjBmZjQ1YWQ5MWY5Y2QxNzYwOGI3MjQ0ID0gJCgnPGRpdiBpZD0iaHRtbF9jOTEzNDdlNDYwZmY0NWFkOTFmOWNkMTc2MDhiNzI0NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um9zZWRhbGUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTIwNmYwODA0NWI1NGYwOGE2ZmU4Y2RjOTJmYzRhOWUuc2V0Q29udGVudChodG1sX2M5MTM0N2U0NjBmZjQ1YWQ5MWY5Y2QxNzYwOGI3MjQ0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NlOWNmZGJhMWMzZDQ3MDJiMTQ4ZTM5N2JhNGJjM2NlLmJpbmRQb3B1cChwb3B1cF9hMjA2ZjA4MDQ1YjU0ZjA4YTZmZThjZGM5MmZjNGE5ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zYWViMTBkNzU4MWQ0ODlkOGUxMmI3NzJiNjE1YjE5NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYwMzEzNDQzMjUwMDg5NCwtNzMuNzU0OTc5NjgwNDM4NzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWQ5ZjNmYzFhYzc1NDEwZDkwNWRhYjMxNjNmY2MxNTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTBlNGI1OTllNTM2NDNlNDhkYWUwNWJmMWQzZjBkOTIgPSAkKCc8ZGl2IGlkPSJodG1sX2UwZTRiNTk5ZTUzNjQzZTQ4ZGFlMDViZjFkM2YwZDkyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GYXIgUm9ja2F3YXksIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWQ5ZjNmYzFhYzc1NDEwZDkwNWRhYjMxNjNmY2MxNTIuc2V0Q29udGVudChodG1sX2UwZTRiNTk5ZTUzNjQzZTQ4ZGFlMDViZjFkM2YwZDkyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNhZWIxMGQ3NTgxZDQ4OWQ4ZTEyYjc3MmI2MTViMTk2LmJpbmRQb3B1cChwb3B1cF9hZDlmM2ZjMWFjNzU0MTBkOTA1ZGFiMzE2M2ZjYzE1Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85ZjgyNjNjYTJiOGQ0OThjODdiYzhkODBhYzJjYmIyZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYwMzAyNjU4MzUxMjM4LC03My44MjAwNTQ4OTExMDMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y2ODAyYTNkMjI3NTRlYWU5MzRiNjRkMGExY2IxYmRiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU3NDI4YjMxZmFlZjQzOWY4MmE1OTE1MjdkMzkyODI1ID0gJCgnPGRpdiBpZD0iaHRtbF81NzQyOGIzMWZhZWY0MzlmODJhNTkxNTI3ZDM5MjgyNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJvYWQgQ2hhbm5lbCwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mNjgwMmEzZDIyNzU0ZWFlOTM0YjY0ZDBhMWNiMWJkYi5zZXRDb250ZW50KGh0bWxfNTc0MjhiMzFmYWVmNDM5ZjgyYTU5MTUyN2QzOTI4MjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWY4MjYzY2EyYjhkNDk4Yzg3YmM4ZDgwYWMyY2JiMmYuYmluZFBvcHVwKHBvcHVwX2Y2ODAyYTNkMjI3NTRlYWU5MzRiNjRkMGExY2IxYmRiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI0NDQyZjg2ODcyODQzZTk4NGU0ZGY4M2MzOTEyZTljID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTU3NDAxMjg4NDU0NTIsLTczLjkyNTUxMTk2OTk0MTY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E0MzM5YTVhMDdlYzQ1Yzc5YTlhMzQxZmM2ZmVkMmI2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhhM2Y2N2NkZjkxZTQ0ZDliOTJlZThjMGM1NGIyMzlkID0gJCgnPGRpdiBpZD0iaHRtbF84YTNmNjdjZGY5MWU0NGQ5YjkyZWU4YzBjNTRiMjM5ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJlZXp5IFBvaW50LCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E0MzM5YTVhMDdlYzQ1Yzc5YTlhMzQxZmM2ZmVkMmI2LnNldENvbnRlbnQoaHRtbF84YTNmNjdjZGY5MWU0NGQ5YjkyZWU4YzBjNTRiMjM5ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yNDQ0MmY4Njg3Mjg0M2U5ODRlNGRmODNjMzkxMmU5Yy5iaW5kUG9wdXAocG9wdXBfYTQzMzlhNWEwN2VjNDVjNzlhOWEzNDFmYzZmZWQyYjYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWM5NmY4Njg1ZmUxNGYxYzkyZDk0ODk1ODYwNTY1ZmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NzU5MjMwMTU2NDI4OTYsLTczLjkwMjI4OTYwMzkxNjczXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q4YjIyYmM5NGNhMzRiZjI5MDk3ZTZmOWQyMjJlYmZhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M2MjNkMzg3MGNjODQ5YmFiODQzZTRjZDIwZTk0MmViID0gJCgnPGRpdiBpZD0iaHRtbF9jNjIzZDM4NzBjYzg0OWJhYjg0M2U0Y2QyMGU5NDJlYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3RlaW53YXksIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDhiMjJiYzk0Y2EzNGJmMjkwOTdlNmY5ZDIyMmViZmEuc2V0Q29udGVudChodG1sX2M2MjNkMzg3MGNjODQ5YmFiODQzZTRjZDIwZTk0MmViKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzljOTZmODY4NWZlMTRmMWM5MmQ5NDg5NTg2MDU2NWZmLmJpbmRQb3B1cChwb3B1cF9kOGIyMmJjOTRjYTM0YmYyOTA5N2U2ZjlkMjIyZWJmYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NzMwNzE1NmFjMjA0ZjRjYTRkZTA3NTU0YjBmYTdiYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc5Mjc4MTQwMzYwMDQ4LC03My44MDQzNjQ1MTcyMDk4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wY2IxMTUwYTY4M2U0NmYyYTMxYzMwMDJlNzFhOTFkMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80OTMxYzE4MGVlMWM0MmM3OWMwZDA1MDYzZGJkNzA5MCA9ICQoJzxkaXYgaWQ9Imh0bWxfNDkzMWMxODBlZTFjNDJjNzljMGQwNTA2M2RiZDcwOTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJlZWNoaHVyc3QsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGNiMTE1MGE2ODNlNDZmMmEzMWMzMDAyZTcxYTkxZDIuc2V0Q29udGVudChodG1sXzQ5MzFjMTgwZWUxYzQyYzc5YzBkMDUwNjNkYmQ3MDkwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk3MzA3MTU2YWMyMDRmNGNhNGRlMDc1NTRiMGZhN2JiLmJpbmRQb3B1cChwb3B1cF8wY2IxMTUwYTY4M2U0NmYyYTMxYzMwMDJlNzFhOTFkMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wZDZjYWNmOTlmMjg0N2MxYWQ4ZjA5M2NjZmRmMTRjYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc4Mjg0MjgwNjI0NTU1NCwtNzMuNzc2ODAyMjI2MjE1OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xMmRlZjNhZjVmYzQ0MmNkOWIzYWJkYWJmMWEzMDlhZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hOGMyZDIxMGQzMTk0MWU0ODU4Y2QzZDYwMmQzNTBiNCA9ICQoJzxkaXYgaWQ9Imh0bWxfYThjMmQyMTBkMzE5NDFlNDg1OGNkM2Q2MDJkMzUwYjQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJheSBUZXJyYWNlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzEyZGVmM2FmNWZjNDQyY2Q5YjNhYmRhYmYxYTMwOWFlLnNldENvbnRlbnQoaHRtbF9hOGMyZDIxMGQzMTk0MWU0ODU4Y2QzZDYwMmQzNTBiNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wZDZjYWNmOTlmMjg0N2MxYWQ4ZjA5M2NjZmRmMTRjYy5iaW5kUG9wdXAocG9wdXBfMTJkZWYzYWY1ZmM0NDJjZDliM2FiZGFiZjFhMzA5YWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWJkN2M3YmQ0YWFhNDJlNzk4M2M0ODNhZjRiYzhkNDIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41OTU2NDE4MDczNjg0OTQsLTczLjc3NjEzMjgyMzkxNzA1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q1YzNmOGQ2NzQ4NTRjZjA4NjFlNGQxZmNiNzY4YzRkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM2ZTM2NTQxYmEwNTRjNjE4Njg1MzM3MDY4ODE5YzJlID0gJCgnPGRpdiBpZD0iaHRtbF8zNmUzNjU0MWJhMDU0YzYxODY4NTMzNzA2ODgxOWMyZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWRnZW1lcmUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDVjM2Y4ZDY3NDg1NGNmMDg2MWU0ZDFmY2I3NjhjNGQuc2V0Q29udGVudChodG1sXzM2ZTM2NTQxYmEwNTRjNjE4Njg1MzM3MDY4ODE5YzJlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzFiZDdjN2JkNGFhYTQyZTc5ODNjNDgzYWY0YmM4ZDQyLmJpbmRQb3B1cChwb3B1cF9kNWMzZjhkNjc0ODU0Y2YwODYxZTRkMWZjYjc2OGM0ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84YmFiZDZlNjVkYzI0M2IxODgzNjQ0NzA5OGIwYjI4OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU4OTE0Mzk0MzcyOTcxLC03My43OTE5OTIzMzEzNjk0M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83YzZjOGI2OGQ0ZTI0YmY3YmUzMTQyOGJmN2I3YjQ0YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yNTJhMThiYTgwMTU0NTA5YTc5ZTFkMDVjNDVjMDA0NiA9ICQoJzxkaXYgaWQ9Imh0bWxfMjUyYTE4YmE4MDE1NDUwOWE3OWUxZDA1YzQ1YzAwNDYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFydmVybmUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2M2YzhiNjhkNGUyNGJmN2JlMzE0MjhiZjdiN2I0NGIuc2V0Q29udGVudChodG1sXzI1MmExOGJhODAxNTQ1MDlhNzllMWQwNWM0NWMwMDQ2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhiYWJkNmU2NWRjMjQzYjE4ODM2NDQ3MDk4YjBiMjg4LmJpbmRQb3B1cChwb3B1cF83YzZjOGI2OGQ0ZTI0YmY3YmUzMTQyOGJmN2I3YjQ0Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81YTQwZTI5MDg5ZjM0YjRkOWNlNWQxYzczNjQyMTRhZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU4MjgwMTY5Njg0NTU4NiwtNzMuODIyMzYxMjEwODg3NTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTc5MTMyNmQwYTAwNDVlMmI3NzJiZTk3YjgwZTMxMjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGNjMTk2Y2EwZDliNDljZDgyM2M2NDk1MWQ0YjY1MmIgPSAkKCc8ZGl2IGlkPSJodG1sXzhjYzE5NmNhMGQ5YjQ5Y2Q4MjNjNjQ5NTFkNGI2NTJiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Sb2NrYXdheSBCZWFjaCwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81NzkxMzI2ZDBhMDA0NWUyYjc3MmJlOTdiODBlMzEyMi5zZXRDb250ZW50KGh0bWxfOGNjMTk2Y2EwZDliNDljZDgyM2M2NDk1MWQ0YjY1MmIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWE0MGUyOTA4OWYzNGI0ZDljZTVkMWM3MzY0MjE0YWUuYmluZFBvcHVwKHBvcHVwXzU3OTEzMjZkMGEwMDQ1ZTJiNzcyYmU5N2I4MGUzMTIyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQyMzcyZWJmYTc2ZjQ3ZmFiODAwOTM5YzczNmI4Njg1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTcyMDM2NzMwMjE3MDE1LC03My44NTc1NDY3MjQxMDgyN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xNjc3NGY4ZjY3NDc0Nzg0OTZhZDhkMzRiYzExY2M3MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zMmM5MDFiODYzNmQ0MDc4ODg3YzEwMjg4ZTZlZDJkZiA9ICQoJzxkaXYgaWQ9Imh0bWxfMzJjOTAxYjg2MzZkNDA3ODg4N2MxMDI4OGU2ZWQyZGYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5lcG9uc2l0LCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE2Nzc0ZjhmNjc0NzQ3ODQ5NmFkOGQzNGJjMTFjYzczLnNldENvbnRlbnQoaHRtbF8zMmM5MDFiODYzNmQ0MDc4ODg3YzEwMjg4ZTZlZDJkZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80MjM3MmViZmE3NmY0N2ZhYjgwMDkzOWM3MzZiODY4NS5iaW5kUG9wdXAocG9wdXBfMTY3NzRmOGY2NzQ3NDc4NDk2YWQ4ZDM0YmMxMWNjNzMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGJjYzMzYWNlOWZjNDJlMmIzNjBjZThlMDRlNDIzYTUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjQxMjYxMjI2MTQwNjYsLTczLjgxMjc2MjY5MTM1ODY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE0ODcyMWE3ODczYzQwOTRhMWY4NmU4ZTJlY2MzYzU5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY3YTYyNTcyNGRmODQ5NDE5ZDFhOTI1YWE3NWMyYmNhID0gJCgnPGRpdiBpZD0iaHRtbF82N2E2MjU3MjRkZjg0OTQxOWQxYTkyNWFhNzVjMmJjYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TXVycmF5IEhpbGwsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTQ4NzIxYTc4NzNjNDA5NGExZjg2ZThlMmVjYzNjNTkuc2V0Q29udGVudChodG1sXzY3YTYyNTcyNGRmODQ5NDE5ZDFhOTI1YWE3NWMyYmNhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RiY2MzM2FjZTlmYzQyZTJiMzYwY2U4ZTA0ZTQyM2E1LmJpbmRQb3B1cChwb3B1cF8xNDg3MjFhNzg3M2M0MDk0YTFmODZlOGUyZWNjM2M1OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yOTE4YTc3NmJhYWU0OTdjYTQyZjg0MmVkNGViZWY0YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0MTM3ODQyMTk0NTQzNCwtNzMuNzA4ODQ3MDU4ODkyNDZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTc0N2QyZjFkYjM1NDRjYzg5ZGMyMmRlZGM1YTY5MDUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmZlZGNmODRiNDhlNDhjNThhZWMxN2QxODg0OWUwM2MgPSAkKCc8ZGl2IGlkPSJodG1sX2JmZWRjZjg0YjQ4ZTQ4YzU4YWVjMTdkMTg4NDllMDNjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GbG9yYWwgUGFyaywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hNzQ3ZDJmMWRiMzU0NGNjODlkYzIyZGVkYzVhNjkwNS5zZXRDb250ZW50KGh0bWxfYmZlZGNmODRiNDhlNDhjNThhZWMxN2QxODg0OWUwM2MpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjkxOGE3NzZiYWFlNDk3Y2E0MmY4NDJlZDRlYmVmNGMuYmluZFBvcHVwKHBvcHVwX2E3NDdkMmYxZGIzNTQ0Y2M4OWRjMjJkZWRjNWE2OTA1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2UwMWNkMzVlYzI1YzQ1MzY4NDgwYzAyY2RkY2FlZjA0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzIwOTU3MjA3NjQ0NCwtNzMuNzY3MTQxNjY3MTQ3MjldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGM3YmUyMWJlMmIyNDExMmFkNGU4MDhlMzI0NzA3YzMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjI1MTQ4YjdjMDBjNDFiMWFiOWE5ODMwMjRhNGQzZGIgPSAkKCc8ZGl2IGlkPSJodG1sX2YyNTE0OGI3YzAwYzQxYjFhYjlhOTgzMDI0YTRkM2RiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ib2xsaXN3b29kLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRjN2JlMjFiZTJiMjQxMTJhZDRlODA4ZTMyNDcwN2MzLnNldENvbnRlbnQoaHRtbF9mMjUxNDhiN2MwMGM0MWIxYWI5YTk4MzAyNGE0ZDNkYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lMDFjZDM1ZWMyNWM0NTM2ODQ4MGMwMmNkZGNhZWYwNC5iaW5kUG9wdXAocG9wdXBfNGM3YmUyMWJlMmIyNDExMmFkNGU4MDhlMzI0NzA3YzMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjFkZGI3ZDYxN2IzNDAwZGIwYjdlYTk1N2FiNWJhZTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTY4MDQ4MzAxNDYxMywtNzMuNzg3MjI2OTY5MzY2Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wMWZmNTY5MTMxMDQ0NjJkYWVhNjlmYmFmY2Q5NmU3MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lZGM1NDQ3Y2IzNDc0ZTYzODlkMDRhYWM3OWJlN2Q2NiA9ICQoJzxkaXYgaWQ9Imh0bWxfZWRjNTQ0N2NiMzQ3NGU2Mzg5ZDA0YWFjNzliZTdkNjYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkphbWFpY2EgRXN0YXRlcywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMWZmNTY5MTMxMDQ0NjJkYWVhNjlmYmFmY2Q5NmU3MC5zZXRDb250ZW50KGh0bWxfZWRjNTQ0N2NiMzQ3NGU2Mzg5ZDA0YWFjNzliZTdkNjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjFkZGI3ZDYxN2IzNDAwZGIwYjdlYTk1N2FiNWJhZTYuYmluZFBvcHVwKHBvcHVwXzAxZmY1NjkxMzEwNDQ2MmRhZWE2OWZiYWZjZDk2ZTcwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUzOTJlN2U5OGIwYjQ0NmFiY2M0MTBmYTA1N2JhY2QwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQ0NTcyMzA5Mjg2NywtNzMuODI1ODA5MTUxMTA1NTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzU3N2RkZmM1NWYyNDgxMmJiMjdhMTUzNzY2ODMyNjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGQyZDlmM2QwZGU3NGVkZjkxM2EzOGRkOGZmMjRkMWIgPSAkKCc8ZGl2IGlkPSJodG1sXzBkMmQ5ZjNkMGRlNzRlZGY5MTNhMzhkZDhmZjI0ZDFiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5RdWVlbnNib3JvIEhpbGwsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzU3N2RkZmM1NWYyNDgxMmJiMjdhMTUzNzY2ODMyNjkuc2V0Q29udGVudChodG1sXzBkMmQ5ZjNkMGRlNzRlZGY5MTNhMzhkZDhmZjI0ZDFiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzUzOTJlN2U5OGIwYjQ0NmFiY2M0MTBmYTA1N2JhY2QwLmJpbmRQb3B1cChwb3B1cF9jNTc3ZGRmYzU1ZjI0ODEyYmIyN2ExNTM3NjY4MzI2OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NDg0YzljM2I2MDk0ZjQwOWFjM2ZmYzc3Nzk2YjQwZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcyMzgyNDkwMTgyOTIwNCwtNzMuNzk3NjAzMDA5MTI2NzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzdjODBlNzczZTAzNGQ4ZWIyNDI5YzY1N2ZlMTJlMjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTMzNDA4MWE3N2QxNGQzNTg3MTlkOTViYmE5OGJkY2EgPSAkKCc8ZGl2IGlkPSJodG1sXzkzMzQwODFhNzdkMTRkMzU4NzE5ZDk1YmJhOThiZGNhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IaWxsY3Jlc3QsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzdjODBlNzczZTAzNGQ4ZWIyNDI5YzY1N2ZlMTJlMjUuc2V0Q29udGVudChodG1sXzkzMzQwODFhNzdkMTRkMzU4NzE5ZDk1YmJhOThiZGNhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk0ODRjOWMzYjYwOTRmNDA5YWMzZmZjNzc3OTZiNDBkLmJpbmRQb3B1cChwb3B1cF9jN2M4MGU3NzNlMDM0ZDhlYjI0MjljNjU3ZmUxMmUyNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wYWNiOTY4OTgyYTg0YjViODhhM2MyYzQxYzRlY2ZkMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2MTcwNDUyNjA1NDE0NiwtNzMuOTMxNTc1MDYwNzI4NzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTRmMzA2NWE0MjE0NGQ4MmJlNDc1ODE5YTQ3ZjU3ZDIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjJkZDhlNDY4MzMyNGM2NmEwYjc0OTE0NTkzMzg3N2IgPSAkKCc8ZGl2IGlkPSJodG1sXzYyZGQ4ZTQ2ODMzMjRjNjZhMGI3NDkxNDU5MzM4NzdiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SYXZlbnN3b29kLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk0ZjMwNjVhNDIxNDRkODJiZTQ3NTgxOWE0N2Y1N2QyLnNldENvbnRlbnQoaHRtbF82MmRkOGU0NjgzMzI0YzY2YTBiNzQ5MTQ1OTMzODc3Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wYWNiOTY4OTgyYTg0YjViODhhM2MyYzQxYzRlY2ZkMy5iaW5kUG9wdXAocG9wdXBfOTRmMzA2NWE0MjE0NGQ4MmJlNDc1ODE5YTQ3ZjU3ZDIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDBiOTViYzE5MDNiNDAwYWE1YWEyMDNkOGQ3M2YzNWIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NjM5MTg0MTkyNTEzOSwtNzMuODQ5NjM3ODI0MDI0NDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzliMjQ3NzQxOTZkNDdhNTkzMTA2MGJkOTBjNDQxNDEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjg5YTExMzY2ODkwNDc3ZDk5MGY2NzIxNWU4MDEyOGMgPSAkKCc8ZGl2IGlkPSJodG1sXzI4OWExMTM2Njg5MDQ3N2Q5OTBmNjcyMTVlODAxMjhjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MaW5kZW53b29kLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM5YjI0Nzc0MTk2ZDQ3YTU5MzEwNjBiZDkwYzQ0MTQxLnNldENvbnRlbnQoaHRtbF8yODlhMTEzNjY4OTA0NzdkOTkwZjY3MjE1ZTgwMTI4Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80MGI5NWJjMTkwM2I0MDBhYTVhYTIwM2Q4ZDczZjM1Yi5iaW5kUG9wdXAocG9wdXBfMzliMjQ3NzQxOTZkNDdhNTkzMTA2MGJkOTBjNDQxNDEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjExNmJkYmRjY2U1NDkwOGJlMDk5YzcxNDE3OGI1NjkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42Njc4ODM4OTY2MDI0NywtNzMuNzQwMjU2MDc5ODk4MjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDdkZWJhZmYzM2Y1NGFkYWI0MTM5YTI1ODcyMDQyNzQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2M0ZjdhNWYyNjBiNDkxYTk3MmQyZjVmZDhjZDRmNjIgPSAkKCc8ZGl2IGlkPSJodG1sX2NjNGY3YTVmMjYwYjQ5MWE5NzJkMmY1ZmQ4Y2Q0ZjYyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MYXVyZWx0b24sIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDdkZWJhZmYzM2Y1NGFkYWI0MTM5YTI1ODcyMDQyNzQuc2V0Q29udGVudChodG1sX2NjNGY3YTVmMjYwYjQ5MWE5NzJkMmY1ZmQ4Y2Q0ZjYyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2YxMTZiZGJkY2NlNTQ5MDhiZTA5OWM3MTQxNzhiNTY5LmJpbmRQb3B1cChwb3B1cF8wN2RlYmFmZjMzZjU0YWRhYjQxMzlhMjU4NzIwNDI3NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xN2EwMTZhZTcwNjY0OWNmOTZjYWQ3ZDAwYzFmMmZiZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczNjA3NDU3MDgzMDc5NSwtNzMuODYyNTI0NzE0MTM3NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hNzliNTZlMTAxOTA0MGIwODAyNmUwZTUzYTE0YzNlZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81ZjAwNTg5OGJlMmY0MjIzYjYwZGY0ZmE1ODNiN2RiZCA9ICQoJzxkaXYgaWQ9Imh0bWxfNWYwMDU4OThiZTJmNDIyM2I2MGRmNGZhNTgzYjdkYmQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxlZnJhayBDaXR5LCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E3OWI1NmUxMDE5MDQwYjA4MDI2ZTBlNTNhMTRjM2VkLnNldENvbnRlbnQoaHRtbF81ZjAwNTg5OGJlMmY0MjIzYjYwZGY0ZmE1ODNiN2RiZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xN2EwMTZhZTcwNjY0OWNmOTZjYWQ3ZDAwYzFmMmZiZC5iaW5kUG9wdXAocG9wdXBfYTc5YjU2ZTEwMTkwNDBiMDgwMjZlMGU1M2ExNGMzZWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWI2Njg4MWFmYTFhNDc0MWIzOTM4NGUwNGViMWEzNjggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41NzYxNTU1NjU0MzEwOSwtNzMuODU0MDE3NTAzOTI1Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kZWY1YmUxOTE3NDY0ZTM3YWU4NjdhOTBmOGY0YzhlZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83N2RkOTQ4YWY5MzE0NTc5YTIwZjY5YjNmZTFkZWFkNCA9ICQoJzxkaXYgaWQ9Imh0bWxfNzdkZDk0OGFmOTMxNDU3OWEyMGY2OWIzZmUxZGVhZDQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJlbGxlIEhhcmJvciwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kZWY1YmUxOTE3NDY0ZTM3YWU4NjdhOTBmOGY0YzhlZi5zZXRDb250ZW50KGh0bWxfNzdkZDk0OGFmOTMxNDU3OWEyMGY2OWIzZmUxZGVhZDQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWI2Njg4MWFmYTFhNDc0MWIzOTM4NGUwNGViMWEzNjguYmluZFBvcHVwKHBvcHVwX2RlZjViZTE5MTc0NjRlMzdhZTg2N2E5MGY4ZjRjOGVmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg5YTdlZDkwNWQwZDRhN2Y5OTEyMDQ4NDExMTM3YjRiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTgwMzQyOTU2NDYxMzEsLTczLjg0MTUzMzcwMjI2MTg2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E4ZDg5Njg0MGQxZTQ5ZTlhOTFlMjQyMzVjNTA5NDM3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2YwNTNhMTVlYjMxYjRjMzdhZjlmZDBlZTUyZTExZDhkID0gJCgnPGRpdiBpZD0iaHRtbF9mMDUzYTE1ZWIzMWI0YzM3YWY5ZmQwZWU1MmUxMWQ4ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um9ja2F3YXkgUGFyaywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hOGQ4OTY4NDBkMWU0OWU5YTkxZTI0MjM1YzUwOTQzNy5zZXRDb250ZW50KGh0bWxfZjA1M2ExNWViMzFiNGMzN2FmOWZkMGVlNTJlMTFkOGQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODlhN2VkOTA1ZDBkNGE3Zjk5MTIwNDg0MTExMzdiNGIuYmluZFBvcHVwKHBvcHVwX2E4ZDg5Njg0MGQxZTQ5ZTlhOTFlMjQyMzVjNTA5NDM3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U1ZWY3ZjM3OTk1NDQyZTJhOGQ4NTVmM2U5MDc0OTJiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTk3NzEwNjE1NjU3NjgsLTczLjc5NjY0NzUwODQ0MDQ3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE3MTljYTE4ODQzYTQ3ZDNiNTRhZWRhNTM5MWVlYjY0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk4MThiMDc3MjZjNDRkMjY4MzVkYWI5NGZhNThjMTk4ID0gJCgnPGRpdiBpZD0iaHRtbF85ODE4YjA3NzI2YzQ0ZDI2ODM1ZGFiOTRmYTU4YzE5OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U29tZXJ2aWxsZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xNzE5Y2ExODg0M2E0N2QzYjU0YWVkYTUzOTFlZWI2NC5zZXRDb250ZW50KGh0bWxfOTgxOGIwNzcyNmM0NGQyNjgzNWRhYjk0ZmE1OGMxOTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTVlZjdmMzc5OTU0NDJlMmE4ZDg1NWYzZTkwNzQ5MmIuYmluZFBvcHVwKHBvcHVwXzE3MTljYTE4ODQzYTQ3ZDNiNTRhZWRhNTM5MWVlYjY0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzlhZDAzMmZlMmRhYzRkZmFhNzQxOGIxZTgzZjVlODRiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjYwMDAzMjI3MzM2MTMsLTczLjc1MTc1MzEwNzMxMTUzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NiN2MwMjhhYzAyYTRlYjc5MDQ1MjU5NTA0MzlkY2QyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U1ODhkYTg2MTI3YjRlZDZhYWQ5ODM3YTFhNTNmZDRkID0gJCgnPGRpdiBpZD0iaHRtbF9lNTg4ZGE4NjEyN2I0ZWQ2YWFkOTgzN2ExYTUzZmQ0ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJvb2t2aWxsZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jYjdjMDI4YWMwMmE0ZWI3OTA0NTI1OTUwNDM5ZGNkMi5zZXRDb250ZW50KGh0bWxfZTU4OGRhODYxMjdiNGVkNmFhZDk4MzdhMWE1M2ZkNGQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWFkMDMyZmUyZGFjNGRmYWE3NDE4YjFlODNmNWU4NGIuYmluZFBvcHVwKHBvcHVwX2NiN2MwMjhhYzAyYTRlYjc5MDQ1MjU5NTA0MzlkY2QyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NjNTI0NDJhZGY2YzQ2ODdiYTgxOWZiYTc3OGI4ZDdiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzMzMDE0MDQwMjc4MzQsLTczLjczODg5MTk4OTEyNDgxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzllYWMyNmVhN2M5MDQ3ZjliYThlZjg0ZWJjMzcyNWNiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU0Zjk0NDZiYWViNDQwODhiMTVhZDRmZDk2OThmOGY3ID0gJCgnPGRpdiBpZD0iaHRtbF81NGY5NDQ2YmFlYjQ0MDg4YjE1YWQ0ZmQ5Njk4ZjhmNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmVsbGFpcmUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWVhYzI2ZWE3YzkwNDdmOWJhOGVmODRlYmMzNzI1Y2Iuc2V0Q29udGVudChodG1sXzU0Zjk0NDZiYWViNDQwODhiMTVhZDRmZDk2OThmOGY3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NjNTI0NDJhZGY2YzQ2ODdiYTgxOWZiYTc3OGI4ZDdiLmJpbmRQb3B1cChwb3B1cF85ZWFjMjZlYTdjOTA0N2Y5YmE4ZWY4NGViYzM3MjVjYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zNTc4YzQ1YzYyZGE0NzUzOGExNzdkNjE4OGZmMDU5NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1NDA3MDk5OTA0ODksLTczLjg1NzUxNzkwNjc2NDQ3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VkYjliMzdjMWY1MTQ1YjM5ZTYwZGQ3NjVjNDg5NDI5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVkZDliY2E3ODkyNDQ1ZjQ5MzUxOTIwYjk3ZWE0ZmNlID0gJCgnPGRpdiBpZD0iaHRtbF81ZGQ5YmNhNzg5MjQ0NWY0OTM1MTkyMGI5N2VhNGZjZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tm9ydGggQ29yb25hLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2VkYjliMzdjMWY1MTQ1YjM5ZTYwZGQ3NjVjNDg5NDI5LnNldENvbnRlbnQoaHRtbF81ZGQ5YmNhNzg5MjQ0NWY0OTM1MTkyMGI5N2VhNGZjZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zNTc4YzQ1YzYyZGE0NzUzOGExNzdkNjE4OGZmMDU5Ni5iaW5kUG9wdXAocG9wdXBfZWRiOWIzN2MxZjUxNDViMzllNjBkZDc2NWM0ODk0MjkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjM1ZTY0MzFmMzlmNDdlOWJkZjJlYTEwNDYxMDAyMGQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTQ2MTEwODE1MTE3LC03My44NDEwMjIxMTIzNDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQwMGI5ZmFkZjI5NjQ4YzA4NTNmNTE2NTNlOTBmNzA3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNhMjgwMmVjODg0NjRjOGViZjk3ZWNiNTJhZDZjN2MxID0gJCgnPGRpdiBpZD0iaHRtbF8zYTI4MDJlYzg4NDY0YzhlYmY5N2VjYjUyYWQ2YzdjMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Rm9yZXN0IEhpbGxzIEdhcmRlbnMsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDAwYjlmYWRmMjk2NDhjMDg1M2Y1MTY1M2U5MGY3MDcuc2V0Q29udGVudChodG1sXzNhMjgwMmVjODg0NjRjOGViZjk3ZWNiNTJhZDZjN2MxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2YzNWU2NDMxZjM5ZjQ3ZTliZGYyZWExMDQ2MTAwMjBkLmJpbmRQb3B1cChwb3B1cF80MDBiOWZhZGYyOTY0OGMwODUzZjUxNjUzZTkwZjcwNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kNDdiMDJhZTVkZTc0NjQzYTVmMjQzNWE2MDEwODc5NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0NDk4MTU3MTAwNDQsLTc0LjA3OTM1MzEyNTEyNzk3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzlhZDBjOTFhYjg4NTQwODQ4Y2I5ZjNkNGI4YjlmMmZlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NkYzA1Y2Y2ZWFjODRhNDZiZWU1YWFhYjEzNGEwMmEzID0gJCgnPGRpdiBpZD0iaHRtbF9jZGMwNWNmNmVhYzg0YTQ2YmVlNWFhYWIxMzRhMDJhMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3QuIEdlb3JnZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWFkMGM5MWFiODg1NDA4NDhjYjlmM2Q0YjhiOWYyZmUuc2V0Q29udGVudChodG1sX2NkYzA1Y2Y2ZWFjODRhNDZiZWU1YWFhYjEzNGEwMmEzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q0N2IwMmFlNWRlNzQ2NDNhNWYyNDM1YTYwMTA4Nzk2LmJpbmRQb3B1cChwb3B1cF85YWQwYzkxYWI4ODU0MDg0OGNiOWYzZDRiOGI5ZjJmZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zMWFjNTg4N2NmYmU0OTZmYWIzOTk2NWFjZTIwNDA3MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0MDYxNDU1OTEzNTExLC03NC4wODcwMTY1MDUxNjYyNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zZTA5ZmZmZTgxYjM0ZDczODZmMjI4MWMzZDY0MzRmYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85YmRiZTM5MzdiMzA0MDg0OGZmMDgwOWU2OWIzOTBlNyA9ICQoJzxkaXYgaWQ9Imh0bWxfOWJkYmUzOTM3YjMwNDA4NDhmZjA4MDllNjliMzkwZTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5ldyBCcmlnaHRvbiwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2UwOWZmZmU4MWIzNGQ3Mzg2ZjIyODFjM2Q2NDM0ZmIuc2V0Q29udGVudChodG1sXzliZGJlMzkzN2IzMDQwODQ4ZmYwODA5ZTY5YjM5MGU3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzMxYWM1ODg3Y2ZiZTQ5NmZhYjM5OTY1YWNlMjA0MDczLmJpbmRQb3B1cChwb3B1cF8zZTA5ZmZmZTgxYjM0ZDczODZmMjI4MWMzZDY0MzRmYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wY2MyMzA1Y2IyMGY0NTRjOTI0OTY1ZDcxMTZmNjhkZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYyNjkyNzYyNTM4MTc2LC03NC4wNzc5MDE5MjY2MDA2Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80ZmZkMGQyZDk3MTA0OWQ5OGVjNTY4NWU1YTliZmEwNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hZTk4ZDU4MjI3NWE0MjJhYmNkOTlhNTg1MTY4ZWQxYSA9ICQoJzxkaXYgaWQ9Imh0bWxfYWU5OGQ1ODIyNzVhNDIyYWJjZDk5YTU4NTE2OGVkMWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN0YXBsZXRvbiwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGZmZDBkMmQ5NzEwNDlkOThlYzU2ODVlNWE5YmZhMDcuc2V0Q29udGVudChodG1sX2FlOThkNTgyMjc1YTQyMmFiY2Q5OWE1ODUxNjhlZDFhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzBjYzIzMDVjYjIwZjQ1NGM5MjQ5NjVkNzExNmY2OGRkLmJpbmRQb3B1cChwb3B1cF80ZmZkMGQyZDk3MTA0OWQ5OGVjNTY4NWU1YTliZmEwNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iMDRhZDcxZWZjYmY0YWI0YjM2ZmJkYWQ4ZDI3NjU0OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxNTMwNDk0NjUyNzYxLC03NC4wNjk4MDUyNjcxNjE0MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83ZTRjZmY2N2IyY2I0OWViYWZjYzJkN2JmYmFkNWY1ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wY2FiMTJlMDIwYjk0NmY0YTAyZmVjMDA4YTYzMmI5OCA9ICQoJzxkaXYgaWQ9Imh0bWxfMGNhYjEyZTAyMGI5NDZmNGEwMmZlYzAwOGE2MzJiOTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJvc2ViYW5rLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83ZTRjZmY2N2IyY2I0OWViYWZjYzJkN2JmYmFkNWY1Zi5zZXRDb250ZW50KGh0bWxfMGNhYjEyZTAyMGI5NDZmNGEwMmZlYzAwOGE2MzJiOTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjA0YWQ3MWVmY2JmNGFiNGIzNmZiZGFkOGQyNzY1NDkuYmluZFBvcHVwKHBvcHVwXzdlNGNmZjY3YjJjYjQ5ZWJhZmNjMmQ3YmZiYWQ1ZjVmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc2Yzg4MzljZDllNzRhMDg4YmE0OWUxMWM4MjE2NzVhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjMxODc4OTI2NTQ2MDcsLTc0LjEwNzE4MTc4MjY1NjFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzFkYzNiMGQwZGU3NDVmY2I4Zjk5ZjAwYmZmZmFiNWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzFiNGYzZDMwNmI0NDA0NGI2MzI5YTEzNWYyNDJlMWEgPSAkKCc8ZGl2IGlkPSJodG1sX2MxYjRmM2QzMDZiNDQwNDRiNjMyOWExMzVmMjQyZTFhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZXN0IEJyaWdodG9uLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jMWRjM2IwZDBkZTc0NWZjYjhmOTlmMDBiZmZmYWI1ZS5zZXRDb250ZW50KGh0bWxfYzFiNGYzZDMwNmI0NDA0NGI2MzI5YTEzNWYyNDJlMWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzZjODgzOWNkOWU3NGEwODhiYTQ5ZTExYzgyMTY3NWEuYmluZFBvcHVwKHBvcHVwX2MxZGMzYjBkMGRlNzQ1ZmNiOGY5OWYwMGJmZmZhYjVlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVjZjY3NTYxMDI5MDQzYWZhZmRhZjA5ZmI4ZDVjZmMzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjI0MTg0NzkxMzEzMDA2LC03NC4wODcyNDgxOTk4MzcyOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iODQwZjM1NGNkMjQ0NTMzOGIzMGIzNTUyZTZiMGYwOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMGViNjczNGFlNWY0NTc3ODRlNmFhMjA0ZDI2MDRiYyA9ICQoJzxkaXYgaWQ9Imh0bWxfZjBlYjY3MzRhZTVmNDU3Nzg0ZTZhYTIwNGQyNjA0YmMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdyeW1lcyBIaWxsLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iODQwZjM1NGNkMjQ0NTMzOGIzMGIzNTUyZTZiMGYwOC5zZXRDb250ZW50KGh0bWxfZjBlYjY3MzRhZTVmNDU3Nzg0ZTZhYTIwNGQyNjA0YmMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWNmNjc1NjEwMjkwNDNhZmFmZGFmMDlmYjhkNWNmYzMuYmluZFBvcHVwKHBvcHVwX2I4NDBmMzU0Y2QyNDQ1MzM4YjMwYjM1NTJlNmIwZjA4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY0ZjRiZjU4YzRhZjQ4MzZhN2VkMTFiYjRmOGVjMGQwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTk3MDY4NTE4MTQ2NzMsLTc0LjExMTMyODgxODAwODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTEyODI0Y2U5Yzg2NDM5NDk0ZGMwNWMyMDhkZTcxZjQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTVjODc3ZmM4MjUwNGM3NmI0YTJhMWYyMzhmNWY1MmYgPSAkKCc8ZGl2IGlkPSJodG1sXzU1Yzg3N2ZjODI1MDRjNzZiNGEyYTFmMjM4ZjVmNTJmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ub2R0IEhpbGwsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ExMjgyNGNlOWM4NjQzOTQ5NGRjMDVjMjA4ZGU3MWY0LnNldENvbnRlbnQoaHRtbF81NWM4NzdmYzgyNTA0Yzc2YjRhMmExZjIzOGY1ZjUyZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82NGY0YmY1OGM0YWY0ODM2YTdlZDExYmI0ZjhlYzBkMC5iaW5kUG9wdXAocG9wdXBfYTEyODI0Y2U5Yzg2NDM5NDk0ZGMwNWMyMDhkZTcxZjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTE2NmY0ZGE0N2I5NDNiMzlkMDYwMjU4ZTYzNmQ2MjQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41ODAyNDc0MTM1MDk1NiwtNzQuMDc5NTUyOTI1Mzk4Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83MDA1NjU2ZWZkZGU0OWJmOGEyOWY0OGUwOWFlOTRmZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yNjM5NWRlYmU2NWY0NGEwYmMyNDI3MDg4NGZhZTliMyA9ICQoJzxkaXYgaWQ9Imh0bWxfMjYzOTVkZWJlNjVmNDRhMGJjMjQyNzA4ODRmYWU5YjMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNvdXRoIEJlYWNoLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83MDA1NjU2ZWZkZGU0OWJmOGEyOWY0OGUwOWFlOTRmZS5zZXRDb250ZW50KGh0bWxfMjYzOTVkZWJlNjVmNDRhMGJjMjQyNzA4ODRmYWU5YjMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTE2NmY0ZGE0N2I5NDNiMzlkMDYwMjU4ZTYzNmQ2MjQuYmluZFBvcHVwKHBvcHVwXzcwMDU2NTZlZmRkZTQ5YmY4YTI5ZjQ4ZTA5YWU5NGZlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA2MmRkNWUzODUxMDQ2ZTViYWI3YzgxYTcwMWFiZGM2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjMzNjY5MzA1NTQzNjUsLTc0LjEyOTQzNDI2Nzk3MDA4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y0ZDBkYzU3YTY1ZDQ4MTNhYTE5YmQ1ZjE0M2UwMzVlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBhNzVjYmZlMWEzMjQyYTE4NzExN2I4MDgzZTllOTJkID0gJCgnPGRpdiBpZD0iaHRtbF8wYTc1Y2JmZTFhMzI0MmExODcxMTdiODA4M2U5ZTkyZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UG9ydCBSaWNobW9uZCwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjRkMGRjNTdhNjVkNDgxM2FhMTliZDVmMTQzZTAzNWUuc2V0Q29udGVudChodG1sXzBhNzVjYmZlMWEzMjQyYTE4NzExN2I4MDgzZTllOTJkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA2MmRkNWUzODUxMDQ2ZTViYWI3YzgxYTcwMWFiZGM2LmJpbmRQb3B1cChwb3B1cF9mNGQwZGM1N2E2NWQ0ODEzYWExOWJkNWYxNDNlMDM1ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wZGI3NzdhY2Q5ZTY0ZjUxOTk4ZjQ5OGMzY2NkNWQxMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYzMjU0NjM5MDQ4MTEyNCwtNzQuMTUwMDg1MzcwNDY5ODFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDc2Yjk1NDFhNTIxNDI4MGE1OTA1NzkyOWIzMTRhNDQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTBkOTZiMWJkMmExNDcxN2FkMGU2OTZiOGZjNDVlYjMgPSAkKCc8ZGl2IGlkPSJodG1sX2UwZDk2YjFiZDJhMTQ3MTdhZDBlNjk2YjhmYzQ1ZWIzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYXJpbmVyJiMzOTtzIEhhcmJvciwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDc2Yjk1NDFhNTIxNDI4MGE1OTA1NzkyOWIzMTRhNDQuc2V0Q29udGVudChodG1sX2UwZDk2YjFiZDJhMTQ3MTdhZDBlNjk2YjhmYzQ1ZWIzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzBkYjc3N2FjZDllNjRmNTE5OThmNDk4YzNjY2Q1ZDExLmJpbmRQb3B1cChwb3B1cF80NzZiOTU0MWE1MjE0MjgwYTU5MDU3OTI5YjMxNGE0NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85ODQzZmE1MDc0NWU0N2Q0YTc4MDZiYmM0NWFmZGMwNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYzOTY4Mjk3ODQ1NTQyLC03NC4xNzQ2NDUzMjk5MzU0Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMjAxYmIwMzEzY2I0NGMxYmZjMGU2ZTdhYmM2ZWZiNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mNjc3NzJjMDA4OTE0Mjc2OTEwZWEzYzFlZWJlMzU3MSA9ICQoJzxkaXYgaWQ9Imh0bWxfZjY3NzcyYzAwODkxNDI3NjkxMGVhM2MxZWViZTM1NzEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBvcnQgSXZvcnksIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2IyMDFiYjAzMTNjYjQ0YzFiZmMwZTZlN2FiYzZlZmI0LnNldENvbnRlbnQoaHRtbF9mNjc3NzJjMDA4OTE0Mjc2OTEwZWEzYzFlZWJlMzU3MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85ODQzZmE1MDc0NWU0N2Q0YTc4MDZiYmM0NWFmZGMwNS5iaW5kUG9wdXAocG9wdXBfYjIwMWJiMDMxM2NiNDRjMWJmYzBlNmU3YWJjNmVmYjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmNjNGQ1YjZhNzg1NDhlYmI4NzNlOGMwNTI3YWJiOWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MTMzMzU5Mzc2Njc0MiwtNzQuMTE5MTgwNTg1MzQ4NDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWJlYTExMWNkOWQ3NDFjYWFkODQwN2NiNzk2MmVmZDEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzhjZWYxMTQ1YjBiNGI0ZGEwYjAwNDkxMmQ1ZTZkODUgPSAkKCc8ZGl2IGlkPSJodG1sXzc4Y2VmMTE0NWIwYjRiNGRhMGIwMDQ5MTJkNWU2ZDg1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DYXN0bGV0b24gQ29ybmVycywgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWJlYTExMWNkOWQ3NDFjYWFkODQwN2NiNzk2MmVmZDEuc2V0Q29udGVudChodG1sXzc4Y2VmMTE0NWIwYjRiNGRhMGIwMDQ5MTJkNWU2ZDg1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZjYzRkNWI2YTc4NTQ4ZWJiODczZThjMDUyN2FiYjljLmJpbmRQb3B1cChwb3B1cF8xYmVhMTExY2Q5ZDc0MWNhYWQ4NDA3Y2I3OTYyZWZkMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kNTY2MTZmZjJkZGY0NmI0YjYwNmEwOTNlM2Y0NmVlNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU5NDI1MjM3OTE2MTY5NSwtNzQuMTY0OTYwMzEzMjk4MjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTgwZmMzYzc2MzlkNDA1YmE4MGEyMzVhNDU1OTExYTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTY1ZmYwMjNlNmJmNDUzOWE0NjFmZDk4MzAxMDg4YjUgPSAkKCc8ZGl2IGlkPSJodG1sXzk2NWZmMDIzZTZiZjQ1MzlhNDYxZmQ5ODMwMTA4OGI1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OZXcgU3ByaW5ndmlsbGUsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E4MGZjM2M3NjM5ZDQwNWJhODBhMjM1YTQ1NTkxMWEyLnNldENvbnRlbnQoaHRtbF85NjVmZjAyM2U2YmY0NTM5YTQ2MWZkOTgzMDEwODhiNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kNTY2MTZmZjJkZGY0NmI0YjYwNmEwOTNlM2Y0NmVlNS5iaW5kUG9wdXAocG9wdXBfYTgwZmMzYzc2MzlkNDA1YmE4MGEyMzVhNDU1OTExYTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmE2ZDQwZWFlNDI3NDU1YjhkZTA1Zjg5NTlkZTYyOTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41ODYzMTM3NTEwMzI4MSwtNzQuMTkwNzM3MTc1MzgxMTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjZlZmNmOWU3YWU3NDMzY2I0ZTUwMTZkZDEwNDc0OGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGU0YzAyODJmNjE1NDllOGFkYmIyOTg4MDEzZWQ5NjggPSAkKCc8ZGl2IGlkPSJodG1sXzhlNGMwMjgyZjYxNTQ5ZThhZGJiMjk4ODAxM2VkOTY4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UcmF2aXMsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I2ZWZjZjllN2FlNzQzM2NiNGU1MDE2ZGQxMDQ3NDhmLnNldENvbnRlbnQoaHRtbF84ZTRjMDI4MmY2MTU0OWU4YWRiYjI5ODgwMTNlZDk2OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mYTZkNDBlYWU0Mjc0NTViOGRlMDVmODk1OWRlNjI5Ny5iaW5kUG9wdXAocG9wdXBfYjZlZmNmOWU3YWU3NDMzY2I0ZTUwMTZkZDEwNDc0OGYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDAwZGI4N2NhODgxNDNjOWI5NTQ2YmU2MDIzNTcxMzUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41NzI1NzIzMTgyMDYzMiwtNzQuMTE2NDc5NDM2MDYzOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yYTE4Y2U4Y2QwMWE0NzhlYWVkYTY3YmJkZDUwNTcxZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hYTBlNTQ0NDdmOGE0YTBmOTE2NDIyOGFlYTQ1ZGE3NiA9ICQoJzxkaXYgaWQ9Imh0bWxfYWEwZTU0NDQ3ZjhhNGEwZjkxNjQyMjhhZWE0NWRhNzYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5ldyBEb3JwLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yYTE4Y2U4Y2QwMWE0NzhlYWVkYTY3YmJkZDUwNTcxZS5zZXRDb250ZW50KGh0bWxfYWEwZTU0NDQ3ZjhhNGEwZjkxNjQyMjhhZWE0NWRhNzYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDAwZGI4N2NhODgxNDNjOWI5NTQ2YmU2MDIzNTcxMzUuYmluZFBvcHVwKHBvcHVwXzJhMThjZThjZDAxYTQ3OGVhZWRhNjdiYmRkNTA1NzFlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU4Yzk5MjBjNWZjODQ3NmY5YTdmZTAzNzBlMmZlMTVhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTU4NDYyMjQzMjg4OCwtNzQuMTIxNTY1OTM3NzE4OTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzM2MTMzOGFmZWJjNDE5Mjk0YmU5OWE2MjZmZDMxZTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTJjZDc1MjJjNzgwNDNmZGFlNzU3NjYxZjczZTU4OWMgPSAkKCc8ZGl2IGlkPSJodG1sXzEyY2Q3NTIyYzc4MDQzZmRhZTc1NzY2MWY3M2U1ODljIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PYWt3b29kLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jMzYxMzM4YWZlYmM0MTkyOTRiZTk5YTYyNmZkMzFlMC5zZXRDb250ZW50KGh0bWxfMTJjZDc1MjJjNzgwNDNmZGFlNzU3NjYxZjczZTU4OWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNThjOTkyMGM1ZmM4NDc2ZjlhN2ZlMDM3MGUyZmUxNWEuYmluZFBvcHVwKHBvcHVwX2MzNjEzMzhhZmViYzQxOTI5NGJlOTlhNjI2ZmQzMWUwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RkYmE1ZGQ1NjA4NDQ1YzBiNWU2YWIzYWRhNzNiODZiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTQ5NDgwMjI4NzEzNjA1LC03NC4xNDkzMjM4MTQ5MDk5Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80MjRiYjcxZjhhYWY0NThmYWIwMmQxNDM5MWI5ZDdlYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lMWRiYjVmMTBhY2I0NjNkYjA0NGMzOTM4ODVjZjUzOCA9ICQoJzxkaXYgaWQ9Imh0bWxfZTFkYmI1ZjEwYWNiNDYzZGIwNDRjMzkzODg1Y2Y1MzgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdyZWF0IEtpbGxzLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MjRiYjcxZjhhYWY0NThmYWIwMmQxNDM5MWI5ZDdlYS5zZXRDb250ZW50KGh0bWxfZTFkYmI1ZjEwYWNiNDYzZGIwNDRjMzkzODg1Y2Y1MzgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGRiYTVkZDU2MDg0NDVjMGI1ZTZhYjNhZGE3M2I4NmIuYmluZFBvcHVwKHBvcHVwXzQyNGJiNzFmOGFhZjQ1OGZhYjAyZDE0MzkxYjlkN2VhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ExZDEyZmZiZjg0MzQyMzZhOGI5ZmNkZWFhMWEwYTM5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTQyMjMwNzQ3NDUwNzQ1LC03NC4xNjQzMzA4MDQxOTM2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM4OTMyMTAxZmQwYjRlOTk4ZWJkZTI3NDllYjFlNDE3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzViNWU0OWU4NDI1YjQ0ZTdiMDI3M2Q4YTE4ZmRkNmQ4ID0gJCgnPGRpdiBpZD0iaHRtbF81YjVlNDllODQyNWI0NGU3YjAyNzNkOGExOGZkZDZkOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWx0aW5ndmlsbGUsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM4OTMyMTAxZmQwYjRlOTk4ZWJkZTI3NDllYjFlNDE3LnNldENvbnRlbnQoaHRtbF81YjVlNDllODQyNWI0NGU3YjAyNzNkOGExOGZkZDZkOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hMWQxMmZmYmY4NDM0MjM2YThiOWZjZGVhYTFhMGEzOS5iaW5kUG9wdXAocG9wdXBfMzg5MzIxMDFmZDBiNGU5OThlYmRlMjc0OWViMWU0MTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTk1NjE5ZDE2YzkyNDAxODkzODBhZDQ4ZTBiODE4YjkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41MzgxMTQxNzQ3NDUwNywtNzQuMTc4NTQ4NjYxNjU4NzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzZkYjNmMTcxMGY4NDFjMzhkMGE2YWJlZDJkNTM1MTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDY4NmU1MmNlNGM2NDFkN2I4MmRkNzgzNTBkM2YzMjggPSAkKCc8ZGl2IGlkPSJodG1sXzA2ODZlNTJjZTRjNjQxZDdiODJkZDc4MzUwZDNmMzI4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Bbm5hZGFsZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzZkYjNmMTcxMGY4NDFjMzhkMGE2YWJlZDJkNTM1MTMuc2V0Q29udGVudChodG1sXzA2ODZlNTJjZTRjNjQxZDdiODJkZDc4MzUwZDNmMzI4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2E5NTYxOWQxNmM5MjQwMTg5MzgwYWQ0OGUwYjgxOGI5LmJpbmRQb3B1cChwb3B1cF8zNmRiM2YxNzEwZjg0MWMzOGQwYTZhYmVkMmQ1MzUxMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zNDFhNTY0MzE1NWI0ZmE4YjgxN2EwMmZiMTdkOWE1OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU0MTk2NzYyMjg4ODc1NSwtNzQuMjA1MjQ1ODI0ODAzMjZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWVhNDA5ZTc2ODlhNDE5OTk1NmEyODRjMjdhZGRkM2EgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWE0NDYwZWU0NWMyNDE3ZTg0YjJhMzc2ODNiYzI4NzkgPSAkKCc8ZGl2IGlkPSJodG1sXzVhNDQ2MGVlNDVjMjQxN2U4NGIyYTM3NjgzYmMyODc5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Xb29kcm93LCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hZWE0MDllNzY4OWE0MTk5OTU2YTI4NGMyN2FkZGQzYS5zZXRDb250ZW50KGh0bWxfNWE0NDYwZWU0NWMyNDE3ZTg0YjJhMzc2ODNiYzI4NzkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzQxYTU2NDMxNTViNGZhOGI4MTdhMDJmYjE3ZDlhNTkuYmluZFBvcHVwKHBvcHVwX2FlYTQwOWU3Njg5YTQxOTk5NTZhMjg0YzI3YWRkZDNhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc5MGRhMmYyODhkOTRmMzU4ZWRiYmRhNmYyZmM1NjBkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTA1MzMzNzYxMTU2NDIsLTc0LjI0NjU2OTM0MjM1MjgzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NjMTk4OWFlY2RhODRlMjViMzBiMmI4MDIyMmViMDZmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E2OTlmZDA0YzM1ZjQzOGFhYTg5YTUyMjZhNjE4N2MxID0gJCgnPGRpdiBpZD0iaHRtbF9hNjk5ZmQwNGMzNWY0MzhhYWE4OWE1MjI2YTYxODdjMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VG90dGVudmlsbGUsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NjMTk4OWFlY2RhODRlMjViMzBiMmI4MDIyMmViMDZmLnNldENvbnRlbnQoaHRtbF9hNjk5ZmQwNGMzNWY0MzhhYWE4OWE1MjI2YTYxODdjMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83OTBkYTJmMjg4ZDk0ZjM1OGVkYmJkYTZmMmZjNTYwZC5iaW5kUG9wdXAocG9wdXBfY2MxOTg5YWVjZGE4NGUyNWIzMGIyYjgwMjIyZWIwNmYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTAyMDkxZjRlMWMzNGE1NzgwMTM3NmYzODhhYzFjN2EgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MzczMTYwNjcxMTAzMjYsLTc0LjA4MDU1MzUxNzkwMTE1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRjNDA4NDcxNzA1NTQ2NDliZmFhYjczZDdlZjQzNmYwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJkNjI2ZWQ0Y2M3MTRhNmE4YjlmYTgwODM0NTRlYzcxID0gJCgnPGRpdiBpZD0iaHRtbF8yZDYyNmVkNGNjNzE0YTZhOGI5ZmE4MDgzNDU0ZWM3MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VG9tcGtpbnN2aWxsZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGM0MDg0NzE3MDU1NDY0OWJmYWFiNzNkN2VmNDM2ZjAuc2V0Q29udGVudChodG1sXzJkNjI2ZWQ0Y2M3MTRhNmE4YjlmYTgwODM0NTRlYzcxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2EwMjA5MWY0ZTFjMzRhNTc4MDEzNzZmMzg4YWMxYzdhLmJpbmRQb3B1cChwb3B1cF80YzQwODQ3MTcwNTU0NjQ5YmZhYWI3M2Q3ZWY0MzZmMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84OGNkMzk5ZGNkMmM0YTgxYjE1ZjU1NjZjN2U3NDkwYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxOTE5MzEwNzkyNjc2LC03NC4wOTYyOTAyOTIzNTQ1OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84Y2U0MTBhNTk1YzQ0YmU5ODk3NGY1ZmNmZTMxM2NkNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iNDY5OWFkM2QxZWQ0NmIyYTBjZTI2YTE0MTU3OTZiMyA9ICQoJzxkaXYgaWQ9Imh0bWxfYjQ2OTlhZDNkMWVkNDZiMmEwY2UyNmExNDE1Nzk2YjMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNpbHZlciBMYWtlLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84Y2U0MTBhNTk1YzQ0YmU5ODk3NGY1ZmNmZTMxM2NkNi5zZXRDb250ZW50KGh0bWxfYjQ2OTlhZDNkMWVkNDZiMmEwY2UyNmExNDE1Nzk2YjMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODhjZDM5OWRjZDJjNGE4MWIxNWY1NTY2YzdlNzQ5MGEuYmluZFBvcHVwKHBvcHVwXzhjZTQxMGE1OTVjNDRiZTk4OTc0ZjVmY2ZlMzEzY2Q2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVhZDBlMmQ2YjU0MTRiYzJiNjAzMGFkZWI0MjQ2MzlkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjEyNzYwMTU3NTY0ODksLTc0LjA5NzEyNTUyMTc4NTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTNlOTBmNTllN2YyNDU1ZWI1YjU3MzQ1YWM2NTVhNDUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTZkNGZkMmFkODY5NDFmNzhlOTViZDA1Nzg1MjliMzQgPSAkKCc8ZGl2IGlkPSJodG1sX2U2ZDRmZDJhZDg2OTQxZjc4ZTk1YmQwNTc4NTI5YjM0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdW5ueXNpZGUsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzUzZTkwZjU5ZTdmMjQ1NWViNWI1NzM0NWFjNjU1YTQ1LnNldENvbnRlbnQoaHRtbF9lNmQ0ZmQyYWQ4Njk0MWY3OGU5NWJkMDU3ODUyOWIzNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81YWQwZTJkNmI1NDE0YmMyYjYwMzBhZGViNDI0NjM5ZC5iaW5kUG9wdXAocG9wdXBfNTNlOTBmNTllN2YyNDU1ZWI1YjU3MzQ1YWM2NTVhNDUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTg3ZTBhOGE3NjI1NGY5NDgwNjJmNzM4Y2MxNTlkOGIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NDM2NzUxODMzNDA5NzQsLTczLjk2MTAxMzEyNDY2Nzc5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAwMDdkOWJjYjgzYjQ1NWVhOGE5NDAwZDA1MGNlMGFmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2YzNWQ4NDgzMjYyZjRmODk4ZmVkYWM0NjdlYTI0ZWIxID0gJCgnPGRpdiBpZD0iaHRtbF9mMzVkODQ4MzI2MmY0Zjg5OGZlZGFjNDY3ZWEyNGViMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RGl0bWFzIFBhcmssIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMDA3ZDliY2I4M2I0NTVlYThhOTQwMGQwNTBjZTBhZi5zZXRDb250ZW50KGh0bWxfZjM1ZDg0ODMyNjJmNGY4OThmZWRhYzQ2N2VhMjRlYjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTg3ZTBhOGE3NjI1NGY5NDgwNjJmNzM4Y2MxNTlkOGIuYmluZFBvcHVwKHBvcHVwXzAwMDdkOWJjYjgzYjQ1NWVhOGE5NDAwZDA1MGNlMGFmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBmMzVhODcxMGMzYTRkMTNiYjc2MTVkZjE1ZmI3NGY5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjYwOTQ2NTYxODgxMTEsLTczLjkzNzE4NjgwNTU5MzE0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU2ZTU3NTJmNjVlNDQzOWVhYmYwYzdmNmIyYWE1ZjkzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RlYzUzYTQ4NGI2MDRkMDFiNWFmMmQ5YWNlZDczNDYwID0gJCgnPGRpdiBpZD0iaHRtbF9kZWM1M2E0ODRiNjA0ZDAxYjVhZjJkOWFjZWQ3MzQ2MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2luZ2F0ZSwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU2ZTU3NTJmNjVlNDQzOWVhYmYwYzdmNmIyYWE1ZjkzLnNldENvbnRlbnQoaHRtbF9kZWM1M2E0ODRiNjA0ZDAxYjVhZjJkOWFjZWQ3MzQ2MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wZjM1YTg3MTBjM2E0ZDEzYmI3NjE1ZGYxNWZiNzRmOS5iaW5kUG9wdXAocG9wdXBfNTZlNTc1MmY2NWU0NDM5ZWFiZjBjN2Y2YjJhYTVmOTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGE2YTY0YjliNzU5NGYyNDk0OTA1NDJmZjdhMWU5YjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NTU1NzIzMTMyODA3NjQsLTczLjkyNjg4MjEyNjE2OTU1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ViZmI3ODFhMjFmYzQ0MjQ5NjFhNWNmMmIxOGNjMTFmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQxM2RmYmU3N2U1ZjQ3ZGJiYWI0MzY1OWEwZDUzYjk4ID0gJCgnPGRpdiBpZD0iaHRtbF80MTNkZmJlNzdlNWY0N2RiYmFiNDM2NTlhMGQ1M2I5OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UnVnYnksIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lYmZiNzgxYTIxZmM0NDI0OTYxYTVjZjJiMThjYzExZi5zZXRDb250ZW50KGh0bWxfNDEzZGZiZTc3ZTVmNDdkYmJhYjQzNjU5YTBkNTNiOTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGE2YTY0YjliNzU5NGYyNDk0OTA1NDJmZjdhMWU5YjMuYmluZFBvcHVwKHBvcHVwX2ViZmI3ODFhMjFmYzQ0MjQ5NjFhNWNmMmIxOGNjMTFmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2MxZjc0ZTFkMDgyOTQ4MzZhNGYyNzU5MDk5NmY0YWU4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA5MTkwNDQ0MzQ1NTgsLTc0LjA4MDE1NzM0OTM2Mjk2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRjMWI2ZDFkNjMzMzQwZGZiNDM1NThjZjI0ZTRkMTlkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFlMWFiNTk3ZTI0MTRiMjE5YzdmYWMyNzcxMDkwMWYwID0gJCgnPGRpdiBpZD0iaHRtbF8xZTFhYjU5N2UyNDE0YjIxOWM3ZmFjMjc3MTA5MDFmMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGFyayBIaWxsLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80YzFiNmQxZDYzMzM0MGRmYjQzNTU4Y2YyNGU0ZDE5ZC5zZXRDb250ZW50KGh0bWxfMWUxYWI1OTdlMjQxNGIyMTljN2ZhYzI3NzEwOTAxZjApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzFmNzRlMWQwODI5NDgzNmE0ZjI3NTkwOTk2ZjRhZTguYmluZFBvcHVwKHBvcHVwXzRjMWI2ZDFkNjMzMzQwZGZiNDM1NThjZjI0ZTRkMTlkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNmNTQ5MWU0MzIxMDQzNmFiMmRkOGIzYzM4YTc3NWZjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjIxMDkwNDcyNzU0MDksLTc0LjEzMzA0MTQzOTUxNzA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U4ZDkwYzVlZDkyZDQ2Mzk5YjM3NjI3YzQxZTQ2YTljID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBkZmFjMmRhZTQ4MDQzMDg4M2E2ODgyY2FkNzEwMDY2ID0gJCgnPGRpdiBpZD0iaHRtbF8wZGZhYzJkYWU0ODA0MzA4ODNhNjg4MmNhZDcxMDA2NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2VzdGVybGVpZ2gsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U4ZDkwYzVlZDkyZDQ2Mzk5YjM3NjI3YzQxZTQ2YTljLnNldENvbnRlbnQoaHRtbF8wZGZhYzJkYWU0ODA0MzA4ODNhNjg4MmNhZDcxMDA2Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zZjU0OTFlNDMyMTA0MzZhYjJkZDhiM2MzOGE3NzVmYy5iaW5kUG9wdXAocG9wdXBfZThkOTBjNWVkOTJkNDYzOTliMzc2MjdjNDFlNDZhOWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjIyNWJjMGNlMWQ2NDkzYWE0ODY2NjNlMjJlNjIyMzcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MjAxNzE1MTIyMzE4ODQsLTc0LjE1MzE1MjQ2Mzg3NzYyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdjMmUyNmE2NDkwYTRhYzRiZWViNmIyNmIzMzVlNDkwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc3ODBlMzRlMjg5MjRkMWRiYzBkOGQ2MWNkZmEzOWY5ID0gJCgnPGRpdiBpZD0iaHRtbF83NzgwZTM0ZTI4OTI0ZDFkYmMwZDhkNjFjZGZhMzlmOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+R3Jhbml0ZXZpbGxlLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83YzJlMjZhNjQ5MGE0YWM0YmVlYjZiMjZiMzM1ZTQ5MC5zZXRDb250ZW50KGh0bWxfNzc4MGUzNGUyODkyNGQxZGJjMGQ4ZDYxY2RmYTM5ZjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjIyNWJjMGNlMWQ2NDkzYWE0ODY2NjNlMjJlNjIyMzcuYmluZFBvcHVwKHBvcHVwXzdjMmUyNmE2NDkwYTRhYzRiZWViNmIyNmIzMzVlNDkwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I4Y2ZjNmU3YWU1MzQ5NjBhYTgwMzhkOGU1MmZkOTM2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjM1MzI1MDk5MTE0OTIsLTc0LjE2NTEwNDIwMjQxMTI0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ1YWM2MzlkMWU2NTQ3YTdiZTUwNGYzN2FkMmYyYzliID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE5ZTlhNDNlNTJhOTRhNWI4MGVlZjgxNzBmMGNkMGZhID0gJCgnPGRpdiBpZD0iaHRtbF8xOWU5YTQzZTUyYTk0YTViODBlZWY4MTcwZjBjZDBmYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXJsaW5ndG9uLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80NWFjNjM5ZDFlNjU0N2E3YmU1MDRmMzdhZDJmMmM5Yi5zZXRDb250ZW50KGh0bWxfMTllOWE0M2U1MmE5NGE1YjgwZWVmODE3MGYwY2QwZmEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjhjZmM2ZTdhZTUzNDk2MGFhODAzOGQ4ZTUyZmQ5MzYuYmluZFBvcHVwKHBvcHVwXzQ1YWM2MzlkMWU2NTQ3YTdiZTUwNGYzN2FkMmYyYzliKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA3YzNjZGY5OTIwMzRhZGM4OTg0YWUxOTMyNDBjZTgxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTk2MzEyNTcxMjc2NzM0LC03NC4wNjcxMjM2MzIyNTU3NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kODE2MjYxMTRjYzg0MGJjYWYwNmZjNzFkNGRjOTQ3NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81YzA0ZGRjZWIxZjA0N2E3YTQ3MTY1MGVhMjA0YjRjMiA9ICQoJzxkaXYgaWQ9Imh0bWxfNWMwNGRkY2ViMWYwNDdhN2E0NzE2NTBlYTIwNGI0YzIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFycm9jaGFyLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kODE2MjYxMTRjYzg0MGJjYWYwNmZjNzFkNGRjOTQ3NC5zZXRDb250ZW50KGh0bWxfNWMwNGRkY2ViMWYwNDdhN2E0NzE2NTBlYTIwNGI0YzIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDdjM2NkZjk5MjAzNGFkYzg5ODRhZTE5MzI0MGNlODEuYmluZFBvcHVwKHBvcHVwX2Q4MTYyNjExNGNjODQwYmNhZjA2ZmM3MWQ0ZGM5NDc0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzMzODMwZmVhYjlkYTRjYWJiMWExZDIwODRjMWZhNWU1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTk4MjY4MzU5NTk5OTEsLTc0LjA3NjY3NDM2Mjc5MDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDA3OTc0MDM3MTA0NDhhMzgwYzc0ZDM4M2NhNjYxOWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWQzZmRkMDU1MGM1NGYzN2IxYjdhN2QxNDA4NDc4ZTMgPSAkKCc8ZGl2IGlkPSJodG1sX2VkM2ZkZDA1NTBjNTRmMzdiMWI3YTdkMTQwODQ3OGUzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmFzbWVyZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDA3OTc0MDM3MTA0NDhhMzgwYzc0ZDM4M2NhNjYxOWUuc2V0Q29udGVudChodG1sX2VkM2ZkZDA1NTBjNTRmMzdiMWI3YTdkMTQwODQ3OGUzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzMzODMwZmVhYjlkYTRjYWJiMWExZDIwODRjMWZhNWU1LmJpbmRQb3B1cChwb3B1cF8wMDc5NzQwMzcxMDQ0OGEzODBjNzRkMzgzY2E2NjE5ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yYzE4YTU1NGEwNzU0ZWFiYTI0NzAwOWI1NjQ4MjVmNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU5NjMyODkxMzc5NTEzLC03NC4wODc1MTExODAwNTU3OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNWMwZjVlMThjN2M0OGM2OGI1YWQxZTFkMDJkMDJmNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lY2IzODM3ZTU0OWM0NTlhYTE5Y2M0MTY3ODhhZWYxMiA9ICQoJzxkaXYgaWQ9Imh0bWxfZWNiMzgzN2U1NDljNDU5YWExOWNjNDE2Nzg4YWVmMTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9sZCBUb3duLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wNWMwZjVlMThjN2M0OGM2OGI1YWQxZTFkMDJkMDJmNC5zZXRDb250ZW50KGh0bWxfZWNiMzgzN2U1NDljNDU5YWExOWNjNDE2Nzg4YWVmMTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmMxOGE1NTRhMDc1NGVhYmEyNDcwMDliNTY0ODI1ZjYuYmluZFBvcHVwKHBvcHVwXzA1YzBmNWUxOGM3YzQ4YzY4YjVhZDFlMWQwMmQwMmY0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2UxMDI4YmZlYzliMzQ2MzNiZGE3NDc4NzEzNjFhNTM2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTg4NjcyOTQ4MTk5Mjc1LC03NC4wOTYzOTkwNTMxMjUyMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82NDg3MzhmOGU4Y2E0YzNmOWQwZjIwOGRmODBiOWFlNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80Y2U4OWExYTZiZjk0Mjc3YTZhMTJlMzNmYmJjYzk0YiA9ICQoJzxkaXYgaWQ9Imh0bWxfNGNlODlhMWE2YmY5NDI3N2E2YTEyZTMzZmJiY2M5NGIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvbmdhbiBIaWxscywgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjQ4NzM4ZjhlOGNhNGMzZjlkMGYyMDhkZjgwYjlhZTYuc2V0Q29udGVudChodG1sXzRjZTg5YTFhNmJmOTQyNzdhNmExMmUzM2ZiYmNjOTRiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2UxMDI4YmZlYzliMzQ2MzNiZGE3NDc4NzEzNjFhNTM2LmJpbmRQb3B1cChwb3B1cF82NDg3MzhmOGU4Y2E0YzNmOWQwZjIwOGRmODBiOWFlNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yYjE4NzQyMjE4M2M0ZTZkYjBjOWM2NTY4ZjY2ZmNjOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU3MzUyNjkwNTc0MjgzLC03NC4wOTM0ODI2NjMwMzU5MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83OGU0NGU1ODMzZDc0YTNhODk1N2I3ZDBjMDBmZGM1ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jYjE1OGEzYzc1ZTM0NzAxYTU3NGQ3ZWI2YWNhNDFkZSA9ICQoJzxkaXYgaWQ9Imh0bWxfY2IxNThhM2M3NWUzNDcwMWE1NzRkN2ViNmFjYTQxZGUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1pZGxhbmQgQmVhY2gsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc4ZTQ0ZTU4MzNkNzRhM2E4OTU3YjdkMGMwMGZkYzVmLnNldENvbnRlbnQoaHRtbF9jYjE1OGEzYzc1ZTM0NzAxYTU3NGQ3ZWI2YWNhNDFkZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yYjE4NzQyMjE4M2M0ZTZkYjBjOWM2NTY4ZjY2ZmNjOS5iaW5kUG9wdXAocG9wdXBfNzhlNDRlNTgzM2Q3NGEzYTg5NTdiN2QwYzAwZmRjNWYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjEzMDEwOTE4YzAzNDY0NmI1OWNkNzA2ZDYwYzQ2MjIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41NzYyMTU1ODcxMTc4OCwtNzQuMTA1ODU1OTg1NDU0MzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDllZGFhY2VmMjM4NDM4Y2JmOTBhNDgyNTY0MjA0MTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzkwODQzMTMxYzEzNDc2YmJiMTljOGNmMGJlYTUyYjMgPSAkKCc8ZGl2IGlkPSJodG1sX2M5MDg0MzEzMWMxMzQ3NmJiYjE5YzhjZjBiZWE1MmIzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmFudCBDaXR5LCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80OWVkYWFjZWYyMzg0MzhjYmY5MGE0ODI1NjQyMDQxNi5zZXRDb250ZW50KGh0bWxfYzkwODQzMTMxYzEzNDc2YmJiMTljOGNmMGJlYTUyYjMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjEzMDEwOTE4YzAzNDY0NmI1OWNkNzA2ZDYwYzQ2MjIuYmluZFBvcHVwKHBvcHVwXzQ5ZWRhYWNlZjIzODQzOGNiZjkwYTQ4MjU2NDIwNDE2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y0MjdkMWQ5YWEyYzQ3ZDQ5NDc5NmJiYjA3ODdkOGM1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTY0MjU1NDkzMDczMzUsLTc0LjEwNDMyNzA3NDY5MTI0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM0Y2UxNDM2MmFlNTRkMzU5YzM4YmYxZDUzOTUxYjE5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzkxOTAwNGY2YzRiMzQ5YmVhZDQ0ZmQ2ZjYyNzkxMzhhID0gJCgnPGRpdiBpZD0iaHRtbF85MTkwMDRmNmM0YjM0OWJlYWQ0NGZkNmY2Mjc5MTM4YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TmV3IERvcnAgQmVhY2gsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM0Y2UxNDM2MmFlNTRkMzU5YzM4YmYxZDUzOTUxYjE5LnNldENvbnRlbnQoaHRtbF85MTkwMDRmNmM0YjM0OWJlYWQ0NGZkNmY2Mjc5MTM4YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mNDI3ZDFkOWFhMmM0N2Q0OTQ3OTZiYmIwNzg3ZDhjNS5iaW5kUG9wdXAocG9wdXBfMzRjZTE0MzYyYWU1NGQzNTljMzhiZjFkNTM5NTFiMTkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDI0OGEzNGU5MGU0NDYxOGFmZmQyNzQwZGE2NDQ0MjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41NTM5ODgwMDg1ODQ2MiwtNzQuMTM5MTY2MjIxNzU3NjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjExYzU5ZDg5MTc3NDdjZjllNGM1ZDE3ZWJhZGUzZjggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTYxZjM2ODY5MzM0NGVlNmI3OWUzNTc0MDlkNDliMmEgPSAkKCc8ZGl2IGlkPSJodG1sXzE2MWYzNjg2OTMzNDRlZTZiNzllMzU3NDA5ZDQ5YjJhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CYXkgVGVycmFjZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjExYzU5ZDg5MTc3NDdjZjllNGM1ZDE3ZWJhZGUzZjguc2V0Q29udGVudChodG1sXzE2MWYzNjg2OTMzNDRlZTZiNzllMzU3NDA5ZDQ5YjJhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2QyNDhhMzRlOTBlNDQ2MThhZmZkMjc0MGRhNjQ0NDIzLmJpbmRQb3B1cChwb3B1cF8yMTFjNTlkODkxNzc0N2NmOWU0YzVkMTdlYmFkZTNmOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81NDQ0MTAxZTk1MmI0YjMzOGRjM2M5ZGI4NzcxMDYwOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjUzMTkxMTkyMDQ4OTYwNSwtNzQuMTkxNzQxMDU3NDc4MTRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDRmZjQyNjY3ODg1NDBjZmFiNDQ1ZGEwNGQ3NmU2ZjMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjVhMzRkNjZiYjA5NDc4YmFhZjNlODY4ZGZkMTdmZDcgPSAkKCc8ZGl2IGlkPSJodG1sX2Y1YTM0ZDY2YmIwOTQ3OGJhYWYzZTg2OGRmZDE3ZmQ3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IdWd1ZW5vdCwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDRmZjQyNjY3ODg1NDBjZmFiNDQ1ZGEwNGQ3NmU2ZjMuc2V0Q29udGVudChodG1sX2Y1YTM0ZDY2YmIwOTQ3OGJhYWYzZTg2OGRmZDE3ZmQ3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzU0NDQxMDFlOTUyYjRiMzM4ZGMzYzlkYjg3NzEwNjA4LmJpbmRQb3B1cChwb3B1cF9kNGZmNDI2Njc4ODU0MGNmYWI0NDVkYTA0ZDc2ZTZmMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wODYxMmIyMzIxYjM0ZjE5OGQyMmFhZjNhODA2OGMzOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjUyNDY5OTM3NjExODEzNiwtNzQuMjE5ODMxMDY2MTY3NzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzM4ZWEyZWMxNTZiNDE0MTllMTgxM2M1MjU4MTIxNDkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTg5OWIzNjE4NDkzNDVjMDhmMjFmNDM0NTUzZTE0MmUgPSAkKCc8ZGl2IGlkPSJodG1sXzU4OTliMzYxODQ5MzQ1YzA4ZjIxZjQzNDU1M2UxNDJlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QbGVhc2FudCBQbGFpbnMsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2MzOGVhMmVjMTU2YjQxNDE5ZTE4MTNjNTI1ODEyMTQ5LnNldENvbnRlbnQoaHRtbF81ODk5YjM2MTg0OTM0NWMwOGYyMWY0MzQ1NTNlMTQyZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wODYxMmIyMzIxYjM0ZjE5OGQyMmFhZjNhODA2OGMzOS5iaW5kUG9wdXAocG9wdXBfYzM4ZWEyZWMxNTZiNDE0MTllMTgxM2M1MjU4MTIxNDkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjRiMmUxNTQ2NjZkNGViZTliOGM1ZjMxMDM5ZmRkMjggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41MDYwODE2NTM0NjMwNSwtNzQuMjI5NTAzNTAyNjAwMjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWVlYWRiNDNmNjViNDExZWFhZmMyNjFmOWE4ZWVhOTEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzhiMTBiY2Q3OGQwNGMxMzlmMWNjMjEwYTU1MzljM2EgPSAkKCc8ZGl2IGlkPSJodG1sX2M4YjEwYmNkNzhkMDRjMTM5ZjFjYzIxMGE1NTM5YzNhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CdXRsZXIgTWFub3IsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2VlZWFkYjQzZjY1YjQxMWVhYWZjMjYxZjlhOGVlYTkxLnNldENvbnRlbnQoaHRtbF9jOGIxMGJjZDc4ZDA0YzEzOWYxY2MyMTBhNTUzOWMzYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yNGIyZTE1NDY2NmQ0ZWJlOWI4YzVmMzEwMzlmZGQyOC5iaW5kUG9wdXAocG9wdXBfZWVlYWRiNDNmNjViNDExZWFhZmMyNjFmOWE4ZWVhOTEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODQwYzcwM2VhNjIyNDBhNzg3MTg1ODZkYWFlMGQwMjEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41MzA1MzE0ODI4MzMxNCwtNzQuMjMyMTU3NzU4OTY1MjZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjNiYzQ3YjA1NjE4NDRkY2FmMGYwZjg2ZjM1YTQ4NmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjc3NDhjMmJhYzdiNGI4YzlmMDQyMWZiZGYxOWIzYWQgPSAkKCc8ZGl2IGlkPSJodG1sXzI3NzQ4YzJiYWM3YjRiOGM5ZjA0MjFmYmRmMTliM2FkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaGFybGVzdG9uLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82M2JjNDdiMDU2MTg0NGRjYWYwZjBmODZmMzVhNDg2ZC5zZXRDb250ZW50KGh0bWxfMjc3NDhjMmJhYzdiNGI4YzlmMDQyMWZiZGYxOWIzYWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODQwYzcwM2VhNjIyNDBhNzg3MTg1ODZkYWFlMGQwMjEuYmluZFBvcHVwKHBvcHVwXzYzYmM0N2IwNTYxODQ0ZGNhZjBmMGY4NmYzNWE0ODZkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNlOTQ4MGU4OGQ4ZjQ2Zjg5ODM3NjE2OTBlZWJkZTg1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTQ5NDA0MDA2NTAwNzIsLTc0LjIxNTcyODUxMTEzOTUyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzkwZDQzYjNlNDJiNzQ0MzM4MThlZDQ3OWMwYTFjZjQ3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE0OGU5ZWI5MDc1YzRjMzg5ODE2N2E2ZjhhNGE1OWFhID0gJCgnPGRpdiBpZD0iaHRtbF8xNDhlOWViOTA3NWM0YzM4OTgxNjdhNmY4YTRhNTlhYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um9zc3ZpbGxlLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85MGQ0M2IzZTQyYjc0NDMzODE4ZWQ0NzljMGExY2Y0Ny5zZXRDb250ZW50KGh0bWxfMTQ4ZTllYjkwNzVjNGMzODk4MTY3YTZmOGE0YTU5YWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2U5NDgwZTg4ZDhmNDZmODk4Mzc2MTY5MGVlYmRlODUuYmluZFBvcHVwKHBvcHVwXzkwZDQzYjNlNDJiNzQ0MzM4MThlZDQ3OWMwYTFjZjQ3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I4OTI2OTUwMTNlYzRmMjdiNGM1NWJkMjgxZmQ1OTUwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTQ5Mjg1ODIyNzgzMjEsLTc0LjE4NTg4Njc0NTgzODkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2UxNTJhYmEwNDFkMzQzZDE5MWY1OGRkODk4NTM5ZTc5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E5ZmUxYWQ4ZjU5NTRlNGE5MDU3MGE5MGIwZjY1NjFhID0gJCgnPGRpdiBpZD0iaHRtbF9hOWZlMWFkOGY1OTU0ZTRhOTA1NzBhOTBiMGY2NTYxYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXJkZW4gSGVpZ2h0cywgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTE1MmFiYTA0MWQzNDNkMTkxZjU4ZGQ4OTg1MzllNzkuc2V0Q29udGVudChodG1sX2E5ZmUxYWQ4ZjU5NTRlNGE5MDU3MGE5MGIwZjY1NjFhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2I4OTI2OTUwMTNlYzRmMjdiNGM1NWJkMjgxZmQ1OTUwLmJpbmRQb3B1cChwb3B1cF9lMTUyYWJhMDQxZDM0M2QxOTFmNThkZDg5ODUzOWU3OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xMTgyYTYyYjM5NWE0NmQ1OGM1Y2Y3NmZmZDY0NDdkZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU1NTI5NTIzNjE3MzE5NCwtNzQuMTcwNzk0MTQ3ODYwOTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDcwNDlmMmQ5ZDUzNGMwODgzYjAxMTYyMjEzODhlZGUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzUwMGJmODdhMWU3NDRlMThhZDk3MGQ1Nzc1MmZkOWUgPSAkKCc8ZGl2IGlkPSJodG1sX2M1MDBiZjg3YTFlNzQ0ZTE4YWQ5NzBkNTc3NTJmZDllIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmVlbnJpZGdlLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80NzA0OWYyZDlkNTM0YzA4ODNiMDExNjIyMTM4OGVkZS5zZXRDb250ZW50KGh0bWxfYzUwMGJmODdhMWU3NDRlMThhZDk3MGQ1Nzc1MmZkOWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTE4MmE2MmIzOTVhNDZkNThjNWNmNzZmZmQ2NDQ3ZGQuYmluZFBvcHVwKHBvcHVwXzQ3MDQ5ZjJkOWQ1MzRjMDg4M2IwMTE2MjIxMzg4ZWRlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU1NjE4ZTlhMjdjOTRiNzk5ZmI3ZTAwMmZiOWVjZGI5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTg5MTM4OTQ4NzUyODEsLTc0LjE1OTAyMjA4MTU2NjAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2YwOTRiOWE2NjM4NDQ0YmJhZThhMDhmMTJhYTliMGY4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZjN2QyMjhhODk2YTQ5MGJhNjgzMzg0YjE1NjQxMmMxID0gJCgnPGRpdiBpZD0iaHRtbF9mYzdkMjI4YTg5NmE0OTBiYTY4MzM4NGIxNTY0MTJjMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SGVhcnRsYW5kIFZpbGxhZ2UsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2YwOTRiOWE2NjM4NDQ0YmJhZThhMDhmMTJhYTliMGY4LnNldENvbnRlbnQoaHRtbF9mYzdkMjI4YTg5NmE0OTBiYTY4MzM4NGIxNTY0MTJjMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81NTYxOGU5YTI3Yzk0Yjc5OWZiN2UwMDJmYjllY2RiOS5iaW5kUG9wdXAocG9wdXBfZjA5NGI5YTY2Mzg0NDRiYmFlOGEwOGYxMmFhOWIwZjgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWMzZGQ3NzIzY2Y2NGFjNWIzZjYwZDIyYTI1NGNlN2MgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41OTQ3MjYwMjc0NjI5NSwtNzQuMTg5NTYwNDU1MTk2OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83NjM0OGI1ZTE4ZGY0YjU2Yjc4MGFkYTQ4MjcxM2NkMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wMjljOWYxMGExYWU0NjdmYmEzMzAyMTRiZjViZDA4NCA9ICQoJzxkaXYgaWQ9Imh0bWxfMDI5YzlmMTBhMWFlNDY3ZmJhMzMwMjE0YmY1YmQwODQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNoZWxzZWEsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc2MzQ4YjVlMThkZjRiNTZiNzgwYWRhNDgyNzEzY2QyLnNldENvbnRlbnQoaHRtbF8wMjljOWYxMGExYWU0NjdmYmEzMzAyMTRiZjViZDA4NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hYzNkZDc3MjNjZjY0YWM1YjNmNjBkMjJhMjU0Y2U3Yy5iaW5kUG9wdXAocG9wdXBfNzYzNDhiNWUxOGRmNGI1NmI3ODBhZGE0ODI3MTNjZDIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWNmNGJlMzAxYzllNGM1YjgyNmM2MDE4YTFmMzBkMzggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MDU3Nzg2ODQ1MjM1OCwtNzQuMTg3MjU2MzgzODE1NjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmFmMmVlZGEzZWZiNDMyNjk4OTA5OWIwZWMwY2EwNjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTUwZjAwODQ4MDU0NDJhZWJkYTkwNWI2ZWQwMWU0OGQgPSAkKCc8ZGl2IGlkPSJodG1sX2E1MGYwMDg0ODA1NDQyYWViZGE5MDViNmVkMDFlNDhkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CbG9vbWZpZWxkLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iYWYyZWVkYTNlZmI0MzI2OTg5MDk5YjBlYzBjYTA2MS5zZXRDb250ZW50KGh0bWxfYTUwZjAwODQ4MDU0NDJhZWJkYTkwNWI2ZWQwMWU0OGQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWNmNGJlMzAxYzllNGM1YjgyNmM2MDE4YTFmMzBkMzguYmluZFBvcHVwKHBvcHVwX2JhZjJlZWRhM2VmYjQzMjY5ODkwOTliMGVjMGNhMDYxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAxZDc2OGE1NjNlYzQ0N2I5ODFlYjY0MTM5NDZlMzJhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA5NTkxODAwNDIwMywtNzQuMTU5NDA5NDg2NTcxMjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzkwMDQzMzcwZjUzNDNhZDg5YzAzNWIxYzJiNjY4YzIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzhiZjA3MTgzY2IxNDk3OWFhYTQ1ZTgyMTI0MTQ1OWEgPSAkKCc8ZGl2IGlkPSJodG1sX2M4YmYwNzE4M2NiMTQ5NzlhYWE0NWU4MjEyNDE0NTlhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CdWxscyBIZWFkLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zOTAwNDMzNzBmNTM0M2FkODljMDM1YjFjMmI2NjhjMi5zZXRDb250ZW50KGh0bWxfYzhiZjA3MTgzY2IxNDk3OWFhYTQ1ZTgyMTI0MTQ1OWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDFkNzY4YTU2M2VjNDQ3Yjk4MWViNjQxMzk0NmUzMmEuYmluZFBvcHVwKHBvcHVwXzM5MDA0MzM3MGY1MzQzYWQ4OWMwMzViMWMyYjY2OGMyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQxNjA1ZDgxM2ZjMDQ0ZWRiZDQ4OTIzYzAxODM3ZWQ5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzgyNjgyNTY3MTI1NywtNzMuOTUzMjU2NDY4MzcxMTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGI0ZWRiZjhjMDRlNGY0NWFjNjk3NTkxNTljMjA0NzAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2NmNzgwZGU3MjkxNGE4ODgzYzM0OTE5NDFiNTQ2NTUgPSAkKCc8ZGl2IGlkPSJodG1sX2NjZjc4MGRlNzI5MTRhODg4M2MzNDkxOTQxYjU0NjU1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DYXJuZWdpZSBIaWxsLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhiNGVkYmY4YzA0ZTRmNDVhYzY5NzU5MTU5YzIwNDcwLnNldENvbnRlbnQoaHRtbF9jY2Y3ODBkZTcyOTE0YTg4ODNjMzQ5MTk0MWI1NDY1NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80MTYwNWQ4MTNmYzA0NGVkYmQ0ODkyM2MwMTgzN2VkOS5iaW5kUG9wdXAocG9wdXBfOGI0ZWRiZjhjMDRlNGY0NWFjNjk3NTkxNTljMjA0NzApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmU1MzcwYzNiYjljNDk1Mzk3MmNiYmViMGZjM2I1NmMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjMyNTkwMTg4NTc2OCwtNzMuOTg4NDMzNjgwMjM1OTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmRkMTgzM2I2ZDU1NGY2N2I2NmQ2ODk1NjIwMWY0ZjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDZlZjlmOGYzMzgwNDg3OTg1ZWRkMmJiYTU4N2ViNTEgPSAkKCc8ZGl2IGlkPSJodG1sXzQ2ZWY5ZjhmMzM4MDQ4Nzk4NWVkZDJiYmE1ODdlYjUxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob2hvLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJkZDE4MzNiNmQ1NTRmNjdiNjZkNjg5NTYyMDFmNGY3LnNldENvbnRlbnQoaHRtbF80NmVmOWY4ZjMzODA0ODc5ODVlZGQyYmJhNTg3ZWI1MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mZTUzNzBjM2JiOWM0OTUzOTcyY2JiZWIwZmMzYjU2Yy5iaW5kUG9wdXAocG9wdXBfMmRkMTgzM2I2ZDU1NGY2N2I2NmQ2ODk1NjIwMWY0ZjcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMGFiNGJiMmExMDFkNDE0YjgwYTc0ODgyZWNlMDI4M2QgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTUyMjg5MjA0NjI4MiwtNzQuMDA1NDE1Mjk4NzMzNTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODg1ZjM2NTc0NjgxNDU5ZWJiODEzOWQ1MGRhZGRiZTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2U3NDg1ZjIwM2U0NDM5ZThlZWRlZjNmYTRiNDU3ZjkgPSAkKCc8ZGl2IGlkPSJodG1sX2NlNzQ4NWYyMDNlNDQzOWU4ZWVkZWYzZmE0YjQ1N2Y5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaXZpYyBDZW50ZXIsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODg1ZjM2NTc0NjgxNDU5ZWJiODEzOWQ1MGRhZGRiZTAuc2V0Q29udGVudChodG1sX2NlNzQ4NWYyMDNlNDQzOWU4ZWVkZWYzZmE0YjQ1N2Y5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzBhYjRiYjJhMTAxZDQxNGI4MGE3NDg4MmVjZTAyODNkLmJpbmRQb3B1cChwb3B1cF84ODVmMzY1NzQ2ODE0NTllYmI4MTM5ZDUwZGFkZGJlMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kNjAzNGFiZWNkYjc0ZjcxODg3YjM2NGM2ZGQyMDNiNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0ODUwOTY2NDMxMjIsLTczLjk4ODcxMzEzMjg1MjQ3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzcwNzJiMzJlYWY0OTRkMjlhZTY2ZTRlY2NhZDI5ZTk4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE1NDIzY2U1Y2ZlMjQ1YWQ5NTVkYjYyYzA2NDVmYWQzID0gJCgnPGRpdiBpZD0iaHRtbF8xNTQyM2NlNWNmZTI0NWFkOTU1ZGI2MmMwNjQ1ZmFkMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWlkdG93biBTb3V0aCwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83MDcyYjMyZWFmNDk0ZDI5YWU2NmU0ZWNjYWQyOWU5OC5zZXRDb250ZW50KGh0bWxfMTU0MjNjZTVjZmUyNDVhZDk1NWRiNjJjMDY0NWZhZDMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDYwMzRhYmVjZGI3NGY3MTg4N2IzNjRjNmRkMjAzYjYuYmluZFBvcHVwKHBvcHVwXzcwNzJiMzJlYWY0OTRkMjlhZTY2ZTRlY2NhZDI5ZTk4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FjNTZkMDNiYTBiNTRhNjg5MDJjNjhlMmY0NTQ2NDE2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTY5NjA1OTQyNzU1MDUsLTc0LjEzNDA1NzI5ODYyNTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzk3NGVjZGE4OGU0NDI4ODlhOTJkZGRjYjI1MDEwOGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWU0NGEyOTIyMjUzNDM4OGJlYzgyMTI2YmU3NmNlNGUgPSAkKCc8ZGl2IGlkPSJodG1sXzVlNDRhMjkyMjI1MzQzODhiZWM4MjEyNmJlNzZjZTRlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SaWNobW9uZCBUb3duLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83OTc0ZWNkYTg4ZTQ0Mjg4OWE5MmRkZGNiMjUwMTA4Yi5zZXRDb250ZW50KGh0bWxfNWU0NGEyOTIyMjUzNDM4OGJlYzgyMTI2YmU3NmNlNGUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWM1NmQwM2JhMGI1NGE2ODkwMmM2OGUyZjQ1NDY0MTYuYmluZFBvcHVwKHBvcHVwXzc5NzRlY2RhODhlNDQyODg5YTkyZGRkY2IyNTAxMDhiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2UzNDEyMzcxMzA0YTRmMGViMzg1MzAxMDZjODcwMzY3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA5NzE5MzQwNzkyODQsLTc0LjA2NjY3NzY2MDYxNzcxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzlmMTJkYWEyN2E5NzQ0NmI5NTU2NDlkZmZmOGUxMjc5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc5YjA0YmViNTg1YTRjODg4MjA5Mzc5ZTZiMTRhODg0ID0gJCgnPGRpdiBpZD0iaHRtbF83OWIwNGJlYjU4NWE0Yzg4ODIwOTM3OWU2YjE0YTg4NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U2hvcmUgQWNyZXMsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzlmMTJkYWEyN2E5NzQ0NmI5NTU2NDlkZmZmOGUxMjc5LnNldENvbnRlbnQoaHRtbF83OWIwNGJlYjU4NWE0Yzg4ODIwOTM3OWU2YjE0YTg4NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lMzQxMjM3MTMwNGE0ZjBlYjM4NTMwMTA2Yzg3MDM2Ny5iaW5kUG9wdXAocG9wdXBfOWYxMmRhYTI3YTk3NDQ2Yjk1NTY0OWRmZmY4ZTEyNzkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjlkZTA3YTc0ZjdkNGNhMDliODQwMGVhOWUzMDgzOWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MTkxNzg0NTIwMjg0MywtNzQuMDcyNjQyNDQ1NDg0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdkMzRlYzJlOWZmNjRmYjM5MzczM2YwMzAxMTZjMzc3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNmZGE1NjY2ZGU4YzRjMWY4ODdmNDdhMGUzMzRmNDhjID0gJCgnPGRpdiBpZD0iaHRtbF8zZmRhNTY2NmRlOGM0YzFmODg3ZjQ3YTBlMzM0ZjQ4YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2xpZnRvbiwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2QzNGVjMmU5ZmY2NGZiMzkzNzMzZjAzMDExNmMzNzcuc2V0Q29udGVudChodG1sXzNmZGE1NjY2ZGU4YzRjMWY4ODdmNDdhMGUzMzRmNDhjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY5ZGUwN2E3NGY3ZDRjYTA5Yjg0MDBlYTllMzA4MzlmLmJpbmRQb3B1cChwb3B1cF83ZDM0ZWMyZTlmZjY0ZmIzOTM3MzNmMDMwMTE2YzM3Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lZGU2N2UxZjNkNmI0NmM5YjM5YzI3M2E0YWZhNzM5OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYwNDQ3MzE4OTY4NzksLTc0LjA4NDAyMzY0NzQwMzU4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk5MmJmM2VkMzJmNjQ3YzViNDYxNGIyNjJlN2ZjZDVmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc4Njg4NzVjNjQxMzQ5MGJiZDAxYThiNjI5Y2MzM2YwID0gJCgnPGRpdiBpZD0iaHRtbF83ODY4ODc1YzY0MTM0OTBiYmQwMWE4YjYyOWNjMzNmMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q29uY29yZCwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTkyYmYzZWQzMmY2NDdjNWI0NjE0YjI2MmU3ZmNkNWYuc2V0Q29udGVudChodG1sXzc4Njg4NzVjNjQxMzQ5MGJiZDAxYThiNjI5Y2MzM2YwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2VkZTY3ZTFmM2Q2YjQ2YzliMzljMjczYTRhZmE3Mzk4LmJpbmRQb3B1cChwb3B1cF85OTJiZjNlZDMyZjY0N2M1YjQ2MTRiMjYyZTdmY2Q1Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jNTM0YzI3YjZiYzI0MWYzYWFlOWY4MThkMmQwMTg2NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYwNjc5NDM5NDgwMSwtNzQuMDk3NzYyMDY5NzI1MjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWRmMzg0Y2NhMWVmNDE1MjkzNDAyOTA1MWQxZjllYjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTgwYzI4MmMxOTM1NDY0ODhkNWY1NTI3ZWIyMGI2MDYgPSAkKCc8ZGl2IGlkPSJodG1sXzk4MGMyODJjMTkzNTQ2NDg4ZDVmNTUyN2ViMjBiNjA2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FbWVyc29uIEhpbGwsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FkZjM4NGNjYTFlZjQxNTI5MzQwMjkwNTFkMWY5ZWIyLnNldENvbnRlbnQoaHRtbF85ODBjMjgyYzE5MzU0NjQ4OGQ1ZjU1MjdlYjIwYjYwNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jNTM0YzI3YjZiYzI0MWYzYWFlOWY4MThkMmQwMTg2Ni5iaW5kUG9wdXAocG9wdXBfYWRmMzg0Y2NhMWVmNDE1MjkzNDAyOTA1MWQxZjllYjIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDQyYzFkZmVlNzBiNDc0OWI3YmQ1OTViOThjNDA4ZGMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MzU2MzAwMDY4MTE1MSwtNzQuMDk4MDUwNjIzNzM4ODddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDRjMzg0OTc2OTI3NDI0ZmFiNTkwM2Q3NDc1ZTAzOTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWU4MGE0YzMyYzg3NDUyMGFiODNjM2RjZmE2MDlhYTAgPSAkKCc8ZGl2IGlkPSJodG1sXzllODBhNGMzMmM4NzQ1MjBhYjgzYzNkY2ZhNjA5YWEwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SYW5kYWxsIE1hbm9yLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80NGMzODQ5NzY5Mjc0MjRmYWI1OTAzZDc0NzVlMDM5My5zZXRDb250ZW50KGh0bWxfOWU4MGE0YzMyYzg3NDUyMGFiODNjM2RjZmE2MDlhYTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDQyYzFkZmVlNzBiNDc0OWI3YmQ1OTViOThjNDA4ZGMuYmluZFBvcHVwKHBvcHVwXzQ0YzM4NDk3NjkyNzQyNGZhYjU5MDNkNzQ3NWUwMzkzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2YyYzQ4NDgzYThkOTQwZWI4Zjk1OTIwMzBmN2RjYzcyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjM4NDMyODM3OTQ3OTUsLTc0LjE4NjIyMzMxNzQ5ODIzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VlZmYzZTgyMDU1OTRjNDQ5ZTc5OTMzNjYyODA3OTczID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk0ODNiMjhlOTk4YTRjYTA4NDJmZTkwM2E2OTE0NGNkID0gJCgnPGRpdiBpZD0iaHRtbF85NDgzYjI4ZTk5OGE0Y2EwODQyZmU5MDNhNjkxNDRjZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SG93bGFuZCBIb29rLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lZWZmM2U4MjA1NTk0YzQ0OWU3OTkzMzY2MjgwNzk3My5zZXRDb250ZW50KGh0bWxfOTQ4M2IyOGU5OThhNGNhMDg0MmZlOTAzYTY5MTQ0Y2QpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjJjNDg0ODNhOGQ5NDBlYjhmOTU5MjAzMGY3ZGNjNzIuYmluZFBvcHVwKHBvcHVwX2VlZmYzZTgyMDU1OTRjNDQ5ZTc5OTMzNjYyODA3OTczKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2EzMWIxMzk2NWFmZTQ1ZGU4MzhjNWI4MTJiM2VhMTkwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjMwMTQ2NzQxMTkzODI2LC03NC4xNDE4MTY3ODk2ODg5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNkYTM4YTNhY2I0NDRmYzFhOGRkMjc4OTAwNTE4ODNhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg1YWViN2JjODZjZjRlNDI5ZTU4ZjlhMTA3Y2NjZDgyID0gJCgnPGRpdiBpZD0iaHRtbF84NWFlYjdiYzg2Y2Y0ZTQyOWU1OGY5YTEwN2NjY2Q4MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWxtIFBhcmssIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNkYTM4YTNhY2I0NDRmYzFhOGRkMjc4OTAwNTE4ODNhLnNldENvbnRlbnQoaHRtbF84NWFlYjdiYzg2Y2Y0ZTQyOWU1OGY5YTEwN2NjY2Q4Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hMzFiMTM5NjVhZmU0NWRlODM4YzViODEyYjNlYTE5MC5iaW5kUG9wdXAocG9wdXBfM2RhMzhhM2FjYjQ0NGZjMWE4ZGQyNzg5MDA1MTg4M2EpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWNlYWI3N2U4ODQ3NDY0YmI0NmRhMmU1ZTE5MWNjMWEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NTIxMTc0NTE3OTM0OTQsLTczLjkxNjY1MzMxOTc4MDQ4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JlYjc2ZWRjMmEyODQxNmZiYzIzZjdkNzY5YzIzZDNlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M0ZmMxMThiNTc2YTRjZTA5YmFkZTA2ZmExNWIwYzJmID0gJCgnPGRpdiBpZD0iaHRtbF9jNGZjMTE4YjU3NmE0Y2UwOWJhZGUwNmZhMTViMGMyZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UmVtc2VuIFZpbGxhZ2UsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iZWI3NmVkYzJhMjg0MTZmYmMyM2Y3ZDc2OWMyM2QzZS5zZXRDb250ZW50KGh0bWxfYzRmYzExOGI1NzZhNGNlMDliYWRlMDZmYTE1YjBjMmYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWNlYWI3N2U4ODQ3NDY0YmI0NmRhMmU1ZTE5MWNjMWEuYmluZFBvcHVwKHBvcHVwX2JlYjc2ZWRjMmEyODQxNmZiYzIzZjdkNzY5YzIzZDNlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzEwNzUxMzZlYjkzMDQwMGQ5OTFiNDA3YzRkZDcwOTVjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjYyNzQ0Mjc5Njk2NiwtNzMuODg1MTE3NzYzNzkyOTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjNiZTJiYmI1NmM3NDczNWEwMGE5NzUwZjc2ZWJlMjYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDFkY2ZjZWE4YWEwNDZlZmE2MGFmZjczYzE5NDhjNjIgPSAkKCc8ZGl2IGlkPSJodG1sXzQxZGNmY2VhOGFhMDQ2ZWZhNjBhZmY3M2MxOTQ4YzYyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OZXcgTG90cywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzIzYmUyYmJiNTZjNzQ3MzVhMDBhOTc1MGY3NmViZTI2LnNldENvbnRlbnQoaHRtbF80MWRjZmNlYThhYTA0NmVmYTYwYWZmNzNjMTk0OGM2Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xMDc1MTM2ZWI5MzA0MDBkOTkxYjQwN2M0ZGQ3MDk1Yy5iaW5kUG9wdXAocG9wdXBfMjNiZTJiYmI1NmM3NDczNWEwMGE5NzUwZjc2ZWJlMjYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTdhYjY5NWMzZTI3NGY2MGFiNGI1MDg0YmNjOGE5MGQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MzEzMTc1NTAzOTY2NywtNzMuOTAyMzM0NzQyOTU4MzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzAzNTAzNTMyZDU4NGZiZmI4MDIwYjFiOGRlMzliYzcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjA1YmJlZDZkZDU1NDJmNDlmMjBmMTFkMTliNTc3MmQgPSAkKCc8ZGl2IGlkPSJodG1sXzIwNWJiZWQ2ZGQ1NTQyZjQ5ZjIwZjExZDE5YjU3NzJkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QYWVyZGVnYXQgQmFzaW4sIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zMDM1MDM1MzJkNTg0ZmJmYjgwMjBiMWI4ZGUzOWJjNy5zZXRDb250ZW50KGh0bWxfMjA1YmJlZDZkZDU1NDJmNDlmMjBmMTFkMTliNTc3MmQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTdhYjY5NWMzZTI3NGY2MGFiNGI1MDg0YmNjOGE5MGQuYmluZFBvcHVwKHBvcHVwXzMwMzUwMzUzMmQ1ODRmYmZiODAyMGIxYjhkZTM5YmM3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzgzNzYxMmUxMmIxNzQ5NTZiODg2MjZmYWUwZWU3OGZlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjE1OTc0MjM5NjIzMzYsLTczLjkxNTE1MzkxNTUwNDA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk0ZDQwOWJlZDRiMTRlNGU5ZmNkOGE1YjNlM2EyMjA1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2QzZDRiMDMyODE0NjQ4NTg4MjE2YjQyOTQ2N2RkYTAwID0gJCgnPGRpdiBpZD0iaHRtbF9kM2Q0YjAzMjgxNDY0ODU4ODIxNmI0Mjk0NjdkZGEwMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWlsbCBCYXNpbiwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk0ZDQwOWJlZDRiMTRlNGU5ZmNkOGE1YjNlM2EyMjA1LnNldENvbnRlbnQoaHRtbF9kM2Q0YjAzMjgxNDY0ODU4ODIxNmI0Mjk0NjdkZGEwMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84Mzc2MTJlMTJiMTc0OTU2Yjg4NjI2ZmFlMGVlNzhmZS5iaW5kUG9wdXAocG9wdXBfOTRkNDA5YmVkNGIxNGU0ZTlmY2Q4YTViM2UzYTIyMDUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmYwMTMyNGExOWM2NDgzNmEwOTA3OWJmNmNmNmJjM2IgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTE0NTk2NDM3MDQ4MiwtNzMuNzk2NDY0NjIwODE1OTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzMzMmFjN2Y5MTEyNGRkZmJkYjg3YTNmNTViMjgxZWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2QxMGJkYWE5MmRiNDBhZThjNzZjY2MwYjU3ZWQ0OGEgPSAkKCc8ZGl2IGlkPSJodG1sXzdkMTBiZGFhOTJkYjQwYWU4Yzc2Y2NjMGI1N2VkNDhhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5KYW1haWNhIEhpbGxzLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMzMzJhYzdmOTExMjRkZGZiZGI4N2EzZjU1YjI4MWViLnNldENvbnRlbnQoaHRtbF83ZDEwYmRhYTkyZGI0MGFlOGM3NmNjYzBiNTdlZDQ4YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mZjAxMzI0YTE5YzY0ODM2YTA5MDc5YmY2Y2Y2YmMzYi5iaW5kUG9wdXAocG9wdXBfMzMzMmFjN2Y5MTEyNGRkZmJkYjg3YTNmNTViMjgxZWIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTIwNjVjNWZlNWU5NDcwNGI1OTQwNTA4OTNiNjk4MzAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MzM1MDAyNTQyOTc1NywtNzMuNzk2NzE2NzgwMjgzNDldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGM5ZjQ3ODk5OTQ0NDE2OGExZmE3NTZjZWY3NTg4YTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2Q1MDUwMDIwNDA1NGUwYWEzNTA1M2M4NGUwODcwMzIgPSAkKCc8ZGl2IGlkPSJodG1sXzdkNTA1MDAyMDQwNTRlMGFhMzUwNTNjODRlMDg3MDMyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5VdG9waWEsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOGM5ZjQ3ODk5OTQ0NDE2OGExZmE3NTZjZWY3NTg4YTYuc2V0Q29udGVudChodG1sXzdkNTA1MDAyMDQwNTRlMGFhMzUwNTNjODRlMDg3MDMyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2EyMDY1YzVmZTVlOTQ3MDRiNTk0MDUwODkzYjY5ODMwLmJpbmRQb3B1cChwb3B1cF84YzlmNDc4OTk5NDQ0MTY4YTFmYTc1NmNlZjc1ODhhNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85MzBiMzAxNjhiNjI0NTljYTAxNWE1ZjcxYTJkMDhhZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczNDkzNjE4MDc1NDc4LC03My44MDQ4NjEyMDA0MDUzN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85Mzg1ZWNhMWQ0MGY0NDA4OTVhNTM3ZWFmYmFmODUwNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wMjQ3NWVhNmYwYzM0YjEzOTlhMjE4NjEzYTE2MjViYyA9ICQoJzxkaXYgaWQ9Imh0bWxfMDI0NzVlYTZmMGMzNGIxMzk5YTIxODYxM2ExNjI1YmMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBvbW9ub2ssIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTM4NWVjYTFkNDBmNDQwODk1YTUzN2VhZmJhZjg1MDQuc2V0Q29udGVudChodG1sXzAyNDc1ZWE2ZjBjMzRiMTM5OWEyMTg2MTNhMTYyNWJjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzkzMGIzMDE2OGI2MjQ1OWNhMDE1YTVmNzFhMmQwOGFkLmJpbmRQb3B1cChwb3B1cF85Mzg1ZWNhMWQ0MGY0NDA4OTVhNTM3ZWFmYmFmODUwNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hNDVjZDdkMDRjOWE0MDVlYTJlMDk1ZjUxZGVmYjgzNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc3MDMxNzM5Mjk5ODIsLTczLjg5NDY3OTk2MjcwNTc0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdjM2FjYzdjOWM5YjQzZGFiYjk0YzNhNmY1ZTliZDc0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U4MjFkNzMwMDk2YzQyZjk4ZGU1MTE5N2U0M2M4MjU5ID0gJCgnPGRpdiBpZD0iaHRtbF9lODIxZDczMDA5NmM0MmY5OGRlNTExOTdlNDNjODI1OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXN0b3JpYSBIZWlnaHRzLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdjM2FjYzdjOWM5YjQzZGFiYjk0YzNhNmY1ZTliZDc0LnNldENvbnRlbnQoaHRtbF9lODIxZDczMDA5NmM0MmY5OGRlNTExOTdlNDNjODI1OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hNDVjZDdkMDRjOWE0MDVlYTJlMDk1ZjUxZGVmYjgzNS5iaW5kUG9wdXAocG9wdXBfN2MzYWNjN2M5YzliNDNkYWJiOTRjM2E2ZjVlOWJkNzQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDYyODcwOWI2MTI1NDJkNWJmNTkzNTE3MWExZTUyMWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MzE0MjgzNDE2MTU0OCwtNzMuOTAxMTk5MDMzODc2NjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjZmMmZhNTEyZTFhNDdlMDgxMThhNjQ4M2Q0OWU4OTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTI2NjUzNDM2YWMxNDMzMmExZDg2YTRhMWI5OTkxZjUgPSAkKCc8ZGl2IGlkPSJodG1sXzEyNjY1MzQzNmFjMTQzMzJhMWQ4NmE0YTFiOTk5MWY1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGFyZW1vbnQgVmlsbGFnZSwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY2ZjJmYTUxMmUxYTQ3ZTA4MTE4YTY0ODNkNDllODkyLnNldENvbnRlbnQoaHRtbF8xMjY2NTM0MzZhYzE0MzMyYTFkODZhNGExYjk5OTFmNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kNjI4NzA5YjYxMjU0MmQ1YmY1OTM1MTcxYTFlNTIxYy5iaW5kUG9wdXAocG9wdXBfNjZmMmZhNTEyZTFhNDdlMDgxMThhNjQ4M2Q0OWU4OTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2I2ZDdkYzI2NTM5NGE5ODhmNWVlYzc3ZmVmNTMwZjggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MjQ3ODA0OTA4NDI5MDUsLTczLjkxNTg0NjUyNzU5MDA5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I0MmY0OTRlMmE0MzQzZWJiYzMzYWE3MzQ3MDAzODBhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzgxMjMwNWYwNmNiZTQzOWI4NTBhMDVhNDEyN2U3Mzg1ID0gJCgnPGRpdiBpZD0iaHRtbF84MTIzMDVmMDZjYmU0MzliODUwYTA1YTQxMjdlNzM4NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q29uY291cnNlIFZpbGxhZ2UsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iNDJmNDk0ZTJhNDM0M2ViYmMzM2FhNzM0NzAwMzgwYS5zZXRDb250ZW50KGh0bWxfODEyMzA1ZjA2Y2JlNDM5Yjg1MGEwNWE0MTI3ZTczODUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2I2ZDdkYzI2NTM5NGE5ODhmNWVlYzc3ZmVmNTMwZjguYmluZFBvcHVwKHBvcHVwX2I0MmY0OTRlMmE0MzQzZWJiYzMzYWE3MzQ3MDAzODBhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2QxZTE5ZWEwNzEwYjQwZTZiNzdkYmU1ZWZkMzcxMWE5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODQzODI2MTc2NzE2NTQsLTczLjkxNjU1NTUxOTY0NDE5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA0MmJmZWEzYzVkZTQxYzQ4ZWFjOGRlYTJlMzczMzRlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBmYTBjN2ZiZWU3ZDQ3Nzg4NjBmMzJiOWU1MmY4YWU5ID0gJCgnPGRpdiBpZD0iaHRtbF8wZmEwYzdmYmVlN2Q0Nzc4ODYwZjMyYjllNTJmOGFlOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW91bnQgRWRlbiwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA0MmJmZWEzYzVkZTQxYzQ4ZWFjOGRlYTJlMzczMzRlLnNldENvbnRlbnQoaHRtbF8wZmEwYzdmYmVlN2Q0Nzc4ODYwZjMyYjllNTJmOGFlOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kMWUxOWVhMDcxMGI0MGU2Yjc3ZGJlNWVmZDM3MTFhOS5iaW5kUG9wdXAocG9wdXBfMDQyYmZlYTNjNWRlNDFjNDhlYWM4ZGVhMmUzNzMzNGUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWU4ODU2OWY3Y2Y3NGM2NDg1NTNiZjNhZWVmODVlZDcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NDg4NDE2MDcyNDY2NSwtNzMuOTA4Mjk5MzA4ODE5ODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjg3NTA3OGNkYTE4NGJiZjg0MjFhNmIwNjViZmIzMTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjY0ODBmMjczZjVjNGI3MzhiOGNiNzkxZGZkMzUxNjcgPSAkKCc8ZGl2IGlkPSJodG1sX2I2NDgwZjI3M2Y1YzRiNzM4YjhjYjc5MWRmZDM1MTY3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Nb3VudCBIb3BlLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjg3NTA3OGNkYTE4NGJiZjg0MjFhNmIwNjViZmIzMTIuc2V0Q29udGVudChodG1sX2I2NDgwZjI3M2Y1YzRiNzM4YjhjYjc5MWRmZDM1MTY3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2FlODg1NjlmN2NmNzRjNjQ4NTUzYmYzYWVlZjg1ZWQ3LmJpbmRQb3B1cChwb3B1cF8yODc1MDc4Y2RhMTg0YmJmODQyMWE2YjA2NWJmYjMxMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hZDc5OWQ3YTM3ZjI0M2EzOGVjNTU0ZTMzODAyODVlZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2MDI4MDMzMTMxMzc0LC03My45NjM1NTYxNDA5NDMwM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81MDEwM2UyNzNjYjA0MTZkYTlkZDU0NWM0NjNiZjI4MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMzE3OTIwM2NlN2E0Mzg3OWZiNDlmMmYzMmE0Y2M4MiA9ICQoJzxkaXYgaWQ9Imh0bWxfZjMxNzkyMDNjZTdhNDM4NzlmYjQ5ZjJmMzJhNGNjODIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN1dHRvbiBQbGFjZSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MDEwM2UyNzNjYjA0MTZkYTlkZDU0NWM0NjNiZjI4MS5zZXRDb250ZW50KGh0bWxfZjMxNzkyMDNjZTdhNDM4NzlmYjQ5ZjJmMzJhNGNjODIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWQ3OTlkN2EzN2YyNDNhMzhlYzU1NGUzMzgwMjg1ZWUuYmluZFBvcHVwKHBvcHVwXzUwMTAzZTI3M2NiMDQxNmRhOWRkNTQ1YzQ2M2JmMjgxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFjMDUwMjliMmFjYTRjYzc4YzkyZWFlN2M1MDg5YzUwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQzNDE0MDkwMDczNTM2LC03My45NTM4Njc4MjEzMDc0NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82MmUzODQ3N2NlMDQ0M2JlODIyYTFlODI3Yjk5ODdmMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82MTA4N2QzNWZjYmE0OWU1YTIwMzkxMTQzZWY2YWQ3NiA9ICQoJzxkaXYgaWQ9Imh0bWxfNjEwODdkMzVmY2JhNDllNWEyMDM5MTE0M2VmNmFkNzYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkh1bnRlcnMgUG9pbnQsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjJlMzg0NzdjZTA0NDNiZTgyMmExZTgyN2I5OTg3ZjEuc2V0Q29udGVudChodG1sXzYxMDg3ZDM1ZmNiYTQ5ZTVhMjAzOTExNDNlZjZhZDc2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzFjMDUwMjliMmFjYTRjYzc4YzkyZWFlN2M1MDg5YzUwLmJpbmRQb3B1cChwb3B1cF82MmUzODQ3N2NlMDQ0M2JlODIyYTFlODI3Yjk5ODdmMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zMWY2M2MyZWJiNTI0N2M1OTgyZWJiN2YxNWE0YzhjNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1MjA0MjM2OTUwNzIyLC03My45Njc3MDgyNDU4MTgzNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wMmY4NjBkMTQ1Nzg0MDAyYjNiY2QzMjYxMTRlNGFiOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82ZDU1YmZkNWU5NDM0NmE1YmJlYzE1NzM1MThlMjllYSA9ICQoJzxkaXYgaWQ9Imh0bWxfNmQ1NWJmZDVlOTQzNDZhNWJiZWMxNTczNTE4ZTI5ZWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlR1cnRsZSBCYXksIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDJmODYwZDE0NTc4NDAwMmIzYmNkMzI2MTE0ZTRhYjkuc2V0Q29udGVudChodG1sXzZkNTViZmQ1ZTk0MzQ2YTViYmVjMTU3MzUxOGUyOWVhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzMxZjYzYzJlYmI1MjQ3YzU5ODJlYmI3ZjE1YTRjOGM1LmJpbmRQb3B1cChwb3B1cF8wMmY4NjBkMTQ1Nzg0MDAyYjNiY2QzMjYxMTRlNGFiOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hYTg5ZGMxNDljOTk0MDlhOWQ3OTU0ODQ5YWU3ZTRjYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NjkxNzQxMDc0MDE5NSwtNzMuOTcxMjE5Mjg3MjIyNjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDU4NDFmMWM5MmJkNGJkNjhlMzZkMGY5NmJiNzYyY2YgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWNhM2JiMGU5ZDkxNDYyZDgyNGE5MDAyNzU2Njg1M2EgPSAkKCc8ZGl2IGlkPSJodG1sXzFjYTNiYjBlOWQ5MTQ2MmQ4MjRhOTAwMjc1NjY4NTNhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UdWRvciBDaXR5LCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA1ODQxZjFjOTJiZDRiZDY4ZTM2ZDBmOTZiYjc2MmNmLnNldENvbnRlbnQoaHRtbF8xY2EzYmIwZTlkOTE0NjJkODI0YTkwMDI3NTY2ODUzYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hYTg5ZGMxNDljOTk0MDlhOWQ3OTU0ODQ5YWU3ZTRjYy5iaW5kUG9wdXAocG9wdXBfMDU4NDFmMWM5MmJkNGJkNjhlMzZkMGY5NmJiNzYyY2YpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2RmMDVjMDhkYjE5NDRlNTgzNmQ5MjI2OThjYTIwYWQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MzA5OTk1NTQ3NzA2MSwtNzMuOTc0MDUxNzA0NjkyMDNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjNhYjYzZTU4YmY4NGY3NmIzYmM3MDQwYzU1YWI5MWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODlhODA2MGUyMjEzNGIyMmIzOWZmMjdkYmQxZGIyYmEgPSAkKCc8ZGl2IGlkPSJodG1sXzg5YTgwNjBlMjIxMzRiMjJiMzlmZjI3ZGJkMWRiMmJhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdHV5dmVzYW50IFRvd24sIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjNhYjYzZTU4YmY4NGY3NmIzYmM3MDQwYzU1YWI5MWUuc2V0Q29udGVudChodG1sXzg5YTgwNjBlMjIxMzRiMjJiMzlmZjI3ZGJkMWRiMmJhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNkZjA1YzA4ZGIxOTQ0ZTU4MzZkOTIyNjk4Y2EyMGFkLmJpbmRQb3B1cChwb3B1cF8yM2FiNjNlNThiZjg0Zjc2YjNiYzcwNDBjNTVhYjkxZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mODE2MjQyZmU3MWI0YjQ2OTA0Y2ViOGNiNjE4N2M5NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczOTY3MzA0NzYzODQyNiwtNzMuOTkwOTQ3MTA1MjgyNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80MGQ1OTZiMTdlMzg0MDBiOTZiMzIwNjM2ODMwODk4OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iZWRiZTA1ZTNiNDY0ZjhmOWViYzIxNzIwNjVjNmQ4NiA9ICQoJzxkaXYgaWQ9Imh0bWxfYmVkYmUwNWUzYjQ2NGY4ZjllYmMyMTcyMDY1YzZkODYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZsYXRpcm9uLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQwZDU5NmIxN2UzODQwMGI5NmIzMjA2MzY4MzA4OTg4LnNldENvbnRlbnQoaHRtbF9iZWRiZTA1ZTNiNDY0ZjhmOWViYzIxNzIwNjVjNmQ4Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mODE2MjQyZmU3MWI0YjQ2OTA0Y2ViOGNiNjE4N2M5Ny5iaW5kUG9wdXAocG9wdXBfNDBkNTk2YjE3ZTM4NDAwYjk2YjMyMDYzNjgzMDg5ODgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGUzMDM2M2U5MTBiNDFlYmI3ZjAwNjY2YzQxYzBiNjkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NDU2NTE4MDYwODA3NiwtNzMuOTE4MTkyODY0MzE2ODJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWMzZWVjOWE2ZjU3NDE2NmJjZThhZDljZWYyNGNkYjAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTU2MDIzNjBkMDU3NGE1Nzk3YjcwY2QwOWJhYmM2OTkgPSAkKCc8ZGl2IGlkPSJodG1sX2E1NjAyMzYwZDA1NzRhNTc5N2I3MGNkMDliYWJjNjk5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdW5ueXNpZGUgR2FyZGVucywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xYzNlZWM5YTZmNTc0MTY2YmNlOGFkOWNlZjI0Y2RiMC5zZXRDb250ZW50KGh0bWxfYTU2MDIzNjBkMDU3NGE1Nzk3YjcwY2QwOWJhYmM2OTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGUzMDM2M2U5MTBiNDFlYmI3ZjAwNjY2YzQxYzBiNjkuYmluZFBvcHVwKHBvcHVwXzFjM2VlYzlhNmY1NzQxNjZiY2U4YWQ5Y2VmMjRjZGIwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IwMzAwNjkyZDkzNzRkODlhMjMzYjExMTJlNDJjZTAyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzM3MjUwNzE2OTQ0OTcsLTczLjkzMjQ0MjM1MjYwMTc4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M0ZDIzZTBkNWQ3MTQwZTJhY2Q5NmJlZDZkMmFjMDBhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NlOTcxZTY4OTZiZjQzNzhiOTI0MjZlMjM0MTQ4NmQ0ID0gJCgnPGRpdiBpZD0iaHRtbF9jZTk3MWU2ODk2YmY0Mzc4YjkyNDI2ZTIzNDE0ODZkNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Qmxpc3N2aWxsZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNGQyM2UwZDVkNzE0MGUyYWNkOTZiZWQ2ZDJhYzAwYS5zZXRDb250ZW50KGh0bWxfY2U5NzFlNjg5NmJmNDM3OGI5MjQyNmUyMzQxNDg2ZDQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjAzMDA2OTJkOTM3NGQ4OWEyMzNiMTExMmU0MmNlMDIuYmluZFBvcHVwKHBvcHVwX2M0ZDIzZTBkNWQ3MTQwZTJhY2Q5NmJlZDZkMmFjMDBhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y4NzlmMDYzMDMwNDRiN2Q4OWRhMmQ5MGJhZTIyMTU2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzAzMjgxMDkwOTMwMTQsLTczLjk5NTUwNzUxODg4NDE1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2UzYzRlZTkwMWFmYzQzZjRhM2Q0OWEzYWY5NzUxZmVlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIzMGQ5M2Y5NmUyYTQzMjQ4M2M5YTdhNGY0MGU4Y2M5ID0gJCgnPGRpdiBpZD0iaHRtbF8yMzBkOTNmOTZlMmE0MzI0ODNjOWE3YTRmNDBlOGNjOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RnVsdG9uIEZlcnJ5LCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTNjNGVlOTAxYWZjNDNmNGEzZDQ5YTNhZjk3NTFmZWUuc2V0Q29udGVudChodG1sXzIzMGQ5M2Y5NmUyYTQzMjQ4M2M5YTdhNGY0MGU4Y2M5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y4NzlmMDYzMDMwNDRiN2Q4OWRhMmQ5MGJhZTIyMTU2LmJpbmRQb3B1cChwb3B1cF9lM2M0ZWU5MDFhZmM0M2Y0YTNkNDlhM2FmOTc1MWZlZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jZDhlZGI1ODA5OTQ0ZWEwODI0MWEyZDUzNThiMDFlYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcwMzMyMTQ5ODgyODc0LC03My45ODExMTYwMzU5MjM5M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mY2VjOTAwZDM5Y2M0MTBkYTMyY2EyMDY4MmMyOGRmZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yOGFlZDQ1Zjc2ZTI0ZjNlOGMzZmU2NjM4YWEzZmMxMCA9ICQoJzxkaXYgaWQ9Imh0bWxfMjhhZWQ0NWY3NmUyNGYzZThjM2ZlNjYzOGFhM2ZjMTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlZpbmVnYXIgSGlsbCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZjZWM5MDBkMzljYzQxMGRhMzJjYTIwNjgyYzI4ZGZmLnNldENvbnRlbnQoaHRtbF8yOGFlZDQ1Zjc2ZTI0ZjNlOGMzZmU2NjM4YWEzZmMxMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jZDhlZGI1ODA5OTQ0ZWEwODI0MWEyZDUzNThiMDFlYS5iaW5kUG9wdXAocG9wdXBfZmNlYzkwMGQzOWNjNDEwZGEzMmNhMjA2ODJjMjhkZmYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2Y3MWZmZmI3MDczNDRjNDk1NWUzMDMyNzhlYTZjYTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NzUwMzk4NjUwMzIzNywtNzMuOTMwNTMxMDg4MTczMzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODVhYmFjZTg2ODlhNGFkZWIzOWJkODMwM2VkNzI0MzkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2NkMTRmNGVmMGE1NDUyMGFmMWY1MGYwZDE2MzI5NWMgPSAkKCc8ZGl2IGlkPSJodG1sX2NjZDE0ZjRlZjBhNTQ1MjBhZjFmNTBmMGQxNjMyOTVjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZWVrc3ZpbGxlLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODVhYmFjZTg2ODlhNGFkZWIzOWJkODMwM2VkNzI0Mzkuc2V0Q29udGVudChodG1sX2NjZDE0ZjRlZjBhNTQ1MjBhZjFmNTBmMGQxNjMyOTVjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzdmNzFmZmZiNzA3MzQ0YzQ5NTVlMzAzMjc4ZWE2Y2E2LmJpbmRQb3B1cChwb3B1cF84NWFiYWNlODY4OWE0YWRlYjM5YmQ4MzAzZWQ3MjQzOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iNWRkNWY2NTM0NjM0ZWE3OTlmMzI2NzMyZjIxN2RlYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY3Nzg2MTA0NzY5NTMxLC03My45MDMzMTY4NDg1MjU5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80NjFhYjI5ZjI0Mzc0NDg0YmQ3MmQ2ZGRjNTAwNzJiMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81ZWRmZjA5ZDA2ODQ0MDRhYjQzYzg0ZGRjMDk2NGU2YiA9ICQoJzxkaXYgaWQ9Imh0bWxfNWVkZmYwOWQwNjg0NDA0YWI0M2M4NGRkYzA5NjRlNmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJyb2Fkd2F5IEp1bmN0aW9uLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDYxYWIyOWYyNDM3NDQ4NGJkNzJkNmRkYzUwMDcyYjMuc2V0Q29udGVudChodG1sXzVlZGZmMDlkMDY4NDQwNGFiNDNjODRkZGMwOTY0ZTZiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2I1ZGQ1ZjY1MzQ2MzRlYTc5OWYzMjY3MzJmMjE3ZGVhLmJpbmRQb3B1cChwb3B1cF80NjFhYjI5ZjI0Mzc0NDg0YmQ3MmQ2ZGRjNTAwNzJiMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80YTQxMGYyZjhjY2I0Mzc4YWIwZjM5YzQ5ZWIzNDk0MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcwMzE3NjMyODIyNjkyLC03My45ODg3NTI4MDc0NTA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzYwOWMxOGYzZDA4OTQ5OGZhYmUwODdkY2YxYzVkY2U1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA1OGNkYTJiNDhkNjQ3YjBhZDI2Y2RmZjczMTIzNmVmID0gJCgnPGRpdiBpZD0iaHRtbF8wNThjZGEyYjQ4ZDY0N2IwYWQyNmNkZmY3MzEyMzZlZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RHVtYm8sIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MDljMThmM2QwODk0OThmYWJlMDg3ZGNmMWM1ZGNlNS5zZXRDb250ZW50KGh0bWxfMDU4Y2RhMmI0OGQ2NDdiMGFkMjZjZGZmNzMxMjM2ZWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGE0MTBmMmY4Y2NiNDM3OGFiMGYzOWM0OWViMzQ5NDMuYmluZFBvcHVwKHBvcHVwXzYwOWMxOGYzZDA4OTQ5OGZhYmUwODdkY2YxYzVkY2U1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2QyM2Y4YmY0MDcyYzRjNmI4OTRlY2MzYjlmMWM1M2Q4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjAxODA5NTc2MzE0NDQsLTc0LjEyMDU5Mzk5NzE4MDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NmYTI2ODM4NDkzZTQ3Nzk4OWE3NmI4NTljYjFiOWQ5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU5Zjc0YmJlZGI2NzRjZTg5YmZlN2U3YjMzN2E0YmYwID0gJCgnPGRpdiBpZD0iaHRtbF81OWY3NGJiZWRiNjc0Y2U4OWJmZTdlN2IzMzdhNGJmMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFub3IgSGVpZ2h0cywgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2ZhMjY4Mzg0OTNlNDc3OTg5YTc2Yjg1OWNiMWI5ZDkuc2V0Q29udGVudChodG1sXzU5Zjc0YmJlZGI2NzRjZTg5YmZlN2U3YjMzN2E0YmYwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2QyM2Y4YmY0MDcyYzRjNmI4OTRlY2MzYjlmMWM1M2Q4LmJpbmRQb3B1cChwb3B1cF9jZmEyNjgzODQ5M2U0Nzc5ODlhNzZiODU5Y2IxYjlkOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xYjc2YmIxZWJlYzQ0OTQ3YmExYzVmMGUwNjljMjJmZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYwMzcwNjkyNjI3MzcxLC03NC4xMzIwODQ0NzQ4NDI5OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81ODkxMTJmZjRhOWM0ZWQzYWUxOTYwYjllMWRiYjgyYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iYjkxNTJmZjhiOTc0ZWRhOWM3ZTc4MmZlZWI0Njc5OSA9ICQoJzxkaXYgaWQ9Imh0bWxfYmI5MTUyZmY4Yjk3NGVkYTljN2U3ODJmZWViNDY3OTkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldpbGxvd2Jyb29rLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81ODkxMTJmZjRhOWM0ZWQzYWUxOTYwYjllMWRiYjgyYi5zZXRDb250ZW50KGh0bWxfYmI5MTUyZmY4Yjk3NGVkYTljN2U3ODJmZWViNDY3OTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWI3NmJiMWViZWM0NDk0N2JhMWM1ZjBlMDY5YzIyZmYuYmluZFBvcHVwKHBvcHVwXzU4OTExMmZmNGE5YzRlZDNhZTE5NjBiOWUxZGJiODJiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA3NTIxYjRmNDFjMDQ4NGY4NGVmOTg2NjM5ZGU3MWRmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTQxMTM5OTIyMDkxNzY2LC03NC4yMTc3NjYzNjA2ODU2N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mZjU4NDMyOGIxM2M0ZDE4OWQ2OGVhYmNiMDdiZjljMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83YWE1Y2ViNTY5ODg0NWE2ODFlMjdhMGFlYTBiZjM2ZiA9ICQoJzxkaXYgaWQ9Imh0bWxfN2FhNWNlYjU2OTg4NDVhNjgxZTI3YTBhZWEwYmYzNmYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNhbmR5IEdyb3VuZCwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmY1ODQzMjhiMTNjNGQxODlkNjhlYWJjYjA3YmY5YzAuc2V0Q29udGVudChodG1sXzdhYTVjZWI1Njk4ODQ1YTY4MWUyN2EwYWVhMGJmMzZmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA3NTIxYjRmNDFjMDQ4NGY4NGVmOTg2NjM5ZGU3MWRmLmJpbmRQb3B1cChwb3B1cF9mZjU4NDMyOGIxM2M0ZDE4OWQ2OGVhYmNiMDdiZjljMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81N2I4ZDMwYTdkNWQ0M2MwYWM1NTU4YTJjZGYyNWE2MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU3OTExODc0Mjk2MTIxNCwtNzQuMTI3MjcyNDA2MDQ5NDZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTFhYWQyM2JhMWYxNDdjNmI3MTc5NTg5MzIyZjkwNDIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGNhMjk3MDViY2ViNDliMGFhNDRhYjA0NjNhN2I3ZDMgPSAkKCc8ZGl2IGlkPSJodG1sX2RjYTI5NzA1YmNlYjQ5YjBhYTQ0YWIwNDYzYTdiN2QzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FZ2JlcnR2aWxsZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTFhYWQyM2JhMWYxNDdjNmI3MTc5NTg5MzIyZjkwNDIuc2V0Q29udGVudChodG1sX2RjYTI5NzA1YmNlYjQ5YjBhYTQ0YWIwNDYzYTdiN2QzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzU3YjhkMzBhN2Q1ZDQzYzBhYzU1NThhMmNkZjI1YTYwLmJpbmRQb3B1cChwb3B1cF81MWFhZDIzYmExZjE0N2M2YjcxNzk1ODkzMjJmOTA0Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82ODYyMGU0YTc1ZDM0MTBmODBlY2IzMzlmYTkzZGVhNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU2NzM3NTg4OTU3MDMyLC03My44OTIxMzc2MDIzMjgyMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84YjkxZTg2ZWUwYWM0ZWQ0YmZkYWEzNjQ0ZDdhMDE5MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85OGM4ZDljODllZmM0OGUxYmJjM2U4NmFhNjAwYTA2ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfOThjOGQ5Yzg5ZWZjNDhlMWJiYzNlODZhYTYwMGEwNmUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJveGJ1cnksIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOGI5MWU4NmVlMGFjNGVkNGJmZGFhMzY0NGQ3YTAxOTIuc2V0Q29udGVudChodG1sXzk4YzhkOWM4OWVmYzQ4ZTFiYmMzZTg2YWE2MDBhMDZlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY4NjIwZTRhNzVkMzQxMGY4MGVjYjMzOWZhOTNkZWE0LmJpbmRQb3B1cChwb3B1cF84YjkxZTg2ZWUwYWM0ZWQ0YmZkYWEzNjQ0ZDdhMDE5Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80MTA0ODljNWIzOTQ0Yzg2YTg1MDNkMTBlOGJhZTgyYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU5ODUyNTA5NTEzNzI1NSwtNzMuOTU5MTg0NTk0Mjg3MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjQxZjJjNjY3YjNmNGQ0N2JiNzFkZmNhZjE4ODcxN2IgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWI4ZGY5YTMxNjRkNDFkYWEwYmQwMmJhZWU3MTVmMmQgPSAkKCc8ZGl2IGlkPSJodG1sX2ViOGRmOWEzMTY0ZDQxZGFhMGJkMDJiYWVlNzE1ZjJkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ib21lY3Jlc3QsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mNDFmMmM2NjdiM2Y0ZDQ3YmI3MWRmY2FmMTg4NzE3Yi5zZXRDb250ZW50KGh0bWxfZWI4ZGY5YTMxNjRkNDFkYWEwYmQwMmJhZWU3MTVmMmQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDEwNDg5YzViMzk0NGM4NmE4NTAzZDEwZThiYWU4MmMuYmluZFBvcHVwKHBvcHVwX2Y0MWYyYzY2N2IzZjRkNDdiYjcxZGZjYWYxODg3MTdiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IwOGQ0MDNiMzU1NzQ1M2E5ZDQzMzM2Zjk4YWFhNTQ1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE2NDE0NTExMTU4MTg1LC03My44ODExNDMxOTIwMDYwNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNWVjMTUzZTQwYjg0ZWY5YTE3OTMxOTI5Y2RjMDRhNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80YjY4OTZmYTY5NmQ0YjU0ODkwODNkZTU3NGRiZmQ3OSA9ICQoJzxkaXYgaWQ9Imh0bWxfNGI2ODk2ZmE2OTZkNGI1NDg5MDgzZGU1NzRkYmZkNzkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1pZGRsZSBWaWxsYWdlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA1ZWMxNTNlNDBiODRlZjlhMTc5MzE5MjljZGMwNGE1LnNldENvbnRlbnQoaHRtbF80YjY4OTZmYTY5NmQ0YjU0ODkwODNkZTU3NGRiZmQ3OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iMDhkNDAzYjM1NTc0NTNhOWQ0MzMzNmY5OGFhYTU0NS5iaW5kUG9wdXAocG9wdXBfMDVlYzE1M2U0MGI4NGVmOWExNzkzMTkyOWNkYzA0YTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDg1ZmRkODFmODI1NGQyZWE4MjZjNTFhODBjZDk0NzMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41MjYyNjQwNjczNDgxMiwtNzQuMjAxNTI1NTY0NTc2NThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjA5OTI5Y2ZkODY0NDc4NTlkM2U1Yjk0Mzg0M2YxY2IgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTkzOTAxZTA0MDZjNGI2Y2IxMjQ1ZWJjZGNkMzA2MDEgPSAkKCc8ZGl2IGlkPSJodG1sX2E5MzkwMWUwNDA2YzRiNmNiMTI0NWViY2RjZDMwNjAxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QcmluY2UmIzM5O3MgQmF5LCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yMDk5MjljZmQ4NjQ0Nzg1OWQzZTViOTQzODQzZjFjYi5zZXRDb250ZW50KGh0bWxfYTkzOTAxZTA0MDZjNGI2Y2IxMjQ1ZWJjZGNkMzA2MDEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDg1ZmRkODFmODI1NGQyZWE4MjZjNTFhODBjZDk0NzMuYmluZFBvcHVwKHBvcHVwXzIwOTkyOWNmZDg2NDQ3ODU5ZDNlNWI5NDM4NDNmMWNiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FmZThmYzUwMWQyZjRjN2NhN2NjZTYxMDc4YzJjYTA2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTc2NTA2MjkzNzk0ODksLTc0LjEzNzkyNjYzNzcxNTY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhkOTRhNGMxMzUwNzQyZThiMmU3NDNmNzcxYzY3YjViID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NiN2Y2MjMwM2U0YTRiOTc4YmJmOWUxMDU0MDdiZTEzID0gJCgnPGRpdiBpZD0iaHRtbF9jYjdmNjIzMDNlNGE0Yjk3OGJiZjllMTA1NDA3YmUxMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGlnaHRob3VzZSBIaWxsLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84ZDk0YTRjMTM1MDc0MmU4YjJlNzQzZjc3MWM2N2I1Yi5zZXRDb250ZW50KGh0bWxfY2I3ZjYyMzAzZTRhNGI5NzhiYmY5ZTEwNTQwN2JlMTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWZlOGZjNTAxZDJmNGM3Y2E3Y2NlNjEwNzhjMmNhMDYuYmluZFBvcHVwKHBvcHVwXzhkOTRhNGMxMzUwNzQyZThiMmU3NDNmNzcxYzY3YjViKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE4MWM3YTlmMDJiZjQ4ZGM4NGRkYWU4NTczMmRiYzQ0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTE5NTQxNDU3NDg5MDksLTc0LjIyOTU3MDgwNjI2OTQxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ExNzNlZmUxOTgwOTQ1ZGNhZDAyNDRmNTIwYzY4ZDE1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZiOWM3NzIzMjM3NzRhOTNiNDFiNDAyMTI3NzYyMWExID0gJCgnPGRpdiBpZD0iaHRtbF9mYjljNzcyMzIzNzc0YTkzYjQxYjQwMjEyNzc2MjFhMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UmljaG1vbmQgVmFsbGV5LCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hMTczZWZlMTk4MDk0NWRjYWQwMjQ0ZjUyMGM2OGQxNS5zZXRDb250ZW50KGh0bWxfZmI5Yzc3MjMyMzc3NGE5M2I0MWI0MDIxMjc3NjIxYTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTgxYzdhOWYwMmJmNDhkYzg0ZGRhZTg1NzMyZGJjNDQuYmluZFBvcHVwKHBvcHVwX2ExNzNlZmUxOTgwOTQ1ZGNhZDAyNDRmNTIwYzY4ZDE1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzliMDk5MzVjNjI0OTRkZTA5ZmVjMGRiN2NhOGFiOGU4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzkwNjAxNTU2NzAxNDgsLTczLjgyNjY3NzU3MTM4NjQxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JmMGQ3NjMyY2E3MzQyZmNiOWUwMjRiYzg5YTJmZGIxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhmNDVhNjQ5MjhmMjQ3ZTE5NmZjYmFlYzU2MGM5NWI3ID0gJCgnPGRpdiBpZD0iaHRtbF84ZjQ1YTY0OTI4ZjI0N2UxOTZmY2JhZWM1NjBjOTViNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFsYmEsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmYwZDc2MzJjYTczNDJmY2I5ZTAyNGJjODlhMmZkYjEuc2V0Q29udGVudChodG1sXzhmNDVhNjQ5MjhmMjQ3ZTE5NmZjYmFlYzU2MGM5NWI3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzliMDk5MzVjNjI0OTRkZTA5ZmVjMGRiN2NhOGFiOGU4LmJpbmRQb3B1cChwb3B1cF9iZjBkNzYzMmNhNzM0MmZjYjllMDI0YmM4OWEyZmRiMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85ZTk2NWJlMzljNzQ0N2I5OTI0OWIxMTM5MWQ1NmQ2ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY4MTk5ODkzNDUxNzMsLTczLjg5MDM0NTcwOTg3Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iYTdlZjFhYzg3NTM0NjMyODdiN2FhNzQ0MzgwMWU3NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yMzk2MDgyNGRiZjg0ZGU1OWUxNDYzNDc1ZjI2NWM3ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfMjM5NjA4MjRkYmY4NGRlNTllMTQ2MzQ3NWYyNjVjN2QiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhpZ2hsYW5kIFBhcmssIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iYTdlZjFhYzg3NTM0NjMyODdiN2FhNzQ0MzgwMWU3NS5zZXRDb250ZW50KGh0bWxfMjM5NjA4MjRkYmY4NGRlNTllMTQ2MzQ3NWYyNjVjN2QpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWU5NjViZTM5Yzc0NDdiOTkyNDliMTEzOTFkNTZkNmYuYmluZFBvcHVwKHBvcHVwX2JhN2VmMWFjODc1MzQ2MzI4N2I3YWE3NDQzODAxZTc1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ2MjgxZDE2YjYyNzQ1ZmQ4NDBiMDAwNmYwMmIyZTM2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA5Mzc3NzAxMTM3NjYsLTczLjk0ODQxNTE1MzI4ODkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RiMzNiOTU2YjUyOTRmYjI4YzhkMWZkMTUwYTY3MGNkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQwNWNjMDZiMDk2ODQwZDk4OWE0OTVkODlhMTBlNGNhID0gJCgnPGRpdiBpZD0iaHRtbF80MDVjYzA2YjA5Njg0MGQ5ODlhNDk1ZDg5YTEwZTRjYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFkaXNvbiwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RiMzNiOTU2YjUyOTRmYjI4YzhkMWZkMTUwYTY3MGNkLnNldENvbnRlbnQoaHRtbF80MDVjYzA2YjA5Njg0MGQ5ODlhNDk1ZDg5YTEwZTRjYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80NjI4MWQxNmI2Mjc0NWZkODQwYjAwMDZmMDJiMmUzNi5iaW5kUG9wdXAocG9wdXBfZGIzM2I5NTZiNTI5NGZiMjhjOGQxZmQxNTBhNjcwY2QpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDg5NmU4ODMyMTA1NDU4YTlkOGZlZThmZjA5NTA2MjUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NTI3MjI5NzYzMzAxNywtNzMuODYxNzI1Nzc1NTUxMTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjZmZDgzMzVlZWYzNDczYThkMTJiNjBhZDYyODA0ZjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWIwNjk5OGViMDllNDkzYjliNmUwNzJkYmQ4OTRkNTMgPSAkKCc8ZGl2IGlkPSJodG1sXzFiMDY5OThlYjA5ZTQ5M2I5YjZlMDcyZGJkODk0ZDUzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ccm9ueGRhbGUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82NmZkODMzNWVlZjM0NzNhOGQxMmI2MGFkNjI4MDRmMi5zZXRDb250ZW50KGh0bWxfMWIwNjk5OGViMDllNDkzYjliNmUwNzJkYmQ4OTRkNTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDg5NmU4ODMyMTA1NDU4YTlkOGZlZThmZjA5NTA2MjUuYmluZFBvcHVwKHBvcHVwXzY2ZmQ4MzM1ZWVmMzQ3M2E4ZDEyYjYwYWQ2MjgwNGYyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FhMDQ1ZmU5Y2JkZTRjY2E4MzFkMjdkNWEwZDBiYTMzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODY1Nzg3ODc4MDI5ODIsLTczLjg1OTMxODYzMjIxNjQ3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZjYTcyZDIzNzViOTRmMWI5YzhlNzMxODRlY2Q4NzZmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2QxMzhiNzBjODBjZjQxNWRiOGYzODUyNTgzM2RjZjgxID0gJCgnPGRpdiBpZD0iaHRtbF9kMTM4YjcwYzgwY2Y0MTVkYjhmMzg1MjU4MzNkY2Y4MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QWxsZXJ0b24sIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82Y2E3MmQyMzc1Yjk0ZjFiOWM4ZTczMTg0ZWNkODc2Zi5zZXRDb250ZW50KGh0bWxfZDEzOGI3MGM4MGNmNDE1ZGI4ZjM4NTI1ODMzZGNmODEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWEwNDVmZTljYmRlNGNjYTgzMWQyN2Q1YTBkMGJhMzMuYmluZFBvcHVwKHBvcHVwXzZjYTcyZDIzNzViOTRmMWI5YzhlNzMxODRlY2Q4NzZmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZkYzg0OTkzM2IxZDRkM2JhZjlkYjlmMmY3NjE2YTY1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODcwMzkyMzkxNDE0NywtNzMuOTAxNTIyNjQ1MTMxNDRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTUxMjNjOTgzNDk3NDczZDkzODI2ZmQyMzg2ZTRjMWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2E2NmU4MTZjODE0NGE0MDhkYjBhZmI1ZWM3YjgwNTAgPSAkKCc8ZGl2IGlkPSJodG1sXzdhNjZlODE2YzgxNDRhNDA4ZGIwYWZiNWVjN2I4MDUwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5LaW5nc2JyaWRnZSBIZWlnaHRzLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTUxMjNjOTgzNDk3NDczZDkzODI2ZmQyMzg2ZTRjMWEuc2V0Q29udGVudChodG1sXzdhNjZlODE2YzgxNDRhNDA4ZGIwYWZiNWVjN2I4MDUwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzZkYzg0OTkzM2IxZDRkM2JhZjlkYjlmMmY3NjE2YTY1LmJpbmRQb3B1cChwb3B1cF81NTEyM2M5ODM0OTc0NzNkOTM4MjZmZDIzODZlNGMxYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yOWUwNDg4ZDM0MTQ0ODIyOGVlOGFjMmJmNDZkYWRlNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0NjkyNjA2NjU4NTc5LC03My45NDgxNzcwOTkyMDE4NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OGU3MWU0MTYwYzA0NTllODkwM2VjNWE1ODBkN2ZiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84OWU0ZmJhYjVhZTE0OGE5YmE4MzJmNWIyZjdhOGRkYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84MDJkMzViYjM0M2M0ODBjYTk4MjdlYWQ3Mjc3NzgwYSA9ICQoJzxkaXYgaWQ9Imh0bWxfODAyZDM1YmIzNDNjNDgwY2E5ODI3ZWFkNzI3Nzc4MGEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVyYXNtdXMsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84OWU0ZmJhYjVhZTE0OGE5YmE4MzJmNWIyZjdhOGRkYi5zZXRDb250ZW50KGh0bWxfODAyZDM1YmIzNDNjNDgwY2E5ODI3ZWFkNzI3Nzc4MGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjllMDQ4OGQzNDE0NDgyMjhlZThhYzJiZjQ2ZGFkZTQuYmluZFBvcHVwKHBvcHVwXzg5ZTRmYmFiNWFlMTQ4YTliYTgzMmY1YjJmN2E4ZGRiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU4YjZiNmUxYWVlZTRhNmFiZDdkNGU4MDZhMTFhODdiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU2NjU4MDgyMjc1MTksLTc0LjAwMDExMTM2MjAyNjM3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2QzYjkxOTZlZTRhYTRkM2FiYjA1Y2RiZmZjNjM4NDk1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIwYzQyYTcxMjQ0YzQyMTNhMTRlN2FmYzZkMjQ0NjU5ID0gJCgnPGRpdiBpZD0iaHRtbF8yMGM0MmE3MTI0NGM0MjEzYTE0ZTdhZmM2ZDI0NDY1OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SHVkc29uIFlhcmRzLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2QzYjkxOTZlZTRhYTRkM2FiYjA1Y2RiZmZjNjM4NDk1LnNldENvbnRlbnQoaHRtbF8yMGM0MmE3MTI0NGM0MjEzYTE0ZTdhZmM2ZDI0NDY1OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81OGI2YjZlMWFlZWU0YTZhYmQ3ZDRlODA2YTExYTg3Yi5iaW5kUG9wdXAocG9wdXBfZDNiOTE5NmVlNGFhNGQzYWJiMDVjZGJmZmM2Mzg0OTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmEyYzIzYWQyMWZmNGYzYWJlMWRhNzhjNzUwMmM3NzUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41ODczMzc3NDAxODc0MSwtNzMuODA1NTMwMDI5Njg3MThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDE1NTJmZWViZDQ1NDU3OGE5YjI2NzkzZjMzZTdiYzEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDNmZDJiZWM4OTdkNGEzNGFiNTdmODVlMDA1ZTg3OTYgPSAkKCc8ZGl2IGlkPSJodG1sXzAzZmQyYmVjODk3ZDRhMzRhYjU3Zjg1ZTAwNWU4Nzk2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IYW1tZWxzLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQxNTUyZmVlYmQ0NTQ1NzhhOWIyNjc5M2YzM2U3YmMxLnNldENvbnRlbnQoaHRtbF8wM2ZkMmJlYzg5N2Q0YTM0YWI1N2Y4NWUwMDVlODc5Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iYTJjMjNhZDIxZmY0ZjNhYmUxZGE3OGM3NTAyYzc3NS5iaW5kUG9wdXAocG9wdXBfNDE1NTJmZWViZDQ1NDU3OGE5YjI2NzkzZjMzZTdiYzEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMThmNzFiMjg3NmZhNGNhYTg2NjM2NmVmMjJmYTNjMDggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MTEzMjE2OTEyODM4MzQsLTczLjc2NTk2NzgxNDQ1NjI3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NjMjExMmQ3NTVmMTQzZWE4NjgwOTZiMDYyMzAzNTE3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI0NDM4ZDlkZWM0ZTQ2OTlhY2EyYjMxMDQxNDczMjg5ID0gJCgnPGRpdiBpZD0iaHRtbF8yNDQzOGQ5ZGVjNGU0Njk5YWNhMmIzMTA0MTQ3MzI4OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF5c3dhdGVyLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NjMjExMmQ3NTVmMTQzZWE4NjgwOTZiMDYyMzAzNTE3LnNldENvbnRlbnQoaHRtbF8yNDQzOGQ5ZGVjNGU0Njk5YWNhMmIzMTA0MTQ3MzI4OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xOGY3MWIyODc2ZmE0Y2FhODY2MzY2ZWYyMmZhM2MwOC5iaW5kUG9wdXAocG9wdXBfY2MyMTEyZDc1NWYxNDNlYTg2ODA5NmIwNjIzMDM1MTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTBmZDIxNTUwZTUyNDFhNDg5NTFjMDhjMTU1MmU4YzkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTYwOTEyOTcwOTQ3MDYsLTczLjk0NTYzMDcwMzM0MDkxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc4ZTcxZTQxNjBjMDQ1OWU4OTAzZWM1YTU4MGQ3ZmJhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E5ZWU5MzJhYWI3NDQ2MDA4NzllMzEzZmQzNDA1ZWI2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdjYWYyNjg2MTg4ZTRhYjhiYzY2YWY5NWRlMjJhMzU5ID0gJCgnPGRpdiBpZD0iaHRtbF83Y2FmMjY4NjE4OGU0YWI4YmM2NmFmOTVkZTIyYTM1OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UXVlZW5zYnJpZGdlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E5ZWU5MzJhYWI3NDQ2MDA4NzllMzEzZmQzNDA1ZWI2LnNldENvbnRlbnQoaHRtbF83Y2FmMjY4NjE4OGU0YWI4YmM2NmFmOTVkZTIyYTM1OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xMGZkMjE1NTBlNTI0MWE0ODk1MWMwOGMxNTUyZThjOS5iaW5kUG9wdXAocG9wdXBfYTllZTkzMmFhYjc0NDYwMDg3OWUzMTNmZDM0MDVlYjYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmFmNGYxZWVhZjRlNDM5MGIyODYyZWNjMTY1ZTM5OTEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MTczMTA3OTI1Mjk4MywtNzQuMDgxNzM5OTIyMTE5NjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzhlNzFlNDE2MGMwNDU5ZTg5MDNlYzVhNTgwZDdmYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjZhNTU4OTc4NDE3NGNlNmE0Y2ZmMWY0NTdhNzc1MDcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzE1ODZlYmI5OGVmNGU4NTlkNWU3YTNlNDdjOTYwYWQgPSAkKCc8ZGl2IGlkPSJodG1sX2MxNTg2ZWJiOThlZjRlODU5ZDVlN2EzZTQ3Yzk2MGFkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Gb3ggSGlsbHMsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I2YTU1ODk3ODQxNzRjZTZhNGNmZjFmNDU3YTc3NTA3LnNldENvbnRlbnQoaHRtbF9jMTU4NmViYjk4ZWY0ZTg1OWQ1ZTdhM2U0N2M5NjBhZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iYWY0ZjFlZWFmNGU0MzkwYjI4NjJlY2MxNjVlMzk5MS5iaW5kUG9wdXAocG9wdXBfYjZhNTU4OTc4NDE3NGNlNmE0Y2ZmMWY0NTdhNzc1MDcpOwoKICAgICAgICAgICAgCiAgICAgICAgCjwvc2NyaXB0Pg== onload=\"this.contentDocument.open();this.contentDocument.write(atob(this.getAttribute('data-html')));this.contentDocument.close();\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x7fe3796daf98>"
]
},
"execution_count": 41,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# create map of New York using latitude and longitude values\n",
"map_newyork = folium.Map(location=[latitude, longitude], zoom_start=10)\n",
"\n",
"# add markers to map\n",
"for lat, lng, borough, neighborhood in zip(neighborhoods['Latitude'], neighborhoods['Longitude'], neighborhoods['Borough'], neighborhoods['Neighborhood']):\n",
" label = '{}, {}'.format(neighborhood, borough)\n",
" label = folium.Popup(label, parse_html=True)\n",
" folium.CircleMarker(\n",
" [lat, lng],\n",
" radius=5,\n",
" popup=label,\n",
" color='blue',\n",
" fill=True,\n",
" fill_color='#3186cc',\n",
" fill_opacity=0.7,\n",
" parse_html=False).add_to(map_newyork) \n",
" \n",
"map_newyork"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Folium** is a great visualization library. Feel free to zoom into the above map, and click on each circle mark to reveal the name of the neighborhood and its respective borough."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"However, for illustration purposes, let's simplify the above map and segment and cluster only the neighborhoods in Manhattan. So let's slice the original dataframe and create a new dataframe of the Manhattan data."
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"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>Borough</th>\n",
" <th>Neighborhood</th>\n",
" <th>Latitude</th>\n",
" <th>Longitude</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Manhattan</td>\n",
" <td>Marble Hill</td>\n",
" <td>40.876551</td>\n",
" <td>-73.910660</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Manhattan</td>\n",
" <td>Chinatown</td>\n",
" <td>40.715618</td>\n",
" <td>-73.994279</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Manhattan</td>\n",
" <td>Washington Heights</td>\n",
" <td>40.851903</td>\n",
" <td>-73.936900</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Manhattan</td>\n",
" <td>Inwood</td>\n",
" <td>40.867684</td>\n",
" <td>-73.921210</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Manhattan</td>\n",
" <td>Hamilton Heights</td>\n",
" <td>40.823604</td>\n",
" <td>-73.949688</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Borough Neighborhood Latitude Longitude\n",
"0 Manhattan Marble Hill 40.876551 -73.910660\n",
"1 Manhattan Chinatown 40.715618 -73.994279\n",
"2 Manhattan Washington Heights 40.851903 -73.936900\n",
"3 Manhattan Inwood 40.867684 -73.921210\n",
"4 Manhattan Hamilton Heights 40.823604 -73.949688"
]
},
"execution_count": 42,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"manhattan_data = neighborhoods[neighborhoods['Borough'] == 'Manhattan'].reset_index(drop=True)\n",
"manhattan_data.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's get the geographical coordinates of Manhattan."
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The geograpical coordinate of Manhattan are 40.7896239, -73.9598939.\n"
]
}
],
"source": [
"address = 'Manhattan, NY'\n",
"\n",
"geolocator = Nominatim(user_agent=\"ny_explorer\")\n",
"location = geolocator.geocode(address)\n",
"latitude = location.latitude\n",
"longitude = location.longitude\n",
"print('The geograpical coordinate of Manhattan are {}, {}.'.format(latitude, longitude))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As we did with all of New York City, let's visualizat Manhattan the neighborhoods in it."
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><span style=\"color:#565656\">Make this Notebook Trusted to load map: File -> Trust Notebook</span><iframe src=\"about:blank\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" data-html=PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfZDdlM2ExNzQzYjI2NGY5ZDlkNDYyOTYyOWViMTMyNjAgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwX2Q3ZTNhMTc0M2IyNjRmOWQ5ZDQ2Mjk2MjllYjEzMjYwIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF9kN2UzYTE3NDNiMjY0ZjlkOWQ0NjI5NjI5ZWIxMzI2MCA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF9kN2UzYTE3NDNiMjY0ZjlkOWQ0NjI5NjI5ZWIxMzI2MCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNDAuNzg5NjIzOSwtNzMuOTU5ODkzOV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiAxMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfM2RkNTZmNTY3OWVmNDc0MDg3ZDI5ZTFhZWNjMjRhMzQgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZDdlM2ExNzQzYjI2NGY5ZDlkNDYyOTYyOWViMTMyNjApOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAxYWU1YzNmYmRiYjQ1MTU5ZTU1Yjc0Yjc1ZjNmMTAwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODc2NTUwNzc4Nzk5NjQsLTczLjkxMDY1OTY1ODYyOTgxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Q3ZTNhMTc0M2IyNjRmOWQ5ZDQ2Mjk2MjllYjEzMjYwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q2MjdhY2JiYTNjZTRiNTRhZWM2NDA2ZTgxYmIxOGFjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzMxZTZlOGYwZDMyYzQzYTNiNTE3NDMzMWFjNzRiM2UxID0gJCgnPGRpdiBpZD0iaHRtbF8zMWU2ZThmMGQzMmM0M2EzYjUxNzQzMzFhYzc0YjNlMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFyYmxlIEhpbGw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q2MjdhY2JiYTNjZTRiNTRhZWM2NDA2ZTgxYmIxOGFjLnNldENvbnRlbnQoaHRtbF8zMWU2ZThmMGQzMmM0M2EzYjUxNzQzMzFhYzc0YjNlMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wMWFlNWMzZmJkYmI0NTE1OWU1NWI3NGI3NWYzZjEwMC5iaW5kUG9wdXAocG9wdXBfZDYyN2FjYmJhM2NlNGI1NGFlYzY0MDZlODFiYjE4YWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTNmMTIyMzM0ZDI2NGNjNDkxNDE2OTFkNjM1ZTNlN2MgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTU2MTg0MjIzMTQzMiwtNzMuOTk0Mjc5MzYyNTU5NzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZDdlM2ExNzQzYjI2NGY5ZDlkNDYyOTYyOWViMTMyNjApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjdlNWE1MzExZDU2NDQwZWIzN2E4MWU0OWFlYmRkOWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2YwMTEyMmYyM2FjNDk4ZmJmZWFmYzNlNjUzZTVhYTYgPSAkKCc8ZGl2IGlkPSJodG1sXzNmMDExMjJmMjNhYzQ5OGZiZmVhZmMzZTY1M2U1YWE2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaGluYXRvd248L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI3ZTVhNTMxMWQ1NjQ0MGViMzdhODFlNDlhZWJkZDlkLnNldENvbnRlbnQoaHRtbF8zZjAxMTIyZjIzYWM0OThmYmZlYWZjM2U2NTNlNWFhNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xM2YxMjIzMzRkMjY0Y2M0OTE0MTY5MWQ2MzVlM2U3Yy5iaW5kUG9wdXAocG9wdXBfMjdlNWE1MzExZDU2NDQwZWIzN2E4MWU0OWFlYmRkOWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWZjNzQyNTE0YjdiNDE1OWJkNzViZTNhYTcxNDljYjggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NTE5MDI1MjU1NTMwNSwtNzMuOTM2OTAwMjc5ODUyMzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZDdlM2ExNzQzYjI2NGY5ZDlkNDYyOTYyOWViMTMyNjApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2Y0Yjk2YWY2ZTk0NDZiN2JkZGUyNjI5NTIyNWU1NDMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDgyZTE1MzcwZmZmNGIyNTkwYzg2MWU3YWU1NDg5ZGMgPSAkKCc8ZGl2IGlkPSJodG1sXzQ4MmUxNTM3MGZmZjRiMjU5MGM4NjFlN2FlNTQ4OWRjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XYXNoaW5ndG9uIEhlaWdodHM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NmNGI5NmFmNmU5NDQ2YjdiZGRlMjYyOTUyMjVlNTQzLnNldENvbnRlbnQoaHRtbF80ODJlMTUzNzBmZmY0YjI1OTBjODYxZTdhZTU0ODlkYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85ZmM3NDI1MTRiN2I0MTU5YmQ3NWJlM2FhNzE0OWNiOC5iaW5kUG9wdXAocG9wdXBfY2Y0Yjk2YWY2ZTk0NDZiN2JkZGUyNjI5NTIyNWU1NDMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODQ1NTkwZmZmMzU3NDA5NmIyY2NhMjg2NDQwOGMzZmUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44Njc2ODM5NjQ0OTkxNSwtNzMuOTIxMjEwNDIyMDM4OTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZDdlM2ExNzQzYjI2NGY5ZDlkNDYyOTYyOWViMTMyNjApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDBkNWVmZjk2ZjFiNDQzMzkxMWVjYWIyZjk1NGEwZTcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDc4ODAyZWNkMDY0NGMzMjk4NzViODkxYWU0MTdhMzUgPSAkKCc8ZGl2IGlkPSJodG1sX2Q3ODgwMmVjZDA2NDRjMzI5ODc1Yjg5MWFlNDE3YTM1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Jbndvb2Q8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAwZDVlZmY5NmYxYjQ0MzM5MTFlY2FiMmY5NTRhMGU3LnNldENvbnRlbnQoaHRtbF9kNzg4MDJlY2QwNjQ0YzMyOTg3NWI4OTFhZTQxN2EzNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84NDU1OTBmZmYzNTc0MDk2YjJjY2EyODY0NDA4YzNmZS5iaW5kUG9wdXAocG9wdXBfMDBkNWVmZjk2ZjFiNDQzMzkxMWVjYWIyZjk1NGEwZTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDBiOWM1NzJmMTIyNGYzNjk2YmYzYTg2ZjlkMDVhMjYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MjM2MDQyODQ4MTE5MzUsLTczLjk0OTY4NzkxODgzMzY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Q3ZTNhMTc0M2IyNjRmOWQ5ZDQ2Mjk2MjllYjEzMjYwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNiNjZmMjNiOWZiMzQzY2I5ZWQ2YjFjZjlhN2Q5OTkyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I4MDYyMmUyMWZmMzQ4NGNiZGUwZjM4OWJkN2M0ZjA0ID0gJCgnPGRpdiBpZD0iaHRtbF9iODA2MjJlMjFmZjM0ODRjYmRlMGYzODliZDdjNGYwNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SGFtaWx0b24gSGVpZ2h0czwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2I2NmYyM2I5ZmIzNDNjYjllZDZiMWNmOWE3ZDk5OTIuc2V0Q29udGVudChodG1sX2I4MDYyMmUyMWZmMzQ4NGNiZGUwZjM4OWJkN2M0ZjA0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2QwYjljNTcyZjEyMjRmMzY5NmJmM2E4NmY5ZDA1YTI2LmJpbmRQb3B1cChwb3B1cF8zYjY2ZjIzYjlmYjM0M2NiOWVkNmIxY2Y5YTdkOTk5Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85Yjg0N2ViNWJiZTM0MjU3OWQ3ZTJlMDdkNzZmMjczNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgxNjkzNDQyOTQ5NzgsLTczLjk1NzM4NTM5MzUxODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZDdlM2ExNzQzYjI2NGY5ZDlkNDYyOTYyOWViMTMyNjApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjY2MjIwNTQ0Y2RmNDMyYmE1M2UxMzZhMDcxMmY1NzAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTEyMDI4MWM4NjhlNGFiOGFlMDdjMDQ3MzM3MzY2MzUgPSAkKCc8ZGl2IGlkPSJodG1sXzkxMjAyODFjODY4ZTRhYjhhZTA3YzA0NzMzNzM2NjM1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYW5oYXR0YW52aWxsZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjY2MjIwNTQ0Y2RmNDMyYmE1M2UxMzZhMDcxMmY1NzAuc2V0Q29udGVudChodG1sXzkxMjAyODFjODY4ZTRhYjhhZTA3YzA0NzMzNzM2NjM1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzliODQ3ZWI1YmJlMzQyNTc5ZDdlMmUwN2Q3NmYyNzM3LmJpbmRQb3B1cChwb3B1cF9iNjYyMjA1NDRjZGY0MzJiYTUzZTEzNmEwNzEyZjU3MCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iNmUzZjdkZGZkNDA0N2E3YjhkNDAyYTgxYWJjZjBjYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgxNTk3NjA2NzQyNDE0LC03My45NDMyMTExMjYwMzkwNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kN2UzYTE3NDNiMjY0ZjlkOWQ0NjI5NjI5ZWIxMzI2MCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81NDI0ZTI3ZWFiZmY0MDIyOWZlZTc4OTE0ODBmZTI5MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lNzJiOTg3MzYxN2Q0ODBhYTljYzFjOTFkM2IxYzk3ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfZTcyYjk4NzM2MTdkNDgwYWE5Y2MxYzkxZDNiMWM5N2UiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNlbnRyYWwgSGFybGVtPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81NDI0ZTI3ZWFiZmY0MDIyOWZlZTc4OTE0ODBmZTI5Mi5zZXRDb250ZW50KGh0bWxfZTcyYjk4NzM2MTdkNDgwYWE5Y2MxYzkxZDNiMWM5N2UpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjZlM2Y3ZGRmZDQwNDdhN2I4ZDQwMmE4MWFiY2YwY2IuYmluZFBvcHVwKHBvcHVwXzU0MjRlMjdlYWJmZjQwMjI5ZmVlNzg5MTQ4MGZlMjkyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzMyZDlkMWIwYTEzZTQ0ZjBiMmIxMWQ4MTNlYjg0OTgwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzkyMjQ5NDY2NjMwMzMsLTczLjk0NDE4MjIzMTQ4NTI0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Q3ZTNhMTc0M2IyNjRmOWQ5ZDQ2Mjk2MjllYjEzMjYwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE3Y2U0OWMxZmRjNDRjMjM5MzgwM2VhYjJkNTc1YWIyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ1YzdlOGJkM2JhNTQ4ODliMTYxOTNkOTE2NDFmYzk0ID0gJCgnPGRpdiBpZD0iaHRtbF80NWM3ZThiZDNiYTU0ODg5YjE2MTkzZDkxNjQxZmM5NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWFzdCBIYXJsZW08L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE3Y2U0OWMxZmRjNDRjMjM5MzgwM2VhYjJkNTc1YWIyLnNldENvbnRlbnQoaHRtbF80NWM3ZThiZDNiYTU0ODg5YjE2MTkzZDkxNjQxZmM5NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zMmQ5ZDFiMGExM2U0NGYwYjJiMTFkODEzZWI4NDk4MC5iaW5kUG9wdXAocG9wdXBfMTdjZTQ5YzFmZGM0NGMyMzkzODAzZWFiMmQ1NzVhYjIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmEwODllODJiYWJjNDRlNDhmNzFmMzZiZGEwNDFjNWUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NzU2Mzg1NzMzMDE4MDUsLTczLjk2MDUwNzYzMTM1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Q3ZTNhMTc0M2IyNjRmOWQ5ZDQ2Mjk2MjllYjEzMjYwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI0MTc5ZDcyNzYxODQwZjU5MDU4YmE5NjY3NzM0ODcxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RkMWMzMWU4MWM4NzRkNGZhMzA1YzNkMjJiM2RkNTk3ID0gJCgnPGRpdiBpZD0iaHRtbF9kZDFjMzFlODFjODc0ZDRmYTMwNWMzZDIyYjNkZDU5NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VXBwZXIgRWFzdCBTaWRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yNDE3OWQ3Mjc2MTg0MGY1OTA1OGJhOTY2NzczNDg3MS5zZXRDb250ZW50KGh0bWxfZGQxYzMxZTgxYzg3NGQ0ZmEzMDVjM2QyMmIzZGQ1OTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmEwODllODJiYWJjNDRlNDhmNzFmMzZiZGEwNDFjNWUuYmluZFBvcHVwKHBvcHVwXzI0MTc5ZDcyNzYxODQwZjU5MDU4YmE5NjY3NzM0ODcxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzliYjc0ZWY1ZGU3YTRmNDNhOWNhNTdlZTA1YWM0MjFhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzc1OTI5ODQ5ODg0ODc1LC03My45NDcxMTc4NDQ3MTgyNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kN2UzYTE3NDNiMjY0ZjlkOWQ0NjI5NjI5ZWIxMzI2MCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82MWQwNWExZGFiZDE0OWE1OWM5NzA3MTZjMTJkMTNkNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lYzg4NzAxN2ZkYzc0NTFmOTE3MmQ2YzAwMDM5ODVhMCA9ICQoJzxkaXYgaWQ9Imh0bWxfZWM4ODcwMTdmZGM3NDUxZjkxNzJkNmMwMDAzOTg1YTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPllvcmt2aWxsZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjFkMDVhMWRhYmQxNDlhNTljOTcwNzE2YzEyZDEzZDYuc2V0Q29udGVudChodG1sX2VjODg3MDE3ZmRjNzQ1MWY5MTcyZDZjMDAwMzk4NWEwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzliYjc0ZWY1ZGU3YTRmNDNhOWNhNTdlZTA1YWM0MjFhLmJpbmRQb3B1cChwb3B1cF82MWQwNWExZGFiZDE0OWE1OWM5NzA3MTZjMTJkMTNkNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85YWVkNTQ0NjI4Mjk0OGVjYjAzZTZlYTA5NjFjZGNmNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2ODExMjY1ODI4NzMzLC03My45NTg4NTk2ODgxMzc2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Q3ZTNhMTc0M2IyNjRmOWQ5ZDQ2Mjk2MjllYjEzMjYwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzExNWIwMTYwZjJiZDRlNzRiMDI1YzQ0YjFhZDRhNDg2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBhODllZmRmYWRhNzQxN2RiZmM0MDgwNjc3MzVjNWYyID0gJCgnPGRpdiBpZD0iaHRtbF8wYTg5ZWZkZmFkYTc0MTdkYmZjNDA4MDY3NzM1YzVmMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGVub3ggSGlsbDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTE1YjAxNjBmMmJkNGU3NGIwMjVjNDRiMWFkNGE0ODYuc2V0Q29udGVudChodG1sXzBhODllZmRmYWRhNzQxN2RiZmM0MDgwNjc3MzVjNWYyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzlhZWQ1NDQ2MjgyOTQ4ZWNiMDNlNmVhMDk2MWNkY2Y2LmJpbmRQb3B1cChwb3B1cF8xMTViMDE2MGYyYmQ0ZTc0YjAyNWM0NGIxYWQ0YTQ4Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xYjU4ZjgxYjUxM2E0N2Y5YjE1OTM4ZDY5MzgzZDAzMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2MjE1OTYwNTc2MjgzLC03My45NDkxNjc2OTIyNzk1M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kN2UzYTE3NDNiMjY0ZjlkOWQ0NjI5NjI5ZWIxMzI2MCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85ZWNmM2QyNjQ1MzY0Y2IzYTI5ZTdiMTQ4OTk2YmE0OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iOGU2MjFlYjZkNmY0MDFlYWRhMmE1ZDllNTAyMGI5ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfYjhlNjIxZWI2ZDZmNDAxZWFkYTJhNWQ5ZTUwMjBiOWUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJvb3NldmVsdCBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzllY2YzZDI2NDUzNjRjYjNhMjllN2IxNDg5OTZiYTQ4LnNldENvbnRlbnQoaHRtbF9iOGU2MjFlYjZkNmY0MDFlYWRhMmE1ZDllNTAyMGI5ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xYjU4ZjgxYjUxM2E0N2Y5YjE1OTM4ZDY5MzgzZDAzMC5iaW5kUG9wdXAocG9wdXBfOWVjZjNkMjY0NTM2NGNiM2EyOWU3YjE0ODk5NmJhNDgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODgwOGRjOTVjZTg1NDMyNGJiZWQ0MTc1MmU0NmViNzEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43ODc2NTc5OTg1MzQ4NTQsLTczLjk3NzA1OTIzNjMwNjAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Q3ZTNhMTc0M2IyNjRmOWQ5ZDQ2Mjk2MjllYjEzMjYwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RhZThhNGQwNTkxYjRiMGM4YTg5M2NjMjA2ZTBmNTQwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU1NzI4YzFjYjRjYTQwMjliYzdkMGFlZWE4YWUzN2ZmID0gJCgnPGRpdiBpZD0iaHRtbF81NTcyOGMxY2I0Y2E0MDI5YmM3ZDBhZWVhOGFlMzdmZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VXBwZXIgV2VzdCBTaWRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kYWU4YTRkMDU5MWI0YjBjOGE4OTNjYzIwNmUwZjU0MC5zZXRDb250ZW50KGh0bWxfNTU3MjhjMWNiNGNhNDAyOWJjN2QwYWVlYThhZTM3ZmYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODgwOGRjOTVjZTg1NDMyNGJiZWQ0MTc1MmU0NmViNzEuYmluZFBvcHVwKHBvcHVwX2RhZThhNGQwNTkxYjRiMGM4YTg5M2NjMjA2ZTBmNTQwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc3NWJhZTEwNDJkMTRkM2VhMjM3YWM0ZDg1NTIxMTVkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzczNTI4ODg5NDIxNjYsLTczLjk4NTMzNzc3MDAxMjYyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Q3ZTNhMTc0M2IyNjRmOWQ5ZDQ2Mjk2MjllYjEzMjYwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RlMTA3MTZhNTg0NTQwYTdhOTEwY2NmNmU1ZWIzZjY0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI3NWMzZTM4MDk3ZjQ5YTJhYWMwNDZjNTQ4YWRjMWNlID0gJCgnPGRpdiBpZD0iaHRtbF8yNzVjM2UzODA5N2Y0OWEyYWFjMDQ2YzU0OGFkYzFjZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGluY29sbiBTcXVhcmU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RlMTA3MTZhNTg0NTQwYTdhOTEwY2NmNmU1ZWIzZjY0LnNldENvbnRlbnQoaHRtbF8yNzVjM2UzODA5N2Y0OWEyYWFjMDQ2YzU0OGFkYzFjZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83NzViYWUxMDQyZDE0ZDNlYTIzN2FjNGQ4NTUyMTE1ZC5iaW5kUG9wdXAocG9wdXBfZGUxMDcxNmE1ODQ1NDBhN2E5MTBjY2Y2ZTVlYjNmNjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODIxMDBmMzkxODdiNDdlYjk4ZjA3MjFiZWNkODAzY2MgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTkxMDA4OTE0NjIxMiwtNzMuOTk2MTE5MzYzMDk0NzldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZDdlM2ExNzQzYjI2NGY5ZDlkNDYyOTYyOWViMTMyNjApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDBkMDE5YWFkNzE3NDJhZjgzYjI4YTA5YjNkNjRmMjAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzZjM2VlZTIxNjIxNDMzMDk3YzFiYzMyYWU2ZjQzYWMgPSAkKCc8ZGl2IGlkPSJodG1sX2M2YzNlZWUyMTYyMTQzMzA5N2MxYmMzMmFlNmY0M2FjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGludG9uPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMGQwMTlhYWQ3MTc0MmFmODNiMjhhMDliM2Q2NGYyMC5zZXRDb250ZW50KGh0bWxfYzZjM2VlZTIxNjIxNDMzMDk3YzFiYzMyYWU2ZjQzYWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODIxMDBmMzkxODdiNDdlYjk4ZjA3MjFiZWNkODAzY2MuYmluZFBvcHVwKHBvcHVwXzAwZDAxOWFhZDcxNzQyYWY4M2IyOGEwOWIzZDY0ZjIwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzgxZmFlYjI5M2QxMzQ0ZjJiNzU4YTlhMTI0ODkzYTM5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU0NjkxMTAyNzA2MjMsLTczLjk4MTY2ODgyNzMwMzA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Q3ZTNhMTc0M2IyNjRmOWQ5ZDQ2Mjk2MjllYjEzMjYwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE4YmQ2N2VkZjcyNTQ4ZmE5ZTI2ZDJhMmE0YjFhODQ1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JiYjVlZGJlOWRmNzQ0ZWViNTg5Y2EzZjQxY2U1ODY3ID0gJCgnPGRpdiBpZD0iaHRtbF9iYmI1ZWRiZTlkZjc0NGVlYjU4OWNhM2Y0MWNlNTg2NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWlkdG93bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMThiZDY3ZWRmNzI1NDhmYTllMjZkMmEyYTRiMWE4NDUuc2V0Q29udGVudChodG1sX2JiYjVlZGJlOWRmNzQ0ZWViNTg5Y2EzZjQxY2U1ODY3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzgxZmFlYjI5M2QxMzQ0ZjJiNzU4YTlhMTI0ODkzYTM5LmJpbmRQb3B1cChwb3B1cF8xOGJkNjdlZGY3MjU0OGZhOWUyNmQyYTJhNGIxYTg0NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iYzk1NWE5NGI4M2I0Y2E1OTdkZGE1ZTdmMTViNWE2OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0ODMwMzA3NzI1MjE3NCwtNzMuOTc4MzMyMDc5MjQxMjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZDdlM2ExNzQzYjI2NGY5ZDlkNDYyOTYyOWViMTMyNjApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmI2YjJlNDU0ZjcxNGU3NzkzNTc1ODhmZmI5NmNkOTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWMxMTQ0MWZiYThlNDY3Njg3NDBmNGY0OWJmMWZiNzcgPSAkKCc8ZGl2IGlkPSJodG1sX2VjMTE0NDFmYmE4ZTQ2NzY4NzQwZjRmNDliZjFmYjc3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NdXJyYXkgSGlsbDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmI2YjJlNDU0ZjcxNGU3NzkzNTc1ODhmZmI5NmNkOTIuc2V0Q29udGVudChodG1sX2VjMTE0NDFmYmE4ZTQ2NzY4NzQwZjRmNDliZjFmYjc3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JjOTU1YTk0YjgzYjRjYTU5N2RkYTVlN2YxNWI1YTY5LmJpbmRQb3B1cChwb3B1cF8yYjZiMmU0NTRmNzE0ZTc3OTM1NzU4OGZmYjk2Y2Q5Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yYTk1MTAyMDIxM2I0MDkyYWMxM2UzNTYxYjZiN2NmOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NDAzNDcwNjc0Nzk3NSwtNzQuMDAzMTE2MzM0NzI4MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZDdlM2ExNzQzYjI2NGY5ZDlkNDYyOTYyOWViMTMyNjApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDFiZjU5ZmQzYjgxNDk2ZjlhZDVhZTQ2YjE2NzBhYTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDU1ZTkxMThlYWY2NGVjNWEzM2U5ZjU5ZjQ3Zjc5NDUgPSAkKCc8ZGl2IGlkPSJodG1sXzQ1NWU5MTE4ZWFmNjRlYzVhMzNlOWY1OWY0N2Y3OTQ1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaGVsc2VhPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMWJmNTlmZDNiODE0OTZmOWFkNWFlNDZiMTY3MGFhMi5zZXRDb250ZW50KGh0bWxfNDU1ZTkxMThlYWY2NGVjNWEzM2U5ZjU5ZjQ3Zjc5NDUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmE5NTEwMjAyMTNiNDA5MmFjMTNlMzU2MWI2YjdjZjkuYmluZFBvcHVwKHBvcHVwXzAxYmY1OWZkM2I4MTQ5NmY5YWQ1YWU0NmIxNjcwYWEyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZjYmU1NDczZWYxMTRlMzdiYzYxMGQyMjQ0YjRmMzMxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzI2OTMyODg1MzYxMjgsLTczLjk5OTkxNDAyOTQ1OTAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Q3ZTNhMTc0M2IyNjRmOWQ5ZDQ2Mjk2MjllYjEzMjYwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2EyZjQ5OWJjN2U0ZDQwNTZiMGUxOWIzZTY4ZDBjZTM5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc1NWY2MTI4ZDJhMzQxNGRhOGE2MDdkYzQyYWU3NDUxID0gJCgnPGRpdiBpZD0iaHRtbF83NTVmNjEyOGQyYTM0MTRkYThhNjA3ZGM0MmFlNzQ1MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+R3JlZW53aWNoIFZpbGxhZ2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EyZjQ5OWJjN2U0ZDQwNTZiMGUxOWIzZTY4ZDBjZTM5LnNldENvbnRlbnQoaHRtbF83NTVmNjEyOGQyYTM0MTRkYThhNjA3ZGM0MmFlNzQ1MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82Y2JlNTQ3M2VmMTE0ZTM3YmM2MTBkMjI0NGI0ZjMzMS5iaW5kUG9wdXAocG9wdXBfYTJmNDk5YmM3ZTRkNDA1NmIwZTE5YjNlNjhkMGNlMzkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjc1MWJjMmMyMmE5NDQ1NmIwZjVmZTlmYThjZGQ4MDcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43Mjc4NDY3NzcyNzAyNDQsLTczLjk4MjIyNjE2NTA2NDE2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Q3ZTNhMTc0M2IyNjRmOWQ5ZDQ2Mjk2MjllYjEzMjYwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc0M2NlYWFiODlmZjRmMDlhZTNkZWYyN2Q4MDA1MDFmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzlkNmNmN2VjNTNhZjQxNDRhZTkzOTdjMGQxYzQyZTNlID0gJCgnPGRpdiBpZD0iaHRtbF85ZDZjZjdlYzUzYWY0MTQ0YWU5Mzk3YzBkMWM0MmUzZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWFzdCBWaWxsYWdlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NDNjZWFhYjg5ZmY0ZjA5YWUzZGVmMjdkODAwNTAxZi5zZXRDb250ZW50KGh0bWxfOWQ2Y2Y3ZWM1M2FmNDE0NGFlOTM5N2MwZDFjNDJlM2UpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjc1MWJjMmMyMmE5NDQ1NmIwZjVmZTlmYThjZGQ4MDcuYmluZFBvcHVwKHBvcHVwXzc0M2NlYWFiODlmZjRmMDlhZTNkZWYyN2Q4MDA1MDFmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JhOTBiYjYwYTExMzQ0MTg5YzlmZDI1OGRjZWJkNTNjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE3ODA2NzQ4OTI3NjUsLTczLjk4MDg5MDMxOTk5MjkxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Q3ZTNhMTc0M2IyNjRmOWQ5ZDQ2Mjk2MjllYjEzMjYwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJmN2E4ODMyYTZkYzQ5Nzg5ZGNkYTRjYmRhYTkxMjlmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2QxN2MyMDFjOWI5NjQzYTJhYmRhMDcwYzE4ZjM1OWFmID0gJCgnPGRpdiBpZD0iaHRtbF9kMTdjMjAxYzliOTY0M2EyYWJkYTA3MGMxOGYzNTlhZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TG93ZXIgRWFzdCBTaWRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZjdhODgzMmE2ZGM0OTc4OWRjZGE0Y2JkYWE5MTI5Zi5zZXRDb250ZW50KGh0bWxfZDE3YzIwMWM5Yjk2NDNhMmFiZGEwNzBjMThmMzU5YWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmE5MGJiNjBhMTEzNDQxODljOWZkMjU4ZGNlYmQ1M2MuYmluZFBvcHVwKHBvcHVwXzJmN2E4ODMyYTZkYzQ5Nzg5ZGNkYTRjYmRhYTkxMjlmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ViMWVkYTVlMjA1NTQzOTFhNzUwZTM4NmVjNzMxM2Y3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzIxNTIxOTY3NDQzMjE2LC03NC4wMTA2ODMyODU1OTA4N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kN2UzYTE3NDNiMjY0ZjlkOWQ0NjI5NjI5ZWIxMzI2MCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wMDZkZDk4ZmY2ZDE0NDk2YWU4ZmE1MmQ0NjNhY2RhNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kN2Q0ZmNkY2RjMDg0NmQ3OTYzNTEzYzNlNDllNTBiMSA9ICQoJzxkaXYgaWQ9Imh0bWxfZDdkNGZjZGNkYzA4NDZkNzk2MzUxM2MzZTQ5ZTUwYjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRyaWJlY2E8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAwNmRkOThmZjZkMTQ0OTZhZThmYTUyZDQ2M2FjZGE0LnNldENvbnRlbnQoaHRtbF9kN2Q0ZmNkY2RjMDg0NmQ3OTYzNTEzYzNlNDllNTBiMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lYjFlZGE1ZTIwNTU0MzkxYTc1MGUzODZlYzczMTNmNy5iaW5kUG9wdXAocG9wdXBfMDA2ZGQ5OGZmNmQxNDQ5NmFlOGZhNTJkNDYzYWNkYTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTg4MzhiMzM1YTk5NGQ3MzhhMWFhNmE5YzY1ZjcxYzEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTkzMjM3OTM5NTkwNywtNzMuOTk3MzA0NjcyMDgwNzNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZDdlM2ExNzQzYjI2NGY5ZDlkNDYyOTYyOWViMTMyNjApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmVhM2E0YjQ2YjZiNGIzYWI5OGE3M2ZlMzc4YTAyYmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGJlZjYyNGFlZWRkNDhjYmJiMGVmZGJhODk3OTE0MTcgPSAkKCc8ZGl2IGlkPSJodG1sXzhiZWY2MjRhZWVkZDQ4Y2JiYjBlZmRiYTg5NzkxNDE3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MaXR0bGUgSXRhbHk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZlYTNhNGI0NmI2YjRiM2FiOThhNzNmZTM3OGEwMmJkLnNldENvbnRlbnQoaHRtbF84YmVmNjI0YWVlZGQ0OGNiYmIwZWZkYmE4OTc5MTQxNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81ODgzOGIzMzVhOTk0ZDczOGExYWE2YTljNjVmNzFjMS5iaW5kUG9wdXAocG9wdXBfZmVhM2E0YjQ2YjZiNGIzYWI5OGE3M2ZlMzc4YTAyYmQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzc3MGViOGJhNzdkNDczYjhkZWZmYmFiYjMyOGJkM2IgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjIxODM4NDEzMTc5NCwtNzQuMDAwNjU2NjY5NTk3NTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZDdlM2ExNzQzYjI2NGY5ZDlkNDYyOTYyOWViMTMyNjApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjc3NjViNTQ3MzlkNDcxMzhmNDg2ODMxOGVjZWI2OTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWM0YzI4YTlhN2FhNGIwZGIwODYyMjZhMTliZGQ2ZjIgPSAkKCc8ZGl2IGlkPSJodG1sXzFjNGMyOGE5YTdhYTRiMGRiMDg2MjI2YTE5YmRkNmYyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Tb2hvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iNzc2NWI1NDczOWQ0NzEzOGY0ODY4MzE4ZWNlYjY5Ni5zZXRDb250ZW50KGh0bWxfMWM0YzI4YTlhN2FhNGIwZGIwODYyMjZhMTliZGQ2ZjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzc3MGViOGJhNzdkNDczYjhkZWZmYmFiYjMyOGJkM2IuYmluZFBvcHVwKHBvcHVwX2I3NzY1YjU0NzM5ZDQ3MTM4ZjQ4NjgzMThlY2ViNjk2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE3MmJmMjY2MmMzOTRhYzc5ZGRmNzQ3N2M2YTkyZjRhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzM0NDMzOTM1NzI0MzQsLTc0LjAwNjE3OTk4MTI2ODEyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Q3ZTNhMTc0M2IyNjRmOWQ5ZDQ2Mjk2MjllYjEzMjYwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzYxMmU1N2Q3NjBjMDQyNDZhZjQ0NDdiZmYyZGE1ZmI5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E2ODY2YzQwNzRlZDRiNzliNjgzOGE1NjliMzQzODQ1ID0gJCgnPGRpdiBpZD0iaHRtbF9hNjg2NmM0MDc0ZWQ0Yjc5YjY4MzhhNTY5YjM0Mzg0NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2VzdCBWaWxsYWdlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MTJlNTdkNzYwYzA0MjQ2YWY0NDQ3YmZmMmRhNWZiOS5zZXRDb250ZW50KGh0bWxfYTY4NjZjNDA3NGVkNGI3OWI2ODM4YTU2OWIzNDM4NDUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTcyYmYyNjYyYzM5NGFjNzlkZGY3NDc3YzZhOTJmNGEuYmluZFBvcHVwKHBvcHVwXzYxMmU1N2Q3NjBjMDQyNDZhZjQ0NDdiZmYyZGE1ZmI5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2VlMTg4OGVjM2Q1MjQyMjZhYWNhNzUwODdhYTU5ODMwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzk3MzA3MDQxNzAyODY1LC03My45NjQyODYxNzc0MDY1NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kN2UzYTE3NDNiMjY0ZjlkOWQ0NjI5NjI5ZWIxMzI2MCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zNmJiMmFiMWY1Njc0ZjAwYmU3YTI1N2M0YzE4YTBmMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wODg3NmVlZGZhNzM0NzYwOGYzZjcwZmMzNmM2ZTEyMSA9ICQoJzxkaXYgaWQ9Imh0bWxfMDg4NzZlZWRmYTczNDc2MDhmM2Y3MGZjMzZjNmUxMjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1hbmhhdHRhbiBWYWxsZXk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM2YmIyYWIxZjU2NzRmMDBiZTdhMjU3YzRjMThhMGYzLnNldENvbnRlbnQoaHRtbF8wODg3NmVlZGZhNzM0NzYwOGYzZjcwZmMzNmM2ZTEyMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lZTE4ODhlYzNkNTI0MjI2YWFjYTc1MDg3YWE1OTgzMC5iaW5kUG9wdXAocG9wdXBfMzZiYjJhYjFmNTY3NGYwMGJlN2EyNTdjNGMxOGEwZjMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTZmYzA1Y2M5Zjc1NDZhZjllOThkYjExMThlYjgxZTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MDc5OTk3MzgxNjU4MjYsLTczLjk2Mzg5NjI3OTA1MzMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Q3ZTNhMTc0M2IyNjRmOWQ5ZDQ2Mjk2MjllYjEzMjYwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FlNzE4N2Y5OWFjMDQ2YmE5YTJiZmJmYmYxYzNlZGJjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRmMmQ5OTI5M2IxMzRkNWU4NDliNzJmYTZjY2IxNjgwID0gJCgnPGRpdiBpZD0iaHRtbF80ZjJkOTkyOTNiMTM0ZDVlODQ5YjcyZmE2Y2NiMTY4MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW9ybmluZ3NpZGUgSGVpZ2h0czwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWU3MTg3Zjk5YWMwNDZiYTlhMmJmYmZiZjFjM2VkYmMuc2V0Q29udGVudChodG1sXzRmMmQ5OTI5M2IxMzRkNWU4NDliNzJmYTZjY2IxNjgwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk2ZmMwNWNjOWY3NTQ2YWY5ZTk4ZGIxMTE4ZWI4MWU4LmJpbmRQb3B1cChwb3B1cF9hZTcxODdmOTlhYzA0NmJhOWEyYmZiZmJmMWMzZWRiYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jNDg3ZWM4YTMwODc0MjQ1YjQ0ZmNmYjFmYjQwZGUxYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczNzIwOTgzMjcxNSwtNzMuOTgxMzc1OTQ4MzM1NDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZDdlM2ExNzQzYjI2NGY5ZDlkNDYyOTYyOWViMTMyNjApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWRmNTkxNGQwNzQ0NDIyYmE3M2NiZGM5Y2M2MTdhZDIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2QzMDM0MmFkNTdlNDM5NGE5NTMwNmQyM2FjM2Q4NDYgPSAkKCc8ZGl2IGlkPSJodG1sXzdkMzAzNDJhZDU3ZTQzOTRhOTUzMDZkMjNhYzNkODQ2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmFtZXJjeTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWRmNTkxNGQwNzQ0NDIyYmE3M2NiZGM5Y2M2MTdhZDIuc2V0Q29udGVudChodG1sXzdkMzAzNDJhZDU3ZTQzOTRhOTUzMDZkMjNhYzNkODQ2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M0ODdlYzhhMzA4NzQyNDViNDRmY2ZiMWZiNDBkZTFjLmJpbmRQb3B1cChwb3B1cF9lZGY1OTE0ZDA3NDQ0MjJiYTczY2JkYzljYzYxN2FkMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mNmYwNmQwYjdkOTg0ODUwODZhOGJlYzk2NGRmNTc0ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcxMTkzMTk4Mzk0NTY1LC03NC4wMTY4NjkzMDUwODYxN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kN2UzYTE3NDNiMjY0ZjlkOWQ0NjI5NjI5ZWIxMzI2MCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zNjAzYjU5MGQ5MjU0NDcwYjlmYWJjOWZmMzExMjMwZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zMmM0MzEyOTI5NzQ0Yjg4YjgzZDQ1ZjlkOTg4NjYzMiA9ICQoJzxkaXYgaWQ9Imh0bWxfMzJjNDMxMjkyOTc0NGI4OGI4M2Q0NWY5ZDk4ODY2MzIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJhdHRlcnkgUGFyayBDaXR5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zNjAzYjU5MGQ5MjU0NDcwYjlmYWJjOWZmMzExMjMwZC5zZXRDb250ZW50KGh0bWxfMzJjNDMxMjkyOTc0NGI4OGI4M2Q0NWY5ZDk4ODY2MzIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjZmMDZkMGI3ZDk4NDg1MDg2YThiZWM5NjRkZjU3NGYuYmluZFBvcHVwKHBvcHVwXzM2MDNiNTkwZDkyNTQ0NzBiOWZhYmM5ZmYzMTEyMzBkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk0MmY3YTRkOGZkZjRjYTc4MGJiMGY0YmRhZTQ2MDMxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzA3MTA3MTA3MjcwNDgsLTc0LjAxMDY2NTQ0NTIxMjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZDdlM2ExNzQzYjI2NGY5ZDlkNDYyOTYyOWViMTMyNjApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGMwMWU2N2I3MTE3NDQ1NWJlOTZhNDNkM2IxYWI1NjQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTQzY2VhYjE4ZWUxNDI5MjkyMjE5ODhiMGE0MTRiMDEgPSAkKCc8ZGl2IGlkPSJodG1sXzE0M2NlYWIxOGVlMTQyOTI5MjIxOTg4YjBhNDE0YjAxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GaW5hbmNpYWwgRGlzdHJpY3Q8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhjMDFlNjdiNzExNzQ0NTViZTk2YTQzZDNiMWFiNTY0LnNldENvbnRlbnQoaHRtbF8xNDNjZWFiMThlZTE0MjkyOTIyMTk4OGIwYTQxNGIwMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85NDJmN2E0ZDhmZGY0Y2E3ODBiYjBmNGJkYWU0NjAzMS5iaW5kUG9wdXAocG9wdXBfOGMwMWU2N2I3MTE3NDQ1NWJlOTZhNDNkM2IxYWI1NjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTk4YTEyODlkYzg0NDUzMGE0YTg4YzRmN2NiMGY5OWUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43ODI2ODI1NjcxMjU3LC03My45NTMyNTY0NjgzNzExMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kN2UzYTE3NDNiMjY0ZjlkOWQ0NjI5NjI5ZWIxMzI2MCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lMTU1YWVjODE2MTM0NDM2YjljNzNhZTY1OGNhNjVlMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82YTU0NWYxMzIwMGY0ZWQ2YTM3NjYxZDdiYjhkZGQyMCA9ICQoJzxkaXYgaWQ9Imh0bWxfNmE1NDVmMTMyMDBmNGVkNmEzNzY2MWQ3YmI4ZGRkMjAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNhcm5lZ2llIEhpbGw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UxNTVhZWM4MTYxMzQ0MzZiOWM3M2FlNjU4Y2E2NWUzLnNldENvbnRlbnQoaHRtbF82YTU0NWYxMzIwMGY0ZWQ2YTM3NjYxZDdiYjhkZGQyMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xOThhMTI4OWRjODQ0NTMwYTRhODhjNGY3Y2IwZjk5ZS5iaW5kUG9wdXAocG9wdXBfZTE1NWFlYzgxNjEzNDQzNmI5YzczYWU2NThjYTY1ZTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTYzYWIwOTE5OGQ0NGIwOWI0NDRmNDU2NGM2ZmE3YzggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjMyNTkwMTg4NTc2OCwtNzMuOTg4NDMzNjgwMjM1OTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZDdlM2ExNzQzYjI2NGY5ZDlkNDYyOTYyOWViMTMyNjApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmMzMTYwOWMxZGZiNGRiODhjZjhjNWQ3MmUzNGRiZDkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjdkNmU4ODRmYzQyNDc5NWJiMTYxYzJkNGY3MzQ1YjEgPSAkKCc8ZGl2IGlkPSJodG1sXzI3ZDZlODg0ZmM0MjQ3OTViYjE2MWMyZDRmNzM0NWIxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob2hvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mYzMxNjA5YzFkZmI0ZGI4OGNmOGM1ZDcyZTM0ZGJkOS5zZXRDb250ZW50KGh0bWxfMjdkNmU4ODRmYzQyNDc5NWJiMTYxYzJkNGY3MzQ1YjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTYzYWIwOTE5OGQ0NGIwOWI0NDRmNDU2NGM2ZmE3YzguYmluZFBvcHVwKHBvcHVwX2ZjMzE2MDljMWRmYjRkYjg4Y2Y4YzVkNzJlMzRkYmQ5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2QxNTFiNzQwMWUyNjRmOWFiYmIzZGEwNmMzYjBkZDViID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE1MjI4OTIwNDYyODIsLTc0LjAwNTQxNTI5ODczMzU1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Q3ZTNhMTc0M2IyNjRmOWQ5ZDQ2Mjk2MjllYjEzMjYwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzlhZTNjMzMyZjg0ZjQ5YmM4NmY0MjE0YjY2NTgyM2FkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQwOGJkZWY5OTQ1MzRkOWNhNzY0YWY2NDM2YTM5YWNkID0gJCgnPGRpdiBpZD0iaHRtbF80MDhiZGVmOTk0NTM0ZDljYTc2NGFmNjQzNmEzOWFjZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2l2aWMgQ2VudGVyPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85YWUzYzMzMmY4NGY0OWJjODZmNDIxNGI2NjU4MjNhZC5zZXRDb250ZW50KGh0bWxfNDA4YmRlZjk5NDUzNGQ5Y2E3NjRhZjY0MzZhMzlhY2QpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDE1MWI3NDAxZTI2NGY5YWJiYjNkYTA2YzNiMGRkNWIuYmluZFBvcHVwKHBvcHVwXzlhZTNjMzMyZjg0ZjQ5YmM4NmY0MjE0YjY2NTgyM2FkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JlZWJlOWNjNzNkNTQxZDRhZGNmOTdlNzc3MjA5YjRmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQ4NTA5NjY0MzEyMiwtNzMuOTg4NzEzMTMyODUyNDddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZDdlM2ExNzQzYjI2NGY5ZDlkNDYyOTYyOWViMTMyNjApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDY1ZjRiYTI2MmRkNDI1ODg1MThkZDY4YmNlZDZmM2MgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDZkNTdkMzFiMWM3NDk1NTk2ZGNjNzM1ZDc3ZWIzZjggPSAkKCc8ZGl2IGlkPSJodG1sXzA2ZDU3ZDMxYjFjNzQ5NTU5NmRjYzczNWQ3N2ViM2Y4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NaWR0b3duIFNvdXRoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kNjVmNGJhMjYyZGQ0MjU4ODUxOGRkNjhiY2VkNmYzYy5zZXRDb250ZW50KGh0bWxfMDZkNTdkMzFiMWM3NDk1NTk2ZGNjNzM1ZDc3ZWIzZjgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmVlYmU5Y2M3M2Q1NDFkNGFkY2Y5N2U3NzcyMDliNGYuYmluZFBvcHVwKHBvcHVwX2Q2NWY0YmEyNjJkZDQyNTg4NTE4ZGQ2OGJjZWQ2ZjNjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVmYmRlZjFjZTI4ZjQ3YTJiMjA5MGYzYzg0YzJiZTU0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzYwMjgwMzMxMzEzNzQsLTczLjk2MzU1NjE0MDk0MzAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Q3ZTNhMTc0M2IyNjRmOWQ5ZDQ2Mjk2MjllYjEzMjYwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NlNjhkYmJiOTBkMzQxNDBhMDcxZTZjYjQ0MWExZjA1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VmNzRmZjQ4NzQ1MDQzNWE4YmFjYjA1OGZiOGIzMDJjID0gJCgnPGRpdiBpZD0iaHRtbF9lZjc0ZmY0ODc0NTA0MzVhOGJhY2IwNThmYjhiMzAyYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3V0dG9uIFBsYWNlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jZTY4ZGJiYjkwZDM0MTQwYTA3MWU2Y2I0NDFhMWYwNS5zZXRDb250ZW50KGh0bWxfZWY3NGZmNDg3NDUwNDM1YThiYWNiMDU4ZmI4YjMwMmMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWZiZGVmMWNlMjhmNDdhMmIyMDkwZjNjODRjMmJlNTQuYmluZFBvcHVwKHBvcHVwX2NlNjhkYmJiOTBkMzQxNDBhMDcxZTZjYjQ0MWExZjA1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY0ODUyMzIwOTQ2OTQ0NzRiMDBkMzU1Y2ViNWI2Zjk4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzUyMDQyMzY5NTA3MjIsLTczLjk2NzcwODI0NTgxODM0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Q3ZTNhMTc0M2IyNjRmOWQ5ZDQ2Mjk2MjllYjEzMjYwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRjMTkzY2U3ZjU3YTRiNTc4MTEwMjAxNTZlNDlkOTQ3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M5NDhhNDMxNTdhMTRmNjc4YmU0Yzk0NTQzMjhkMTc1ID0gJCgnPGRpdiBpZD0iaHRtbF9jOTQ4YTQzMTU3YTE0ZjY3OGJlNGM5NDU0MzI4ZDE3NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VHVydGxlIEJheTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGMxOTNjZTdmNTdhNGI1NzgxMTAyMDE1NmU0OWQ5NDcuc2V0Q29udGVudChodG1sX2M5NDhhNDMxNTdhMTRmNjc4YmU0Yzk0NTQzMjhkMTc1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY0ODUyMzIwOTQ2OTQ0NzRiMDBkMzU1Y2ViNWI2Zjk4LmJpbmRQb3B1cChwb3B1cF80YzE5M2NlN2Y1N2E0YjU3ODExMDIwMTU2ZTQ5ZDk0Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jZDMyOTc1MmIyOGQ0NjBlOGMwZmUxYWJkZDkwYjg2NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NjkxNzQxMDc0MDE5NSwtNzMuOTcxMjE5Mjg3MjIyNjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZDdlM2ExNzQzYjI2NGY5ZDlkNDYyOTYyOWViMTMyNjApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjhjZjMyNGJiODM5NGY5YmE3OGY3MzM1OGM0MzMwN2QgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGY5YTc3M2IwMDA1NDBjNTljNmJmMGQxNDQ2M2VlMjkgPSAkKCc8ZGl2IGlkPSJodG1sXzRmOWE3NzNiMDAwNTQwYzU5YzZiZjBkMTQ0NjNlZTI5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UdWRvciBDaXR5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iOGNmMzI0YmI4Mzk0ZjliYTc4ZjczMzU4YzQzMzA3ZC5zZXRDb250ZW50KGh0bWxfNGY5YTc3M2IwMDA1NDBjNTljNmJmMGQxNDQ2M2VlMjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2QzMjk3NTJiMjhkNDYwZThjMGZlMWFiZGQ5MGI4NjQuYmluZFBvcHVwKHBvcHVwX2I4Y2YzMjRiYjgzOTRmOWJhNzhmNzMzNThjNDMzMDdkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQzZTA1Zjc5Y2NmNjQ3NGFhOGYwZTcwNDVjMzQ3ZmU4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzMwOTk5NTU0NzcwNjEsLTczLjk3NDA1MTcwNDY5MjAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Q3ZTNhMTc0M2IyNjRmOWQ5ZDQ2Mjk2MjllYjEzMjYwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk0MjY4MDBmZDk3NTQ0NjZhMzE1MDVjNGQ1NjhjYmNhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk4OWY1YmNiYzBhYTQ5Y2Y4ZWJjZjQ5YTRmNTNkZWM5ID0gJCgnPGRpdiBpZD0iaHRtbF85ODlmNWJjYmMwYWE0OWNmOGViY2Y0OWE0ZjUzZGVjOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3R1eXZlc2FudCBUb3duPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NDI2ODAwZmQ5NzU0NDY2YTMxNTA1YzRkNTY4Y2JjYS5zZXRDb250ZW50KGh0bWxfOTg5ZjViY2JjMGFhNDljZjhlYmNmNDlhNGY1M2RlYzkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDNlMDVmNzljY2Y2NDc0YWE4ZjBlNzA0NWMzNDdmZTguYmluZFBvcHVwKHBvcHVwXzk0MjY4MDBmZDk3NTQ0NjZhMzE1MDVjNGQ1NjhjYmNhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ViMTdiNzE4ZDkyMzQ0NDNhNmYwNDlkYjBjYzhkODJhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzM5NjczMDQ3NjM4NDI2LC03My45OTA5NDcxMDUyODI2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Q3ZTNhMTc0M2IyNjRmOWQ5ZDQ2Mjk2MjllYjEzMjYwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMwOGViZGI0ODhjNTQyZTc4Y2Y2NDI3ZjgzMWRkYTFhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM1Y2IxM2MxNTQxNzQ4YTFiZDkxZjYxZTQ0OGIwYzQ0ID0gJCgnPGRpdiBpZD0iaHRtbF8zNWNiMTNjMTU0MTc0OGExYmQ5MWY2MWU0NDhiMGM0NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RmxhdGlyb248L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMwOGViZGI0ODhjNTQyZTc4Y2Y2NDI3ZjgzMWRkYTFhLnNldENvbnRlbnQoaHRtbF8zNWNiMTNjMTU0MTc0OGExYmQ5MWY2MWU0NDhiMGM0NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lYjE3YjcxOGQ5MjM0NDQzYTZmMDQ5ZGIwY2M4ZDgyYS5iaW5kUG9wdXAocG9wdXBfMzA4ZWJkYjQ4OGM1NDJlNzhjZjY0MjdmODMxZGRhMWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzBjNDI4NGZkM2RjNGVjZjhjYTEwOTY3NThlNzg2YzUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTY2NTgwODIyNzUxOSwtNzQuMDAwMTExMzYyMDI2MzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZDdlM2ExNzQzYjI2NGY5ZDlkNDYyOTYyOWViMTMyNjApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjc1MDg5ZTEzYmU3NDYzNWIxZjY2OWFjYjlmODA1ZmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzliODhjMjA3Y2ZlNGM4NTljMjdlNzNlMDU0NWQxYzQgPSAkKCc8ZGl2IGlkPSJodG1sX2M5Yjg4YzIwN2NmZTRjODU5YzI3ZTczZTA1NDVkMWM0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IdWRzb24gWWFyZHM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I3NTA4OWUxM2JlNzQ2MzViMWY2NjlhY2I5ZjgwNWZlLnNldENvbnRlbnQoaHRtbF9jOWI4OGMyMDdjZmU0Yzg1OWMyN2U3M2UwNTQ1ZDFjNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jMGM0Mjg0ZmQzZGM0ZWNmOGNhMTA5Njc1OGU3ODZjNS5iaW5kUG9wdXAocG9wdXBfYjc1MDg5ZTEzYmU3NDYzNWIxZjY2OWFjYjlmODA1ZmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCjwvc2NyaXB0Pg== onload=\"this.contentDocument.open();this.contentDocument.write(atob(this.getAttribute('data-html')));this.contentDocument.close();\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x7fe379185470>"
]
},
"execution_count": 44,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# create map of Manhattan using latitude and longitude values\n",
"map_manhattan = folium.Map(location=[latitude, longitude], zoom_start=11)\n",
"\n",
"# add markers to map\n",
"for lat, lng, label in zip(manhattan_data['Latitude'], manhattan_data['Longitude'], manhattan_data['Neighborhood']):\n",
" label = folium.Popup(label, parse_html=True)\n",
" folium.CircleMarker(\n",
" [lat, lng],\n",
" radius=5,\n",
" popup=label,\n",
" color='blue',\n",
" fill=True,\n",
" fill_color='#3186cc',\n",
" fill_opacity=0.7,\n",
" parse_html=False).add_to(map_manhattan) \n",
" \n",
"map_manhattan"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next, we are going to start utilizing the Foursquare API to explore the neighborhoods and segment them."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Define Foursquare Credentials and Version"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Your credentails:\n",
"CLIENT_ID: UETX00PUATTU2SPS1HF2AS2VETJRQEZG1HC2X2TTDUOJZIJS\n",
"CLIENT_SECRET:RSPGFL4C02UDGBEBLBDEC1BG5M0DZNUOJFUACB2W0W4OLREC\n"
]
}
],
"source": [
"CLIENT_ID = 'UETX00PUATTU2SPS1HF2AS2VETJRQEZG1HC2X2TTDUOJZIJS' # your Foursquare ID\n",
"CLIENT_SECRET = 'RSPGFL4C02UDGBEBLBDEC1BG5M0DZNUOJFUACB2W0W4OLREC' # your Foursquare Secret\n",
"VERSION = '20180605' # Foursquare API version\n",
"\n",
"print('Your credentails:')\n",
"print('CLIENT_ID: ' + CLIENT_ID)\n",
"print('CLIENT_SECRET:' + CLIENT_SECRET)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Let's explore the first neighborhood in our dataframe."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Get the neighborhood's name."
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"'Marble Hill'"
]
},
"execution_count": 46,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"manhattan_data.loc[0, 'Neighborhood']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Get the neighborhood's latitude and longitude values."
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Latitude and longitude values of Marble Hill are 40.87655077879964, -73.91065965862981.\n"
]
}
],
"source": [
"neighborhood_latitude = manhattan_data.loc[0, 'Latitude'] # neighborhood latitude value\n",
"neighborhood_longitude = manhattan_data.loc[0, 'Longitude'] # neighborhood longitude value\n",
"\n",
"neighborhood_name = manhattan_data.loc[0, 'Neighborhood'] # neighborhood name\n",
"\n",
"print('Latitude and longitude values of {} are {}, {}.'.format(neighborhood_name, \n",
" neighborhood_latitude, \n",
" neighborhood_longitude))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Now, let's get the top 100 venues that are in Marble Hill within a radius of 500 meters."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First, let's create the GET request URL. Name your URL **url**."
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
},
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"'https://api.foursquare.com/v2/venues/explore?&client_id=UETX00PUATTU2SPS1HF2AS2VETJRQEZG1HC2X2TTDUOJZIJS&client_secret=RSPGFL4C02UDGBEBLBDEC1BG5M0DZNUOJFUACB2W0W4OLREC&v=20180605&ll=40.87655077879964,-73.91065965862981&radius=500&limit=100'"
]
},
"execution_count": 48,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"path1='https://api.foursquare.com/v2/venues/explore?&client_id={}&client_secret={}&v={}&ll={},{}&radius={}&limit={}'\n",
"url = path1.format(\n",
" CLIENT_ID, \n",
" CLIENT_SECRET, \n",
" VERSION, \n",
" neighborhood_latitude, \n",
" neighborhood_longitude, \n",
" 500, \n",
" 100)\n",
"url"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Double-click __here__ for the solution.\n",
"<!-- The correct answer is:\n",
"LIMIT = 100 # limit of number of venues returned by Foursquare API\n",
"-->\n",
"\n",
"<!--\n",
"radius = 500 # define radius\n",
"-->\n",
"\n",
"<!--\n",
"\\\\ # create URL\n",
"url = 'https://api.foursquare.com/v2/venues/explore?&client_id={}&client_secret={}&v={}&ll={},{}&radius={}&limit={}'.format(\n",
" CLIENT_ID, \n",
" CLIENT_SECRET, \n",
" VERSION, \n",
" neighborhood_latitude, \n",
" neighborhood_longitude, \n",
" radius, \n",
" LIMIT)\n",
"url # display URL\n",
"--> "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Send the GET request and examine the resutls"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"{'meta': {'code': 200, 'requestId': '5ebc1145a2e538001b0a2280'},\n",
" 'response': {'suggestedFilters': {'header': 'Tap to show:',\n",
" 'filters': [{'name': 'Open now', 'key': 'openNow'}]},\n",
" 'headerLocation': 'Marble Hill',\n",
" 'headerFullLocation': 'Marble Hill, New York',\n",
" 'headerLocationGranularity': 'neighborhood',\n",
" 'totalResults': 26,\n",
" 'suggestedBounds': {'ne': {'lat': 40.88105078329964,\n",
" 'lng': -73.90471933917806},\n",
" 'sw': {'lat': 40.87205077429964, 'lng': -73.91659997808156}},\n",
" 'groups': [{'type': 'Recommended Places',\n",
" 'name': 'recommended',\n",
" 'items': [{'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b4429abf964a52037f225e3',\n",
" 'name': \"Arturo's\",\n",
" 'location': {'address': '5198 Broadway',\n",
" 'crossStreet': 'at 225th St.',\n",
" 'lat': 40.87441177110231,\n",
" 'lng': -73.91027100981574,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87441177110231,\n",
" 'lng': -73.91027100981574},\n",
" {'label': 'entrance', 'lat': 40.874401, 'lng': -73.910339}],\n",
" 'distance': 240,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5198 Broadway (at 225th St.)',\n",
" 'New York, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1ca941735',\n",
" 'name': 'Pizza Place',\n",
" 'pluralName': 'Pizza Places',\n",
" 'shortName': 'Pizza',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/pizza_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'delivery': {'id': '72548',\n",
" 'url': 'https://www.seamless.com/menu/arturos-pizza-5189-broadway-ave-new-york/72548?affiliate=1131&utm_source=foursquare-affiliate-network&utm_medium=affiliate&utm_campaign=1131&utm_content=72548',\n",
" 'provider': {'name': 'seamless',\n",
" 'icon': {'prefix': 'https://fastly.4sqi.net/img/general/cap/',\n",
" 'sizes': [40, 50],\n",
" 'name': '/delivery_provider_seamless_20180129.png'}}},\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b4429abf964a52037f225e3-0'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4baf59e8f964a520a6f93be3',\n",
" 'name': 'Bikram Yoga',\n",
" 'location': {'address': '5500 Broadway',\n",
" 'crossStreet': '230th Street',\n",
" 'lat': 40.876843690797934,\n",
" 'lng': -73.90620384419528,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.876843690797934,\n",
" 'lng': -73.90620384419528}],\n",
" 'distance': 376,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5500 Broadway (230th Street)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d102941735',\n",
" 'name': 'Yoga Studio',\n",
" 'pluralName': 'Yoga Studios',\n",
" 'shortName': 'Yoga Studio',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/gym_yogastudio_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4baf59e8f964a520a6f93be3-1'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b79cc46f964a520c5122fe3',\n",
" 'name': 'Tibbett Diner',\n",
" 'location': {'address': '3033 Tibbett Ave',\n",
" 'crossStreet': 'btwn 230th & 231st',\n",
" 'lat': 40.8804044222466,\n",
" 'lng': -73.90893738006402,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.8804044222466,\n",
" 'lng': -73.90893738006402},\n",
" {'label': 'entrance', 'lat': 40.880388, 'lng': -73.90896}],\n",
" 'distance': 452,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['3033 Tibbett Ave (btwn 230th & 231st)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d147941735',\n",
" 'name': 'Diner',\n",
" 'pluralName': 'Diners',\n",
" 'shortName': 'Diner',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/diner_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b79cc46f964a520c5122fe3-2'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '55f81cd2498ee903149fcc64',\n",
" 'name': 'Starbucks',\n",
" 'location': {'address': '171 W 230th St',\n",
" 'crossStreet': 'Kimberly Pl',\n",
" 'lat': 40.87753134921497,\n",
" 'lng': -73.90558216359267,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87753134921497,\n",
" 'lng': -73.90558216359267}],\n",
" 'distance': 441,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['171 W 230th St (Kimberly Pl)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1e0931735',\n",
" 'name': 'Coffee Shop',\n",
" 'pluralName': 'Coffee Shops',\n",
" 'shortName': 'Coffee Shop',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/coffeeshop_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-55f81cd2498ee903149fcc64-3'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b5357adf964a520319827e3',\n",
" 'name': \"Dunkin'\",\n",
" 'location': {'address': '5501 Broadway',\n",
" 'crossStreet': 'W 230th St',\n",
" 'lat': 40.87713584201589,\n",
" 'lng': -73.90666550701411,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87713584201589,\n",
" 'lng': -73.90666550701411}],\n",
" 'distance': 342,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5501 Broadway (W 230th St)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d148941735',\n",
" 'name': 'Donut Shop',\n",
" 'pluralName': 'Donut Shops',\n",
" 'shortName': 'Donuts',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/donuts_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b5357adf964a520319827e3-4'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b88e053f964a5208a1132e3',\n",
" 'name': 'Rite Aid',\n",
" 'location': {'address': '5237 Broadway',\n",
" 'crossStreet': '228th Street',\n",
" 'lat': 40.875466574434704,\n",
" 'lng': -73.90890629016033,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.875466574434704,\n",
" 'lng': -73.90890629016033}],\n",
" 'distance': 190,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5237 Broadway (228th Street)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d10f951735',\n",
" 'name': 'Pharmacy',\n",
" 'pluralName': 'Pharmacies',\n",
" 'shortName': 'Pharmacy',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/pharmacy_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b88e053f964a5208a1132e3-5'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4a725fa1f964a520f6da1fe3',\n",
" 'name': 'TCR The Club of Riverdale',\n",
" 'location': {'address': '2600 Netherland Ave',\n",
" 'lat': 40.8786283,\n",
" 'lng': -73.9145678,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.8786283,\n",
" 'lng': -73.9145678}],\n",
" 'distance': 402,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['2600 Netherland Ave',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4e39a891bd410d7aed40cbc2',\n",
" 'name': 'Tennis Stadium',\n",
" 'pluralName': 'Tennis Stadiums',\n",
" 'shortName': 'Tennis',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/arts_entertainment/stadium_tennis_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []},\n",
" 'venuePage': {'id': '40358759'}},\n",
" 'referralId': 'e-0-4a725fa1f964a520f6da1fe3-6'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b9c9c6af964a520b27236e3',\n",
" 'name': 'Land & Sea Restaurant',\n",
" 'location': {'address': '5535 Broadway',\n",
" 'crossStreet': '231st St',\n",
" 'lat': 40.87788463309788,\n",
" 'lng': -73.90587282193539,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87788463309788,\n",
" 'lng': -73.90587282193539},\n",
" {'label': 'entrance', 'lat': 40.877906, 'lng': -73.905722}],\n",
" 'distance': 429,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5535 Broadway (231st St)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1ce941735',\n",
" 'name': 'Seafood Restaurant',\n",
" 'pluralName': 'Seafood Restaurants',\n",
" 'shortName': 'Seafood',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/seafood_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b9c9c6af964a520b27236e3-7'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '57655be738faa66160da7527',\n",
" 'name': 'Starbucks',\n",
" 'location': {'address': '50 W 225th St',\n",
" 'lat': 40.873754554218515,\n",
" 'lng': -73.90861305343668,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.873754554218515,\n",
" 'lng': -73.90861305343668},\n",
" {'label': 'entrance', 'lat': 40.873502, 'lng': -73.907986}],\n",
" 'distance': 355,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['50 W 225th St',\n",
" 'New York, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1e0931735',\n",
" 'name': 'Coffee Shop',\n",
" 'pluralName': 'Coffee Shops',\n",
" 'shortName': 'Coffee Shop',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/coffeeshop_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-57655be738faa66160da7527-8'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4cf6ae55d3a8a1cd71a9d243',\n",
" 'name': 'Astral Fitness & Wellness Center',\n",
" 'location': {'address': '5500 Broadway',\n",
" 'crossStreet': '230th St',\n",
" 'lat': 40.87670526507199,\n",
" 'lng': -73.90637207670373,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87670526507199,\n",
" 'lng': -73.90637207670373},\n",
" {'label': 'entrance', 'lat': 40.87685, 'lng': -73.906058}],\n",
" 'distance': 361,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5500 Broadway (230th St)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d176941735',\n",
" 'name': 'Gym',\n",
" 'pluralName': 'Gyms',\n",
" 'shortName': 'Gym',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/building/gym_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []},\n",
" 'venuePage': {'id': '75803748'}},\n",
" 'referralId': 'e-0-4cf6ae55d3a8a1cd71a9d243-9'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '55f751ca498eacc0307d1cfe',\n",
" 'name': 'Blink Fitness',\n",
" 'location': {'address': '5520 Broadway',\n",
" 'crossStreet': 'at W 230th St',\n",
" 'lat': 40.877271495944626,\n",
" 'lng': -73.90559491338075,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.877271495944626,\n",
" 'lng': -73.90559491338075}],\n",
" 'distance': 433,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'neighborhood': 'Kingsbridge',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5520 Broadway (at W 230th St)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d176941735',\n",
" 'name': 'Gym',\n",
" 'pluralName': 'Gyms',\n",
" 'shortName': 'Gym',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/building/gym_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-55f751ca498eacc0307d1cfe-10'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '5631194e498e2de074de661c',\n",
" 'name': 'Vitamin Shoppe',\n",
" 'location': {'address': '5510 Broadway',\n",
" 'lat': 40.87716,\n",
" 'lng': -73.905632,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87716,\n",
" 'lng': -73.905632},\n",
" {'label': 'entrance', 'lat': 40.877165, 'lng': -73.905673}],\n",
" 'distance': 428,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5510 Broadway',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '5744ccdfe4b0c0459246b4cd',\n",
" 'name': 'Supplement Shop',\n",
" 'pluralName': 'Supplement Shops',\n",
" 'shortName': 'Supplement Shop',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/education/lab_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-5631194e498e2de074de661c-11'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4dfe40df8877333e195b68fc',\n",
" 'name': 'Parrilla Latina',\n",
" 'location': {'address': '230th St & Broadway',\n",
" 'lat': 40.87747294351472,\n",
" 'lng': -73.90607346968568,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87747294351472,\n",
" 'lng': -73.90607346968568}],\n",
" 'distance': 399,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['230th St & Broadway',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1cc941735',\n",
" 'name': 'Steakhouse',\n",
" 'pluralName': 'Steakhouses',\n",
" 'shortName': 'Steakhouse',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/steakhouse_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4dfe40df8877333e195b68fc-12'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '546d31ca498e561c698a0320',\n",
" 'name': 'T.J. Maxx',\n",
" 'location': {'lat': 40.87723198343352,\n",
" 'lng': -73.90504239962168,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87723198343352,\n",
" 'lng': -73.90504239962168}],\n",
" 'distance': 478,\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['Bronx, NY', 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1f6941735',\n",
" 'name': 'Department Store',\n",
" 'pluralName': 'Department Stores',\n",
" 'shortName': 'Department Store',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/departmentstore_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-546d31ca498e561c698a0320-13'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '585c205665e7c70a2f1055ea',\n",
" 'name': 'Boston Market',\n",
" 'location': {'address': '5520 Broadway',\n",
" 'lat': 40.87743,\n",
" 'lng': -73.9054121,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87743,\n",
" 'lng': -73.9054121}],\n",
" 'distance': 452,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5520 Broadway',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d14e941735',\n",
" 'name': 'American Restaurant',\n",
" 'pluralName': 'American Restaurants',\n",
" 'shortName': 'American',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/default_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-585c205665e7c70a2f1055ea-14'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b4f7b65f964a5205a0827e3',\n",
" 'name': 'Subway Sandwiches',\n",
" 'location': {'address': '5209 Broadway',\n",
" 'lat': 40.8746665302951,\n",
" 'lng': -73.9095858429637,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.8746665302951,\n",
" 'lng': -73.9095858429637}],\n",
" 'distance': 228,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5209 Broadway',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1c5941735',\n",
" 'name': 'Sandwich Place',\n",
" 'pluralName': 'Sandwich Places',\n",
" 'shortName': 'Sandwiches',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/deli_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b4f7b65f964a5205a0827e3-15'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4e4e4517bd4101d0d7a67568',\n",
" 'name': 'Baskin-Robbins',\n",
" 'location': {'address': '5501 Broadway',\n",
" 'lat': 40.87714929478882,\n",
" 'lng': -73.90665810372622,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87714929478882,\n",
" 'lng': -73.90665810372622},\n",
" {'label': 'entrance', 'lat': 40.877129, 'lng': -73.906608}],\n",
" 'distance': 343,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5501 Broadway',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1c9941735',\n",
" 'name': 'Ice Cream Shop',\n",
" 'pluralName': 'Ice Cream Shops',\n",
" 'shortName': 'Ice Cream',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/icecream_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4e4e4517bd4101d0d7a67568-16'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b9c9c43f964a520ac7236e3',\n",
" 'name': 'Lot Less Closeouts',\n",
" 'location': {'address': '5545 Broadway',\n",
" 'crossStreet': '231st St',\n",
" 'lat': 40.878270422202085,\n",
" 'lng': -73.9052646742604,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.878270422202085,\n",
" 'lng': -73.9052646742604},\n",
" {'label': 'entrance', 'lat': 40.87828, 'lng': -73.905466}],\n",
" 'distance': 492,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5545 Broadway (231st St)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '52dea92d3cf9994f4e043dbb',\n",
" 'name': 'Discount Store',\n",
" 'pluralName': 'Discount Stores',\n",
" 'shortName': 'Discount Store',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/discountstore_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b9c9c43f964a520ac7236e3-17'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b9f030af964a520eb0f37e3',\n",
" 'name': 'GameStop',\n",
" 'location': {'address': '90 W 225th St Ste A-B',\n",
" 'crossStreet': 'btw Broadway & Exterior St.',\n",
" 'lat': 40.874266802124836,\n",
" 'lng': -73.90934218062803,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.874266802124836,\n",
" 'lng': -73.90934218062803}],\n",
" 'distance': 277,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['90 W 225th St Ste A-B (btw Broadway & Exterior St.)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d10b951735',\n",
" 'name': 'Video Game Store',\n",
" 'pluralName': 'Video Game Stores',\n",
" 'shortName': 'Video Games',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/videogames_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b9f030af964a520eb0f37e3-18'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4ec68016cc21b428e1d2060a',\n",
" 'name': 'TD Bank',\n",
" 'location': {'address': '281 W 230th St',\n",
" 'lat': 40.8794958,\n",
" 'lng': -73.9092856,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.8794958,\n",
" 'lng': -73.9092856},\n",
" {'label': 'entrance', 'lat': 40.879414, 'lng': -73.909311}],\n",
" 'distance': 347,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['281 W 230th St',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d10a951735',\n",
" 'name': 'Bank',\n",
" 'pluralName': 'Banks',\n",
" 'shortName': 'Bank',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/financial_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4ec68016cc21b428e1d2060a-19'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4e4ce4debd413c4cc66d05d0',\n",
" 'name': 'Subway',\n",
" 'location': {'address': '5549 Broadway',\n",
" 'lat': 40.878464979323944,\n",
" 'lng': -73.9055176422437,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.878464979323944,\n",
" 'lng': -73.9055176422437},\n",
" {'label': 'entrance', 'lat': 40.878473, 'lng': -73.905329}],\n",
" 'distance': 482,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5549 Broadway',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1c5941735',\n",
" 'name': 'Sandwich Place',\n",
" 'pluralName': 'Sandwich Places',\n",
" 'shortName': 'Sandwiches',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/deli_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4e4ce4debd413c4cc66d05d0-20'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4c852173dc018cfa2bc3e56c',\n",
" 'name': \"The Children's Place\",\n",
" 'location': {'address': '44 W 225th St',\n",
" 'lat': 40.873671591133125,\n",
" 'lng': -73.90815619608166,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.873671591133125,\n",
" 'lng': -73.90815619608166}],\n",
" 'distance': 383,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['44 W 225th St',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d105951735',\n",
" 'name': 'Kids Store',\n",
" 'pluralName': 'Kids Stores',\n",
" 'shortName': 'Kids Store',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/apparel_kids_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4c852173dc018cfa2bc3e56c-21'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '56229ff8498e2abb44b6f12b',\n",
" 'name': 'Five Below',\n",
" 'location': {'address': '171 W 230th St',\n",
" 'lat': 40.8772564,\n",
" 'lng': -73.9049384,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.8772564,\n",
" 'lng': -73.9049384}],\n",
" 'distance': 487,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['171 W 230th St',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1ff941735',\n",
" 'name': 'Miscellaneous Shop',\n",
" 'pluralName': 'Miscellaneous Shops',\n",
" 'shortName': 'Shop',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/default_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-56229ff8498e2abb44b6f12b-22'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4d0a529133d6b60cf4cf9985',\n",
" 'name': 'Subway',\n",
" 'location': {'address': '5209 Broadway',\n",
" 'lat': 40.877720351115315,\n",
" 'lng': -73.90537973066263,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.877720351115315,\n",
" 'lng': -73.90537973066263}],\n",
" 'distance': 463,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5209 Broadway',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1c5941735',\n",
" 'name': 'Sandwich Place',\n",
" 'pluralName': 'Sandwich Places',\n",
" 'shortName': 'Sandwiches',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/deli_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4d0a529133d6b60cf4cf9985-23'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '53319bb511d2ef06787f02b4',\n",
" 'name': 'Broadway Plaza',\n",
" 'location': {'address': '171 W 231st St',\n",
" 'lat': 40.87753906779665,\n",
" 'lng': -73.90539578168178,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87753906779665,\n",
" 'lng': -73.90539578168178}],\n",
" 'distance': 456,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['171 W 231st St',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1fd941735',\n",
" 'name': 'Shopping Mall',\n",
" 'pluralName': 'Shopping Malls',\n",
" 'shortName': 'Mall',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/mall_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-53319bb511d2ef06787f02b4-24'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4ed7956b8b81b2bf28adc714',\n",
" 'name': 'Terrace View Delicatessen',\n",
" 'location': {'address': '135 Terrace View Ave.',\n",
" 'lat': 40.875995,\n",
" 'lng': -73.913151,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.875995,\n",
" 'lng': -73.913151},\n",
" {'label': 'entrance', 'lat': 40.875964, 'lng': -73.912985}],\n",
" 'distance': 218,\n",
" 'postalCode': '10034',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['135 Terrace View Ave.',\n",
" 'New York, NY 10034',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d146941735',\n",
" 'name': 'Deli / Bodega',\n",
" 'pluralName': 'Delis / Bodegas',\n",
" 'shortName': 'Deli / Bodega',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/deli_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4ed7956b8b81b2bf28adc714-25'}]}]}}"
]
},
"execution_count": 49,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"results = requests.get(url).json()\n",
"results"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"From the Foursquare lab in the previous module, we know that all the information is in the *items* key. Before we proceed, let's borrow the **get_category_type** function from the Foursquare lab."
]
},
{
"cell_type": "code",
"execution_count": 50,
"metadata": {},
"outputs": [],
"source": [
"# function that extracts the category of the venue\n",
"def get_category_type(row):\n",
" try:\n",
" categories_list = row['categories']\n",
" except:\n",
" categories_list = row['venue.categories']\n",
" \n",
" if len(categories_list) == 0:\n",
" return None\n",
" else:\n",
" return categories_list[0]['name']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we are ready to clean the json and structure it into a *pandas* dataframe."
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/jupyterlab/conda/envs/python/lib/python3.6/site-packages/ipykernel_launcher.py:3: FutureWarning: pandas.io.json.json_normalize is deprecated, use pandas.json_normalize instead\n",
" This is separate from the ipykernel package so we can avoid doing imports until\n"
]
},
{
"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>name</th>\n",
" <th>categories</th>\n",
" <th>lat</th>\n",
" <th>lng</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Arturo's</td>\n",
" <td>Pizza Place</td>\n",
" <td>40.874412</td>\n",
" <td>-73.910271</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Bikram Yoga</td>\n",
" <td>Yoga Studio</td>\n",
" <td>40.876844</td>\n",
" <td>-73.906204</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Tibbett Diner</td>\n",
" <td>Diner</td>\n",
" <td>40.880404</td>\n",
" <td>-73.908937</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Starbucks</td>\n",
" <td>Coffee Shop</td>\n",
" <td>40.877531</td>\n",
" <td>-73.905582</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Dunkin'</td>\n",
" <td>Donut Shop</td>\n",
" <td>40.877136</td>\n",
" <td>-73.906666</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" name categories lat lng\n",
"0 Arturo's Pizza Place 40.874412 -73.910271\n",
"1 Bikram Yoga Yoga Studio 40.876844 -73.906204\n",
"2 Tibbett Diner Diner 40.880404 -73.908937\n",
"3 Starbucks Coffee Shop 40.877531 -73.905582\n",
"4 Dunkin' Donut Shop 40.877136 -73.906666"
]
},
"execution_count": 51,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"venues = results['response']['groups'][0]['items']\n",
" \n",
"nearby_venues = json_normalize(venues) # flatten JSON\n",
"\n",
"# filter columns\n",
"filtered_columns = ['venue.name', 'venue.categories', 'venue.location.lat', 'venue.location.lng']\n",
"nearby_venues =nearby_venues.loc[:, filtered_columns]\n",
"\n",
"# filter the category for each row\n",
"nearby_venues['venue.categories'] = nearby_venues.apply(get_category_type, axis=1)\n",
"\n",
"# clean columns\n",
"nearby_venues.columns = [col.split(\".\")[-1] for col in nearby_venues.columns]\n",
"\n",
"nearby_venues.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And how many venues were returned by Foursquare?"
]
},
{
"cell_type": "code",
"execution_count": 52,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"26 venues were returned by Foursquare.\n"
]
}
],
"source": [
"print('{} venues were returned by Foursquare.'.format(nearby_venues.shape[0]))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a id='item2'></a>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 2. Explore Neighborhoods in Manhattan"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Let's create a function to repeat the same process to all the neighborhoods in Manhattan"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {},
"outputs": [],
"source": [
"def getNearbyVenues(names, latitudes, longitudes, radius=500,LIMIT=100):\n",
" \n",
" venues_list=[]\n",
" for name, lat, lng in zip(names, latitudes, longitudes):\n",
" print(name)\n",
" \n",
" # create the API request URL\n",
" url = 'https://api.foursquare.com/v2/venues/explore?&client_id={}&client_secret={}&v={}&ll={},{}&radius={}&limit={}'.format(\n",
" CLIENT_ID, \n",
" CLIENT_SECRET, \n",
" VERSION, \n",
" lat, \n",
" lng, \n",
" radius, \n",
" LIMIT)\n",
" \n",
" # make the GET request\n",
" results = requests.get(url).json()[\"response\"]['groups'][0]['items']\n",
" \n",
" # return only relevant information for each nearby venue\n",
" venues_list.append([(\n",
" name, \n",
" lat, \n",
" lng, \n",
" v['venue']['name'], \n",
" v['venue']['location']['lat'], \n",
" v['venue']['location']['lng'], \n",
" v['venue']['categories'][0]['name']) for v in results])\n",
"\n",
" nearby_venues = pd.DataFrame([item for venue_list in venues_list for item in venue_list])\n",
" nearby_venues.columns = ['Neighborhood', \n",
" 'Neighborhood Latitude', \n",
" 'Neighborhood Longitude', \n",
" 'Venue', \n",
" 'Venue Latitude', \n",
" 'Venue Longitude', \n",
" 'Venue Category']\n",
" \n",
" return(nearby_venues)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Now write the code to run the above function on each neighborhood and create a new dataframe called *manhattan_venues*."
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
},
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Marble Hill\n",
"Chinatown\n",
"Washington Heights\n",
"Inwood\n",
"Hamilton Heights\n",
"Manhattanville\n",
"Central Harlem\n",
"East Harlem\n",
"Upper East Side\n",
"Yorkville\n",
"Lenox Hill\n",
"Roosevelt Island\n",
"Upper West Side\n",
"Lincoln Square\n",
"Clinton\n",
"Midtown\n",
"Murray Hill\n",
"Chelsea\n",
"Greenwich Village\n",
"East Village\n",
"Lower East Side\n",
"Tribeca\n",
"Little Italy\n",
"Soho\n",
"West Village\n",
"Manhattan Valley\n",
"Morningside Heights\n",
"Gramercy\n",
"Battery Park City\n",
"Financial District\n",
"Carnegie Hill\n",
"Noho\n",
"Civic Center\n",
"Midtown South\n",
"Sutton Place\n",
"Turtle Bay\n",
"Tudor City\n",
"Stuyvesant Town\n",
"Flatiron\n",
"Hudson Yards\n"
]
}
],
"source": [
"# type your answer here\n",
"\n",
"manhattan_venues = getNearbyVenues(names=manhattan_data['Neighborhood'],\n",
" latitudes=manhattan_data['Latitude'],\n",
" longitudes=manhattan_data['Longitude']\n",
" )\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Double-click __here__ for the solution.\n",
"<!-- The correct answer is:\n",
"manhattan_venues = getNearbyVenues(names=manhattan_data['Neighborhood'],\n",
" latitudes=manhattan_data['Latitude'],\n",
" longitudes=manhattan_data['Longitude']\n",
" )\n",
"--> "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Let's check the size of the resulting dataframe"
]
},
{
"cell_type": "code",
"execution_count": 57,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(3005, 7)\n"
]
},
{
"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>Neighborhood</th>\n",
" <th>Neighborhood Latitude</th>\n",
" <th>Neighborhood Longitude</th>\n",
" <th>Venue</th>\n",
" <th>Venue Latitude</th>\n",
" <th>Venue Longitude</th>\n",
" <th>Venue Category</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Marble Hill</td>\n",
" <td>40.876551</td>\n",
" <td>-73.91066</td>\n",
" <td>Arturo's</td>\n",
" <td>40.874412</td>\n",
" <td>-73.910271</td>\n",
" <td>Pizza Place</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Marble Hill</td>\n",
" <td>40.876551</td>\n",
" <td>-73.91066</td>\n",
" <td>Bikram Yoga</td>\n",
" <td>40.876844</td>\n",
" <td>-73.906204</td>\n",
" <td>Yoga Studio</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Marble Hill</td>\n",
" <td>40.876551</td>\n",
" <td>-73.91066</td>\n",
" <td>Tibbett Diner</td>\n",
" <td>40.880404</td>\n",
" <td>-73.908937</td>\n",
" <td>Diner</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Marble Hill</td>\n",
" <td>40.876551</td>\n",
" <td>-73.91066</td>\n",
" <td>Starbucks</td>\n",
" <td>40.877531</td>\n",
" <td>-73.905582</td>\n",
" <td>Coffee Shop</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Marble Hill</td>\n",
" <td>40.876551</td>\n",
" <td>-73.91066</td>\n",
" <td>Dunkin'</td>\n",
" <td>40.877136</td>\n",
" <td>-73.906666</td>\n",
" <td>Donut Shop</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Neighborhood Neighborhood Latitude Neighborhood Longitude Venue \\\n",
"0 Marble Hill 40.876551 -73.91066 Arturo's \n",
"1 Marble Hill 40.876551 -73.91066 Bikram Yoga \n",
"2 Marble Hill 40.876551 -73.91066 Tibbett Diner \n",
"3 Marble Hill 40.876551 -73.91066 Starbucks \n",
"4 Marble Hill 40.876551 -73.91066 Dunkin' \n",
"\n",
" Venue Latitude Venue Longitude Venue Category \n",
"0 40.874412 -73.910271 Pizza Place \n",
"1 40.876844 -73.906204 Yoga Studio \n",
"2 40.880404 -73.908937 Diner \n",
"3 40.877531 -73.905582 Coffee Shop \n",
"4 40.877136 -73.906666 Donut Shop "
]
},
"execution_count": 57,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"print(manhattan_venues.shape)\n",
"manhattan_venues.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's check how many venues were returned for each neighborhood"
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"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>Neighborhood Latitude</th>\n",
" <th>Neighborhood Longitude</th>\n",
" <th>Venue</th>\n",
" <th>Venue Latitude</th>\n",
" <th>Venue Longitude</th>\n",
" <th>Venue Category</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Neighborhood</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Battery Park City</th>\n",
" <td>59</td>\n",
" <td>59</td>\n",
" <td>59</td>\n",
" <td>59</td>\n",
" <td>59</td>\n",
" <td>59</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Carnegie Hill</th>\n",
" <td>86</td>\n",
" <td>86</td>\n",
" <td>86</td>\n",
" <td>86</td>\n",
" <td>86</td>\n",
" <td>86</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Central Harlem</th>\n",
" <td>45</td>\n",
" <td>45</td>\n",
" <td>45</td>\n",
" <td>45</td>\n",
" <td>45</td>\n",
" <td>45</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Chelsea</th>\n",
" <td>98</td>\n",
" <td>98</td>\n",
" <td>98</td>\n",
" <td>98</td>\n",
" <td>98</td>\n",
" <td>98</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Chinatown</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Civic Center</th>\n",
" <td>87</td>\n",
" <td>87</td>\n",
" <td>87</td>\n",
" <td>87</td>\n",
" <td>87</td>\n",
" <td>87</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Clinton</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>East Harlem</th>\n",
" <td>42</td>\n",
" <td>42</td>\n",
" <td>42</td>\n",
" <td>42</td>\n",
" <td>42</td>\n",
" <td>42</td>\n",
" </tr>\n",
" <tr>\n",
" <th>East Village</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Financial District</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Flatiron</th>\n",
" <td>96</td>\n",
" <td>96</td>\n",
" <td>96</td>\n",
" <td>96</td>\n",
" <td>96</td>\n",
" <td>96</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Gramercy</th>\n",
" <td>72</td>\n",
" <td>72</td>\n",
" <td>72</td>\n",
" <td>72</td>\n",
" <td>72</td>\n",
" <td>72</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Greenwich Village</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Hamilton Heights</th>\n",
" <td>61</td>\n",
" <td>61</td>\n",
" <td>61</td>\n",
" <td>61</td>\n",
" <td>61</td>\n",
" <td>61</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Hudson Yards</th>\n",
" <td>52</td>\n",
" <td>52</td>\n",
" <td>52</td>\n",
" <td>52</td>\n",
" <td>52</td>\n",
" <td>52</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Inwood</th>\n",
" <td>57</td>\n",
" <td>57</td>\n",
" <td>57</td>\n",
" <td>57</td>\n",
" <td>57</td>\n",
" <td>57</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Lenox Hill</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Lincoln Square</th>\n",
" <td>93</td>\n",
" <td>93</td>\n",
" <td>93</td>\n",
" <td>93</td>\n",
" <td>93</td>\n",
" <td>93</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Little Italy</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Lower East Side</th>\n",
" <td>42</td>\n",
" <td>42</td>\n",
" <td>42</td>\n",
" <td>42</td>\n",
" <td>42</td>\n",
" <td>42</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Manhattan Valley</th>\n",
" <td>42</td>\n",
" <td>42</td>\n",
" <td>42</td>\n",
" <td>42</td>\n",
" <td>42</td>\n",
" <td>42</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Manhattanville</th>\n",
" <td>43</td>\n",
" <td>43</td>\n",
" <td>43</td>\n",
" <td>43</td>\n",
" <td>43</td>\n",
" <td>43</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Marble Hill</th>\n",
" <td>26</td>\n",
" <td>26</td>\n",
" <td>26</td>\n",
" <td>26</td>\n",
" <td>26</td>\n",
" <td>26</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Midtown</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Midtown South</th>\n",
" <td>95</td>\n",
" <td>95</td>\n",
" <td>95</td>\n",
" <td>95</td>\n",
" <td>95</td>\n",
" <td>95</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Morningside Heights</th>\n",
" <td>39</td>\n",
" <td>39</td>\n",
" <td>39</td>\n",
" <td>39</td>\n",
" <td>39</td>\n",
" <td>39</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Murray Hill</th>\n",
" <td>75</td>\n",
" <td>75</td>\n",
" <td>75</td>\n",
" <td>75</td>\n",
" <td>75</td>\n",
" <td>75</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Noho</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Roosevelt Island</th>\n",
" <td>26</td>\n",
" <td>26</td>\n",
" <td>26</td>\n",
" <td>26</td>\n",
" <td>26</td>\n",
" <td>26</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Soho</th>\n",
" <td>69</td>\n",
" <td>69</td>\n",
" <td>69</td>\n",
" <td>69</td>\n",
" <td>69</td>\n",
" <td>69</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Stuyvesant Town</th>\n",
" <td>18</td>\n",
" <td>18</td>\n",
" <td>18</td>\n",
" <td>18</td>\n",
" <td>18</td>\n",
" <td>18</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Sutton Place</th>\n",
" <td>95</td>\n",
" <td>95</td>\n",
" <td>95</td>\n",
" <td>95</td>\n",
" <td>95</td>\n",
" <td>95</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Tribeca</th>\n",
" <td>69</td>\n",
" <td>69</td>\n",
" <td>69</td>\n",
" <td>69</td>\n",
" <td>69</td>\n",
" <td>69</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Tudor City</th>\n",
" <td>72</td>\n",
" <td>72</td>\n",
" <td>72</td>\n",
" <td>72</td>\n",
" <td>72</td>\n",
" <td>72</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Turtle Bay</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Upper East Side</th>\n",
" <td>85</td>\n",
" <td>85</td>\n",
" <td>85</td>\n",
" <td>85</td>\n",
" <td>85</td>\n",
" <td>85</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Upper West Side</th>\n",
" <td>71</td>\n",
" <td>71</td>\n",
" <td>71</td>\n",
" <td>71</td>\n",
" <td>71</td>\n",
" <td>71</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Washington Heights</th>\n",
" <td>90</td>\n",
" <td>90</td>\n",
" <td>90</td>\n",
" <td>90</td>\n",
" <td>90</td>\n",
" <td>90</td>\n",
" </tr>\n",
" <tr>\n",
" <th>West Village</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Yorkville</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Neighborhood Latitude Neighborhood Longitude Venue \\\n",
"Neighborhood \n",
"Battery Park City 59 59 59 \n",
"Carnegie Hill 86 86 86 \n",
"Central Harlem 45 45 45 \n",
"Chelsea 98 98 98 \n",
"Chinatown 100 100 100 \n",
"Civic Center 87 87 87 \n",
"Clinton 100 100 100 \n",
"East Harlem 42 42 42 \n",
"East Village 100 100 100 \n",
"Financial District 100 100 100 \n",
"Flatiron 96 96 96 \n",
"Gramercy 72 72 72 \n",
"Greenwich Village 100 100 100 \n",
"Hamilton Heights 61 61 61 \n",
"Hudson Yards 52 52 52 \n",
"Inwood 57 57 57 \n",
"Lenox Hill 100 100 100 \n",
"Lincoln Square 93 93 93 \n",
"Little Italy 100 100 100 \n",
"Lower East Side 42 42 42 \n",
"Manhattan Valley 42 42 42 \n",
"Manhattanville 43 43 43 \n",
"Marble Hill 26 26 26 \n",
"Midtown 100 100 100 \n",
"Midtown South 95 95 95 \n",
"Morningside Heights 39 39 39 \n",
"Murray Hill 75 75 75 \n",
"Noho 100 100 100 \n",
"Roosevelt Island 26 26 26 \n",
"Soho 69 69 69 \n",
"Stuyvesant Town 18 18 18 \n",
"Sutton Place 95 95 95 \n",
"Tribeca 69 69 69 \n",
"Tudor City 72 72 72 \n",
"Turtle Bay 100 100 100 \n",
"Upper East Side 85 85 85 \n",
"Upper West Side 71 71 71 \n",
"Washington Heights 90 90 90 \n",
"West Village 100 100 100 \n",
"Yorkville 100 100 100 \n",
"\n",
" Venue Latitude Venue Longitude Venue Category \n",
"Neighborhood \n",
"Battery Park City 59 59 59 \n",
"Carnegie Hill 86 86 86 \n",
"Central Harlem 45 45 45 \n",
"Chelsea 98 98 98 \n",
"Chinatown 100 100 100 \n",
"Civic Center 87 87 87 \n",
"Clinton 100 100 100 \n",
"East Harlem 42 42 42 \n",
"East Village 100 100 100 \n",
"Financial District 100 100 100 \n",
"Flatiron 96 96 96 \n",
"Gramercy 72 72 72 \n",
"Greenwich Village 100 100 100 \n",
"Hamilton Heights 61 61 61 \n",
"Hudson Yards 52 52 52 \n",
"Inwood 57 57 57 \n",
"Lenox Hill 100 100 100 \n",
"Lincoln Square 93 93 93 \n",
"Little Italy 100 100 100 \n",
"Lower East Side 42 42 42 \n",
"Manhattan Valley 42 42 42 \n",
"Manhattanville 43 43 43 \n",
"Marble Hill 26 26 26 \n",
"Midtown 100 100 100 \n",
"Midtown South 95 95 95 \n",
"Morningside Heights 39 39 39 \n",
"Murray Hill 75 75 75 \n",
"Noho 100 100 100 \n",
"Roosevelt Island 26 26 26 \n",
"Soho 69 69 69 \n",
"Stuyvesant Town 18 18 18 \n",
"Sutton Place 95 95 95 \n",
"Tribeca 69 69 69 \n",
"Tudor City 72 72 72 \n",
"Turtle Bay 100 100 100 \n",
"Upper East Side 85 85 85 \n",
"Upper West Side 71 71 71 \n",
"Washington Heights 90 90 90 \n",
"West Village 100 100 100 \n",
"Yorkville 100 100 100 "
]
},
"execution_count": 58,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"manhattan_venues.groupby('Neighborhood').count()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Let's find out how many unique categories can be curated from all the returned venues"
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"There are 329 uniques categories.\n"
]
}
],
"source": [
"print('There are {} uniques categories.'.format(len(manhattan_venues['Venue Category'].unique())))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a id='item3'></a>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 3. Analyze Each Neighborhood"
]
},
{
"cell_type": "code",
"execution_count": 60,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"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>Neighborhood</th>\n",
" <th>Accessories Store</th>\n",
" <th>Adult Boutique</th>\n",
" <th>Afghan Restaurant</th>\n",
" <th>African Restaurant</th>\n",
" <th>American Restaurant</th>\n",
" <th>Antique Shop</th>\n",
" <th>Arcade</th>\n",
" <th>Arepa Restaurant</th>\n",
" <th>Argentinian Restaurant</th>\n",
" <th>Art Gallery</th>\n",
" <th>Art Museum</th>\n",
" <th>Arts &amp; Crafts Store</th>\n",
" <th>Asian Restaurant</th>\n",
" <th>Athletics &amp; Sports</th>\n",
" <th>Auditorium</th>\n",
" <th>Australian Restaurant</th>\n",
" <th>Austrian Restaurant</th>\n",
" <th>BBQ Joint</th>\n",
" <th>Baby Store</th>\n",
" <th>Bagel Shop</th>\n",
" <th>Bakery</th>\n",
" <th>Bank</th>\n",
" <th>Bar</th>\n",
" <th>Baseball Field</th>\n",
" <th>Basketball Court</th>\n",
" <th>Basketball Stadium</th>\n",
" <th>Beer Bar</th>\n",
" <th>Beer Garden</th>\n",
" <th>Beer Store</th>\n",
" <th>Bike Rental / Bike Share</th>\n",
" <th>Bike Shop</th>\n",
" <th>Bike Trail</th>\n",
" <th>Bistro</th>\n",
" <th>Board Shop</th>\n",
" <th>Boat or Ferry</th>\n",
" <th>Bookstore</th>\n",
" <th>Boutique</th>\n",
" <th>Boxing Gym</th>\n",
" <th>Brazilian Restaurant</th>\n",
" <th>Breakfast Spot</th>\n",
" <th>Bridal Shop</th>\n",
" <th>Bridge</th>\n",
" <th>Bubble Tea Shop</th>\n",
" <th>Building</th>\n",
" <th>Burger Joint</th>\n",
" <th>Burrito Place</th>\n",
" <th>Bus Line</th>\n",
" <th>Bus Station</th>\n",
" <th>Butcher</th>\n",
" <th>Cafeteria</th>\n",
" <th>Café</th>\n",
" <th>Cajun / Creole Restaurant</th>\n",
" <th>Cambodian Restaurant</th>\n",
" <th>Camera Store</th>\n",
" <th>Candy Store</th>\n",
" <th>Cantonese Restaurant</th>\n",
" <th>Caribbean Restaurant</th>\n",
" <th>Caucasian Restaurant</th>\n",
" <th>Check Cashing Service</th>\n",
" <th>Cheese Shop</th>\n",
" <th>Chinese Restaurant</th>\n",
" <th>Chocolate Shop</th>\n",
" <th>Circus</th>\n",
" <th>Climbing Gym</th>\n",
" <th>Clothing Store</th>\n",
" <th>Club House</th>\n",
" <th>Cocktail Bar</th>\n",
" <th>Coffee Shop</th>\n",
" <th>College Academic Building</th>\n",
" <th>College Arts Building</th>\n",
" <th>College Bookstore</th>\n",
" <th>College Cafeteria</th>\n",
" <th>Comedy Club</th>\n",
" <th>Community Center</th>\n",
" <th>Concert Hall</th>\n",
" <th>Convenience Store</th>\n",
" <th>Cooking School</th>\n",
" <th>Cosmetics Shop</th>\n",
" <th>Coworking Space</th>\n",
" <th>Creperie</th>\n",
" <th>Cuban Restaurant</th>\n",
" <th>Cupcake Shop</th>\n",
" <th>Cycle Studio</th>\n",
" <th>Czech Restaurant</th>\n",
" <th>Dance Studio</th>\n",
" <th>Daycare</th>\n",
" <th>Deli / Bodega</th>\n",
" <th>Department Store</th>\n",
" <th>Dessert Shop</th>\n",
" <th>Dim Sum Restaurant</th>\n",
" <th>Diner</th>\n",
" <th>Discount Store</th>\n",
" <th>Doctor's Office</th>\n",
" <th>Dog Run</th>\n",
" <th>Donut Shop</th>\n",
" <th>Drugstore</th>\n",
" <th>Dry Cleaner</th>\n",
" <th>Dumpling Restaurant</th>\n",
" <th>Duty-free Shop</th>\n",
" <th>Eastern European Restaurant</th>\n",
" <th>Electronics Store</th>\n",
" <th>Empanada Restaurant</th>\n",
" <th>English Restaurant</th>\n",
" <th>Ethiopian Restaurant</th>\n",
" <th>Event Space</th>\n",
" <th>Exhibit</th>\n",
" <th>Falafel Restaurant</th>\n",
" <th>Farmers Market</th>\n",
" <th>Fast Food Restaurant</th>\n",
" <th>Filipino Restaurant</th>\n",
" <th>Financial or Legal Service</th>\n",
" <th>Fish Market</th>\n",
" <th>Flea Market</th>\n",
" <th>Flower Shop</th>\n",
" <th>Food</th>\n",
" <th>Food &amp; Drink Shop</th>\n",
" <th>Food Court</th>\n",
" <th>Food Stand</th>\n",
" <th>Food Truck</th>\n",
" <th>Fountain</th>\n",
" <th>French Restaurant</th>\n",
" <th>Fried Chicken Joint</th>\n",
" <th>Frozen Yogurt Shop</th>\n",
" <th>Furniture / Home Store</th>\n",
" <th>Gaming Cafe</th>\n",
" <th>Garden</th>\n",
" <th>Garden Center</th>\n",
" <th>Gas Station</th>\n",
" <th>Gastropub</th>\n",
" <th>Gay Bar</th>\n",
" <th>General Entertainment</th>\n",
" <th>German Restaurant</th>\n",
" <th>Gift Shop</th>\n",
" <th>Golf Course</th>\n",
" <th>Gourmet Shop</th>\n",
" <th>Greek Restaurant</th>\n",
" <th>Grocery Store</th>\n",
" <th>Gym</th>\n",
" <th>Gym / Fitness Center</th>\n",
" <th>Gym Pool</th>\n",
" <th>Gymnastics Gym</th>\n",
" <th>Harbor / Marina</th>\n",
" <th>Hardware Store</th>\n",
" <th>Hawaiian Restaurant</th>\n",
" <th>Health &amp; Beauty Service</th>\n",
" <th>Health Food Store</th>\n",
" <th>Heliport</th>\n",
" <th>High School</th>\n",
" <th>Historic Site</th>\n",
" <th>History Museum</th>\n",
" <th>Hobby Shop</th>\n",
" <th>Hookah Bar</th>\n",
" <th>Hostel</th>\n",
" <th>Hot Dog Joint</th>\n",
" <th>Hotel</th>\n",
" <th>Hotel Bar</th>\n",
" <th>Hotpot Restaurant</th>\n",
" <th>Ice Cream Shop</th>\n",
" <th>Indian Restaurant</th>\n",
" <th>Indie Movie Theater</th>\n",
" <th>Indie Theater</th>\n",
" <th>Intersection</th>\n",
" <th>Irish Pub</th>\n",
" <th>Israeli Restaurant</th>\n",
" <th>Italian Restaurant</th>\n",
" <th>Japanese Curry Restaurant</th>\n",
" <th>Japanese Restaurant</th>\n",
" <th>Jazz Club</th>\n",
" <th>Jewelry Store</th>\n",
" <th>Jewish Restaurant</th>\n",
" <th>Juice Bar</th>\n",
" <th>Karaoke Bar</th>\n",
" <th>Kids Store</th>\n",
" <th>Kitchen Supply Store</th>\n",
" <th>Korean Restaurant</th>\n",
" <th>Kosher Restaurant</th>\n",
" <th>Latin American Restaurant</th>\n",
" <th>Laundry Service</th>\n",
" <th>Lebanese Restaurant</th>\n",
" <th>Library</th>\n",
" <th>Lingerie Store</th>\n",
" <th>Liquor Store</th>\n",
" <th>Lounge</th>\n",
" <th>Mac &amp; Cheese Joint</th>\n",
" <th>Malay Restaurant</th>\n",
" <th>Market</th>\n",
" <th>Martial Arts Dojo</th>\n",
" <th>Massage Studio</th>\n",
" <th>Mattress Store</th>\n",
" <th>Mediterranean Restaurant</th>\n",
" <th>Memorial Site</th>\n",
" <th>Men's Store</th>\n",
" <th>Metro Station</th>\n",
" <th>Mexican Restaurant</th>\n",
" <th>Middle Eastern Restaurant</th>\n",
" <th>Mini Golf</th>\n",
" <th>Miscellaneous Shop</th>\n",
" <th>Mobile Phone Shop</th>\n",
" <th>Modern European Restaurant</th>\n",
" <th>Molecular Gastronomy Restaurant</th>\n",
" <th>Monument / Landmark</th>\n",
" <th>Moroccan Restaurant</th>\n",
" <th>Movie Theater</th>\n",
" <th>Moving Target</th>\n",
" <th>Museum</th>\n",
" <th>Music School</th>\n",
" <th>Music Venue</th>\n",
" <th>Nail Salon</th>\n",
" <th>New American Restaurant</th>\n",
" <th>Newsstand</th>\n",
" <th>Nightclub</th>\n",
" <th>Non-Profit</th>\n",
" <th>Noodle House</th>\n",
" <th>North Indian Restaurant</th>\n",
" <th>Office</th>\n",
" <th>Opera House</th>\n",
" <th>Optical Shop</th>\n",
" <th>Organic Grocery</th>\n",
" <th>Other Great Outdoors</th>\n",
" <th>Outdoor Sculpture</th>\n",
" <th>Outdoor Supply Store</th>\n",
" <th>Outdoors &amp; Recreation</th>\n",
" <th>Paper / Office Supplies Store</th>\n",
" <th>Park</th>\n",
" <th>Pedestrian Plaza</th>\n",
" <th>Performing Arts Venue</th>\n",
" <th>Persian Restaurant</th>\n",
" <th>Peruvian Restaurant</th>\n",
" <th>Pet Café</th>\n",
" <th>Pet Service</th>\n",
" <th>Pet Store</th>\n",
" <th>Pharmacy</th>\n",
" <th>Photography Studio</th>\n",
" <th>Physical Therapist</th>\n",
" <th>Pie Shop</th>\n",
" <th>Pier</th>\n",
" <th>Pilates Studio</th>\n",
" <th>Pizza Place</th>\n",
" <th>Playground</th>\n",
" <th>Plaza</th>\n",
" <th>Poke Place</th>\n",
" <th>Pool</th>\n",
" <th>Pub</th>\n",
" <th>Public Art</th>\n",
" <th>Ramen Restaurant</th>\n",
" <th>Record Shop</th>\n",
" <th>Rental Car Location</th>\n",
" <th>Residential Building (Apartment / Condo)</th>\n",
" <th>Resort</th>\n",
" <th>Rest Area</th>\n",
" <th>Restaurant</th>\n",
" <th>River</th>\n",
" <th>Rock Club</th>\n",
" <th>Roof Deck</th>\n",
" <th>Russian Restaurant</th>\n",
" <th>Sake Bar</th>\n",
" <th>Salad Place</th>\n",
" <th>Salon / Barbershop</th>\n",
" <th>Sandwich Place</th>\n",
" <th>Scandinavian Restaurant</th>\n",
" <th>Scenic Lookout</th>\n",
" <th>School</th>\n",
" <th>Sculpture Garden</th>\n",
" <th>Seafood Restaurant</th>\n",
" <th>Shanghai Restaurant</th>\n",
" <th>Shipping Store</th>\n",
" <th>Shoe Store</th>\n",
" <th>Shopping Mall</th>\n",
" <th>Skate Park</th>\n",
" <th>Smoke Shop</th>\n",
" <th>Snack Place</th>\n",
" <th>Soba Restaurant</th>\n",
" <th>Soccer Field</th>\n",
" <th>Soup Place</th>\n",
" <th>South American Restaurant</th>\n",
" <th>South Indian Restaurant</th>\n",
" <th>Southern / Soul Food Restaurant</th>\n",
" <th>Spa</th>\n",
" <th>Spanish Restaurant</th>\n",
" <th>Speakeasy</th>\n",
" <th>Spiritual Center</th>\n",
" <th>Sporting Goods Shop</th>\n",
" <th>Sports Bar</th>\n",
" <th>Sports Club</th>\n",
" <th>Sri Lankan Restaurant</th>\n",
" <th>Steakhouse</th>\n",
" <th>Street Art</th>\n",
" <th>Strip Club</th>\n",
" <th>Supermarket</th>\n",
" <th>Supplement Shop</th>\n",
" <th>Sushi Restaurant</th>\n",
" <th>Swiss Restaurant</th>\n",
" <th>Szechuan Restaurant</th>\n",
" <th>Taco Place</th>\n",
" <th>Tailor Shop</th>\n",
" <th>Taiwanese Restaurant</th>\n",
" <th>Tapas Restaurant</th>\n",
" <th>Tattoo Parlor</th>\n",
" <th>Tea Room</th>\n",
" <th>Tech Startup</th>\n",
" <th>Temple</th>\n",
" <th>Tennis Court</th>\n",
" <th>Tennis Stadium</th>\n",
" <th>Thai Restaurant</th>\n",
" <th>Theater</th>\n",
" <th>Theme Park Ride / Attraction</th>\n",
" <th>Thrift / Vintage Store</th>\n",
" <th>Tiki Bar</th>\n",
" <th>Tourist Information Center</th>\n",
" <th>Toy / Game Store</th>\n",
" <th>Track</th>\n",
" <th>Trail</th>\n",
" <th>Train Station</th>\n",
" <th>Turkish Restaurant</th>\n",
" <th>Udon Restaurant</th>\n",
" <th>Used Bookstore</th>\n",
" <th>Vegetarian / Vegan Restaurant</th>\n",
" <th>Veterinarian</th>\n",
" <th>Video Game Store</th>\n",
" <th>Video Store</th>\n",
" <th>Vietnamese Restaurant</th>\n",
" <th>Volleyball Court</th>\n",
" <th>Waterfront</th>\n",
" <th>Whisky Bar</th>\n",
" <th>Wine Bar</th>\n",
" <th>Wine Shop</th>\n",
" <th>Wings Joint</th>\n",
" <th>Women's Store</th>\n",
" <th>Yoga Studio</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Marble Hill</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Marble Hill</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Marble Hill</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Marble Hill</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Marble Hill</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Neighborhood Accessories Store Adult Boutique Afghan Restaurant \\\n",
"0 Marble Hill 0 0 0 \n",
"1 Marble Hill 0 0 0 \n",
"2 Marble Hill 0 0 0 \n",
"3 Marble Hill 0 0 0 \n",
"4 Marble Hill 0 0 0 \n",
"\n",
" African Restaurant American Restaurant Antique Shop Arcade \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Arepa Restaurant Argentinian Restaurant Art Gallery Art Museum \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Arts & Crafts Store Asian Restaurant Athletics & Sports Auditorium \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Australian Restaurant Austrian Restaurant BBQ Joint Baby Store \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Bagel Shop Bakery Bank Bar Baseball Field Basketball Court \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" Basketball Stadium Beer Bar Beer Garden Beer Store \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Bike Rental / Bike Share Bike Shop Bike Trail Bistro Board Shop \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Boat or Ferry Bookstore Boutique Boxing Gym Brazilian Restaurant \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Breakfast Spot Bridal Shop Bridge Bubble Tea Shop Building \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Burger Joint Burrito Place Bus Line Bus Station Butcher Cafeteria \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" Café Cajun / Creole Restaurant Cambodian Restaurant Camera Store \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Candy Store Cantonese Restaurant Caribbean Restaurant \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Caucasian Restaurant Check Cashing Service Cheese Shop \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Chinese Restaurant Chocolate Shop Circus Climbing Gym Clothing Store \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Club House Cocktail Bar Coffee Shop College Academic Building \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 1 0 \n",
"4 0 0 0 0 \n",
"\n",
" College Arts Building College Bookstore College Cafeteria Comedy Club \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Community Center Concert Hall Convenience Store Cooking School \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Cosmetics Shop Coworking Space Creperie Cuban Restaurant Cupcake Shop \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Cycle Studio Czech Restaurant Dance Studio Daycare Deli / Bodega \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Department Store Dessert Shop Dim Sum Restaurant Diner Discount Store \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 1 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Doctor's Office Dog Run Donut Shop Drugstore Dry Cleaner \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 1 0 0 \n",
"\n",
" Dumpling Restaurant Duty-free Shop Eastern European Restaurant \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Electronics Store Empanada Restaurant English Restaurant \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Ethiopian Restaurant Event Space Exhibit Falafel Restaurant \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Farmers Market Fast Food Restaurant Filipino Restaurant \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Financial or Legal Service Fish Market Flea Market Flower Shop Food \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Food & Drink Shop Food Court Food Stand Food Truck Fountain \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" French Restaurant Fried Chicken Joint Frozen Yogurt Shop \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Furniture / Home Store Gaming Cafe Garden Garden Center Gas Station \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Gastropub Gay Bar General Entertainment German Restaurant Gift Shop \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Golf Course Gourmet Shop Greek Restaurant Grocery Store Gym \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Gym / Fitness Center Gym Pool Gymnastics Gym Harbor / Marina \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Hardware Store Hawaiian Restaurant Health & Beauty Service \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Health Food Store Heliport High School Historic Site History Museum \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Hobby Shop Hookah Bar Hostel Hot Dog Joint Hotel Hotel Bar \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" Hotpot Restaurant Ice Cream Shop Indian Restaurant Indie Movie Theater \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Indie Theater Intersection Irish Pub Israeli Restaurant \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Italian Restaurant Japanese Curry Restaurant Japanese Restaurant \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Jazz Club Jewelry Store Jewish Restaurant Juice Bar Karaoke Bar \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Kids Store Kitchen Supply Store Korean Restaurant Kosher Restaurant \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Latin American Restaurant Laundry Service Lebanese Restaurant Library \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Lingerie Store Liquor Store Lounge Mac & Cheese Joint Malay Restaurant \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Market Martial Arts Dojo Massage Studio Mattress Store \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Mediterranean Restaurant Memorial Site Men's Store Metro Station \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Mexican Restaurant Middle Eastern Restaurant Mini Golf \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Miscellaneous Shop Mobile Phone Shop Modern European Restaurant \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Molecular Gastronomy Restaurant Monument / Landmark Moroccan Restaurant \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Movie Theater Moving Target Museum Music School Music Venue \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Nail Salon New American Restaurant Newsstand Nightclub Non-Profit \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Noodle House North Indian Restaurant Office Opera House Optical Shop \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Organic Grocery Other Great Outdoors Outdoor Sculpture \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Outdoor Supply Store Outdoors & Recreation Paper / Office Supplies Store \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Park Pedestrian Plaza Performing Arts Venue Persian Restaurant \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Peruvian Restaurant Pet Café Pet Service Pet Store Pharmacy \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Photography Studio Physical Therapist Pie Shop Pier Pilates Studio \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Pizza Place Playground Plaza Poke Place Pool Pub Public Art \\\n",
"0 1 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 0 \n",
"\n",
" Ramen Restaurant Record Shop Rental Car Location \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Residential Building (Apartment / Condo) Resort Rest Area Restaurant \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" River Rock Club Roof Deck Russian Restaurant Sake Bar Salad Place \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" Salon / Barbershop Sandwich Place Scandinavian Restaurant \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Scenic Lookout School Sculpture Garden Seafood Restaurant \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Shanghai Restaurant Shipping Store Shoe Store Shopping Mall Skate Park \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Smoke Shop Snack Place Soba Restaurant Soccer Field Soup Place \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" South American Restaurant South Indian Restaurant \\\n",
"0 0 0 \n",
"1 0 0 \n",
"2 0 0 \n",
"3 0 0 \n",
"4 0 0 \n",
"\n",
" Southern / Soul Food Restaurant Spa Spanish Restaurant Speakeasy \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Spiritual Center Sporting Goods Shop Sports Bar Sports Club \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Sri Lankan Restaurant Steakhouse Street Art Strip Club Supermarket \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Supplement Shop Sushi Restaurant Swiss Restaurant Szechuan Restaurant \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Taco Place Tailor Shop Taiwanese Restaurant Tapas Restaurant \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Tattoo Parlor Tea Room Tech Startup Temple Tennis Court \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Tennis Stadium Thai Restaurant Theater Theme Park Ride / Attraction \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Thrift / Vintage Store Tiki Bar Tourist Information Center \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Toy / Game Store Track Trail Train Station Turkish Restaurant \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Udon Restaurant Used Bookstore Vegetarian / Vegan Restaurant \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Veterinarian Video Game Store Video Store Vietnamese Restaurant \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Volleyball Court Waterfront Whisky Bar Wine Bar Wine Shop Wings Joint \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" Women's Store Yoga Studio \n",
"0 0 0 \n",
"1 0 1 \n",
"2 0 0 \n",
"3 0 0 \n",
"4 0 0 "
]
},
"execution_count": 60,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# one hot encoding\n",
"manhattan_onehot = pd.get_dummies(manhattan_venues[['Venue Category']], prefix=\"\", prefix_sep=\"\")\n",
"\n",
"# add neighborhood column back to dataframe\n",
"manhattan_onehot['Neighborhood'] = manhattan_venues['Neighborhood'] \n",
"\n",
"# move neighborhood column to the first column\n",
"fixed_columns = [manhattan_onehot.columns[-1]] + list(manhattan_onehot.columns[:-1])\n",
"manhattan_onehot = manhattan_onehot[fixed_columns]\n",
"\n",
"manhattan_onehot.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And let's examine the new dataframe size."
]
},
{
"cell_type": "code",
"execution_count": 61,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"(3005, 330)"
]
},
"execution_count": 61,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"manhattan_onehot.shape"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Next, let's group rows by neighborhood and by taking the mean of the frequency of occurrence of each category"
]
},
{
"cell_type": "code",
"execution_count": 62,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"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>Neighborhood</th>\n",
" <th>Accessories Store</th>\n",
" <th>Adult Boutique</th>\n",
" <th>Afghan Restaurant</th>\n",
" <th>African Restaurant</th>\n",
" <th>American Restaurant</th>\n",
" <th>Antique Shop</th>\n",
" <th>Arcade</th>\n",
" <th>Arepa Restaurant</th>\n",
" <th>Argentinian Restaurant</th>\n",
" <th>Art Gallery</th>\n",
" <th>Art Museum</th>\n",
" <th>Arts &amp; Crafts Store</th>\n",
" <th>Asian Restaurant</th>\n",
" <th>Athletics &amp; Sports</th>\n",
" <th>Auditorium</th>\n",
" <th>Australian Restaurant</th>\n",
" <th>Austrian Restaurant</th>\n",
" <th>BBQ Joint</th>\n",
" <th>Baby Store</th>\n",
" <th>Bagel Shop</th>\n",
" <th>Bakery</th>\n",
" <th>Bank</th>\n",
" <th>Bar</th>\n",
" <th>Baseball Field</th>\n",
" <th>Basketball Court</th>\n",
" <th>Basketball Stadium</th>\n",
" <th>Beer Bar</th>\n",
" <th>Beer Garden</th>\n",
" <th>Beer Store</th>\n",
" <th>Bike Rental / Bike Share</th>\n",
" <th>Bike Shop</th>\n",
" <th>Bike Trail</th>\n",
" <th>Bistro</th>\n",
" <th>Board Shop</th>\n",
" <th>Boat or Ferry</th>\n",
" <th>Bookstore</th>\n",
" <th>Boutique</th>\n",
" <th>Boxing Gym</th>\n",
" <th>Brazilian Restaurant</th>\n",
" <th>Breakfast Spot</th>\n",
" <th>Bridal Shop</th>\n",
" <th>Bridge</th>\n",
" <th>Bubble Tea Shop</th>\n",
" <th>Building</th>\n",
" <th>Burger Joint</th>\n",
" <th>Burrito Place</th>\n",
" <th>Bus Line</th>\n",
" <th>Bus Station</th>\n",
" <th>Butcher</th>\n",
" <th>Cafeteria</th>\n",
" <th>Café</th>\n",
" <th>Cajun / Creole Restaurant</th>\n",
" <th>Cambodian Restaurant</th>\n",
" <th>Camera Store</th>\n",
" <th>Candy Store</th>\n",
" <th>Cantonese Restaurant</th>\n",
" <th>Caribbean Restaurant</th>\n",
" <th>Caucasian Restaurant</th>\n",
" <th>Check Cashing Service</th>\n",
" <th>Cheese Shop</th>\n",
" <th>Chinese Restaurant</th>\n",
" <th>Chocolate Shop</th>\n",
" <th>Circus</th>\n",
" <th>Climbing Gym</th>\n",
" <th>Clothing Store</th>\n",
" <th>Club House</th>\n",
" <th>Cocktail Bar</th>\n",
" <th>Coffee Shop</th>\n",
" <th>College Academic Building</th>\n",
" <th>College Arts Building</th>\n",
" <th>College Bookstore</th>\n",
" <th>College Cafeteria</th>\n",
" <th>Comedy Club</th>\n",
" <th>Community Center</th>\n",
" <th>Concert Hall</th>\n",
" <th>Convenience Store</th>\n",
" <th>Cooking School</th>\n",
" <th>Cosmetics Shop</th>\n",
" <th>Coworking Space</th>\n",
" <th>Creperie</th>\n",
" <th>Cuban Restaurant</th>\n",
" <th>Cupcake Shop</th>\n",
" <th>Cycle Studio</th>\n",
" <th>Czech Restaurant</th>\n",
" <th>Dance Studio</th>\n",
" <th>Daycare</th>\n",
" <th>Deli / Bodega</th>\n",
" <th>Department Store</th>\n",
" <th>Dessert Shop</th>\n",
" <th>Dim Sum Restaurant</th>\n",
" <th>Diner</th>\n",
" <th>Discount Store</th>\n",
" <th>Doctor's Office</th>\n",
" <th>Dog Run</th>\n",
" <th>Donut Shop</th>\n",
" <th>Drugstore</th>\n",
" <th>Dry Cleaner</th>\n",
" <th>Dumpling Restaurant</th>\n",
" <th>Duty-free Shop</th>\n",
" <th>Eastern European Restaurant</th>\n",
" <th>Electronics Store</th>\n",
" <th>Empanada Restaurant</th>\n",
" <th>English Restaurant</th>\n",
" <th>Ethiopian Restaurant</th>\n",
" <th>Event Space</th>\n",
" <th>Exhibit</th>\n",
" <th>Falafel Restaurant</th>\n",
" <th>Farmers Market</th>\n",
" <th>Fast Food Restaurant</th>\n",
" <th>Filipino Restaurant</th>\n",
" <th>Financial or Legal Service</th>\n",
" <th>Fish Market</th>\n",
" <th>Flea Market</th>\n",
" <th>Flower Shop</th>\n",
" <th>Food</th>\n",
" <th>Food &amp; Drink Shop</th>\n",
" <th>Food Court</th>\n",
" <th>Food Stand</th>\n",
" <th>Food Truck</th>\n",
" <th>Fountain</th>\n",
" <th>French Restaurant</th>\n",
" <th>Fried Chicken Joint</th>\n",
" <th>Frozen Yogurt Shop</th>\n",
" <th>Furniture / Home Store</th>\n",
" <th>Gaming Cafe</th>\n",
" <th>Garden</th>\n",
" <th>Garden Center</th>\n",
" <th>Gas Station</th>\n",
" <th>Gastropub</th>\n",
" <th>Gay Bar</th>\n",
" <th>General Entertainment</th>\n",
" <th>German Restaurant</th>\n",
" <th>Gift Shop</th>\n",
" <th>Golf Course</th>\n",
" <th>Gourmet Shop</th>\n",
" <th>Greek Restaurant</th>\n",
" <th>Grocery Store</th>\n",
" <th>Gym</th>\n",
" <th>Gym / Fitness Center</th>\n",
" <th>Gym Pool</th>\n",
" <th>Gymnastics Gym</th>\n",
" <th>Harbor / Marina</th>\n",
" <th>Hardware Store</th>\n",
" <th>Hawaiian Restaurant</th>\n",
" <th>Health &amp; Beauty Service</th>\n",
" <th>Health Food Store</th>\n",
" <th>Heliport</th>\n",
" <th>High School</th>\n",
" <th>Historic Site</th>\n",
" <th>History Museum</th>\n",
" <th>Hobby Shop</th>\n",
" <th>Hookah Bar</th>\n",
" <th>Hostel</th>\n",
" <th>Hot Dog Joint</th>\n",
" <th>Hotel</th>\n",
" <th>Hotel Bar</th>\n",
" <th>Hotpot Restaurant</th>\n",
" <th>Ice Cream Shop</th>\n",
" <th>Indian Restaurant</th>\n",
" <th>Indie Movie Theater</th>\n",
" <th>Indie Theater</th>\n",
" <th>Intersection</th>\n",
" <th>Irish Pub</th>\n",
" <th>Israeli Restaurant</th>\n",
" <th>Italian Restaurant</th>\n",
" <th>Japanese Curry Restaurant</th>\n",
"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment