Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save dmalc/854dcc02b052303e90599c83d2a7cd09 to your computer and use it in GitHub Desktop.
Save dmalc/854dcc02b052303e90599c83d2a7cd09 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": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"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>Generating Maps with Python</font></h1>"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"## Introduction\n",
"\n",
"In this lab, we will learn how to create maps for different objectives. To do that, we will part ways with Matplotlib and work with another Python visualization library, namely **Folium**. What is nice about **Folium** is that it was developed for the sole purpose of visualizing geospatial data. While other libraries are available to visualize geospatial data, such as **plotly**, they might have a cap on how many API calls you can make within a defined time frame. **Folium**, on the other hand, is completely free."
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"## Table of Contents\n",
"\n",
"<div class=\"alert alert-block alert-info\" style=\"margin-top: 20px\">\n",
"\n",
"1. [Exploring Datasets with *p*andas](#0)<br>\n",
"2. [Downloading and Prepping Data](#2)<br>\n",
"3. [Introduction to Folium](#4) <br>\n",
"4. [Map with Markers](#6) <br>\n",
"5. [Choropleth Maps](#8) <br>\n",
"</div>\n",
"<hr>"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"# Exploring Datasets with *pandas* and Matplotlib<a id=\"0\"></a>\n",
"\n",
"Toolkits: This lab heavily relies on [*pandas*](http://pandas.pydata.org/) and [**Numpy**](http://www.numpy.org/) for data wrangling, analysis, and visualization. The primary plotting library we will explore in this lab is [**Folium**](https://github.com/python-visualization/folium/).\n",
"\n",
"Datasets: \n",
"\n",
"1. San Francisco Police Department Incidents for the year 2016 - [Police Department Incidents](https://data.sfgov.org/Public-Safety/Police-Department-Incidents-Previous-Year-2016-/ritf-b9ki) from San Francisco public data portal. Incidents derived from San Francisco Police Department (SFPD) Crime Incident Reporting system. Updated daily, showing data for the entire year of 2016. Address and location has been anonymized by moving to mid-block or to an intersection. \n",
"\n",
"2. Immigration to Canada from 1980 to 2013 - [International migration flows to and from selected countries - The 2015 revision](http://www.un.org/en/development/desa/population/migration/data/empirical2/migrationflows.shtml) from United Nation's website. The dataset contains annual data on the flows of international migrants as recorded by the countries of destination. The data presents both inflows and outflows according to the place of birth, citizenship or place of previous / next residence both for foreigners and nationals. For this lesson, we will focus on the Canadian Immigration data"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"# Downloading and Prepping Data <a id=\"2\"></a>"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Import Primary Modules:"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"import numpy as np # useful for many scientific computing in Python\n",
"import pandas as pd # primary data structure library"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"# Introduction to Folium <a id=\"4\"></a>"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Folium is a powerful Python library that helps you create several types of Leaflet maps. The fact that the Folium results are interactive makes this library very useful for dashboard building.\n",
"\n",
"From the official Folium documentation page:\n",
"\n",
"> Folium builds on the data wrangling strengths of the Python ecosystem and the mapping strengths of the Leaflet.js library. Manipulate your data in Python, then visualize it in on a Leaflet map via Folium.\n",
"\n",
"> Folium makes it easy to visualize data that's been manipulated in Python on an interactive Leaflet map. It enables both the binding of data to a map for choropleth visualizations as well as passing Vincent/Vega visualizations as markers on the map.\n",
"\n",
"> The library has a number of built-in tilesets from OpenStreetMap, Mapbox, and Stamen, and supports custom tilesets with Mapbox or Cloudmade API keys. Folium supports both GeoJSON and TopoJSON overlays, as well as the binding of data to those overlays to create choropleth maps with color-brewer color schemes."
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"#### Let's install **Folium**"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"**Folium** is not available by default. So, we first need to install it before we are able to import it."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"jupyter": {
"outputs_hidden": false
},
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting package metadata (current_repodata.json): done\n",
"Solving environment: failed with initial frozen solve. Retrying with flexible solve.\n",
"Collecting package metadata (repodata.json): done\n",
"Solving environment: done\n",
"\n",
"## Package Plan ##\n",
"\n",
" environment location: /home/jupyterlab/conda/envs/python\n",
"\n",
" added / updated specs:\n",
" - folium=0.5.0\n",
"\n",
"\n",
"The following packages will be downloaded:\n",
"\n",
" package | build\n",
" ---------------------------|-----------------\n",
" altair-4.1.0 | py_1 614 KB conda-forge\n",
" branca-0.4.1 | py_0 26 KB conda-forge\n",
" brotlipy-0.7.0 |py36h8c4c3a4_1000 346 KB conda-forge\n",
" chardet-3.0.4 |py36h9880bd3_1008 194 KB conda-forge\n",
" cryptography-3.1.1 | py36h45558ae_0 617 KB conda-forge\n",
" folium-0.5.0 | py_0 45 KB conda-forge\n",
" importlib_metadata-2.0.0 | 1 3 KB conda-forge\n",
" markupsafe-1.1.1 | py36he6145b8_2 27 KB conda-forge\n",
" pyrsistent-0.17.3 | py36h8c4c3a4_1 89 KB conda-forge\n",
" pysocks-1.7.1 | py36h9880bd3_2 27 KB conda-forge\n",
" toolz-0.11.1 | py_0 46 KB conda-forge\n",
" vincent-0.4.4 | py_1 28 KB conda-forge\n",
" ------------------------------------------------------------\n",
" Total: 2.0 MB\n",
"\n",
"The following NEW packages will be INSTALLED:\n",
"\n",
" altair conda-forge/noarch::altair-4.1.0-py_1\n",
" attrs conda-forge/noarch::attrs-20.2.0-pyh9f0ad1d_0\n",
" branca conda-forge/noarch::branca-0.4.1-py_0\n",
" brotlipy conda-forge/linux-64::brotlipy-0.7.0-py36h8c4c3a4_1000\n",
" chardet conda-forge/linux-64::chardet-3.0.4-py36h9880bd3_1008\n",
" cryptography conda-forge/linux-64::cryptography-3.1.1-py36h45558ae_0\n",
" entrypoints conda-forge/linux-64::entrypoints-0.3-py36h9f0ad1d_1001\n",
" folium conda-forge/noarch::folium-0.5.0-py_0\n",
" idna conda-forge/noarch::idna-2.10-pyh9f0ad1d_0\n",
" importlib_metadata conda-forge/noarch::importlib_metadata-2.0.0-1\n",
" jinja2 conda-forge/noarch::jinja2-2.11.2-pyh9f0ad1d_0\n",
" jsonschema conda-forge/linux-64::jsonschema-3.2.0-py36h9f0ad1d_1\n",
" markupsafe conda-forge/linux-64::markupsafe-1.1.1-py36he6145b8_2\n",
" pyopenssl conda-forge/noarch::pyopenssl-19.1.0-py_1\n",
" pyrsistent conda-forge/linux-64::pyrsistent-0.17.3-py36h8c4c3a4_1\n",
" pysocks conda-forge/linux-64::pysocks-1.7.1-py36h9880bd3_2\n",
" requests conda-forge/noarch::requests-2.24.0-pyh9f0ad1d_0\n",
" toolz conda-forge/noarch::toolz-0.11.1-py_0\n",
" urllib3 conda-forge/noarch::urllib3-1.25.10-py_0\n",
" vincent conda-forge/noarch::vincent-0.4.4-py_1\n",
"\n",
"The following packages will be UPDATED:\n",
"\n",
" certifi anaconda::certifi-2020.6.20-py36_0 --> conda-forge::certifi-2020.6.20-py36h9880bd3_2\n",
"\n",
"The following packages will be SUPERSEDED by a higher-priority channel:\n",
"\n",
" ca-certificates anaconda::ca-certificates-2020.7.22-0 --> conda-forge::ca-certificates-2020.6.20-hecda079_0\n",
" openssl anaconda::openssl-1.1.1h-h7b6447c_0 --> conda-forge::openssl-1.1.1h-h516909a_0\n",
"\n",
"\n",
"\n",
"Downloading and Extracting Packages\n",
"markupsafe-1.1.1 | 27 KB | ##################################### | 100% \n",
"pyrsistent-0.17.3 | 89 KB | ##################################### | 100% \n",
"importlib_metadata-2 | 3 KB | ##################################### | 100% \n",
"folium-0.5.0 | 45 KB | ##################################### | 100% \n",
"pysocks-1.7.1 | 27 KB | ##################################### | 100% \n",
"chardet-3.0.4 | 194 KB | ##################################### | 100% \n",
"branca-0.4.1 | 26 KB | ##################################### | 100% \n",
"brotlipy-0.7.0 | 346 KB | ##################################### | 100% \n",
"altair-4.1.0 | 614 KB | ##################################### | 100% \n",
"toolz-0.11.1 | 46 KB | ##################################### | 100% \n",
"cryptography-3.1.1 | 617 KB | ##################################### | 100% \n",
"vincent-0.4.4 | 28 KB | ##################################### | 100% \n",
"Preparing transaction: done\n",
"Verifying transaction: done\n",
"Executing transaction: done\n",
"Folium installed and imported!\n"
]
}
],
"source": [
"!conda install -c conda-forge folium=0.5.0 --yes\n",
"import folium\n",
"\n",
"print('Folium installed and imported!')"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Generating the world map is straigtforward in **Folium**. You simply create a **Folium** *Map* object and then you display it. What is attactive about **Folium** maps is that they are interactive, so you can zoom into any region of interest despite the initial zoom level. "
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"jupyter": {
"outputs_hidden": false
},
"new_sheet": false,
"run_control": {
"read_only": false
},
"scrolled": true
},
"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+ICNtYXBfMzVkYmM5ZWY3OWUzNDA0NjkzZGM5MGI2ZjMxOTAwNzIgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzM1ZGJjOWVmNzllMzQwNDY5M2RjOTBiNmYzMTkwMDcyIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF8zNWRiYzllZjc5ZTM0MDQ2OTNkYzkwYjZmMzE5MDA3MiA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF8zNWRiYzllZjc5ZTM0MDQ2OTNkYzkwYjZmMzE5MDA3MicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbMCwwXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb206IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyX2RiZmQwNWEyZDI4MDQ2MjM5OTA2OThjZjk0MTI2OTJhID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnLAogICAgICAgICAgICAgICAgewogICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICJtYXhab29tIjogMTgsCiAgIm1pblpvb20iOiAxLAogICJub1dyYXAiOiBmYWxzZSwKICAic3ViZG9tYWlucyI6ICJhYmMiCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM1ZGJjOWVmNzllMzQwNDY5M2RjOTBiNmYzMTkwMDcyKTsKICAgICAgICAKPC9zY3JpcHQ+ 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 0x7ff5146e4a90>"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# define the world map\n",
"world_map = folium.Map()\n",
"\n",
"# display world map\n",
"world_map"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Go ahead. Try zooming in and out of the rendered map above."
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"You can customize this default definition of the world map by specifying the centre of your map and the intial zoom level. \n",
"\n",
"All locations on a map are defined by their respective *Latitude* and *Longitude* values. So you can create a map and pass in a center of *Latitude* and *Longitude* values of **[0, 0]**. \n",
"\n",
"For a defined center, you can also define the intial zoom level into that location when the map is rendered. **The higher the zoom level the more the map is zoomed into the center**.\n",
"\n",
"Let's create a map centered around Canada and play with the zoom level to see how it affects the rendered map."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"jupyter": {
"outputs_hidden": false
},
"new_sheet": false,
"run_control": {
"read_only": 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+ICNtYXBfOWU4M2I1YWQ5NmQ3NDI0N2E2ZWU3MmQyYjIwNjUxMjEgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzllODNiNWFkOTZkNzQyNDdhNmVlNzJkMmIyMDY1MTIxIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF85ZTgzYjVhZDk2ZDc0MjQ3YTZlZTcyZDJiMjA2NTEyMSA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF85ZTgzYjVhZDk2ZDc0MjQ3YTZlZTcyZDJiMjA2NTEyMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNTYuMTMsLTEwNi4zNV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Qm91bmRzOiBib3VuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcnM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGRDb3B5SnVtcDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgdGlsZV9sYXllcl9iMjI2YTVkNzk0MTI0Njk2OTcwZWJkOTA4YWVjMDljZiA9IEwudGlsZUxheWVyKAogICAgICAgICAgICAgICAgJ2h0dHBzOi8ve3N9LnRpbGUub3BlbnN0cmVldG1hcC5vcmcve3p9L3t4fS97eX0ucG5nJywKICAgICAgICAgICAgICAgIHsKICAiYXR0cmlidXRpb24iOiBudWxsLAogICJkZXRlY3RSZXRpbmEiOiBmYWxzZSwKICAibWF4Wm9vbSI6IDE4LAogICJtaW5ab29tIjogMSwKICAibm9XcmFwIjogZmFsc2UsCiAgInN1YmRvbWFpbnMiOiAiYWJjIgp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ZTgzYjVhZDk2ZDc0MjQ3YTZlZTcyZDJiMjA2NTEyMSk7CiAgICAgICAgCjwvc2NyaXB0Pg== 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 0x7ff4f6116438>"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# define the world map centered around Canada with a low zoom level\n",
"world_map = folium.Map(location=[56.130, -106.35], zoom_start=4)\n",
"\n",
"# display world map\n",
"world_map"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Let's create the map again with a higher zoom level"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"jupyter": {
"outputs_hidden": false
},
"new_sheet": false,
"run_control": {
"read_only": 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+ICNtYXBfMTNhYmRhODkzYTZjNGQ5Zjk4OWIxZmU1MzU3N2Y1NTAgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzEzYWJkYTg5M2E2YzRkOWY5ODliMWZlNTM1NzdmNTUwIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF8xM2FiZGE4OTNhNmM0ZDlmOTg5YjFmZTUzNTc3ZjU1MCA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF8xM2FiZGE4OTNhNmM0ZDlmOTg5YjFmZTUzNTc3ZjU1MCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNTYuMTMsLTEwNi4zNV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Qm91bmRzOiBib3VuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcnM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGRDb3B5SnVtcDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgdGlsZV9sYXllcl8yYzhkYmQ1MmJlOGY0Nzk4YTNmNzYzYzliOTFkYzJlYyA9IEwudGlsZUxheWVyKAogICAgICAgICAgICAgICAgJ2h0dHBzOi8ve3N9LnRpbGUub3BlbnN0cmVldG1hcC5vcmcve3p9L3t4fS97eX0ucG5nJywKICAgICAgICAgICAgICAgIHsKICAiYXR0cmlidXRpb24iOiBudWxsLAogICJkZXRlY3RSZXRpbmEiOiBmYWxzZSwKICAibWF4Wm9vbSI6IDE4LAogICJtaW5ab29tIjogMSwKICAibm9XcmFwIjogZmFsc2UsCiAgInN1YmRvbWFpbnMiOiAiYWJjIgp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8xM2FiZGE4OTNhNmM0ZDlmOTg5YjFmZTUzNTc3ZjU1MCk7CiAgICAgICAgCjwvc2NyaXB0Pg== 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 0x7ff4f6116ba8>"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# define the world map centered around Canada with a higher zoom level\n",
"world_map = folium.Map(location=[56.130, -106.35], zoom_start=8)\n",
"\n",
"# display world map\n",
"world_map"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"As you can see, the higher the zoom level the more the map is zoomed into the given center."
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"**Question**: Create a map of Mexico with a zoom level of 4."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"jupyter": {
"outputs_hidden": false
},
"new_sheet": false,
"run_control": {
"read_only": 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+ICNtYXBfMjljMWQwMTJhM2MxNDViZGIzNDVlOTljNmNiZGY3ZWQgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzI5YzFkMDEyYTNjMTQ1YmRiMzQ1ZTk5YzZjYmRmN2VkIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF8yOWMxZDAxMmEzYzE0NWJkYjM0NWU5OWM2Y2JkZjdlZCA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF8yOWMxZDAxMmEzYzE0NWJkYjM0NWU5OWM2Y2JkZjdlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbMjMuNjM0NSwtMTAyLjU1MjhdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfNzgwYTY3MWY3NGZhNDk4MTgyZDBiZjU1MmUwYTkyMWYgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjljMWQwMTJhM2MxNDViZGIzNDVlOTljNmNiZGY3ZWQpOwogICAgICAgIAo8L3NjcmlwdD4= 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 0x7ff4f612b860>"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"### type your answer here\n",
"\n",
"mexico_latitude = 23.6345 \n",
"mexico_longitude = -102.5528\n",
"mexico_map = folium.Map(location=[mexico_latitude, mexico_longitude], zoom_start=4)\n",
"\n",
"mexico_map"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Double-click __here__ for the solution.\n",
"<!-- The correct answer is:\n",
"\\\\ # define Mexico's geolocation coordinates\n",
"mexico_latitude = 23.6345 \n",
"mexico_longitude = -102.5528\n",
"-->\n",
"\n",
"<!--\n",
"\\\\ # define the world map centered around Canada with a higher zoom level\n",
"mexico_map = folium.Map(location=[mexico_latitude, mexico_longitude], zoom_start=4)\n",
"-->\n",
"\n",
"<!--\n",
"\\\\ # display world map\n",
"mexico_map\n",
"-->"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Another cool feature of **Folium** is that you can generate different map styles."
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"### A. Stamen Toner Maps\n",
"\n",
"These are high-contrast B+W (black and white) maps. They are perfect for data mashups and exploring river meanders and coastal zones. "
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Let's create a Stamen Toner map of canada with a zoom level of 4."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"jupyter": {
"outputs_hidden": false
},
"new_sheet": false,
"run_control": {
"read_only": 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+ICNtYXBfZThjMTJiYWU0N2FkNDU0MTkwOTRkNjVjYzU5MDQ3ODUgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwX2U4YzEyYmFlNDdhZDQ1NDE5MDk0ZDY1Y2M1OTA0Nzg1IiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF9lOGMxMmJhZTQ3YWQ0NTQxOTA5NGQ2NWNjNTkwNDc4NSA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF9lOGMxMmJhZTQ3YWQ0NTQxOTA5NGQ2NWNjNTkwNDc4NScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNTYuMTMsLTEwNi4zNV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Qm91bmRzOiBib3VuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcnM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGRDb3B5SnVtcDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgdGlsZV9sYXllcl8zYjA5MTc0MzdmMDE0ZDcwYWRiNDZlNDI1N2QzYWE0ZCA9IEwudGlsZUxheWVyKAogICAgICAgICAgICAgICAgJ2h0dHBzOi8vc3RhbWVuLXRpbGVzLXtzfS5hLnNzbC5mYXN0bHkubmV0L3RvbmVyL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZThjMTJiYWU0N2FkNDU0MTkwOTRkNjVjYzU5MDQ3ODUpOwogICAgICAgIAo8L3NjcmlwdD4= 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 0x7ff4f612b748>"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# create a Stamen Toner map of the world centered around Canada\n",
"world_map = folium.Map(location=[56.130, -106.35], zoom_start=4, tiles='Stamen Toner')\n",
"\n",
"# display map\n",
"world_map"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Feel free to zoom in and out to see how this style compares to the default one."
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"### B. Stamen Terrain Maps\n",
"\n",
"These are maps that feature hill shading and natural vegetation colors. They showcase advanced labeling and linework generalization of dual-carriageway roads."
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Let's create a Stamen Terrain map of Canada with zoom level 4."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"jupyter": {
"outputs_hidden": false
},
"new_sheet": false,
"run_control": {
"read_only": 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+ICNtYXBfNmNhOWFhNjMxOTgyNDZmYzlkN2FkMjE4MDk2MWI2MWIgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzZjYTlhYTYzMTk4MjQ2ZmM5ZDdhZDIxODA5NjFiNjFiIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF82Y2E5YWE2MzE5ODI0NmZjOWQ3YWQyMTgwOTYxYjYxYiA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF82Y2E5YWE2MzE5ODI0NmZjOWQ3YWQyMTgwOTYxYjYxYicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNTYuMTMsLTEwNi4zNV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Qm91bmRzOiBib3VuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcnM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGRDb3B5SnVtcDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgdGlsZV9sYXllcl84N2EyMDhmMTNmOWM0MmFlOWQ4NTZlMTU2ZmE1MGUxNSA9IEwudGlsZUxheWVyKAogICAgICAgICAgICAgICAgJ2h0dHBzOi8vc3RhbWVuLXRpbGVzLXtzfS5hLnNzbC5mYXN0bHkubmV0L3RlcnJhaW4ve3p9L3t4fS97eX0uanBnJywKICAgICAgICAgICAgICAgIHsKICAiYXR0cmlidXRpb24iOiBudWxsLAogICJkZXRlY3RSZXRpbmEiOiBmYWxzZSwKICAibWF4Wm9vbSI6IDE4LAogICJtaW5ab29tIjogMSwKICAibm9XcmFwIjogZmFsc2UsCiAgInN1YmRvbWFpbnMiOiAiYWJjIgp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82Y2E5YWE2MzE5ODI0NmZjOWQ3YWQyMTgwOTYxYjYxYik7CiAgICAgICAgCjwvc2NyaXB0Pg== 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 0x7ff4f60c3400>"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# create a Stamen Toner map of the world centered around Canada\n",
"world_map = folium.Map(location=[56.130, -106.35], zoom_start=4, tiles='Stamen Terrain')\n",
"\n",
"# display map\n",
"world_map"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Feel free to zoom in and out to see how this style compares to Stamen Toner and the default style."
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"### C. Mapbox Bright Maps\n",
"\n",
"These are maps that quite similar to the default style, except that the borders are not visible with a low zoom level. Furthermore, unlike the default style where country names are displayed in each country's native language, *Mapbox Bright* style displays all country names in English."
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Let's create a world map with this style."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"jupyter": {
"outputs_hidden": false
},
"new_sheet": false,
"run_control": {
"read_only": 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+ICNtYXBfNGE5YWM4YjRkMzA3NGY2ZmE0YTk4ZTFhODljY2IzMDUgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzRhOWFjOGI0ZDMwNzRmNmZhNGE5OGUxYTg5Y2NiMzA1IiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF80YTlhYzhiNGQzMDc0ZjZmYTRhOThlMWE4OWNjYjMwNSA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF80YTlhYzhiNGQzMDc0ZjZmYTRhOThlMWE4OWNjYjMwNScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbMCwwXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb206IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyXzBiMDM3MjMyNjIyNzQwMjc4NTNmM2QzNDg0NDY0MDliID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly97c30udGlsZXMubWFwYm94LmNvbS92My9tYXBib3gud29ybGQtYnJpZ2h0L3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGE5YWM4YjRkMzA3NGY2ZmE0YTk4ZTFhODljY2IzMDUpOwogICAgICAgIAo8L3NjcmlwdD4= 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 0x7ff4f60cbef0>"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# create a world map with a Mapbox Bright style.\n",
"world_map = folium.Map(tiles='Mapbox Bright')\n",
"\n",
"# display the map\n",
"world_map"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Zoom in and notice how the borders start showing as you zoom in, and the displayed country names are in English."
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"**Question**: Create a map of Mexico to visualize its hill shading and natural vegetation. Use a zoom level of 6."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"jupyter": {
"outputs_hidden": false
},
"new_sheet": false,
"run_control": {
"read_only": 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+ICNtYXBfYTY4NTY5ZWFmMzA1NDRiMzhhNGQzNDRmZWUwYmZlZWQgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwX2E2ODU2OWVhZjMwNTQ0YjM4YTRkMzQ0ZmVlMGJmZWVkIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF9hNjg1NjllYWYzMDU0NGIzOGE0ZDM0NGZlZTBiZmVlZCA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF9hNjg1NjllYWYzMDU0NGIzOGE0ZDM0NGZlZTBiZmVlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbMjMuNjM0NSwtMTAyLjU1MjhdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfYWNhMDM0ZTgzZGNjNGZiMmE2Y2FlNDEwNmNiMGI2OWIgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3N0YW1lbi10aWxlcy17c30uYS5zc2wuZmFzdGx5Lm5ldC90ZXJyYWluL3t6fS97eH0ve3l9LmpwZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTY4NTY5ZWFmMzA1NDRiMzhhNGQzNDRmZWUwYmZlZWQpOwogICAgICAgIAo8L3NjcmlwdD4= 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 0x7ff4f60d5898>"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"### type your answer here\n",
"\n",
"mexico_latitude = 23.6345 \n",
"mexico_longitude = -102.5528\n",
"mexico_map = folium.Map(location=[mexico_latitude, mexico_longitude], zoom_start=6, tiles='Stamen Terrain')\n",
"mexico_map"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Double-click __here__ for the solution.\n",
"<!-- The correct answer is:\n",
"\\\\ # define Mexico's geolocation coordinates\n",
"mexico_latitude = 23.6345 \n",
"mexico_longitude = -102.5528\n",
"-->\n",
"\n",
"<!--\n",
"\\\\ # define the world map centered around Canada with a higher zoom level\n",
"mexico_map = folium.Map(location=[mexico_latitude, mexico_longitude], zoom_start=6, tiles='Stamen Terrain')\n",
"-->\n",
"\n",
"<!--\n",
"\\\\ # display world map\n",
"mexico_map\n",
"-->"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"# Maps with Markers <a id=\"6\"></a>\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Let's download and import the data on police department incidents using *pandas* `read_csv()` method."
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Download the dataset and read it into a *pandas* dataframe:"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"jupyter": {
"outputs_hidden": false
},
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Dataset downloaded and read into a pandas dataframe!\n"
]
}
],
"source": [
"df_incidents = pd.read_csv('https://s3-api.us-geo.objectstorage.softlayer.net/cf-courses-data/CognitiveClass/DV0101EN/labs/Data_Files/Police_Department_Incidents_-_Previous_Year__2016_.csv')\n",
"\n",
"print('Dataset downloaded and read into a pandas dataframe!')"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Let's take a look at the first five items in our dataset."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"jupyter": {
"outputs_hidden": false
},
"new_sheet": false,
"run_control": {
"read_only": 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>IncidntNum</th>\n",
" <th>Category</th>\n",
" <th>Descript</th>\n",
" <th>DayOfWeek</th>\n",
" <th>Date</th>\n",
" <th>Time</th>\n",
" <th>PdDistrict</th>\n",
" <th>Resolution</th>\n",
" <th>Address</th>\n",
" <th>X</th>\n",
" <th>Y</th>\n",
" <th>Location</th>\n",
" <th>PdId</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>120058272</td>\n",
" <td>WEAPON LAWS</td>\n",
" <td>POSS OF PROHIBITED WEAPON</td>\n",
" <td>Friday</td>\n",
" <td>01/29/2016 12:00:00 AM</td>\n",
" <td>11:00</td>\n",
" <td>SOUTHERN</td>\n",
" <td>ARREST, BOOKED</td>\n",
" <td>800 Block of BRYANT ST</td>\n",
" <td>-122.403405</td>\n",
" <td>37.775421</td>\n",
" <td>(37.775420706711, -122.403404791479)</td>\n",
" <td>12005827212120</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>120058272</td>\n",
" <td>WEAPON LAWS</td>\n",
" <td>FIREARM, LOADED, IN VEHICLE, POSSESSION OR USE</td>\n",
" <td>Friday</td>\n",
" <td>01/29/2016 12:00:00 AM</td>\n",
" <td>11:00</td>\n",
" <td>SOUTHERN</td>\n",
" <td>ARREST, BOOKED</td>\n",
" <td>800 Block of BRYANT ST</td>\n",
" <td>-122.403405</td>\n",
" <td>37.775421</td>\n",
" <td>(37.775420706711, -122.403404791479)</td>\n",
" <td>12005827212168</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>141059263</td>\n",
" <td>WARRANTS</td>\n",
" <td>WARRANT ARREST</td>\n",
" <td>Monday</td>\n",
" <td>04/25/2016 12:00:00 AM</td>\n",
" <td>14:59</td>\n",
" <td>BAYVIEW</td>\n",
" <td>ARREST, BOOKED</td>\n",
" <td>KEITH ST / SHAFTER AV</td>\n",
" <td>-122.388856</td>\n",
" <td>37.729981</td>\n",
" <td>(37.7299809672996, -122.388856204292)</td>\n",
" <td>14105926363010</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>160013662</td>\n",
" <td>NON-CRIMINAL</td>\n",
" <td>LOST PROPERTY</td>\n",
" <td>Tuesday</td>\n",
" <td>01/05/2016 12:00:00 AM</td>\n",
" <td>23:50</td>\n",
" <td>TENDERLOIN</td>\n",
" <td>NONE</td>\n",
" <td>JONES ST / OFARRELL ST</td>\n",
" <td>-122.412971</td>\n",
" <td>37.785788</td>\n",
" <td>(37.7857883766888, -122.412970537591)</td>\n",
" <td>16001366271000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>160002740</td>\n",
" <td>NON-CRIMINAL</td>\n",
" <td>LOST PROPERTY</td>\n",
" <td>Friday</td>\n",
" <td>01/01/2016 12:00:00 AM</td>\n",
" <td>00:30</td>\n",
" <td>MISSION</td>\n",
" <td>NONE</td>\n",
" <td>16TH ST / MISSION ST</td>\n",
" <td>-122.419672</td>\n",
" <td>37.765050</td>\n",
" <td>(37.7650501214668, -122.419671780296)</td>\n",
" <td>16000274071000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" IncidntNum Category Descript \\\n",
"0 120058272 WEAPON LAWS POSS OF PROHIBITED WEAPON \n",
"1 120058272 WEAPON LAWS FIREARM, LOADED, IN VEHICLE, POSSESSION OR USE \n",
"2 141059263 WARRANTS WARRANT ARREST \n",
"3 160013662 NON-CRIMINAL LOST PROPERTY \n",
"4 160002740 NON-CRIMINAL LOST PROPERTY \n",
"\n",
" DayOfWeek Date Time PdDistrict Resolution \\\n",
"0 Friday 01/29/2016 12:00:00 AM 11:00 SOUTHERN ARREST, BOOKED \n",
"1 Friday 01/29/2016 12:00:00 AM 11:00 SOUTHERN ARREST, BOOKED \n",
"2 Monday 04/25/2016 12:00:00 AM 14:59 BAYVIEW ARREST, BOOKED \n",
"3 Tuesday 01/05/2016 12:00:00 AM 23:50 TENDERLOIN NONE \n",
"4 Friday 01/01/2016 12:00:00 AM 00:30 MISSION NONE \n",
"\n",
" Address X Y \\\n",
"0 800 Block of BRYANT ST -122.403405 37.775421 \n",
"1 800 Block of BRYANT ST -122.403405 37.775421 \n",
"2 KEITH ST / SHAFTER AV -122.388856 37.729981 \n",
"3 JONES ST / OFARRELL ST -122.412971 37.785788 \n",
"4 16TH ST / MISSION ST -122.419672 37.765050 \n",
"\n",
" Location PdId \n",
"0 (37.775420706711, -122.403404791479) 12005827212120 \n",
"1 (37.775420706711, -122.403404791479) 12005827212168 \n",
"2 (37.7299809672996, -122.388856204292) 14105926363010 \n",
"3 (37.7857883766888, -122.412970537591) 16001366271000 \n",
"4 (37.7650501214668, -122.419671780296) 16000274071000 "
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_incidents.head()"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"So each row consists of 13 features:\n",
"> 1. **IncidntNum**: Incident Number\n",
"> 2. **Category**: Category of crime or incident\n",
"> 3. **Descript**: Description of the crime or incident\n",
"> 4. **DayOfWeek**: The day of week on which the incident occurred\n",
"> 5. **Date**: The Date on which the incident occurred\n",
"> 6. **Time**: The time of day on which the incident occurred\n",
"> 7. **PdDistrict**: The police department district\n",
"> 8. **Resolution**: The resolution of the crime in terms whether the perpetrator was arrested or not\n",
"> 9. **Address**: The closest address to where the incident took place\n",
"> 10. **X**: The longitude value of the crime location \n",
"> 11. **Y**: The latitude value of the crime location\n",
"> 12. **Location**: A tuple of the latitude and the longitude values\n",
"> 13. **PdId**: The police department ID"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Let's find out how many entries there are in our dataset."
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"jupyter": {
"outputs_hidden": false
},
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"(150500, 13)"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_incidents.shape"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"So the dataframe consists of 150,500 crimes, which took place in the year 2016. In order to reduce computational cost, let's just work with the first 100 incidents in this dataset."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"# get the first 100 crimes in the df_incidents dataframe\n",
"limit = 100\n",
"df_incidents = df_incidents.iloc[0:limit, :]"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Let's confirm that our dataframe now consists only of 100 crimes."
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"jupyter": {
"outputs_hidden": false
},
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"(100, 13)"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_incidents.shape"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Now that we reduced the data a little bit, let's visualize where these crimes took place in the city of San Francisco. We will use the default style and we will initialize the zoom level to 12. "
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"# San Francisco latitude and longitude values\n",
"latitude = 37.77\n",
"longitude = -122.42"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"jupyter": {
"outputs_hidden": false
},
"new_sheet": false,
"run_control": {
"read_only": 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+ICNtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzVkYTFlOWM0NWNhNzRlZWFhYTIxZGQzMWNiYmJjYTc0IiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF81ZGExZTljNDVjYTc0ZWVhYWEyMWRkMzFjYmJiY2E3NCA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF81ZGExZTljNDVjYTc0ZWVhYWEyMWRkMzFjYmJiY2E3NCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbMzcuNzcsLTEyMi40Ml0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiAxMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfZTIxMjY0MjNjMjcxNDc1ZWE4NmE4MmQzNjliZGY0YmMgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQpOwogICAgICAgIAo8L3NjcmlwdD4= 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 0x7ff4ed5f2c18>"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# create map and display it\n",
"sanfran_map = folium.Map(location=[latitude, longitude], zoom_start=12)\n",
"\n",
"# display the map of San Francisco\n",
"sanfran_map"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Now let's superimpose the locations of the crimes onto the map. The way to do that in **Folium** is to create a *feature group* with its own features and style and then add it to the sanfran_map."
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"jupyter": {
"outputs_hidden": false
},
"new_sheet": false,
"run_control": {
"read_only": 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+ICNtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzVkYTFlOWM0NWNhNzRlZWFhYTIxZGQzMWNiYmJjYTc0IiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF81ZGExZTljNDVjYTc0ZWVhYWEyMWRkMzFjYmJiY2E3NCA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF81ZGExZTljNDVjYTc0ZWVhYWEyMWRkMzFjYmJiY2E3NCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbMzcuNzcsLTEyMi40Ml0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiAxMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfZTIxMjY0MjNjMjcxNDc1ZWE4NmE4MmQzNjliZGY0YmMgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzID0gTC5mZWF0dXJlR3JvdXAoCiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF81ZGExZTljNDVjYTc0ZWVhYWEyMWRkMzFjYmJiY2E3NCk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjVkOGQ5NWNkNjY4NDJkNGFiNWRiMGQ2YjUxNWMzMmQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzU0MjA3MDY3MTEsLTEyMi40MDM0MDQ3OTE0Nzg5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2VmNWQ2YjYxZjU5NTQ3YWVhM2VlNThhYTBhMzg0NjU0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1NDIwNzA2NzExLC0xMjIuNDAzNDA0NzkxNDc4OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82MTVkYjE2ZWZiNjg0Zjc4OTVhZjE2MTliMzcyMGM5MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyOTk4MDk2NzI5OTU5NiwtMTIyLjM4ODg1NjIwNDI5Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg2MjM2MWIxYWZkNzQ5NzRhYmMzNTc3MmFhZTZiZTMyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg1Nzg4Mzc2Njg4NzksLTEyMi40MTI5NzA1Mzc1OTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hY2RhZDRkMTY4ZGY0YzJlODY5ODBhMDljNjA0NmVlMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NTA1MDEyMTQ2NjgsLTEyMi40MTk2NzE3ODAyOTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85MzdhNjA1M2M1ZWE0MjRkYTc5NGM1MDBmNzczOGM4NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4ODAxODU1NTgyOSwtMTIyLjQyNjA3NzE3NzM3NDk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWVhMGViYmIzYTY5NGY5Y2EzZTUyMTg0YzhlNDg0YmUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODA4Nzg5MzYwMjE0LC0xMjIuNDA1NzIxNDU0NTY3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzRlNDRjNjEyYTRiNGEzM2IzNjk1YTg5YWYzOTE4YWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODM5ODA1NTkyNjM0LC0xMjIuNDExNzc4Mjk1OTkyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWZjNjJlZDZhZDAzNDZiYjhiMjMzZDk1ZDhjNDM3OGMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzU3ODc2MjE4MjkyOTUsLTEyMi4zOTMzNTcyNDE0NTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yY2ZhYmRjMjcyMjc0NTViYmMxMzY0YzNkYzNiOTEzMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyMDk2Njk2MTU0OTksLTEyMi4zODcxODE2MzU5OTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yZTRhMTM1ZjE4MWI0MmM0YWNjMWRlMDgyNzI4ZDZiMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NDQ3ODE1Nzg2OTUwNSwtMTIyLjQ3NzM3NjUyNDAwMjk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmM3OTQzNGJhNzU4NGQzMDg3NDZiNWM4NzY3M2JkYjAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDU3Mzg5NDI5NjU0OTUsLTEyMi40Nzc5NjAzMjcyOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jNWM1ZjM5OWQ3Y2U0YjZkYWI3MjcwMWM1OWVlMjgwNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczNTY5NzAyNzU0ODIwNiwtMTIyLjM3Njc1NzY1NTUzMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmYzYmFjY2EwNDc4NDYwNWExMjE5MjQ0NjkwNzYzNDUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjkyNzA1MTk5NTkyLC0xMjIuNDMyMzI1ODcxMDI4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGIxNWZlZjdiMTFmNDQxODlkZTZlMzYwYmJlZjA5NGMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43OTE2NDI5ODIzODQsLTEyMi40MDA5MDg2OTg4ODk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzExM2U5YzBiNmI0ODRhMjQ5NzMxYTc5MmQwOTkxMjRmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzNzA2OTMwMTU0NSwtMTIyLjQwODU5NTExMDg2OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FjNmEyOTY1NGRjNTRlNGJiZjc1YTRjZTMwNzlhMjNlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzU3Mjg5NTkwNDU3Nzk1LC0xMjIuNDA2ODcwNDAyMDgyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTdmZTg0ZDllMzkwNDNjZGFlZTAwYjlhY2FjNTNlNjQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDg5MDYzMDUxODI5LC0xMjIuNDIwMzU0NzgwODYwOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NmU1Zjk0Mzg4NDg0MDhiOGMyNDA4YzY0MzZiMDdhZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcxNTc2NTQyNjk5NSwtMTIyLjQzOTkwOTc2Njc3Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U1ZTk4NjNkZGYzYjQxM2JhNDc5M2I0Y2JmYmFlN2MxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzNTY5OTM4NjkxOCwtMTIyLjQwODQyMTExNjkyMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzkyY2U1ZTc4MTg2YzQ5Y2ZhMmQ5ZjJmMGNmMWQxYWQ3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzczNjE4NjI3NjQ1NjA0LC0xMjIuNDIyMzE1NjcwNzQ5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWUwYmE1MDY5YTVmNDU0MWIxNjNkZDYzNDhmYzNlY2MgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43OTI4NDEyODQwNDQ3MDUsLTEyMi40MjQ1MTk4MzUwMDkwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2EwNzNlZGJjOGRhNzQ2Zjc5NTJhZmYxZWUwNzNkZjU0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzU0MDk4Njg4MjA2Nzk1LC0xMjIuNDE0MjMzODQ5MDM3OThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81NzgzMjFlMjBhNDg0MDAzYmE4YTIxMGEzZGYyYWU2YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc1NDA5ODY4ODIwNjc5NSwtMTIyLjQxNDIzMzg0OTAzNzk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzFjMjI0ZGUzOWJlNDM2M2FkZDdiZTUyNjVhY2IyNWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzE0OTM5OTY5NDE2LC0xMjIuNTA3NzUwMTMxMDA0MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83NzFhYzdjMDQ5ZmU0ZjE2YmYzZmM0OWRmNDdmMGE4NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcxODMwMjIwNDc2NjAwNSwtMTIyLjQ3NDQ0NDYzOTU5NDk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZThmYTY4YzUxNDliNDgyNjkyNDMyNDY0ZDNlMDFjNzUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjQ1NzUyMzE3NjE1LC0xMjIuNDI3NTYyNTk2OTg1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2JiNTgxZmIwNTAzNGM3NTllZmQ1M2RmMzRlMmFhMmIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODc0Mzc4MzA5MTEyLC0xMjIuNDE5MjAzMDA0MjY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGZiNjZiOTA4NDE3NGIxMzg0NTBhYTU3YmVhNDMwNGUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDkzNjg4Mjg0NTMyLC0xMjIuNDEyNjkwMTQyMzA4MDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zOWMwOTAwZGMxMGQ0ODlkODM5ZGY2ODI5NmZiYjQ2ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcwOTIwMTA0NjIzNzksLTEyMi40MzQ2MDkyODAzNTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xZTFmYjY4MDljZTk0YzY1YjdlZmI0YjQ3MGE3ZWQyZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NzkyMDkzNzU1MzI5NSwtMTIyLjQxMDg4MjgyNTU1MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIwMDlkN2Q5ZjVhNDQwNzFiM2YzMzY1ZmM2YmZmNjk5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuODAwNDU2NjQ3MTAzODksLTEyMi40MDE0MzI3NTQ3MjIwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVjOGY3MDFmNTdjNDRhOWNiODY4Y2FiNzRlMzM4YjI1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzQzNTU1MDU0MjI2NSwtMTIyLjQyMTEyODAyOTUwNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg1MGUxOGIzZDFiZDRjZWY4MGRmMGNmZjYxZTliODQyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg2NTY0NzYwNzY4NSwtMTIyLjQwNzI0NDA4NzAzMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIyNjA1YjNiNjUxNTQ1ODlhZGEwZDQyNjQzYjljMjE1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzYxNTY1NTkyODA0NSwtMTIyLjQyMzgwMzAwMTkwMDk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTYzMzViZmQwZTVkNDM1MTg1M2VjYzVkNzg4ZTNjODEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjE1NjU1OTI4MDQ1LC0xMjIuNDIzODAzMDAxOTAwOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83ZjFkOTE3ZTk4MzA0ZGJlODM0ZWQxMGRjZjA2OTRhZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0NDE5Mjc1MDg5MzIwNSwtMTIyLjQ0NDY4NTQ4MjI3M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA5OGViZTI5NTkyMTQ1OGJiNjBmMzZkYjc4MzhhNTFiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1NDY5MjgyMDA0MSwtMTIyLjQxNTc1NzAzOTE5Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I1MzAzOThiZDI4MTRlOTFhMDVhZDI3NmNkMGY4MmQ3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzI4NTI4MDYyNzQ2NSwtMTIyLjQ3NTY0NzQ2MDc4NTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDg5ZjgzMmQ0MWVlNGYwZGFjNzljY2I1ODVkMTU4MDcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDI4NTE3Mzc0NDQ4OTQsLTEyMi40MjA5Njc0NDA1NjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yZGNmZDg0ZDM0ODM0YWZhYjBiOTM0MjVhMzFlNjIzZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MjExOTg0ODg5MzEsLTEyMi40MTU2Njk2NjE0NDNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lZjZhMDk0NDg0NzQ0Yzg4OGMyNTdmOTA0ZDQ3MWQ5ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3OTE2NzQyMTg5NjMsLTEyMi40MDYzNDY0MjU2MzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hNTJjYmZkNjQ4OWY0M2UwYWEyODc2MzI5MmU3MTFmMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NTcxODQzOTUyODIsLTEyMi40MDk1Mjk5MTMyNzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jMmI3ZGJlN2UyOTc0Y2QyOTdjYTMwOTZjMTJkNGIwOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NTQyMDcwNjcxMSwtMTIyLjQwMzQwNDc5MTQ3ODk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmQyYzc4OTc3ZWIwNDQyYmIxOGVkMmVjMGFhM2E1ZWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43Njc1MjQzMDg3ODMsLTEyMi40MTA3MzgwOTczMTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jMDhjN2U3ZDNiMTg0MDViYjllMjZkZjE1ZjMyZjQ4MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NzUyNDMwODc4MywtMTIyLjQxMDczODA5NzMxNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JhNTAxOThiNWI4ZTQ5MzY4ZDgwNmEyMmI1OTQzYTY5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzEzMTA4MzQzMzI2NCwtMTIyLjQ0NDMxNDAyNTE4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NkMGFkNWU4MTY4YzQyMTg4YzVjOTA0YTEyODk5M2M1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzEzMTA4MzQzMzI2NCwtMTIyLjQ0NDMxNDAyNTE4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2VkZTFmN2MyNjcyNjQ3YzE5ZWFmODUzODdkNTExYTNkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY2MDE2MDExNDEwMywtMTIyLjQwMzY0NDYyMDQzOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRlODZlMGQ5ZTU5YTQyMjFiZGQ0MjU5Y2E1ZWRhZTljID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY2MDE2MDExNDEwMywtMTIyLjQwMzY0NDYyMDQzOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc0ZDE0ZGQyMGFkMTQ2ODJhM2ZhMmI3Y2RkNzlhOGFkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc2MjMxMDQwNDc1OCwtMTIyLjQxNDcxNDI5NTU3ODk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTA2Y2Y3ZTNlYzQ5NDhjOWEwMWU3MWQyYWE4NDhjNzcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzYyMzEwNDA0NzU4LC0xMjIuNDE0NzE0Mjk1NTc4OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84MGU0YjEwYzUxMDM0YzNkOGE1OTI1YjdhMjgyYmM2MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NzUxMTg4OTU2OTUsLTEyMi40MTgwNDU0NTI3NjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81MTc2YjJjMGNjZjU0OTBhYTFiNzE5NTRmODMyNzNiZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MjAyMzg0Nzg5NzUsLTEyMi40MDExNjE1NTU2MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82NDczMzY2ZDIyM2I0MmU2ODkzZjcyNDIyODhiMGFhNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyNzAwNTMxOTYyOTk5NSwtMTIyLjQwMzQwODY2OTE5MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA3ZGFhNjhmYTFlNzQ1ZTY5ZjZkMDIyMmM2OTNkMWI5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzODM0NDM3NDE0MSwtMTIyLjQxMjkzMDUyMjA1OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2UwOGMzYzIzZTUwZjRjNGY5YjE3NDQ2YWRhNzFiZDQ5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzUzMDE4NjUzNzQ0NjA0LC0xMjIuNDE4NTg3MTcyMjE5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGUxYzA3ZDUzMDkxNGNhZGJiNzQxMTUzYjVjNDFkNTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzQwNDE4Mzg1MDQxLC0xMjIuNDE0MzcwNjI3NDk1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDYyZjNlOGFiMzZkNDE5MjhiMjM4N2YwZDQxZjRhODIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43OTA1Mzg5OTM3MjUsLTEyMi40MDM5MTU2ODE1NzEwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBmN2Y2ZDQyM2FjMzRkMzBiMGM4NmU1OGU4NjgzMmIyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzMDk5ODI0NDU5MjEsLTEyMi40MTkxODMwOTYzNjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82OGY4YTNlMjNlNzM0M2VjYjkyNGE3NTdhZmY5OGZhMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0MDczNjA1NDgzNTc5LC0xMjIuMzg4NzUzMDQ2OTk3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTcyZDgxMzFhYTRhNGZjYWE4ZmJjYjA3MDU2NDczOGMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzQ5OTEyOTQ0MzY2LC0xMjIuNDM3Nzk5NzAzNDY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjQwZmQ3YjU4NmU1NGI3YWI0NTA0Zjk0OGI3N2I5M2IgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzcwOTAyNzQzNjY5LC0xMjIuNDIxMzMyNjg0NjMzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGFmOWQxZDgwZGYwNDBiNDk5NGI5ZjFkMzI2MmM5YWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzcwOTAyNzQzNjY5LC0xMjIuNDIxMzMyNjg0NjMzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTRjNmYxZDVkZjlkNGIyY2FhM2Y3YzhiYzRmN2U4MmEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODIyNDU4MjIzOTE3LC0xMjIuNDQ2NjEyOTc4ODM5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzc0MzQ5NTJjYmIzNDcyZmJhZDFiZmQ5OTgwYjM0NDMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MzAwMzc5OTk1MTI3OTUsLTEyMi40MDQ1OTQxNDA2MzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82MDE5MTUxOWIwNGE0ZjU3OWE5NmI1MGNiNzgzZGI4YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc5NTMzMzgyNjc0MzYsLTEyMi4zOTczNzM3NDAwNjZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xZDg3MTUwMzZjN2E0NjEwYmRhODE0ZDEyM2M2ZmU0NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NzUxNTg3NDE2MjI5NSwtMTIyLjQwNzQzNDk4OTUyM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc5Y2MzODljNmEyYjQ2YjQ4OTdiMTY0NGM5NmIxNGI4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc4NTIzMzc3NjAzMiwtMTIyLjQwMzQ2NDA4MDAzM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzgzMzA3ZTRmMDlkNjRiYzc5MmM1Yzc1YjU0NGMzMjE2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc4NTIzMzc3NjAzMiwtMTIyLjQwMzQ2NDA4MDAzM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2MwYWVlYTVjYzRhOTQwYTc5YTRiNWRkZGQ1OGQ1YzgzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzczMjkxODA2OTAyOTk2LC0xMjIuNDM2NjE0MTgxMzMxMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81NmFjYmVjOTQxYzE0NjM3YmQwOWFjNDVhY2E0NWUyYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MDUyNzU3ODUwOSwtMTIyLjM5Njg0OTAxNTE3MjAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmJkOTk3M2UwYTNkNDYzZTgwNzViZmI1M2IyMDMzZWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODA1Mjc1Nzg1MDksLTEyMi4zOTY4NDkwMTUxNzIwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI0MjU1NjQwNmRiYjQxMTc5ZjgwYjliOWEwZWIyNDViID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzI4NDE4MDcwNjYwMjA0LC0xMjIuNDUwMDAwNzkwNDQ1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTBlY2I5NTVhYmY3NGExNmI3OGYwODY4OTkxNDdmOTUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjkyMTE0NjQ3MzU5LC0xMjIuNDAwODM0MjgzMDMxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDBhZGQ0YzZhZmI2NDkxZDg1MjkwNTc0NTY5ZTNkMmQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODgwMDY1MzI0MzkyMDUsLTEyMi4zOTk4MDIxNDU3OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xMDIwMjMzMmI5NTA0MDUyYWY1OTNjZThmOGFiMjAzNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyMzk3NDgyNDE2MDksLTEyMi4zOTQ5Mjg0NzU4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTBjYzdkNGRmZjExNGE4OWFmMmVhN2ZmZDZjYzI0N2IgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjM5NzQ4MjQxNjA5LC0xMjIuMzk0OTI4NDc1OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RhMGRjODFkNTc2MDQ5Y2JhZGI2MTZkY2JjNmE1MGRhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzIzOTc0ODI0MTYwOSwtMTIyLjM5NDkyODQ3NThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xZTljMDBkZjJmNDU0OWMxOGYzYzBiNGVjM2U2ZTkwYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4ODMyMzU0NDk5MDQsLTEyMi40MTE4NTcwMzI1NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVhYTBmZDU4NzU2NDQ2ZDI4ODZiODE5NmE3OTBhOTJkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzU1OTk3NzMzOTg1NiwtMTIyLjQwOTQzNTYxNzEwNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhmODVkY2I0YzY3MTQyMWVhOWUzZjU4ZmUyNDlmYTQ1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg3MDc5ODE0NDQ0MywtMTIyLjQyNTg4MzM1ODE0OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M2NDU4NmU4NTUwNzRlZTZiNGYwYzFjNzk5ZTg5ZjA5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzM2MDM3NDQ2Njg2MjA0LC0xMjIuNDE1MTI2NTQzMDAxMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mZjRkOTkwOTIyNDE0Y2ZhOTE1ZjZhMzMxM2M5MTI1OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcxMjc2Nzg4NDgyMSwtMTIyLjQzMTkyODAxMTA4OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRmYzUzOWQyZWViNzRkZTNhOGQyYzRjNDYxNWRhYjNjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg5NTcxMDI1NTg2MywtMTIyLjQwMjE2MzcxMzYxOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2YwYzgwZGM1MzZiYjQ2YjhiZDdkYzJiMTdmNmQ5OTllID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzMwNzQyOTE2OTU1OSwtMTIyLjQyOTMwNjcyODM3Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2QyYmE3MzljZmYyMzQ2M2Q5NTBlMjJmNzUwZWMzYjUzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzODM2NTU2NTM0Nzk0LC0xMjIuNDEzNzkwOTcyNzgwOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83MGY3YTQ4M2FhNTI0NjVmODQyNWUxM2NlOWQyZjlhMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczMDc0MjkxNjk1NTksLTEyMi40MjkzMDY3MjgzNzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83ZDA5MDQwNzZmNzI0OWVlYjAwOWEwY2YyZGI5ZTI2MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczNzM2MjM2MDUyMTI5NiwtMTIyLjQyMjA2NzE4NDkzN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY3ZDEwOWQ5NDk2NjRiMmJiNmMyODQ4ODRkMTg1MDk4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzM3MzYyMzYwNTIxMjk2LC0xMjIuNDIyMDY3MTg0OTM3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODQ5Y2U2ODgyNDA2NDkwZjg0YTBhODU5YTA5NTViYjQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODU5OTg4MzIzNzk3OTYsLTEyMi40MTE3NDczNzE5MjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yMWE1NTA2ZmZlNTg0MDljYjE3MmEyNmRhOTQ2MDI1YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2MzM3NTgwNTgwNTksLTEyMi40MjA0MzQ3MjQ1NTI5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc1YzczMjI1NmVjYTRlYzJiOGU3ODkwZjBhNGI0NGE2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg1MDIyNjYyMjc4NiwtMTIyLjQxMTk4NzY0MzU5NTAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmJhOGQ3MTg1YjY0NDhlYThkZGM1MzM2YzIyN2Q2YTUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzQ2MjA2NDkxMDY0OTUsLTEyMi41MDAzODA0Mjc5MTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zYjc2YzNiY2ExZjU0OTdlYjdiZGJiMGYzNjJhN2JmMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NTE5MTgyNjcyMTcsLTEyMi40NjY1NTg3ODA2ODNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83NDhhN2QyMjg1ZDI0Yjg4OThiNjNjM2JmNTNjNzJjNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0OTA4NDE3MjkwMjgsLTEyMi40ODY5MjU5NjAxMTQwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIyZjFiZDFhZDNiNDRjZTVhNWNhZTVjNWYxZGFiMzY1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY4NTM2MDEyMzU4MywtMTIyLjQxNTYxNjMzODMxOTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTc3YzBjYmJhNmJmNDlkMDg5ZTE0MDUyZTEwZjUzYjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjQ0Mjk3NzE0MDc0LC0xMjIuNDQ5NzUxNjUyNTYzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWU1M2NlMGU5MzYwNDY1Y2JlODg1MDg5MDllODI4OTMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjQ0Mjk3NzE0MDc0LC0xMjIuNDQ5NzUxNjUyNTYzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDVjOTJmNWE3YjA5NGE4YmE1Njc1ZWNkZjQyMGI2MTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MzUyNjgxNDY5MDgzOTYsLTEyMi40NzI3MTU3NTk2MzFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKPC9zY3JpcHQ+ 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 0x7ff4ed5f2c18>"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# instantiate a feature group for the incidents in the dataframe\n",
"incidents = folium.map.FeatureGroup()\n",
"\n",
"# loop through the 100 crimes and add each to the incidents feature group\n",
"for lat, lng, in zip(df_incidents.Y, df_incidents.X):\n",
" incidents.add_child(\n",
" folium.features.CircleMarker(\n",
" [lat, lng],\n",
" radius=5, # define how big you want the circle markers to be\n",
" color='yellow',\n",
" fill=True,\n",
" fill_color='blue',\n",
" fill_opacity=0.6\n",
" )\n",
" )\n",
"\n",
"# add incidents to map\n",
"sanfran_map.add_child(incidents)"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"You can also add some pop-up text that would get displayed when you hover over a marker. Let's make each marker display the category of the crime when hovered over."
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"jupyter": {
"outputs_hidden": false
},
"new_sheet": false,
"run_control": {
"read_only": 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+ICNtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzVkYTFlOWM0NWNhNzRlZWFhYTIxZGQzMWNiYmJjYTc0IiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF81ZGExZTljNDVjYTc0ZWVhYWEyMWRkMzFjYmJiY2E3NCA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF81ZGExZTljNDVjYTc0ZWVhYWEyMWRkMzFjYmJiY2E3NCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbMzcuNzcsLTEyMi40Ml0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiAxMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfZTIxMjY0MjNjMjcxNDc1ZWE4NmE4MmQzNjliZGY0YmMgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzID0gTC5mZWF0dXJlR3JvdXAoCiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF81ZGExZTljNDVjYTc0ZWVhYWEyMWRkMzFjYmJiY2E3NCk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjVkOGQ5NWNkNjY4NDJkNGFiNWRiMGQ2YjUxNWMzMmQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzU0MjA3MDY3MTEsLTEyMi40MDM0MDQ3OTE0Nzg5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2VmNWQ2YjYxZjU5NTQ3YWVhM2VlNThhYTBhMzg0NjU0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1NDIwNzA2NzExLC0xMjIuNDAzNDA0NzkxNDc4OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82MTVkYjE2ZWZiNjg0Zjc4OTVhZjE2MTliMzcyMGM5MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyOTk4MDk2NzI5OTU5NiwtMTIyLjM4ODg1NjIwNDI5Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg2MjM2MWIxYWZkNzQ5NzRhYmMzNTc3MmFhZTZiZTMyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg1Nzg4Mzc2Njg4NzksLTEyMi40MTI5NzA1Mzc1OTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hY2RhZDRkMTY4ZGY0YzJlODY5ODBhMDljNjA0NmVlMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NTA1MDEyMTQ2NjgsLTEyMi40MTk2NzE3ODAyOTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85MzdhNjA1M2M1ZWE0MjRkYTc5NGM1MDBmNzczOGM4NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4ODAxODU1NTgyOSwtMTIyLjQyNjA3NzE3NzM3NDk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWVhMGViYmIzYTY5NGY5Y2EzZTUyMTg0YzhlNDg0YmUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODA4Nzg5MzYwMjE0LC0xMjIuNDA1NzIxNDU0NTY3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzRlNDRjNjEyYTRiNGEzM2IzNjk1YTg5YWYzOTE4YWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODM5ODA1NTkyNjM0LC0xMjIuNDExNzc4Mjk1OTkyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWZjNjJlZDZhZDAzNDZiYjhiMjMzZDk1ZDhjNDM3OGMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzU3ODc2MjE4MjkyOTUsLTEyMi4zOTMzNTcyNDE0NTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yY2ZhYmRjMjcyMjc0NTViYmMxMzY0YzNkYzNiOTEzMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyMDk2Njk2MTU0OTksLTEyMi4zODcxODE2MzU5OTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yZTRhMTM1ZjE4MWI0MmM0YWNjMWRlMDgyNzI4ZDZiMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NDQ3ODE1Nzg2OTUwNSwtMTIyLjQ3NzM3NjUyNDAwMjk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmM3OTQzNGJhNzU4NGQzMDg3NDZiNWM4NzY3M2JkYjAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDU3Mzg5NDI5NjU0OTUsLTEyMi40Nzc5NjAzMjcyOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jNWM1ZjM5OWQ3Y2U0YjZkYWI3MjcwMWM1OWVlMjgwNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczNTY5NzAyNzU0ODIwNiwtMTIyLjM3Njc1NzY1NTUzMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmYzYmFjY2EwNDc4NDYwNWExMjE5MjQ0NjkwNzYzNDUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjkyNzA1MTk5NTkyLC0xMjIuNDMyMzI1ODcxMDI4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGIxNWZlZjdiMTFmNDQxODlkZTZlMzYwYmJlZjA5NGMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43OTE2NDI5ODIzODQsLTEyMi40MDA5MDg2OTg4ODk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzExM2U5YzBiNmI0ODRhMjQ5NzMxYTc5MmQwOTkxMjRmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzNzA2OTMwMTU0NSwtMTIyLjQwODU5NTExMDg2OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FjNmEyOTY1NGRjNTRlNGJiZjc1YTRjZTMwNzlhMjNlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzU3Mjg5NTkwNDU3Nzk1LC0xMjIuNDA2ODcwNDAyMDgyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTdmZTg0ZDllMzkwNDNjZGFlZTAwYjlhY2FjNTNlNjQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDg5MDYzMDUxODI5LC0xMjIuNDIwMzU0NzgwODYwOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NmU1Zjk0Mzg4NDg0MDhiOGMyNDA4YzY0MzZiMDdhZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcxNTc2NTQyNjk5NSwtMTIyLjQzOTkwOTc2Njc3Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U1ZTk4NjNkZGYzYjQxM2JhNDc5M2I0Y2JmYmFlN2MxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzNTY5OTM4NjkxOCwtMTIyLjQwODQyMTExNjkyMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzkyY2U1ZTc4MTg2YzQ5Y2ZhMmQ5ZjJmMGNmMWQxYWQ3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzczNjE4NjI3NjQ1NjA0LC0xMjIuNDIyMzE1NjcwNzQ5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWUwYmE1MDY5YTVmNDU0MWIxNjNkZDYzNDhmYzNlY2MgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43OTI4NDEyODQwNDQ3MDUsLTEyMi40MjQ1MTk4MzUwMDkwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2EwNzNlZGJjOGRhNzQ2Zjc5NTJhZmYxZWUwNzNkZjU0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzU0MDk4Njg4MjA2Nzk1LC0xMjIuNDE0MjMzODQ5MDM3OThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81NzgzMjFlMjBhNDg0MDAzYmE4YTIxMGEzZGYyYWU2YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc1NDA5ODY4ODIwNjc5NSwtMTIyLjQxNDIzMzg0OTAzNzk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzFjMjI0ZGUzOWJlNDM2M2FkZDdiZTUyNjVhY2IyNWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzE0OTM5OTY5NDE2LC0xMjIuNTA3NzUwMTMxMDA0MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83NzFhYzdjMDQ5ZmU0ZjE2YmYzZmM0OWRmNDdmMGE4NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcxODMwMjIwNDc2NjAwNSwtMTIyLjQ3NDQ0NDYzOTU5NDk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZThmYTY4YzUxNDliNDgyNjkyNDMyNDY0ZDNlMDFjNzUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjQ1NzUyMzE3NjE1LC0xMjIuNDI3NTYyNTk2OTg1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2JiNTgxZmIwNTAzNGM3NTllZmQ1M2RmMzRlMmFhMmIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODc0Mzc4MzA5MTEyLC0xMjIuNDE5MjAzMDA0MjY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGZiNjZiOTA4NDE3NGIxMzg0NTBhYTU3YmVhNDMwNGUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDkzNjg4Mjg0NTMyLC0xMjIuNDEyNjkwMTQyMzA4MDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zOWMwOTAwZGMxMGQ0ODlkODM5ZGY2ODI5NmZiYjQ2ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcwOTIwMTA0NjIzNzksLTEyMi40MzQ2MDkyODAzNTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xZTFmYjY4MDljZTk0YzY1YjdlZmI0YjQ3MGE3ZWQyZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NzkyMDkzNzU1MzI5NSwtMTIyLjQxMDg4MjgyNTU1MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIwMDlkN2Q5ZjVhNDQwNzFiM2YzMzY1ZmM2YmZmNjk5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuODAwNDU2NjQ3MTAzODksLTEyMi40MDE0MzI3NTQ3MjIwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVjOGY3MDFmNTdjNDRhOWNiODY4Y2FiNzRlMzM4YjI1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzQzNTU1MDU0MjI2NSwtMTIyLjQyMTEyODAyOTUwNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg1MGUxOGIzZDFiZDRjZWY4MGRmMGNmZjYxZTliODQyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg2NTY0NzYwNzY4NSwtMTIyLjQwNzI0NDA4NzAzMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIyNjA1YjNiNjUxNTQ1ODlhZGEwZDQyNjQzYjljMjE1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzYxNTY1NTkyODA0NSwtMTIyLjQyMzgwMzAwMTkwMDk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTYzMzViZmQwZTVkNDM1MTg1M2VjYzVkNzg4ZTNjODEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjE1NjU1OTI4MDQ1LC0xMjIuNDIzODAzMDAxOTAwOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83ZjFkOTE3ZTk4MzA0ZGJlODM0ZWQxMGRjZjA2OTRhZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0NDE5Mjc1MDg5MzIwNSwtMTIyLjQ0NDY4NTQ4MjI3M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA5OGViZTI5NTkyMTQ1OGJiNjBmMzZkYjc4MzhhNTFiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1NDY5MjgyMDA0MSwtMTIyLjQxNTc1NzAzOTE5Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I1MzAzOThiZDI4MTRlOTFhMDVhZDI3NmNkMGY4MmQ3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzI4NTI4MDYyNzQ2NSwtMTIyLjQ3NTY0NzQ2MDc4NTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDg5ZjgzMmQ0MWVlNGYwZGFjNzljY2I1ODVkMTU4MDcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDI4NTE3Mzc0NDQ4OTQsLTEyMi40MjA5Njc0NDA1NjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yZGNmZDg0ZDM0ODM0YWZhYjBiOTM0MjVhMzFlNjIzZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MjExOTg0ODg5MzEsLTEyMi40MTU2Njk2NjE0NDNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lZjZhMDk0NDg0NzQ0Yzg4OGMyNTdmOTA0ZDQ3MWQ5ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3OTE2NzQyMTg5NjMsLTEyMi40MDYzNDY0MjU2MzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hNTJjYmZkNjQ4OWY0M2UwYWEyODc2MzI5MmU3MTFmMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NTcxODQzOTUyODIsLTEyMi40MDk1Mjk5MTMyNzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jMmI3ZGJlN2UyOTc0Y2QyOTdjYTMwOTZjMTJkNGIwOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NTQyMDcwNjcxMSwtMTIyLjQwMzQwNDc5MTQ3ODk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmQyYzc4OTc3ZWIwNDQyYmIxOGVkMmVjMGFhM2E1ZWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43Njc1MjQzMDg3ODMsLTEyMi40MTA3MzgwOTczMTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jMDhjN2U3ZDNiMTg0MDViYjllMjZkZjE1ZjMyZjQ4MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NzUyNDMwODc4MywtMTIyLjQxMDczODA5NzMxNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JhNTAxOThiNWI4ZTQ5MzY4ZDgwNmEyMmI1OTQzYTY5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzEzMTA4MzQzMzI2NCwtMTIyLjQ0NDMxNDAyNTE4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NkMGFkNWU4MTY4YzQyMTg4YzVjOTA0YTEyODk5M2M1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzEzMTA4MzQzMzI2NCwtMTIyLjQ0NDMxNDAyNTE4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2VkZTFmN2MyNjcyNjQ3YzE5ZWFmODUzODdkNTExYTNkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY2MDE2MDExNDEwMywtMTIyLjQwMzY0NDYyMDQzOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRlODZlMGQ5ZTU5YTQyMjFiZGQ0MjU5Y2E1ZWRhZTljID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY2MDE2MDExNDEwMywtMTIyLjQwMzY0NDYyMDQzOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc0ZDE0ZGQyMGFkMTQ2ODJhM2ZhMmI3Y2RkNzlhOGFkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc2MjMxMDQwNDc1OCwtMTIyLjQxNDcxNDI5NTU3ODk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTA2Y2Y3ZTNlYzQ5NDhjOWEwMWU3MWQyYWE4NDhjNzcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzYyMzEwNDA0NzU4LC0xMjIuNDE0NzE0Mjk1NTc4OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84MGU0YjEwYzUxMDM0YzNkOGE1OTI1YjdhMjgyYmM2MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NzUxMTg4OTU2OTUsLTEyMi40MTgwNDU0NTI3NjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81MTc2YjJjMGNjZjU0OTBhYTFiNzE5NTRmODMyNzNiZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MjAyMzg0Nzg5NzUsLTEyMi40MDExNjE1NTU2MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82NDczMzY2ZDIyM2I0MmU2ODkzZjcyNDIyODhiMGFhNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyNzAwNTMxOTYyOTk5NSwtMTIyLjQwMzQwODY2OTE5MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA3ZGFhNjhmYTFlNzQ1ZTY5ZjZkMDIyMmM2OTNkMWI5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzODM0NDM3NDE0MSwtMTIyLjQxMjkzMDUyMjA1OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2UwOGMzYzIzZTUwZjRjNGY5YjE3NDQ2YWRhNzFiZDQ5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzUzMDE4NjUzNzQ0NjA0LC0xMjIuNDE4NTg3MTcyMjE5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGUxYzA3ZDUzMDkxNGNhZGJiNzQxMTUzYjVjNDFkNTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzQwNDE4Mzg1MDQxLC0xMjIuNDE0MzcwNjI3NDk1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDYyZjNlOGFiMzZkNDE5MjhiMjM4N2YwZDQxZjRhODIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43OTA1Mzg5OTM3MjUsLTEyMi40MDM5MTU2ODE1NzEwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBmN2Y2ZDQyM2FjMzRkMzBiMGM4NmU1OGU4NjgzMmIyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzMDk5ODI0NDU5MjEsLTEyMi40MTkxODMwOTYzNjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82OGY4YTNlMjNlNzM0M2VjYjkyNGE3NTdhZmY5OGZhMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0MDczNjA1NDgzNTc5LC0xMjIuMzg4NzUzMDQ2OTk3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTcyZDgxMzFhYTRhNGZjYWE4ZmJjYjA3MDU2NDczOGMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzQ5OTEyOTQ0MzY2LC0xMjIuNDM3Nzk5NzAzNDY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjQwZmQ3YjU4NmU1NGI3YWI0NTA0Zjk0OGI3N2I5M2IgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzcwOTAyNzQzNjY5LC0xMjIuNDIxMzMyNjg0NjMzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGFmOWQxZDgwZGYwNDBiNDk5NGI5ZjFkMzI2MmM5YWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzcwOTAyNzQzNjY5LC0xMjIuNDIxMzMyNjg0NjMzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTRjNmYxZDVkZjlkNGIyY2FhM2Y3YzhiYzRmN2U4MmEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODIyNDU4MjIzOTE3LC0xMjIuNDQ2NjEyOTc4ODM5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzc0MzQ5NTJjYmIzNDcyZmJhZDFiZmQ5OTgwYjM0NDMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MzAwMzc5OTk1MTI3OTUsLTEyMi40MDQ1OTQxNDA2MzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82MDE5MTUxOWIwNGE0ZjU3OWE5NmI1MGNiNzgzZGI4YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc5NTMzMzgyNjc0MzYsLTEyMi4zOTczNzM3NDAwNjZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xZDg3MTUwMzZjN2E0NjEwYmRhODE0ZDEyM2M2ZmU0NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NzUxNTg3NDE2MjI5NSwtMTIyLjQwNzQzNDk4OTUyM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc5Y2MzODljNmEyYjQ2YjQ4OTdiMTY0NGM5NmIxNGI4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc4NTIzMzc3NjAzMiwtMTIyLjQwMzQ2NDA4MDAzM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzgzMzA3ZTRmMDlkNjRiYzc5MmM1Yzc1YjU0NGMzMjE2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc4NTIzMzc3NjAzMiwtMTIyLjQwMzQ2NDA4MDAzM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2MwYWVlYTVjYzRhOTQwYTc5YTRiNWRkZGQ1OGQ1YzgzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzczMjkxODA2OTAyOTk2LC0xMjIuNDM2NjE0MTgxMzMxMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81NmFjYmVjOTQxYzE0NjM3YmQwOWFjNDVhY2E0NWUyYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MDUyNzU3ODUwOSwtMTIyLjM5Njg0OTAxNTE3MjAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmJkOTk3M2UwYTNkNDYzZTgwNzViZmI1M2IyMDMzZWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODA1Mjc1Nzg1MDksLTEyMi4zOTY4NDkwMTUxNzIwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI0MjU1NjQwNmRiYjQxMTc5ZjgwYjliOWEwZWIyNDViID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzI4NDE4MDcwNjYwMjA0LC0xMjIuNDUwMDAwNzkwNDQ1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTBlY2I5NTVhYmY3NGExNmI3OGYwODY4OTkxNDdmOTUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjkyMTE0NjQ3MzU5LC0xMjIuNDAwODM0MjgzMDMxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDBhZGQ0YzZhZmI2NDkxZDg1MjkwNTc0NTY5ZTNkMmQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODgwMDY1MzI0MzkyMDUsLTEyMi4zOTk4MDIxNDU3OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xMDIwMjMzMmI5NTA0MDUyYWY1OTNjZThmOGFiMjAzNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyMzk3NDgyNDE2MDksLTEyMi4zOTQ5Mjg0NzU4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTBjYzdkNGRmZjExNGE4OWFmMmVhN2ZmZDZjYzI0N2IgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjM5NzQ4MjQxNjA5LC0xMjIuMzk0OTI4NDc1OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RhMGRjODFkNTc2MDQ5Y2JhZGI2MTZkY2JjNmE1MGRhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzIzOTc0ODI0MTYwOSwtMTIyLjM5NDkyODQ3NThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xZTljMDBkZjJmNDU0OWMxOGYzYzBiNGVjM2U2ZTkwYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4ODMyMzU0NDk5MDQsLTEyMi40MTE4NTcwMzI1NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVhYTBmZDU4NzU2NDQ2ZDI4ODZiODE5NmE3OTBhOTJkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzU1OTk3NzMzOTg1NiwtMTIyLjQwOTQzNTYxNzEwNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhmODVkY2I0YzY3MTQyMWVhOWUzZjU4ZmUyNDlmYTQ1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg3MDc5ODE0NDQ0MywtMTIyLjQyNTg4MzM1ODE0OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M2NDU4NmU4NTUwNzRlZTZiNGYwYzFjNzk5ZTg5ZjA5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzM2MDM3NDQ2Njg2MjA0LC0xMjIuNDE1MTI2NTQzMDAxMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mZjRkOTkwOTIyNDE0Y2ZhOTE1ZjZhMzMxM2M5MTI1OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcxMjc2Nzg4NDgyMSwtMTIyLjQzMTkyODAxMTA4OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRmYzUzOWQyZWViNzRkZTNhOGQyYzRjNDYxNWRhYjNjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg5NTcxMDI1NTg2MywtMTIyLjQwMjE2MzcxMzYxOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2YwYzgwZGM1MzZiYjQ2YjhiZDdkYzJiMTdmNmQ5OTllID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzMwNzQyOTE2OTU1OSwtMTIyLjQyOTMwNjcyODM3Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2QyYmE3MzljZmYyMzQ2M2Q5NTBlMjJmNzUwZWMzYjUzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzODM2NTU2NTM0Nzk0LC0xMjIuNDEzNzkwOTcyNzgwOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83MGY3YTQ4M2FhNTI0NjVmODQyNWUxM2NlOWQyZjlhMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczMDc0MjkxNjk1NTksLTEyMi40MjkzMDY3MjgzNzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83ZDA5MDQwNzZmNzI0OWVlYjAwOWEwY2YyZGI5ZTI2MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczNzM2MjM2MDUyMTI5NiwtMTIyLjQyMjA2NzE4NDkzN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY3ZDEwOWQ5NDk2NjRiMmJiNmMyODQ4ODRkMTg1MDk4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzM3MzYyMzYwNTIxMjk2LC0xMjIuNDIyMDY3MTg0OTM3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODQ5Y2U2ODgyNDA2NDkwZjg0YTBhODU5YTA5NTViYjQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODU5OTg4MzIzNzk3OTYsLTEyMi40MTE3NDczNzE5MjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yMWE1NTA2ZmZlNTg0MDljYjE3MmEyNmRhOTQ2MDI1YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2MzM3NTgwNTgwNTksLTEyMi40MjA0MzQ3MjQ1NTI5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc1YzczMjI1NmVjYTRlYzJiOGU3ODkwZjBhNGI0NGE2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg1MDIyNjYyMjc4NiwtMTIyLjQxMTk4NzY0MzU5NTAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmJhOGQ3MTg1YjY0NDhlYThkZGM1MzM2YzIyN2Q2YTUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzQ2MjA2NDkxMDY0OTUsLTEyMi41MDAzODA0Mjc5MTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zYjc2YzNiY2ExZjU0OTdlYjdiZGJiMGYzNjJhN2JmMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NTE5MTgyNjcyMTcsLTEyMi40NjY1NTg3ODA2ODNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83NDhhN2QyMjg1ZDI0Yjg4OThiNjNjM2JmNTNjNzJjNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0OTA4NDE3MjkwMjgsLTEyMi40ODY5MjU5NjAxMTQwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kZDk2NWQ0YTliNWY0ZmQwOTUwZTQxYWQwNTY2MjJlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIyZjFiZDFhZDNiNDRjZTVhNWNhZTVjNWYxZGFiMzY1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY4NTM2MDEyMzU4MywtMTIyLjQxNTYxNjMzODMxOTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTc3YzBjYmJhNmJmNDlkMDg5ZTE0MDUyZTEwZjUzYjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjQ0Mjk3NzE0MDc0LC0xMjIuNDQ5NzUxNjUyNTYzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWU1M2NlMGU5MzYwNDY1Y2JlODg1MDg5MDllODI4OTMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjQ0Mjk3NzE0MDc0LC0xMjIuNDQ5NzUxNjUyNTYzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RkOTY1ZDRhOWI1ZjRmZDA5NTBlNDFhZDA1NjYyMmUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDVjOTJmNWE3YjA5NGE4YmE1Njc1ZWNkZjQyMGI2MTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MzUyNjgxNDY5MDgzOTYsLTEyMi40NzI3MTU3NTk2MzFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGQ5NjVkNGE5YjVmNGZkMDk1MGU0MWFkMDU2NjIyZTMpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl81Y2E4Y2IxNTQxYzE0NTA1OTI2YjBlYWYyNWJmMjBhMCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NTQyMDcwNjcxMSwtMTIyLjQwMzQwNDc5MTQ3ODk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTE5ZGFmYzU4MzRhNDk1NjlmZDU2YTc3NzgxNTkwYzEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDQzZDM5NTk2OTNjNGY1OWI1NGY3MWE2ZjYxZjkxYzcgPSAkKCc8ZGl2IGlkPSJodG1sX2Q0M2QzOTU5NjkzYzRmNTliNTRmNzFhNmY2MWY5MWM3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XRUFQT04gTEFXUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTE5ZGFmYzU4MzRhNDk1NjlmZDU2YTc3NzgxNTkwYzEuc2V0Q29udGVudChodG1sX2Q0M2QzOTU5NjkzYzRmNTliNTRmNzFhNmY2MWY5MWM3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNWNhOGNiMTU0MWMxNDUwNTkyNmIwZWFmMjViZjIwYTAuYmluZFBvcHVwKHBvcHVwXzUxOWRhZmM1ODM0YTQ5NTY5ZmQ1NmE3Nzc4MTU5MGMxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzU0NzFiMjNhYTgwYjQ0MDNiM2JkZWNhNDM5ZWYzZmE5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1NDIwNzA2NzExLC0xMjIuNDAzNDA0NzkxNDc4OTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZGExZTljNDVjYTc0ZWVhYWEyMWRkMzFjYmJiY2E3NCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jN2I3ZTczZTQzYWU0OGQ1YTIzMzUwMjg1MzczYzZiNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81YmM1N2NhODMxMzQ0Nzg4OTYyYmI0NjAyOTU2NWFmZCA9ICQoJzxkaXYgaWQ9Imh0bWxfNWJjNTdjYTgzMTM0NDc4ODk2MmJiNDYwMjk1NjVhZmQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldFQVBPTiBMQVdTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jN2I3ZTczZTQzYWU0OGQ1YTIzMzUwMjg1MzczYzZiNC5zZXRDb250ZW50KGh0bWxfNWJjNTdjYTgzMTM0NDc4ODk2MmJiNDYwMjk1NjVhZmQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl81NDcxYjIzYWE4MGI0NDAzYjNiZGVjYTQzOWVmM2ZhOS5iaW5kUG9wdXAocG9wdXBfYzdiN2U3M2U0M2FlNDhkNWEyMzM1MDI4NTM3M2M2YjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOThlNjZlMGFmZmY3NDE4MDkyZGRjNzZlOTgzM2E0ZWIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43Mjk5ODA5NjcyOTk1OTYsLTEyMi4zODg4NTYyMDQyOTJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZGExZTljNDVjYTc0ZWVhYWEyMWRkMzFjYmJiY2E3NCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hYmQzMTNjNjllZTk0YmQ3ODljNWFjZTg1ODUyNTRkZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lZGZhMjg1OTNlZWE0MmUyOGQxOTQ0MTAyOTRjOTA3NyA9ICQoJzxkaXYgaWQ9Imh0bWxfZWRmYTI4NTkzZWVhNDJlMjhkMTk0NDEwMjk0YzkwNzciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldBUlJBTlRTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hYmQzMTNjNjllZTk0YmQ3ODljNWFjZTg1ODUyNTRkZi5zZXRDb250ZW50KGh0bWxfZWRmYTI4NTkzZWVhNDJlMjhkMTk0NDEwMjk0YzkwNzcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85OGU2NmUwYWZmZjc0MTgwOTJkZGM3NmU5ODMzYTRlYi5iaW5kUG9wdXAocG9wdXBfYWJkMzEzYzY5ZWU5NGJkNzg5YzVhY2U4NTg1MjU0ZGYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNjJlMDljZWM0NGZmNGI0ODk0MDczZjlmYjkwMWMyMzkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODU3ODgzNzY2ODg3OSwtMTIyLjQxMjk3MDUzNzU5MV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVkYTFlOWM0NWNhNzRlZWFhYTIxZGQzMWNiYmJjYTc0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E3ODAyYmU1YmVlYzRhYzI4OWVkYmRiMTA0MjUxYzE0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzlmZDdhNzE5NGNiOTQyMDZiMDZiZDY5YmE4OGFkYzc3ID0gJCgnPGRpdiBpZD0iaHRtbF85ZmQ3YTcxOTRjYjk0MjA2YjA2YmQ2OWJhODhhZGM3NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hNzgwMmJlNWJlZWM0YWMyODllZGJkYjEwNDI1MWMxNC5zZXRDb250ZW50KGh0bWxfOWZkN2E3MTk0Y2I5NDIwNmIwNmJkNjliYTg4YWRjNzcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82MmUwOWNlYzQ0ZmY0YjQ4OTQwNzNmOWZiOTAxYzIzOS5iaW5kUG9wdXAocG9wdXBfYTc4MDJiZTViZWVjNGFjMjg5ZWRiZGIxMDQyNTFjMTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMzFiNTJmOGVjYTM3NDQ0MGIwNzk4OGI0NTY3M2VjMGUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjUwNTAxMjE0NjY4LC0xMjIuNDE5NjcxNzgwMjk2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWM0ODVjM2Y5N2ZjNDEwYjg5MjZmNTcxYjk4YmU3YjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzBjNmRjYTg0YzYyNDE5MjhlMTUxZjY1YjM1MThiMmUgPSAkKCc8ZGl2IGlkPSJodG1sXzcwYzZkY2E4NGM2MjQxOTI4ZTE1MWY2NWIzNTE4YjJlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OT04tQ1JJTUlOQUw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFjNDg1YzNmOTdmYzQxMGI4OTI2ZjU3MWI5OGJlN2IyLnNldENvbnRlbnQoaHRtbF83MGM2ZGNhODRjNjI0MTkyOGUxNTFmNjViMzUxOGIyZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzMxYjUyZjhlY2EzNzQ0NDBiMDc5ODhiNDU2NzNlYzBlLmJpbmRQb3B1cChwb3B1cF8xYzQ4NWMzZjk3ZmM0MTBiODkyNmY1NzFiOThiZTdiMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8xMzUwMTg2ZmE2NGE0ZmNkOWM5ZmYxYzk3ZDZiYmI3YSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4ODAxODU1NTgyOSwtMTIyLjQyNjA3NzE3NzM3NDk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDFkYWQ1MmYwMTM1NGJkNDgwZjY4NzkxMDU5ODliZGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjBlYWZkNjMwODdlNDJkZTk4ODIxMjAzMDcxY2NkYzIgPSAkKCc8ZGl2IGlkPSJodG1sXzIwZWFmZDYzMDg3ZTQyZGU5ODgyMTIwMzA3MWNjZGMyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BU1NBVUxUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMWRhZDUyZjAxMzU0YmQ0ODBmNjg3OTEwNTk4OWJkYS5zZXRDb250ZW50KGh0bWxfMjBlYWZkNjMwODdlNDJkZTk4ODIxMjAzMDcxY2NkYzIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8xMzUwMTg2ZmE2NGE0ZmNkOWM5ZmYxYzk3ZDZiYmI3YS5iaW5kUG9wdXAocG9wdXBfMDFkYWQ1MmYwMTM1NGJkNDgwZjY4NzkxMDU5ODliZGEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMDMyZjYxMDFmODk0NDYwMDk1MWQxOGU0M2I1MDJkZTIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODA4Nzg5MzYwMjE0LC0xMjIuNDA1NzIxNDU0NTY3XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzBkM2VkNWJlN2I5NDU3ZmI2YjZlZDQ2ZDMzOGU0YjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjE5ZjlhYmIyOTE1NGUzZTk1ODQ3NjZlMDg2ODNkZTcgPSAkKCc8ZGl2IGlkPSJodG1sX2IxOWY5YWJiMjkxNTRlM2U5NTg0NzY2ZTA4NjgzZGU3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzBkM2VkNWJlN2I5NDU3ZmI2YjZlZDQ2ZDMzOGU0Yjkuc2V0Q29udGVudChodG1sX2IxOWY5YWJiMjkxNTRlM2U5NTg0NzY2ZTA4NjgzZGU3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMDMyZjYxMDFmODk0NDYwMDk1MWQxOGU0M2I1MDJkZTIuYmluZFBvcHVwKHBvcHVwXzMwZDNlZDViZTdiOTQ1N2ZiNmI2ZWQ0NmQzMzhlNGI5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2M5ZWMyNTUyYmY3MjRlNjliYTc5ZjNkY2M4ZjllYjdjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzOTgwNTU5MjYzNCwtMTIyLjQxMTc3ODI5NTk5Ml0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVkYTFlOWM0NWNhNzRlZWFhYTIxZGQzMWNiYmJjYTc0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzYwNGQ2NDZkZTlmNTQwMGI4MmIxYmE4ZjQwM2JiNjlkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzllYjg4NzlmNWVlNjRiNjdiOTcyZDQ4NzgwZDI5YmY2ID0gJCgnPGRpdiBpZD0iaHRtbF85ZWI4ODc5ZjVlZTY0YjY3Yjk3MmQ0ODc4MGQyOWJmNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MDRkNjQ2ZGU5ZjU0MDBiODJiMWJhOGY0MDNiYjY5ZC5zZXRDb250ZW50KGh0bWxfOWViODg3OWY1ZWU2NGI2N2I5NzJkNDg3ODBkMjliZjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jOWVjMjU1MmJmNzI0ZTY5YmE3OWYzZGNjOGY5ZWI3Yy5iaW5kUG9wdXAocG9wdXBfNjA0ZDY0NmRlOWY1NDAwYjgyYjFiYThmNDAzYmI2OWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNzAyMmIyMDgxODk1NGE3N2JiNmJhODBhYTM1NDdmOWIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzU3ODc2MjE4MjkyOTUsLTEyMi4zOTMzNTcyNDE0NTFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZGExZTljNDVjYTc0ZWVhYWEyMWRkMzFjYmJiY2E3NCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wYzM3Y2E0ZWEzMzQ0MDUyODkzNTkwOWJlZWNiNTkwOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83NDI1ZTA0OTMyMzA0YzBlYmYwZmQ1NWZhZjFhMmJmZSA9ICQoJzxkaXYgaWQ9Imh0bWxfNzQyNWUwNDkzMjMwNGMwZWJmMGZkNTVmYWYxYTJiZmUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldBUlJBTlRTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wYzM3Y2E0ZWEzMzQ0MDUyODkzNTkwOWJlZWNiNTkwOS5zZXRDb250ZW50KGh0bWxfNzQyNWUwNDkzMjMwNGMwZWJmMGZkNTVmYWYxYTJiZmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl83MDIyYjIwODE4OTU0YTc3YmI2YmE4MGFhMzU0N2Y5Yi5iaW5kUG9wdXAocG9wdXBfMGMzN2NhNGVhMzM0NDA1Mjg5MzU5MDliZWVjYjU5MDkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfM2EyMjI2MzM2NTIwNGJkMTkzMDRkMTliMGJjZjUxNmUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjA5NjY5NjE1NDk5LC0xMjIuMzg3MTgxNjM1OTk1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2VkNDliYzZkNjE5NDUxZWFiNzZkMWNhM2MwZGQzMzIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzU0NjRkNjhjZjc5NGFkZTgwZjk5ODBlOGNiMzNhZmEgPSAkKCc8ZGl2IGlkPSJodG1sXzc1NDY0ZDY4Y2Y3OTRhZGU4MGY5OTgwZThjYjMzYWZhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NSVNTSU5HIFBFUlNPTjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2VkNDliYzZkNjE5NDUxZWFiNzZkMWNhM2MwZGQzMzIuc2V0Q29udGVudChodG1sXzc1NDY0ZDY4Y2Y3OTRhZGU4MGY5OTgwZThjYjMzYWZhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfM2EyMjI2MzM2NTIwNGJkMTkzMDRkMTliMGJjZjUxNmUuYmluZFBvcHVwKHBvcHVwXzdlZDQ5YmM2ZDYxOTQ1MWVhYjc2ZDFjYTNjMGRkMzMyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2RmOGVkNDYyZjA0NzQyN2JhNjM1NjcwMjA0MjE1MzQxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY0NDc4MTU3ODY5NTA1LC0xMjIuNDc3Mzc2NTI0MDAyOTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZGExZTljNDVjYTc0ZWVhYWEyMWRkMzFjYmJiY2E3NCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81NzAxMDVhN2NjZGM0YTQ1YjJmYzFlMzI0MGNkY2JkOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xYjBhZWRkODA1MmM0MTMzYjFkYzM2MjI5ZjhjMGFiZiA9ICQoJzxkaXYgaWQ9Imh0bWxfMWIwYWVkZDgwNTJjNDEzM2IxZGMzNjIyOWY4YzBhYmYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxBUkNFTlkvVEhFRlQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU3MDEwNWE3Y2NkYzRhNDViMmZjMWUzMjQwY2RjYmQ5LnNldENvbnRlbnQoaHRtbF8xYjBhZWRkODA1MmM0MTMzYjFkYzM2MjI5ZjhjMGFiZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2RmOGVkNDYyZjA0NzQyN2JhNjM1NjcwMjA0MjE1MzQxLmJpbmRQb3B1cChwb3B1cF81NzAxMDVhN2NjZGM0YTQ1YjJmYzFlMzI0MGNkY2JkOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl80Mzk4NjJmMTY4MGQ0ZTQyYTg2ZDdjMWIzNmNjMjFmYyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0NTczODk0Mjk2NTQ5NSwtMTIyLjQ3Nzk2MDMyNzI5OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVkYTFlOWM0NWNhNzRlZWFhYTIxZGQzMWNiYmJjYTc0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M2N2M1NjBjMmE2MTRiODNiMGQzMjljYmFlY2Y5NDAxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RjMmUxNjVlYjE0ODRjMzU4ODI3MTk5ODg0NjViNmFkID0gJCgnPGRpdiBpZD0iaHRtbF9kYzJlMTY1ZWIxNDg0YzM1ODgyNzE5OTg4NDY1YjZhZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNjdjNTYwYzJhNjE0YjgzYjBkMzI5Y2JhZWNmOTQwMS5zZXRDb250ZW50KGh0bWxfZGMyZTE2NWViMTQ4NGMzNTg4MjcxOTk4ODQ2NWI2YWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl80Mzk4NjJmMTY4MGQ0ZTQyYTg2ZDdjMWIzNmNjMjFmYy5iaW5kUG9wdXAocG9wdXBfYzY3YzU2MGMyYTYxNGI4M2IwZDMyOWNiYWVjZjk0MDEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYmE0ZjVlZDJlYjdjNDgwZmIzNjlmYWMxOGZhNDBiM2IgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MzU2OTcwMjc1NDgyMDYsLTEyMi4zNzY3NTc2NTU1MzAwMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVkYTFlOWM0NWNhNzRlZWFhYTIxZGQzMWNiYmJjYTc0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JlOTU1NmMxOTZmNzRhMTA5M2Q0MTVjYWU1YzYxNGU2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U4NzM0MzU3ZmNjMzRlMjk5NzI4NThmYmVhZjk4YTRiID0gJCgnPGRpdiBpZD0iaHRtbF9lODczNDM1N2ZjYzM0ZTI5OTcyODU4ZmJlYWY5OGE0YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JlOTU1NmMxOTZmNzRhMTA5M2Q0MTVjYWU1YzYxNGU2LnNldENvbnRlbnQoaHRtbF9lODczNDM1N2ZjYzM0ZTI5OTcyODU4ZmJlYWY5OGE0Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2JhNGY1ZWQyZWI3YzQ4MGZiMzY5ZmFjMThmYTQwYjNiLmJpbmRQb3B1cChwb3B1cF9iZTk1NTZjMTk2Zjc0YTEwOTNkNDE1Y2FlNWM2MTRlNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9hMDY5NWVmMGQ5Mjg0NzE0OGFmMTQ0YmNiMThhM2I3YSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyOTI3MDUxOTk1OTIsLTEyMi40MzIzMjU4NzEwMjhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZGExZTljNDVjYTc0ZWVhYWEyMWRkMzFjYmJiY2E3NCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mNzhhNWIyZmIyY2E0ODVkYmFjM2IxYzU0YTU5MWJjNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kZjYyZjdiN2ExNGU0MGU2OTYwYmQzZDdmMzYxNTM2MCA9ICQoJzxkaXYgaWQ9Imh0bWxfZGY2MmY3YjdhMTRlNDBlNjk2MGJkM2Q3ZjM2MTUzNjAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFTU0FVTFQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y3OGE1YjJmYjJjYTQ4NWRiYWMzYjFjNTRhNTkxYmM0LnNldENvbnRlbnQoaHRtbF9kZjYyZjdiN2ExNGU0MGU2OTYwYmQzZDdmMzYxNTM2MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2EwNjk1ZWYwZDkyODQ3MTQ4YWYxNDRiY2IxOGEzYjdhLmJpbmRQb3B1cChwb3B1cF9mNzhhNWIyZmIyY2E0ODVkYmFjM2IxYzU0YTU5MWJjNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9lNmQ0MjMyY2JhMGY0NjM3YWRhOGQ1OTk1YmIyYjg2OCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc5MTY0Mjk4MjM4NCwtMTIyLjQwMDkwODY5ODg4OTk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjVhYzJjN2ZmYzhhNDVmNDgxMDA5ZDk1MGMxYjkzY2UgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjg3YmZhODM0ZDBiNDdkNjkzMDAyZWY5NjdmOTk0MWMgPSAkKCc8ZGl2IGlkPSJodG1sX2Y4N2JmYTgzNGQwYjQ3ZDY5MzAwMmVmOTY3Zjk5NDFjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CVVJHTEFSWTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjVhYzJjN2ZmYzhhNDVmNDgxMDA5ZDk1MGMxYjkzY2Uuc2V0Q29udGVudChodG1sX2Y4N2JmYTgzNGQwYjQ3ZDY5MzAwMmVmOTY3Zjk5NDFjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZTZkNDIzMmNiYTBmNDYzN2FkYThkNTk5NWJiMmI4NjguYmluZFBvcHVwKHBvcHVwXzI1YWMyYzdmZmM4YTQ1ZjQ4MTAwOWQ5NTBjMWI5M2NlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzg0ZDA4OTc3Y2ZkOTRlYzE4YWY2MjhjMDZhMzI0OTdiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzNzA2OTMwMTU0NSwtMTIyLjQwODU5NTExMDg2OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVkYTFlOWM0NWNhNzRlZWFhYTIxZGQzMWNiYmJjYTc0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZlNmIzYjNiYzA4MzQ1ZDQ4MTM5MWI1MDQyNzY1ODlhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJmYWRhNGI0YmMzMDRlM2Y4MDYzMTc4MzI2YmIwYWRkID0gJCgnPGRpdiBpZD0iaHRtbF8yZmFkYTRiNGJjMzA0ZTNmODA2MzE3ODMyNmJiMGFkZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U1RPTEVOIFBST1BFUlRZPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ZTZiM2IzYmMwODM0NWQ0ODEzOTFiNTA0Mjc2NTg5YS5zZXRDb250ZW50KGh0bWxfMmZhZGE0YjRiYzMwNGUzZjgwNjMxNzgzMjZiYjBhZGQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84NGQwODk3N2NmZDk0ZWMxOGFmNjI4YzA2YTMyNDk3Yi5iaW5kUG9wdXAocG9wdXBfNmU2YjNiM2JjMDgzNDVkNDgxMzkxYjUwNDI3NjU4OWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMGViYmQ4Zjc0YmE3NDVhNTkzYmUwOGM5M2YwMmQ1NzEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NTcyODk1OTA0NTc3OTUsLTEyMi40MDY4NzA0MDIwODJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZGExZTljNDVjYTc0ZWVhYWEyMWRkMzFjYmJiY2E3NCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iYzFmMjE1NmQzYjA0MTFkOGJlMzgxMTlkMDljNzY2YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mYjBiZDQwNTE1NWY0MjFjOWVkZDgxMGI4NzJkN2M5YSA9ICQoJzxkaXYgaWQ9Imh0bWxfZmIwYmQ0MDUxNTVmNDIxYzllZGQ4MTBiODcyZDdjOWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJPQkJFUlk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JjMWYyMTU2ZDNiMDQxMWQ4YmUzODExOWQwOWM3NjZiLnNldENvbnRlbnQoaHRtbF9mYjBiZDQwNTE1NWY0MjFjOWVkZDgxMGI4NzJkN2M5YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzBlYmJkOGY3NGJhNzQ1YTU5M2JlMDhjOTNmMDJkNTcxLmJpbmRQb3B1cChwb3B1cF9iYzFmMjE1NmQzYjA0MTFkOGJlMzgxMTlkMDljNzY2Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9mMjViNjBlM2ZhMmQ0ODdjYjM0NDc2YjYwZjU4ZjM0NCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0ODkwNjMwNTE4MjksLTEyMi40MjAzNTQ3ODA4NjA5OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVkYTFlOWM0NWNhNzRlZWFhYTIxZGQzMWNiYmJjYTc0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ3ZGJlNWRkN2IxNDRkZWRhZGI0ODE2YTNlNWEyMzViID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZlY2QyNmE2M2ExYTRlMjFiNWM3NDM0ZGIxODRmN2MyID0gJCgnPGRpdiBpZD0iaHRtbF9mZWNkMjZhNjNhMWE0ZTIxYjVjNzQzNGRiMTg0ZjdjMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QVNTQVVMVDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDdkYmU1ZGQ3YjE0NGRlZGFkYjQ4MTZhM2U1YTIzNWIuc2V0Q29udGVudChodG1sX2ZlY2QyNmE2M2ExYTRlMjFiNWM3NDM0ZGIxODRmN2MyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZjI1YjYwZTNmYTJkNDg3Y2IzNDQ3NmI2MGY1OGYzNDQuYmluZFBvcHVwKHBvcHVwXzQ3ZGJlNWRkN2IxNDRkZWRhZGI0ODE2YTNlNWEyMzViKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzc0MzI4OTE2MTQwODQwMjRiNjUxNTQwZDNkOTUxNWI2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzE1NzY1NDI2OTk1LC0xMjIuNDM5OTA5NzY2NzcyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGExMWM4NmQ5YzlhNGZhMThjMWYzZGMyY2VkNzBlZWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDNjZTI2NzQwMjQzNDQzMzgzNGFmMzU5OTk2NWU1YjYgPSAkKCc8ZGl2IGlkPSJodG1sXzQzY2UyNjc0MDI0MzQ0MzM4MzRhZjM1OTk5NjVlNWI2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BU1NBVUxUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wYTExYzg2ZDljOWE0ZmExOGMxZjNkYzJjZWQ3MGVlZS5zZXRDb250ZW50KGh0bWxfNDNjZTI2NzQwMjQzNDQzMzgzNGFmMzU5OTk2NWU1YjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl83NDMyODkxNjE0MDg0MDI0YjY1MTU0MGQzZDk1MTViNi5iaW5kUG9wdXAocG9wdXBfMGExMWM4NmQ5YzlhNGZhMThjMWYzZGMyY2VkNzBlZWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNjNlODQwMDBhNDM0NGU4MTk4NWQ2MzkyNGQ1MTlhN2EgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODM1Njk5Mzg2OTE4LC0xMjIuNDA4NDIxMTE2OTIyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWZiMDZlMDEyYjI5NGJjN2EzY2YzOWY0ZjcyZjIyY2QgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWNiYTAwMTlmYWE3NGI2OWFjZTRhNWIwMjc3MjY3ODAgPSAkKCc8ZGl2IGlkPSJodG1sX2FjYmEwMDE5ZmFhNzRiNjlhY2U0YTViMDI3NzI2NzgwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MQVJDRU5ZL1RIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85ZmIwNmUwMTJiMjk0YmM3YTNjZjM5ZjRmNzJmMjJjZC5zZXRDb250ZW50KGh0bWxfYWNiYTAwMTlmYWE3NGI2OWFjZTRhNWIwMjc3MjY3ODApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82M2U4NDAwMGE0MzQ0ZTgxOTg1ZDYzOTI0ZDUxOWE3YS5iaW5kUG9wdXAocG9wdXBfOWZiMDZlMDEyYjI5NGJjN2EzY2YzOWY0ZjcyZjIyY2QpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMmNhMzMzMzRlZGIzNDI5NzllMjgwNGU4ZGM5MmNlZmMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzM2MTg2Mjc2NDU2MDQsLTEyMi40MjIzMTU2NzA3NDldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZGExZTljNDVjYTc0ZWVhYWEyMWRkMzFjYmJiY2E3NCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yZDJiM2U3ZmQyMzg0YzE5YWQ0ODg1N2MzOWI4MDJmZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jYTAwYmMxOGI1ODE0NGQ1OGYyMzZiMjQ2Y2I1ZWMzYSA9ICQoJzxkaXYgaWQ9Imh0bWxfY2EwMGJjMThiNTgxNDRkNThmMjM2YjI0NmNiNWVjM2EiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZSQVVEPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZDJiM2U3ZmQyMzg0YzE5YWQ0ODg1N2MzOWI4MDJmZi5zZXRDb250ZW50KGh0bWxfY2EwMGJjMThiNTgxNDRkNThmMjM2YjI0NmNiNWVjM2EpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8yY2EzMzMzNGVkYjM0Mjk3OWUyODA0ZThkYzkyY2VmYy5iaW5kUG9wdXAocG9wdXBfMmQyYjNlN2ZkMjM4NGMxOWFkNDg4NTdjMzliODAyZmYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYjI3Y2YyYzc1MDI0NDQwYWEwMDk1OTUxNzYwNDIzMTkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43OTI4NDEyODQwNDQ3MDUsLTEyMi40MjQ1MTk4MzUwMDkwMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVkYTFlOWM0NWNhNzRlZWFhYTIxZGQzMWNiYmJjYTc0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY0N2M5MTA5OTg1YTQ3NGRiZTIzNzM5NTNhYjQ2NTM0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y2NDIwNDIzMjE5YzQ2ZjViOTQ0MmZjNGZlNDlkOTUwID0gJCgnPGRpdiBpZD0iaHRtbF9mNjQyMDQyMzIxOWM0NmY1Yjk0NDJmYzRmZTQ5ZDk1MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V0FSUkFOVFM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY0N2M5MTA5OTg1YTQ3NGRiZTIzNzM5NTNhYjQ2NTM0LnNldENvbnRlbnQoaHRtbF9mNjQyMDQyMzIxOWM0NmY1Yjk0NDJmYzRmZTQ5ZDk1MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2IyN2NmMmM3NTAyNDQ0MGFhMDA5NTk1MTc2MDQyMzE5LmJpbmRQb3B1cChwb3B1cF82NDdjOTEwOTk4NWE0NzRkYmUyMzczOTUzYWI0NjUzNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9lMDM0Yzc0MzI4YTI0ODBjOWVhMDFlZjFkY2E3ZjY1MCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc1NDA5ODY4ODIwNjc5NSwtMTIyLjQxNDIzMzg0OTAzNzk4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTU0ZWQyMTE0MzgxNDQ2NWI2NjQ0OTU3NDgwNzZjZmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGFkMTM3OGMzNGFiNDgzZTg4YTU4MGZkMzFkZjA4ZDYgPSAkKCc8ZGl2IGlkPSJodG1sXzRhZDEzNzhjMzRhYjQ4M2U4OGE1ODBmZDMxZGYwOGQ2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EUlVHL05BUkNPVElDPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81NTRlZDIxMTQzODE0NDY1YjY2NDQ5NTc0ODA3NmNmZC5zZXRDb250ZW50KGh0bWxfNGFkMTM3OGMzNGFiNDgzZTg4YTU4MGZkMzFkZjA4ZDYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9lMDM0Yzc0MzI4YTI0ODBjOWVhMDFlZjFkY2E3ZjY1MC5iaW5kUG9wdXAocG9wdXBfNTU0ZWQyMTE0MzgxNDQ2NWI2NjQ0OTU3NDgwNzZjZmQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMTFmOTg4NjcxMDllNGZkODlkNjNhY2NlMjM5YWNlNjEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NTQwOTg2ODgyMDY3OTUsLTEyMi40MTQyMzM4NDkwMzc5OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVkYTFlOWM0NWNhNzRlZWFhYTIxZGQzMWNiYmJjYTc0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFlYzAwNTFhZDQ5NTQ2ZDBhNzQ0MTM4MWI0MzM3NGFiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIyYzVhM2MzZGEzNzQxNjFiNWZjMGYzN2VjN2QxYWI4ID0gJCgnPGRpdiBpZD0iaHRtbF8yMmM1YTNjM2RhMzc0MTYxYjVmYzBmMzdlYzdkMWFiOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFlYzAwNTFhZDQ5NTQ2ZDBhNzQ0MTM4MWI0MzM3NGFiLnNldENvbnRlbnQoaHRtbF8yMmM1YTNjM2RhMzc0MTYxYjVmYzBmMzdlYzdkMWFiOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzExZjk4ODY3MTA5ZTRmZDg5ZDYzYWNjZTIzOWFjZTYxLmJpbmRQb3B1cChwb3B1cF8xZWMwMDUxYWQ0OTU0NmQwYTc0NDEzODFiNDMzNzRhYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl85YTQ1YTY5MjA1ZjY0OTIwODhkYmZjNzdhNjkwYmM2MSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3MTQ5Mzk5Njk0MTYsLTEyMi41MDc3NTAxMzEwMDQwMl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVkYTFlOWM0NWNhNzRlZWFhYTIxZGQzMWNiYmJjYTc0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI2ODQyOWZkYmE2MTRhMDM4NmVlM2I5YjBmMmZkNDRmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRjODk5ZGUzYWI0ODQzOWQ4NjFmMDgzMGNmZjI3YTdhID0gJCgnPGRpdiBpZD0iaHRtbF80Yzg5OWRlM2FiNDg0MzlkODYxZjA4MzBjZmYyN2E3YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QVNTQVVMVDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjY4NDI5ZmRiYTYxNGEwMzg2ZWUzYjliMGYyZmQ0NGYuc2V0Q29udGVudChodG1sXzRjODk5ZGUzYWI0ODQzOWQ4NjFmMDgzMGNmZjI3YTdhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOWE0NWE2OTIwNWY2NDkyMDg4ZGJmYzc3YTY5MGJjNjEuYmluZFBvcHVwKHBvcHVwXzI2ODQyOWZkYmE2MTRhMDM4NmVlM2I5YjBmMmZkNDRmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2JiMDE2ZGUzZmM1NDQyNjU5YmU0ZmI5MzM5ZmQ4OWY4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzE4MzAyMjA0NzY2MDA1LC0xMjIuNDc0NDQ0NjM5NTk0OTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZGExZTljNDVjYTc0ZWVhYWEyMWRkMzFjYmJiY2E3NCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82NzczY2QwZGZlNTU0NTViOTZmNzYwMjMzODNlNDA4YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84YTAwOTBmNWUxNDk0ZmMzYTYzZjRlODRjODg1ODBjMSA9ICQoJzxkaXYgaWQ9Imh0bWxfOGEwMDkwZjVlMTQ5NGZjM2E2M2Y0ZTg0Yzg4NTgwYzEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82NzczY2QwZGZlNTU0NTViOTZmNzYwMjMzODNlNDA4YS5zZXRDb250ZW50KGh0bWxfOGEwMDkwZjVlMTQ5NGZjM2E2M2Y0ZTg0Yzg4NTgwYzEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9iYjAxNmRlM2ZjNTQ0MjY1OWJlNGZiOTMzOWZkODlmOC5iaW5kUG9wdXAocG9wdXBfNjc3M2NkMGRmZTU1NDU1Yjk2Zjc2MDIzMzgzZTQwOGEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZGI3MjJmYWY2OGIzNGRiNzgzNjIyN2VjN2RhYjRmMDEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjQ1NzUyMzE3NjE1LC0xMjIuNDI3NTYyNTk2OTg1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzcyODYyMDNmZDg3NDExNWE2ZTZhZDA4ZDU2NTk0NzMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzU0NzM3ODU1MmQxNGM0MTlmZmMwN2U0MDVlZjE0MjMgPSAkKCc8ZGl2IGlkPSJodG1sX2M1NDczNzg1NTJkMTRjNDE5ZmZjMDdlNDA1ZWYxNDIzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzcyODYyMDNmZDg3NDExNWE2ZTZhZDA4ZDU2NTk0NzMuc2V0Q29udGVudChodG1sX2M1NDczNzg1NTJkMTRjNDE5ZmZjMDdlNDA1ZWYxNDIzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZGI3MjJmYWY2OGIzNGRiNzgzNjIyN2VjN2RhYjRmMDEuYmluZFBvcHVwKHBvcHVwXzM3Mjg2MjAzZmQ4NzQxMTVhNmU2YWQwOGQ1NjU5NDczKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzBlZWNlMTdjMjRmMTQ3NDY5ZTdjYzhjZmJhMjEzOTJjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg3NDM3ODMwOTExMiwtMTIyLjQxOTIwMzAwNDI2OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVkYTFlOWM0NWNhNzRlZWFhYTIxZGQzMWNiYmJjYTc0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MyMzhmZWU4ODE2MDRiMGQ4MDIyMTZmNGJmNzA5YzdhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAyY2Y0MjMwMDRjZTRlNmQ4M2M5NmYwMzRjY2E4MWJjID0gJCgnPGRpdiBpZD0iaHRtbF8wMmNmNDIzMDA0Y2U0ZTZkODNjOTZmMDM0Y2NhODFiYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QlVSR0xBUlk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2MyMzhmZWU4ODE2MDRiMGQ4MDIyMTZmNGJmNzA5YzdhLnNldENvbnRlbnQoaHRtbF8wMmNmNDIzMDA0Y2U0ZTZkODNjOTZmMDM0Y2NhODFiYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzBlZWNlMTdjMjRmMTQ3NDY5ZTdjYzhjZmJhMjEzOTJjLmJpbmRQb3B1cChwb3B1cF9jMjM4ZmVlODgxNjA0YjBkODAyMjE2ZjRiZjcwOWM3YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9mOTdiNDRjNjQ5YTc0ZDcxYTM5YmUzMzQwNGE2MTYxOCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0OTM2ODgyODQ1MzIsLTEyMi40MTI2OTAxNDIzMDgwMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVkYTFlOWM0NWNhNzRlZWFhYTIxZGQzMWNiYmJjYTc0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JjNWY0ZmMxM2NjMzQxZTU4NTg5ZjljZTIzZDgyNWE1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg0MGExNjQ0N2U5ZTQzZDk5MjhiYWJjY2UxNmRlMWZlID0gJCgnPGRpdiBpZD0iaHRtbF84NDBhMTY0NDdlOWU0M2Q5OTI4YmFiY2NlMTZkZTFmZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JjNWY0ZmMxM2NjMzQxZTU4NTg5ZjljZTIzZDgyNWE1LnNldENvbnRlbnQoaHRtbF84NDBhMTY0NDdlOWU0M2Q5OTI4YmFiY2NlMTZkZTFmZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2Y5N2I0NGM2NDlhNzRkNzFhMzliZTMzNDA0YTYxNjE4LmJpbmRQb3B1cChwb3B1cF9iYzVmNGZjMTNjYzM0MWU1ODU4OWY5Y2UyM2Q4MjVhNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8wMTA0MzQzMDU4Mzc0OGU5ODA2NmE3MDE2ZGI3ODRhZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcwOTIwMTA0NjIzNzksLTEyMi40MzQ2MDkyODAzNTJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZGExZTljNDVjYTc0ZWVhYWEyMWRkMzFjYmJiY2E3NCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yYzI3MzkyZWQzNjc0YzU2YmMxYWMyNTkyYjQxMzRiOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lMGRlZmE5YTM2MjY0MWM5YjIyYzE3Mzg5M2UzMGVjNSA9ICQoJzxkaXYgaWQ9Imh0bWxfZTBkZWZhOWEzNjI2NDFjOWIyMmMxNzM4OTNlMzBlYzUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmMyNzM5MmVkMzY3NGM1NmJjMWFjMjU5MmI0MTM0Yjkuc2V0Q29udGVudChodG1sX2UwZGVmYTlhMzYyNjQxYzliMjJjMTczODkzZTMwZWM1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMDEwNDM0MzA1ODM3NDhlOTgwNjZhNzAxNmRiNzg0YWQuYmluZFBvcHVwKHBvcHVwXzJjMjczOTJlZDM2NzRjNTZiYzFhYzI1OTJiNDEzNGI5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2Q2Njc4NGNmOGEzZTQwNzBhNmVjNDdlNzI1MjJjOTllID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg3OTIwOTM3NTUzMjk1LC0xMjIuNDEwODgyODI1NTUxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjhiNzYxNzI1MzcwNGU1ZmJhMzMxNGViNGRjMGIxNWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODllNWFlYTYwMDM0NGRkMTgxYmMzNWUyMjczN2EyNDAgPSAkKCc8ZGl2IGlkPSJodG1sXzg5ZTVhZWE2MDAzNDRkZDE4MWJjMzVlMjI3MzdhMjQwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WRUhJQ0xFIFRIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mOGI3NjE3MjUzNzA0ZTVmYmEzMzE0ZWI0ZGMwYjE1ZS5zZXRDb250ZW50KGh0bWxfODllNWFlYTYwMDM0NGRkMTgxYmMzNWUyMjczN2EyNDApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kNjY3ODRjZjhhM2U0MDcwYTZlYzQ3ZTcyNTIyYzk5ZS5iaW5kUG9wdXAocG9wdXBfZjhiNzYxNzI1MzcwNGU1ZmJhMzMxNGViNGRjMGIxNWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOWMxNjk4NzIyYjc5NGJjNzkwNDY3OWY5NmQ4MjcxOTkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy44MDA0NTY2NDcxMDM4OSwtMTIyLjQwMTQzMjc1NDcyMjAxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGQ1NTVlZTY5ZTI0NDk4Yjg1ZjI0ZjdkZjQ0ZjM5OWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWRjN2EzNDNhNmFlNGVmYThlMTM1MTM5YjBhZDNkNzYgPSAkKCc8ZGl2IGlkPSJodG1sXzVkYzdhMzQzYTZhZTRlZmE4ZTEzNTEzOWIwYWQzZDc2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WRUhJQ0xFIFRIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80ZDU1NWVlNjllMjQ0OThiODVmMjRmN2RmNDRmMzk5YS5zZXRDb250ZW50KGh0bWxfNWRjN2EzNDNhNmFlNGVmYThlMTM1MTM5YjBhZDNkNzYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85YzE2OTg3MjJiNzk0YmM3OTA0Njc5Zjk2ZDgyNzE5OS5iaW5kUG9wdXAocG9wdXBfNGQ1NTVlZTY5ZTI0NDk4Yjg1ZjI0ZjdkZjQ0ZjM5OWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZjczY2Q0MGUwMTRiNDA4OGEwMTZmZjI5NjZkYmQ5YzcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDM1NTUwNTQyMjY1LC0xMjIuNDIxMTI4MDI5NTA1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjZmYjcyMjkzOWYwNDIxOGEyNjBkYWNjYmY4YWQ0M2YgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmQ0MWFlN2Y4YjAwNGZhNmFhNDNiMzIxNzAxYTQxZWIgPSAkKCc8ZGl2IGlkPSJodG1sXzZkNDFhZTdmOGIwMDRmYTZhYTQzYjMyMTcwMWE0MWViIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MQVJDRU5ZL1RIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mNmZiNzIyOTM5ZjA0MjE4YTI2MGRhY2NiZjhhZDQzZi5zZXRDb250ZW50KGh0bWxfNmQ0MWFlN2Y4YjAwNGZhNmFhNDNiMzIxNzAxYTQxZWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9mNzNjZDQwZTAxNGI0MDg4YTAxNmZmMjk2NmRiZDljNy5iaW5kUG9wdXAocG9wdXBfZjZmYjcyMjkzOWYwNDIxOGEyNjBkYWNjYmY4YWQ0M2YpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMTRjMTZjZDU5ZmMyNGZjMmE5N2U5YWJhZTMwMzA4MTggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODY1NjQ3NjA3Njg1LC0xMjIuNDA3MjQ0MDg3MDMyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjczODU5ZmRjMmNhNGNmNDhhNTBmZjcwOWU0ODljYmEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzFkMzY5YzMxMmJiNDZjNGFkNmUwZTJmMDhhOGNiNzIgPSAkKCc8ZGl2IGlkPSJodG1sX2MxZDM2OWMzMTJiYjQ2YzRhZDZlMGUyZjA4YThjYjcyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BU1NBVUxUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iNzM4NTlmZGMyY2E0Y2Y0OGE1MGZmNzA5ZTQ4OWNiYS5zZXRDb250ZW50KGh0bWxfYzFkMzY5YzMxMmJiNDZjNGFkNmUwZTJmMDhhOGNiNzIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8xNGMxNmNkNTlmYzI0ZmMyYTk3ZTlhYmFlMzAzMDgxOC5iaW5kUG9wdXAocG9wdXBfYjczODU5ZmRjMmNhNGNmNDhhNTBmZjcwOWU0ODljYmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfY2E1NTc0YmZkMmVjNDM1ZDhhOGU2NDNjM2U4ZDkxNmQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjE1NjU1OTI4MDQ1LC0xMjIuNDIzODAzMDAxOTAwOTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZGExZTljNDVjYTc0ZWVhYWEyMWRkMzFjYmJiY2E3NCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80MDJjNGQ3NmFmN2E0NmJhYjM4OTc3N2I5MTE4MzU1ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83YzZkNzIzNGQ4Yjg0OWQwYTFhYTRkMTJiM2RiNDI2MSA9ICQoJzxkaXYgaWQ9Imh0bWxfN2M2ZDcyMzRkOGI4NDlkMGExYWE0ZDEyYjNkYjQyNjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJFQ09WRVJFRCBWRUhJQ0xFPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MDJjNGQ3NmFmN2E0NmJhYjM4OTc3N2I5MTE4MzU1Zi5zZXRDb250ZW50KGh0bWxfN2M2ZDcyMzRkOGI4NDlkMGExYWE0ZDEyYjNkYjQyNjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jYTU1NzRiZmQyZWM0MzVkOGE4ZTY0M2MzZThkOTE2ZC5iaW5kUG9wdXAocG9wdXBfNDAyYzRkNzZhZjdhNDZiYWIzODk3NzdiOTExODM1NWYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZWU2MTAzYTFmMzc5NGM5MDk2MjI0OTUzNTBlMjZhMDggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjE1NjU1OTI4MDQ1LC0xMjIuNDIzODAzMDAxOTAwOTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZGExZTljNDVjYTc0ZWVhYWEyMWRkMzFjYmJiY2E3NCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lNzI1YzRhZTgzN2E0NDhjODI5YzAyODU4OGE5ODc3MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80YzlkYjkzODg1MDc0MTk4YjBkOTE5ZWIyODhhMGZkOCA9ICQoJzxkaXYgaWQ9Imh0bWxfNGM5ZGI5Mzg4NTA3NDE5OGIwZDkxOWViMjg4YTBmZDgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lNzI1YzRhZTgzN2E0NDhjODI5YzAyODU4OGE5ODc3MC5zZXRDb250ZW50KGh0bWxfNGM5ZGI5Mzg4NTA3NDE5OGIwZDkxOWViMjg4YTBmZDgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9lZTYxMDNhMWYzNzk0YzkwOTYyMjQ5NTM1MGUyNmEwOC5iaW5kUG9wdXAocG9wdXBfZTcyNWM0YWU4MzdhNDQ4YzgyOWMwMjg1ODhhOTg3NzApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZWZlYWM2MTAzYmI0NDNjM2E4NjRjNzAzYzA5NDVhMDUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDQxOTI3NTA4OTMyMDUsLTEyMi40NDQ2ODU0ODIyNzNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZGExZTljNDVjYTc0ZWVhYWEyMWRkMzFjYmJiY2E3NCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wMmQ3YjIxMDM3NDY0NzE4OTA5OTFlMjI2YmRlNzMzZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hNDVhZjVhNDVjOTI0M2JkOWY2ZTM5MGU3ZWIyNDNlNiA9ICQoJzxkaXYgaWQ9Imh0bWxfYTQ1YWY1YTQ1YzkyNDNiZDlmNmUzOTBlN2ViMjQzZTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDJkN2IyMTAzNzQ2NDcxODkwOTkxZTIyNmJkZTczM2Uuc2V0Q29udGVudChodG1sX2E0NWFmNWE0NWM5MjQzYmQ5ZjZlMzkwZTdlYjI0M2U2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZWZlYWM2MTAzYmI0NDNjM2E4NjRjNzAzYzA5NDVhMDUuYmluZFBvcHVwKHBvcHVwXzAyZDdiMjEwMzc0NjQ3MTg5MDk5MWUyMjZiZGU3MzNlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2ZkNzRlMjgwNmE3NzQ1Njg5NzgzZTA2MzA0NzIwMzMwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1NDY5MjgyMDA0MSwtMTIyLjQxNTc1NzAzOTE5Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVkYTFlOWM0NWNhNzRlZWFhYTIxZGQzMWNiYmJjYTc0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzcyZTYwMmUyZjIzYjRjNzY5ODgyNWI1Y2IyM2FhMGI4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2EwODhkZDNiMzY3NTRhNmI5NGE2NDQ4Njk0MjJjOGU1ID0gJCgnPGRpdiBpZD0iaHRtbF9hMDg4ZGQzYjM2NzU0YTZiOTRhNjQ0ODY5NDIyYzhlNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83MmU2MDJlMmYyM2I0Yzc2OTg4MjViNWNiMjNhYTBiOC5zZXRDb250ZW50KGh0bWxfYTA4OGRkM2IzNjc1NGE2Yjk0YTY0NDg2OTQyMmM4ZTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9mZDc0ZTI4MDZhNzc0NTY4OTc4M2UwNjMwNDcyMDMzMC5iaW5kUG9wdXAocG9wdXBfNzJlNjAyZTJmMjNiNGM3Njk4ODI1YjVjYjIzYWEwYjgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZGNlYzU5N2EyYzBmNGRlMTlhMjE1OWM1MTgzMjU4ODcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43Mjg1MjgwNjI3NDY1LC0xMjIuNDc1NjQ3NDYwNzg1OTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZGExZTljNDVjYTc0ZWVhYWEyMWRkMzFjYmJiY2E3NCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lMGNlZTgwMDQ0NzI0MTFiYmZjZTFkNjU3YjE3NTNmYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82NzhkYTMxODUxNGM0MGYyYTk5ZGZiNTNjYWRlYmMyOSA9ICQoJzxkaXYgaWQ9Imh0bWxfNjc4ZGEzMTg1MTRjNDBmMmE5OWRmYjUzY2FkZWJjMjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJPQkJFUlk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UwY2VlODAwNDQ3MjQxMWJiZmNlMWQ2NTdiMTc1M2ZjLnNldENvbnRlbnQoaHRtbF82NzhkYTMxODUxNGM0MGYyYTk5ZGZiNTNjYWRlYmMyOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2RjZWM1OTdhMmMwZjRkZTE5YTIxNTljNTE4MzI1ODg3LmJpbmRQb3B1cChwb3B1cF9lMGNlZTgwMDQ0NzI0MTFiYmZjZTFkNjU3YjE3NTNmYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl82NWJkZmIwMmQwYzU0YjU5YmNjOWJmN2YyNWU2OTk1MSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0Mjg1MTczNzQ0NDg5NCwtMTIyLjQyMDk2NzQ0MDU2NF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVkYTFlOWM0NWNhNzRlZWFhYTIxZGQzMWNiYmJjYTc0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg0YjFiZWZjYjA4ZTRiYjhhNWZkOTMwZGZiOTg2NTY4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc5YWVkNzlmYTQ5MTRmZjJiOGY0YTkyYTYzNWJmMGNjID0gJCgnPGRpdiBpZD0iaHRtbF83OWFlZDc5ZmE0OTE0ZmYyYjhmNGE5MmE2MzViZjBjYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg0YjFiZWZjYjA4ZTRiYjhhNWZkOTMwZGZiOTg2NTY4LnNldENvbnRlbnQoaHRtbF83OWFlZDc5ZmE0OTE0ZmYyYjhmNGE5MmE2MzViZjBjYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzY1YmRmYjAyZDBjNTRiNTliY2M5YmY3ZjI1ZTY5OTUxLmJpbmRQb3B1cChwb3B1cF84NGIxYmVmY2IwOGU0YmI4YTVmZDkzMGRmYjk4NjU2OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8zZmU0ZWYyM2ZkYTg0ODA2YjdhZWQwNTI4YmJjZDg5MiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MjExOTg0ODg5MzEsLTEyMi40MTU2Njk2NjE0NDNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZGExZTljNDVjYTc0ZWVhYWEyMWRkMzFjYmJiY2E3NCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mNjZkYzA5M2M3Mjg0NDU0YWY5N2E0ZDQ4MWJiZTM4NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84YzJiNDZiNDAwYjg0MGQ3YmVlNWNhNTlmZjIxNTllMyA9ICQoJzxkaXYgaWQ9Imh0bWxfOGMyYjQ2YjQwMGI4NDBkN2JlZTVjYTU5ZmYyMTU5ZTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlZBTkRBTElTTTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjY2ZGMwOTNjNzI4NDQ1NGFmOTdhNGQ0ODFiYmUzODQuc2V0Q29udGVudChodG1sXzhjMmI0NmI0MDBiODQwZDdiZWU1Y2E1OWZmMjE1OWUzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfM2ZlNGVmMjNmZGE4NDgwNmI3YWVkMDUyOGJiY2Q4OTIuYmluZFBvcHVwKHBvcHVwX2Y2NmRjMDkzYzcyODQ0NTRhZjk3YTRkNDgxYmJlMzg0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzg4ZGY2N2MyZGQxOTQwOTJiMjVkNDk4NjQ1ZTc0ZjEzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc5MTY3NDIxODk2MywtMTIyLjQwNjM0NjQyNTYzMl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVkYTFlOWM0NWNhNzRlZWFhYTIxZGQzMWNiYmJjYTc0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U3OWI0YzQ0ZjE4ZDRkZjY5Mzk3ODIzMGYwMTVlZGExID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJlMTU5OGIyODMxYjQ5ZmM5YjJkNzJhMDRlNjRkODZkID0gJCgnPGRpdiBpZD0iaHRtbF8yZTE1OThiMjgzMWI0OWZjOWIyZDcyYTA0ZTY0ZDg2ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QVNTQVVMVDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTc5YjRjNDRmMThkNGRmNjkzOTc4MjMwZjAxNWVkYTEuc2V0Q29udGVudChodG1sXzJlMTU5OGIyODMxYjQ5ZmM5YjJkNzJhMDRlNjRkODZkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfODhkZjY3YzJkZDE5NDA5MmIyNWQ0OTg2NDVlNzRmMTMuYmluZFBvcHVwKHBvcHVwX2U3OWI0YzQ0ZjE4ZDRkZjY5Mzk3ODIzMGYwMTVlZGExKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzI1Yzc5NDkxOGYxOTQzZDRiZGMxMWM2MzY4MTZmMGZhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY1NzE4NDM5NTI4MiwtMTIyLjQwOTUyOTkxMzI3OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVkYTFlOWM0NWNhNzRlZWFhYTIxZGQzMWNiYmJjYTc0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBmNDUxYTkyMDNkODQ2NDc5ZjdmMWIyY2VjNzk1NDQyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU5YzBiMjQ4ZjMxMjQ0MGY5ZDU0NTBkZmE1M2EwMmQ4ID0gJCgnPGRpdiBpZD0iaHRtbF81OWMwYjI0OGYzMTI0NDBmOWQ1NDUwZGZhNTNhMDJkOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TEFSQ0VOWS9USEVGVDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGY0NTFhOTIwM2Q4NDY0NzlmN2YxYjJjZWM3OTU0NDIuc2V0Q29udGVudChodG1sXzU5YzBiMjQ4ZjMxMjQ0MGY5ZDU0NTBkZmE1M2EwMmQ4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMjVjNzk0OTE4ZjE5NDNkNGJkYzExYzYzNjgxNmYwZmEuYmluZFBvcHVwKHBvcHVwXzBmNDUxYTkyMDNkODQ2NDc5ZjdmMWIyY2VjNzk1NDQyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2VjMzRmZTA0MTA0NTQwOThiNzk5ZDA2YjIwZjA1NTU1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1NDIwNzA2NzExLC0xMjIuNDAzNDA0NzkxNDc4OTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZGExZTljNDVjYTc0ZWVhYWEyMWRkMzFjYmJiY2E3NCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lMzcyMjE5ZTY0MjQ0NDM5OGI4ZmViMTRkOTM4NjY3YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zNzhhZTQ4MzllZTI0OTViYTJiMzRlMDVhYjVjNjA5NSA9ICQoJzxkaXYgaWQ9Imh0bWxfMzc4YWU0ODM5ZWUyNDk1YmEyYjM0ZTA1YWI1YzYwOTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTM3MjIxOWU2NDI0NDQzOThiOGZlYjE0ZDkzODY2N2Euc2V0Q29udGVudChodG1sXzM3OGFlNDgzOWVlMjQ5NWJhMmIzNGUwNWFiNWM2MDk1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZWMzNGZlMDQxMDQ1NDA5OGI3OTlkMDZiMjBmMDU1NTUuYmluZFBvcHVwKHBvcHVwX2UzNzIyMTllNjQyNDQ0Mzk4YjhmZWIxNGQ5Mzg2NjdhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2Q4ODI3YzhmMzZhODRhNTc5YmU3NTYyZjEzNDQwN2I4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY3NTI0MzA4NzgzLC0xMjIuNDEwNzM4MDk3MzE1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWU1MGFlMTBjM2M3NDQwYmFjMTE4Y2JjYTkyNGZmOTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzhjZjkwZDEwMWY2NDk5MzgzNjc5YjQyMzdlMTU5MGEgPSAkKCc8ZGl2IGlkPSJodG1sXzM4Y2Y5MGQxMDFmNjQ5OTM4MzY3OWI0MjM3ZTE1OTBhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CVVJHTEFSWTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWU1MGFlMTBjM2M3NDQwYmFjMTE4Y2JjYTkyNGZmOTAuc2V0Q29udGVudChodG1sXzM4Y2Y5MGQxMDFmNjQ5OTM4MzY3OWI0MjM3ZTE1OTBhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZDg4MjdjOGYzNmE4NGE1NzliZTc1NjJmMTM0NDA3YjguYmluZFBvcHVwKHBvcHVwXzVlNTBhZTEwYzNjNzQ0MGJhYzExOGNiY2E5MjRmZjkwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzdmNWMyMzMzMDUyZjRmZTZhMWMwN2IyM2ZjMWI3ZDE2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY3NTI0MzA4NzgzLC0xMjIuNDEwNzM4MDk3MzE1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzA3ZmNmMzk2MmUxNDU5YWEwMDE1YjA0ZjU4Y2VhNjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjc1MWQ5ZmQyYWYzNGJmOWExNTk5OGVlZWQ0OGU4Y2YgPSAkKCc8ZGl2IGlkPSJodG1sXzY3NTFkOWZkMmFmMzRiZjlhMTU5OThlZWVkNDhlOGNmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BUlNPTjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzA3ZmNmMzk2MmUxNDU5YWEwMDE1YjA0ZjU4Y2VhNjkuc2V0Q29udGVudChodG1sXzY3NTFkOWZkMmFmMzRiZjlhMTU5OThlZWVkNDhlOGNmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfN2Y1YzIzMzMwNTJmNGZlNmExYzA3YjIzZmMxYjdkMTYuYmluZFBvcHVwKHBvcHVwXzcwN2ZjZjM5NjJlMTQ1OWFhMDAxNWIwNGY1OGNlYTY5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2IwZTQxZTU3ZWQ5ODRiNDhiYTYwYjZkNmM0YWYwNWY5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzEzMTA4MzQzMzI2NCwtMTIyLjQ0NDMxNDAyNTE4OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVkYTFlOWM0NWNhNzRlZWFhYTIxZGQzMWNiYmJjYTc0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzliNmE1YTMxODlkZDQ0NzQ5OTg4YmQ0MDllMjBlZGZiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg4Y2UzODFiNDI4ZTQxMGY5YzYzNzcyNWVhZTYxNGJiID0gJCgnPGRpdiBpZD0iaHRtbF84OGNlMzgxYjQyOGU0MTBmOWM2Mzc3MjVlYWU2MTRiYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QlVSR0xBUlk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzliNmE1YTMxODlkZDQ0NzQ5OTg4YmQ0MDllMjBlZGZiLnNldENvbnRlbnQoaHRtbF84OGNlMzgxYjQyOGU0MTBmOWM2Mzc3MjVlYWU2MTRiYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2IwZTQxZTU3ZWQ5ODRiNDhiYTYwYjZkNmM0YWYwNWY5LmJpbmRQb3B1cChwb3B1cF85YjZhNWEzMTg5ZGQ0NDc0OTk4OGJkNDA5ZTIwZWRmYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9lN2NiNzI4ZDRmOWU0ZGI5YjY3Y2UwODkwNTg2Y2UwMyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcxMzEwODM0MzMyNjQsLTEyMi40NDQzMTQwMjUxODhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZGExZTljNDVjYTc0ZWVhYWEyMWRkMzFjYmJiY2E3NCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85MmVmNGUyNmI4ZDg0M2RhYmMyODFhMTExOTk0NGZmOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xMDA0ODcwYjMxOWE0Zjg5YjNkOGM1OWY5NTA0OWQ2ZiA9ICQoJzxkaXYgaWQ9Imh0bWxfMTAwNDg3MGIzMTlhNGY4OWIzZDhjNTlmOTUwNDlkNmYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRSVUcvTkFSQ09USUM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkyZWY0ZTI2YjhkODQzZGFiYzI4MWExMTE5OTQ0ZmY4LnNldENvbnRlbnQoaHRtbF8xMDA0ODcwYjMxOWE0Zjg5YjNkOGM1OWY5NTA0OWQ2Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2U3Y2I3MjhkNGY5ZTRkYjliNjdjZTA4OTA1ODZjZTAzLmJpbmRQb3B1cChwb3B1cF85MmVmNGUyNmI4ZDg0M2RhYmMyODFhMTExOTk0NGZmOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl81YTFjYzJjYTU4NDM0ZDI2YWU4ZGFlMWU2M2U3MmExNiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NjAxNjAxMTQxMDMsLTEyMi40MDM2NDQ2MjA0MzldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZGExZTljNDVjYTc0ZWVhYWEyMWRkMzFjYmJiY2E3NCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84N2U1NmU2MWYwOWE0YzQ1ODAxZmI0MDJiZDk1Yjg0MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jM2Q0ODVhMzkxN2E0ZTNmOTI3NTQwODU0NzY5Y2Q5MyA9ICQoJzxkaXYgaWQ9Imh0bWxfYzNkNDg1YTM5MTdhNGUzZjkyNzU0MDg1NDc2OWNkOTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1JU1NJTkcgUEVSU09OPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84N2U1NmU2MWYwOWE0YzQ1ODAxZmI0MDJiZDk1Yjg0MS5zZXRDb250ZW50KGh0bWxfYzNkNDg1YTM5MTdhNGUzZjkyNzU0MDg1NDc2OWNkOTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl81YTFjYzJjYTU4NDM0ZDI2YWU4ZGFlMWU2M2U3MmExNi5iaW5kUG9wdXAocG9wdXBfODdlNTZlNjFmMDlhNGM0NTgwMWZiNDAyYmQ5NWI4NDEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYzQ5YzBlNTcwYTAzNGRlNWJiZGM4ZmI0MzE3NTRiNDYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjYwMTYwMTE0MTAzLC0xMjIuNDAzNjQ0NjIwNDM5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzg1NWJhMTAzNTk5NGI4ZDhjMGFiOTE0MmYwMTY1MTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTY5MjI3OGMxNTc1NDczYmFlZDZmMDljNGJjMzE0YTcgPSAkKCc8ZGl2IGlkPSJodG1sX2E2OTIyNzhjMTU3NTQ3M2JhZWQ2ZjA5YzRiYzMxNGE3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NSVNTSU5HIFBFUlNPTjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzg1NWJhMTAzNTk5NGI4ZDhjMGFiOTE0MmYwMTY1MTIuc2V0Q29udGVudChodG1sX2E2OTIyNzhjMTU3NTQ3M2JhZWQ2ZjA5YzRiYzMxNGE3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYzQ5YzBlNTcwYTAzNGRlNWJiZGM4ZmI0MzE3NTRiNDYuYmluZFBvcHVwKHBvcHVwX2M4NTViYTEwMzU5OTRiOGQ4YzBhYjkxNDJmMDE2NTEyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzM0NWQ0ODFjMWZhMDQ5N2I4YWVlZjU5YjYyMGE3MTEzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc2MjMxMDQwNDc1OCwtMTIyLjQxNDcxNDI5NTU3ODk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjRhNDllODVmZTliNDgzNWJhOTRiZWNjMzFjZTgxMjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjE3YTgzODI3OTc3NGZlY2FkOGE1YTgzZWQ5OWMzYTggPSAkKCc8ZGl2IGlkPSJodG1sXzIxN2E4MzgyNzk3NzRmZWNhZDhhNWE4M2VkOTljM2E4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BU1NBVUxUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mNGE0OWU4NWZlOWI0ODM1YmE5NGJlY2MzMWNlODEyNS5zZXRDb250ZW50KGh0bWxfMjE3YTgzODI3OTc3NGZlY2FkOGE1YTgzZWQ5OWMzYTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8zNDVkNDgxYzFmYTA0OTdiOGFlZWY1OWI2MjBhNzExMy5iaW5kUG9wdXAocG9wdXBfZjRhNDllODVmZTliNDgzNWJhOTRiZWNjMzFjZTgxMjUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZjljOTJlMTk0MzVhNDU0ZmE2YjVmMzlhMWI2ZDMwNzQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzYyMzEwNDA0NzU4LC0xMjIuNDE0NzE0Mjk1NTc4OTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZGExZTljNDVjYTc0ZWVhYWEyMWRkMzFjYmJiY2E3NCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zN2IwNDAxYmI4NjM0YzE4YTJjOWY2YTRmZmQ2NDJlYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iNmZkNDBhZjA1ZmQ0ZWMyOTQ2Yzc3NmQ4Zjk4NTgzOSA9ICQoJzxkaXYgaWQ9Imh0bWxfYjZmZDQwYWYwNWZkNGVjMjk0NmM3NzZkOGY5ODU4MzkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1JU1NJTkcgUEVSU09OPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zN2IwNDAxYmI4NjM0YzE4YTJjOWY2YTRmZmQ2NDJlYy5zZXRDb250ZW50KGh0bWxfYjZmZDQwYWYwNWZkNGVjMjk0NmM3NzZkOGY5ODU4MzkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9mOWM5MmUxOTQzNWE0NTRmYTZiNWYzOWExYjZkMzA3NC5iaW5kUG9wdXAocG9wdXBfMzdiMDQwMWJiODYzNGMxOGEyYzlmNmE0ZmZkNjQyZWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOTRjZGI3NzY3NzdlNDBkYWFiMTQ2MmM1YTAzZDlhM2YgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43Nzc1MTE4ODk1Njk1LC0xMjIuNDE4MDQ1NDUyNzY4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDFlZmIwMWE4MGVjNDQ4MDgzZTkyOTdiM2JlMWYyNjYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGE5OGI3NGZhNmNlNDA5Zjg3MDc4ODc5MWFmOGNjN2MgPSAkKCc8ZGl2IGlkPSJodG1sX2RhOThiNzRmYTZjZTQwOWY4NzA3ODg3OTFhZjhjYzdjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WRUhJQ0xFIFRIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MWVmYjAxYTgwZWM0NDgwODNlOTI5N2IzYmUxZjI2Ni5zZXRDb250ZW50KGh0bWxfZGE5OGI3NGZhNmNlNDA5Zjg3MDc4ODc5MWFmOGNjN2MpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85NGNkYjc3Njc3N2U0MGRhYWIxNDYyYzVhMDNkOWEzZi5iaW5kUG9wdXAocG9wdXBfNDFlZmIwMWE4MGVjNDQ4MDgzZTkyOTdiM2JlMWYyNjYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOGM5ZGQ4NWE0YTNiNDc3MGFlZmY4MDEwMWU4NzMwZjcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODIwMjM4NDc4OTc1LC0xMjIuNDAxMTYxNTU1NjAyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2EyMjQ3ZDdmYTIyNDc3YmFkY2I4NmM4ODI4NzEwZDcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzg3ZTIxZWIwODQyNDQ1OTk5Y2M2YmIxM2I3OGFhZWYgPSAkKCc8ZGl2IGlkPSJodG1sXzc4N2UyMWViMDg0MjQ0NTk5OWNjNmJiMTNiNzhhYWVmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2EyMjQ3ZDdmYTIyNDc3YmFkY2I4NmM4ODI4NzEwZDcuc2V0Q29udGVudChodG1sXzc4N2UyMWViMDg0MjQ0NTk5OWNjNmJiMTNiNzhhYWVmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOGM5ZGQ4NWE0YTNiNDc3MGFlZmY4MDEwMWU4NzMwZjcuYmluZFBvcHVwKHBvcHVwX2NhMjI0N2Q3ZmEyMjQ3N2JhZGNiODZjODgyODcxMGQ3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzYyZDNjMTFhZjYwNjRkODM4NzE3NjY0NjNmMzllNTVmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzI3MDA1MzE5NjI5OTk1LC0xMjIuNDAzNDA4NjY5MTkxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDRjMmM2ZGM4NTc5NDg2ODg0MzliNDdmMGFkMDY3NjMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjU3YWRiZjEyODNiNDE2NWE3ZTQwZDQxOGFjNDBkNDAgPSAkKCc8ZGl2IGlkPSJodG1sX2I1N2FkYmYxMjgzYjQxNjVhN2U0MGQ0MThhYzQwZDQwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XQVJSQU5UUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDRjMmM2ZGM4NTc5NDg2ODg0MzliNDdmMGFkMDY3NjMuc2V0Q29udGVudChodG1sX2I1N2FkYmYxMjgzYjQxNjVhN2U0MGQ0MThhYzQwZDQwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNjJkM2MxMWFmNjA2NGQ4Mzg3MTc2NjQ2M2YzOWU1NWYuYmluZFBvcHVwKHBvcHVwXzA0YzJjNmRjODU3OTQ4Njg4NDM5YjQ3ZjBhZDA2NzYzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzg0ODM0YzNiZTljNDQxMzZhMTAwYTBkMjM1N2IzOGRiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzODM0NDM3NDE0MSwtMTIyLjQxMjkzMDUyMjA1OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVkYTFlOWM0NWNhNzRlZWFhYTIxZGQzMWNiYmJjYTc0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U0YWRmMWM0OWNjNjRhYjg4YWYyZmZiZWVjMDI4ZjkyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2IzM2VhOTQzYTVhNjQ2ZjhiZGViZWE0Y2U1ZmVhZjZkID0gJCgnPGRpdiBpZD0iaHRtbF9iMzNlYTk0M2E1YTY0NmY4YmRlYmVhNGNlNWZlYWY2ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VkFOREFMSVNNPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lNGFkZjFjNDljYzY0YWI4OGFmMmZmYmVlYzAyOGY5Mi5zZXRDb250ZW50KGh0bWxfYjMzZWE5NDNhNWE2NDZmOGJkZWJlYTRjZTVmZWFmNmQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84NDgzNGMzYmU5YzQ0MTM2YTEwMGEwZDIzNTdiMzhkYi5iaW5kUG9wdXAocG9wdXBfZTRhZGYxYzQ5Y2M2NGFiODhhZjJmZmJlZWMwMjhmOTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfODkzZjYxNjRjNzM5NDRiY2FmODJmYjFhMzdiNDY0ZmQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NTMwMTg2NTM3NDQ2MDQsLTEyMi40MTg1ODcxNzIyMTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZGExZTljNDVjYTc0ZWVhYWEyMWRkMzFjYmJiY2E3NCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kNTY3ZTY4MDQyMGQ0ODVmYjU5ZGJmYWZkZjU1ZmQxYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jNTQ2NmM5NzQwZDY0NWNhOTIyZDJlOWNlZWNlMjM1MiA9ICQoJzxkaXYgaWQ9Imh0bWxfYzU0NjZjOTc0MGQ2NDVjYTkyMmQyZTljZWVjZTIzNTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDU2N2U2ODA0MjBkNDg1ZmI1OWRiZmFmZGY1NWZkMWMuc2V0Q29udGVudChodG1sX2M1NDY2Yzk3NDBkNjQ1Y2E5MjJkMmU5Y2VlY2UyMzUyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfODkzZjYxNjRjNzM5NDRiY2FmODJmYjFhMzdiNDY0ZmQuYmluZFBvcHVwKHBvcHVwX2Q1NjdlNjgwNDIwZDQ4NWZiNTlkYmZhZmRmNTVmZDFjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2U0NTUwZjc1MjU0MTQ3Yjc4NGYwNmI3NTk2YzFiMDU5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc0MDQxODM4NTA0MSwtMTIyLjQxNDM3MDYyNzQ5NV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVkYTFlOWM0NWNhNzRlZWFhYTIxZGQzMWNiYmJjYTc0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRlNWFhYWJiZTQ5NTQzZmI5MzIxNzI1YjQ2NzdiNWRlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhlOGViYWU1MGUxZDRjM2I4NTE5ZGMwNTJkNDA0ODJiID0gJCgnPGRpdiBpZD0iaHRtbF84ZThlYmFlNTBlMWQ0YzNiODUxOWRjMDUyZDQwNDgyYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RlJBVUQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRlNWFhYWJiZTQ5NTQzZmI5MzIxNzI1YjQ2NzdiNWRlLnNldENvbnRlbnQoaHRtbF84ZThlYmFlNTBlMWQ0YzNiODUxOWRjMDUyZDQwNDgyYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2U0NTUwZjc1MjU0MTQ3Yjc4NGYwNmI3NTk2YzFiMDU5LmJpbmRQb3B1cChwb3B1cF80ZTVhYWFiYmU0OTU0M2ZiOTMyMTcyNWI0Njc3YjVkZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8wZDVhZGUxOWVlYzA0NjEyOGFmMGUzZDA2NTliYjZmMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc5MDUzODk5MzcyNSwtMTIyLjQwMzkxNTY4MTU3MTAxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjg3MGEwMzhmNWY4NDllNmE5MjRiYjBmODBmOTkzY2UgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2I0ZjFhMjMzYWMyNGFkNmI5YWQ4NmU2NGUyMTRjODMgPSAkKCc8ZGl2IGlkPSJodG1sXzdiNGYxYTIzM2FjMjRhZDZiOWFkODZlNjRlMjE0YzgzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BU1NBVUxUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iODcwYTAzOGY1Zjg0OWU2YTkyNGJiMGY4MGY5OTNjZS5zZXRDb250ZW50KGh0bWxfN2I0ZjFhMjMzYWMyNGFkNmI5YWQ4NmU2NGUyMTRjODMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wZDVhZGUxOWVlYzA0NjEyOGFmMGUzZDA2NTliYjZmMS5iaW5kUG9wdXAocG9wdXBfYjg3MGEwMzhmNWY4NDllNmE5MjRiYjBmODBmOTkzY2UpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYWYxYzYyYzkzMTM1NDIxYWE1YTMxNjA5ZjRjM2Y3NGQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODMwOTk4MjQ0NTkyMSwtMTIyLjQxOTE4MzA5NjM2Ml0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVkYTFlOWM0NWNhNzRlZWFhYTIxZGQzMWNiYmJjYTc0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzljNGE4YzYxZTZmNDQ0MzY5OTA4NzFiZTU2OTdkMmUxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZmZjRhNDdjYTI2YTRjNGJhNmVlZDlmYTQ1YWNhNzk5ID0gJCgnPGRpdiBpZD0iaHRtbF82ZmY0YTQ3Y2EyNmE0YzRiYTZlZWQ5ZmE0NWFjYTc5OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzljNGE4YzYxZTZmNDQ0MzY5OTA4NzFiZTU2OTdkMmUxLnNldENvbnRlbnQoaHRtbF82ZmY0YTQ3Y2EyNmE0YzRiYTZlZWQ5ZmE0NWFjYTc5OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2FmMWM2MmM5MzEzNTQyMWFhNWEzMTYwOWY0YzNmNzRkLmJpbmRQb3B1cChwb3B1cF85YzRhOGM2MWU2ZjQ0NDM2OTkwODcxYmU1Njk3ZDJlMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl82NTkwMDhiMTE2OTA0ZTQ2YWFjYmM5OWUwNjM4ODhmNiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0MDczNjA1NDgzNTc5LC0xMjIuMzg4NzUzMDQ2OTk3XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2NlOTBmNDAyODMwNDc0MzhlYWNhNDkyMDJhNzFhNTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjhkOWU0M2IwOTUzNDQ4YzkxNjc4ZmY5MDdhMTI3NDggPSAkKCc8ZGl2IGlkPSJodG1sXzY4ZDllNDNiMDk1MzQ0OGM5MTY3OGZmOTA3YTEyNzQ4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2NlOTBmNDAyODMwNDc0MzhlYWNhNDkyMDJhNzFhNTIuc2V0Q29udGVudChodG1sXzY4ZDllNDNiMDk1MzQ0OGM5MTY3OGZmOTA3YTEyNzQ4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNjU5MDA4YjExNjkwNGU0NmFhY2JjOTllMDYzODg4ZjYuYmluZFBvcHVwKHBvcHVwX2NjZTkwZjQwMjgzMDQ3NDM4ZWFjYTQ5MjAyYTcxYTUyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2Q5YWU5YTJhZjY4NDRlYjM5MDViNGE4OTAwYzUzMjdmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc0OTkxMjk0NDM2NiwtMTIyLjQzNzc5OTcwMzQ2OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVkYTFlOWM0NWNhNzRlZWFhYTIxZGQzMWNiYmJjYTc0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U1MmQ4NGFlMmY5MTRlOWFiNDEzNTg0MTVkMmJmYmM2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAwYjA5YWRhM2ZkZTQ2ZWZhZGYzODEyZWQ0ZDVlZWY2ID0gJCgnPGRpdiBpZD0iaHRtbF8wMGIwOWFkYTNmZGU0NmVmYWRmMzgxMmVkNGQ1ZWVmNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TEFSQ0VOWS9USEVGVDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTUyZDg0YWUyZjkxNGU5YWI0MTM1ODQxNWQyYmZiYzYuc2V0Q29udGVudChodG1sXzAwYjA5YWRhM2ZkZTQ2ZWZhZGYzODEyZWQ0ZDVlZWY2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZDlhZTlhMmFmNjg0NGViMzkwNWI0YTg5MDBjNTMyN2YuYmluZFBvcHVwKHBvcHVwX2U1MmQ4NGFlMmY5MTRlOWFiNDEzNTg0MTVkMmJmYmM2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzlkZWYwMTI1MjUzYzQyNmJiNzUzMTFiZDcyMGY2ODBmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc3MDkwMjc0MzY2OSwtMTIyLjQyMTMzMjY4NDYzM10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVkYTFlOWM0NWNhNzRlZWFhYTIxZGQzMWNiYmJjYTc0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FlMTAyNzdhNDc1MjQxOGZhMjFiOTcwYWQ3ZDhiMzAxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U2NTk0N2I2ZTI1MzQ0NDg5MWNiODQ1MTYxMTBlOWQ0ID0gJCgnPGRpdiBpZD0iaHRtbF9lNjU5NDdiNmUyNTM0NDQ4OTFjYjg0NTE2MTEwZTlkNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TUlTU0lORyBQRVJTT048L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FlMTAyNzdhNDc1MjQxOGZhMjFiOTcwYWQ3ZDhiMzAxLnNldENvbnRlbnQoaHRtbF9lNjU5NDdiNmUyNTM0NDQ4OTFjYjg0NTE2MTEwZTlkNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzlkZWYwMTI1MjUzYzQyNmJiNzUzMTFiZDcyMGY2ODBmLmJpbmRQb3B1cChwb3B1cF9hZTEwMjc3YTQ3NTI0MThmYTIxYjk3MGFkN2Q4YjMwMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9hNzczNDY1NzFlMzk0YTNjYjgwZTk2YmFiNWZhOGFlMiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NzA5MDI3NDM2NjksLTEyMi40MjEzMzI2ODQ2MzNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZGExZTljNDVjYTc0ZWVhYWEyMWRkMzFjYmJiY2E3NCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kOGYxZjQ0ODYxNDY0Yzc3OTE3ZTIxZjY4NDNjZDIyMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hMjA3MDYzNDZmMjI0MWQ3ODYyNzlkMzQwNTYwYTJiMiA9ICQoJzxkaXYgaWQ9Imh0bWxfYTIwNzA2MzQ2ZjIyNDFkNzg2Mjc5ZDM0MDU2MGEyYjIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1JU1NJTkcgUEVSU09OPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kOGYxZjQ0ODYxNDY0Yzc3OTE3ZTIxZjY4NDNjZDIyMy5zZXRDb250ZW50KGh0bWxfYTIwNzA2MzQ2ZjIyNDFkNzg2Mjc5ZDM0MDU2MGEyYjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9hNzczNDY1NzFlMzk0YTNjYjgwZTk2YmFiNWZhOGFlMi5iaW5kUG9wdXAocG9wdXBfZDhmMWY0NDg2MTQ2NGM3NzkxN2UyMWY2ODQzY2QyMjMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZTUwZmMyYzM5MDQ2NDc0NjhlNWE3N2JhZTQ4MmM0YWYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODIyNDU4MjIzOTE3LC0xMjIuNDQ2NjEyOTc4ODM5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2M0ODI5YjEzZTk5NDQwMjkzYTkzZDY0NTRkMTIwYzUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWQ4YjQ3MDU3OWJkNDFmODlmODk1YjgxNGE0MDMzMmMgPSAkKCc8ZGl2IGlkPSJodG1sXzFkOGI0NzA1NzliZDQxZjg5Zjg5NWI4MTRhNDAzMzJjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XQVJSQU5UUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2M0ODI5YjEzZTk5NDQwMjkzYTkzZDY0NTRkMTIwYzUuc2V0Q29udGVudChodG1sXzFkOGI0NzA1NzliZDQxZjg5Zjg5NWI4MTRhNDAzMzJjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZTUwZmMyYzM5MDQ2NDc0NjhlNWE3N2JhZTQ4MmM0YWYuYmluZFBvcHVwKHBvcHVwXzNjNDgyOWIxM2U5OTQ0MDI5M2E5M2Q2NDU0ZDEyMGM1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzI3NDgzNjVkNmUyYzQ1MDdhNTQ0Y2JmYTBjYWU4MDM2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzMwMDM3OTk5NTEyNzk1LC0xMjIuNDA0NTk0MTQwNjM0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTIxYTlkZjhhYjMzNGZiZjlhNmY1OTcwZTdiOWJkNWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzViY2RiNjZmY2VkNGM3N2IyYjcyMjgyNWIyZjEwMWQgPSAkKCc8ZGl2IGlkPSJodG1sXzM1YmNkYjY2ZmNlZDRjNzdiMmI3MjI4MjViMmYxMDFkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OT04tQ1JJTUlOQUw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzUyMWE5ZGY4YWIzMzRmYmY5YTZmNTk3MGU3YjliZDVlLnNldENvbnRlbnQoaHRtbF8zNWJjZGI2NmZjZWQ0Yzc3YjJiNzIyODI1YjJmMTAxZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzI3NDgzNjVkNmUyYzQ1MDdhNTQ0Y2JmYTBjYWU4MDM2LmJpbmRQb3B1cChwb3B1cF81MjFhOWRmOGFiMzM0ZmJmOWE2ZjU5NzBlN2I5YmQ1ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8yYjUyNGUxZGY0YWE0ZTFmODQ5ZDVkZDRhNjExYzA5MSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc5NTMzMzgyNjc0MzYsLTEyMi4zOTczNzM3NDAwNjZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZGExZTljNDVjYTc0ZWVhYWEyMWRkMzFjYmJiY2E3NCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84NGQ1ODRlMzk0NzI0NWYyYTNmY2FlNzQ0ODE5OGVkNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84MGJlY2Q5NmY1OWQ0YTI1YWYwODI0MmVmNzI1ZjcyYSA9ICQoJzxkaXYgaWQ9Imh0bWxfODBiZWNkOTZmNTlkNGEyNWFmMDgyNDJlZjcyNWY3MmEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODRkNTg0ZTM5NDcyNDVmMmEzZmNhZTc0NDgxOThlZDQuc2V0Q29udGVudChodG1sXzgwYmVjZDk2ZjU5ZDRhMjVhZjA4MjQyZWY3MjVmNzJhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMmI1MjRlMWRmNGFhNGUxZjg0OWQ1ZGQ0YTYxMWMwOTEuYmluZFBvcHVwKHBvcHVwXzg0ZDU4NGUzOTQ3MjQ1ZjJhM2ZjYWU3NDQ4MTk4ZWQ0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzE0ZDA4MmUwZmRiMTRiY2RiNzhiNGNmYzkxZDkxMTI4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg3NTE1ODc0MTYyMjk1LC0xMjIuNDA3NDM0OTg5NTIzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGY4NDNhYmQ2YWE0NDViNjkwODEyNDRlMjFlMDkxNjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDcyNDE2Y2UzOGFiNDhhZWI5YTkxM2ZhMjY1MDVkZGYgPSAkKCc8ZGl2IGlkPSJodG1sXzA3MjQxNmNlMzhhYjQ4YWViOWE5MTNmYTI2NTA1ZGRmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XQVJSQU5UUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOGY4NDNhYmQ2YWE0NDViNjkwODEyNDRlMjFlMDkxNjcuc2V0Q29udGVudChodG1sXzA3MjQxNmNlMzhhYjQ4YWViOWE5MTNmYTI2NTA1ZGRmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMTRkMDgyZTBmZGIxNGJjZGI3OGI0Y2ZjOTFkOTExMjguYmluZFBvcHVwKHBvcHVwXzhmODQzYWJkNmFhNDQ1YjY5MDgxMjQ0ZTIxZTA5MTY3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzRmYmZhN2U2ZTJlYjRkNzFhMjM0MzY3YjdhZmUwYTgxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc4NTIzMzc3NjAzMiwtMTIyLjQwMzQ2NDA4MDAzM10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVkYTFlOWM0NWNhNzRlZWFhYTIxZGQzMWNiYmJjYTc0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNhZGVhZjdkNzhkNjQ2NThhM2ViMWJkNzk2YjdiZjJmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA4MmYxN2MxODJjMjRhYzZiZTljNDgyMzZjY2ZlZWQ0ID0gJCgnPGRpdiBpZD0iaHRtbF8wODJmMTdjMTgyYzI0YWM2YmU5YzQ4MjM2Y2NmZWVkNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UFJPU1RJVFVUSU9OPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zYWRlYWY3ZDc4ZDY0NjU4YTNlYjFiZDc5NmI3YmYyZi5zZXRDb250ZW50KGh0bWxfMDgyZjE3YzE4MmMyNGFjNmJlOWM0ODIzNmNjZmVlZDQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl80ZmJmYTdlNmUyZWI0ZDcxYTIzNDM2N2I3YWZlMGE4MS5iaW5kUG9wdXAocG9wdXBfM2FkZWFmN2Q3OGQ2NDY1OGEzZWIxYmQ3OTZiN2JmMmYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYTE4ZDc2OGFjY2UxNDQ2MzgxODJmZmMxNjcwMjk0MTIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43Nzg1MjMzNzc2MDMyLC0xMjIuNDAzNDY0MDgwMDMzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjA0MDdjNTAyNTkyNGY3ODk3Mzg0MTBmM2QzMGM3NmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGVmMTE0MDJjNmRhNGVkZDk1NmE3ZmY1MTM3M2FkYWMgPSAkKCc8ZGl2IGlkPSJodG1sX2RlZjExNDAyYzZkYTRlZGQ5NTZhN2ZmNTEzNzNhZGFjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjA0MDdjNTAyNTkyNGY3ODk3Mzg0MTBmM2QzMGM3NmQuc2V0Q29udGVudChodG1sX2RlZjExNDAyYzZkYTRlZGQ5NTZhN2ZmNTEzNzNhZGFjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYTE4ZDc2OGFjY2UxNDQ2MzgxODJmZmMxNjcwMjk0MTIuYmluZFBvcHVwKHBvcHVwX2IwNDA3YzUwMjU5MjRmNzg5NzM4NDEwZjNkMzBjNzZkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzE1ZDJjNWVhOTQ3YzQ0OGRhYWY5YTBmYzYzNjVmNmU5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzczMjkxODA2OTAyOTk2LC0xMjIuNDM2NjE0MTgxMzMxMDFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZGExZTljNDVjYTc0ZWVhYWEyMWRkMzFjYmJiY2E3NCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hNTNmYzk4NjhjNjU0YmJlYTkxZDU2YzQyZWQ5ZWRkYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wNjllMGYwMmU3MmU0MjlkYmVkZDI4ZTNiZDVhM2RmYyA9ICQoJzxkaXYgaWQ9Imh0bWxfMDY5ZTBmMDJlNzJlNDI5ZGJlZGQyOGUzYmQ1YTNkZmMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTUzZmM5ODY4YzY1NGJiZWE5MWQ1NmM0MmVkOWVkZGMuc2V0Q29udGVudChodG1sXzA2OWUwZjAyZTcyZTQyOWRiZWRkMjhlM2JkNWEzZGZjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMTVkMmM1ZWE5NDdjNDQ4ZGFhZjlhMGZjNjM2NWY2ZTkuYmluZFBvcHVwKHBvcHVwX2E1M2ZjOTg2OGM2NTRiYmVhOTFkNTZjNDJlZDllZGRjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzY0ZmNkMTNmYmYwNjRmNTk5NjA5MmZmYzQzMjI1OWU3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgwNTI3NTc4NTA5LC0xMjIuMzk2ODQ5MDE1MTcyMDFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZGExZTljNDVjYTc0ZWVhYWEyMWRkMzFjYmJiY2E3NCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kN2JiYTA3MWE4OTE0ODY5YjI5MmE2Yzg0NDMxZDcyZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xYTA0YjY3ODY0ODA0ODdkYjNlMTkwMjU0N2U4OGIzZSA9ICQoJzxkaXYgaWQ9Imh0bWxfMWEwNGI2Nzg2NDgwNDg3ZGIzZTE5MDI1NDdlODhiM2UiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRSVUcvTkFSQ09USUM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q3YmJhMDcxYTg5MTQ4NjliMjkyYTZjODQ0MzFkNzJkLnNldENvbnRlbnQoaHRtbF8xYTA0YjY3ODY0ODA0ODdkYjNlMTkwMjU0N2U4OGIzZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzY0ZmNkMTNmYmYwNjRmNTk5NjA5MmZmYzQzMjI1OWU3LmJpbmRQb3B1cChwb3B1cF9kN2JiYTA3MWE4OTE0ODY5YjI5MmE2Yzg0NDMxZDcyZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8yODM1YjRmZGNiNTE0OTFhYmM1NjUwNWEyNmJhYjJmYiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MDUyNzU3ODUwOSwtMTIyLjM5Njg0OTAxNTE3MjAxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDMwYjU2NjQzZGE3NDkxN2IyM2JhZTJjM2UwMWJmNWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGUyMjdiOTgzMDY5NDQ4NDk0NmU4ZGQxMmU4ZmQ5M2IgPSAkKCc8ZGl2IGlkPSJodG1sX2RlMjI3Yjk4MzA2OTQ0ODQ5NDZlOGRkMTJlOGZkOTNiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XQVJSQU5UUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDMwYjU2NjQzZGE3NDkxN2IyM2JhZTJjM2UwMWJmNWEuc2V0Q29udGVudChodG1sX2RlMjI3Yjk4MzA2OTQ0ODQ5NDZlOGRkMTJlOGZkOTNiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMjgzNWI0ZmRjYjUxNDkxYWJjNTY1MDVhMjZiYWIyZmIuYmluZFBvcHVwKHBvcHVwX2QzMGI1NjY0M2RhNzQ5MTdiMjNiYWUyYzNlMDFiZjVhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzNlOGIwY2U3YWYxZTRiZGNiNGZjYjc4Yjg1YTUzNDdkID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzI4NDE4MDcwNjYwMjA0LC0xMjIuNDUwMDAwNzkwNDQ1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjY0MDkyNjYwYWYzNDcwZTllOWIyYTBkNmIxNTc0Y2QgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODU4ZjI4YTU3OWZhNDYxM2E5ZjBiMWM4ZWMzNjJhYmIgPSAkKCc8ZGl2IGlkPSJodG1sXzg1OGYyOGE1NzlmYTQ2MTNhOWYwYjFjOGVjMzYyYWJiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MQVJDRU5ZL1RIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iNjQwOTI2NjBhZjM0NzBlOWU5YjJhMGQ2YjE1NzRjZC5zZXRDb250ZW50KGh0bWxfODU4ZjI4YTU3OWZhNDYxM2E5ZjBiMWM4ZWMzNjJhYmIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8zZThiMGNlN2FmMWU0YmRjYjRmY2I3OGI4NWE1MzQ3ZC5iaW5kUG9wdXAocG9wdXBfYjY0MDkyNjYwYWYzNDcwZTllOWIyYTBkNmIxNTc0Y2QpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZjIzNjM5ZWZkMTc5NDBiMDhhNjAxODUxY2U2ZTE4NjMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjkyMTE0NjQ3MzU5LC0xMjIuNDAwODM0MjgzMDMxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTEyMGI3MzIzMmE1NGQyZGE0ZjI1NGYwOTlmOTMxMGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzJlYjg1NmQwY2U4NGEwMDlkZWQ2ZmRhOTljNzM2NWUgPSAkKCc8ZGl2IGlkPSJodG1sX2MyZWI4NTZkMGNlODRhMDA5ZGVkNmZkYTk5YzczNjVlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTEyMGI3MzIzMmE1NGQyZGE0ZjI1NGYwOTlmOTMxMGIuc2V0Q29udGVudChodG1sX2MyZWI4NTZkMGNlODRhMDA5ZGVkNmZkYTk5YzczNjVlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZjIzNjM5ZWZkMTc5NDBiMDhhNjAxODUxY2U2ZTE4NjMuYmluZFBvcHVwKHBvcHVwXzkxMjBiNzMyMzJhNTRkMmRhNGYyNTRmMDk5ZjkzMTBiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzNkM2EwYzY2ODgzNDQwYzY5NTc3YWEyODAzNTU0OTc1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg4MDA2NTMyNDM5MjA1LC0xMjIuMzk5ODAyMTQ1Nzk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODM0ZjVhZGUzOGUyNGEzNGI3NmJmN2ZjMjI1MzNiMTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGJkMzg4MzM5NWIyNGFlM2JhMDIxNDJkNjhjMGIxNGIgPSAkKCc8ZGl2IGlkPSJodG1sXzBiZDM4ODMzOTViMjRhZTNiYTAyMTQyZDY4YzBiMTRiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MQVJDRU5ZL1RIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MzRmNWFkZTM4ZTI0YTM0Yjc2YmY3ZmMyMjUzM2IxMC5zZXRDb250ZW50KGh0bWxfMGJkMzg4MzM5NWIyNGFlM2JhMDIxNDJkNjhjMGIxNGIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8zZDNhMGM2Njg4MzQ0MGM2OTU3N2FhMjgwMzU1NDk3NS5iaW5kUG9wdXAocG9wdXBfODM0ZjVhZGUzOGUyNGEzNGI3NmJmN2ZjMjI1MzNiMTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMjkyZGMwMzA2MzhkNDE1OGJkNDk3ZTZiOTM2OGM0NDYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjM5NzQ4MjQxNjA5LC0xMjIuMzk0OTI4NDc1OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVkYTFlOWM0NWNhNzRlZWFhYTIxZGQzMWNiYmJjYTc0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg3ZTU2ZDhhZjA3ZjQ1NmQ5ODc0ODQ5ZmJlM2RhMTRiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI2YjA5ZTZhMzc3YTQ3NmE5NGZhNmY1ZTc1ZDE0NzQ2ID0gJCgnPGRpdiBpZD0iaHRtbF8yNmIwOWU2YTM3N2E0NzZhOTRmYTZmNWU3NWQxNDc0NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U0VDT05EQVJZIENPREVTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84N2U1NmQ4YWYwN2Y0NTZkOTg3NDg0OWZiZTNkYTE0Yi5zZXRDb250ZW50KGh0bWxfMjZiMDllNmEzNzdhNDc2YTk0ZmE2ZjVlNzVkMTQ3NDYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8yOTJkYzAzMDYzOGQ0MTU4YmQ0OTdlNmI5MzY4YzQ0Ni5iaW5kUG9wdXAocG9wdXBfODdlNTZkOGFmMDdmNDU2ZDk4NzQ4NDlmYmUzZGExNGIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNDc0NTg2NmRjMDVlNDQ5MmFiODc5MTJlNGUwNmUyMjAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjM5NzQ4MjQxNjA5LC0xMjIuMzk0OTI4NDc1OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVkYTFlOWM0NWNhNzRlZWFhYTIxZGQzMWNiYmJjYTc0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNmNTZkOTg1ZjJkMzQxM2ZiOGQ1ZGE0ODY4ZjVkZWMyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBiNTc2N2FkYTkwZDRkN2VhZGJhMDBlMDJkYzVhZGViID0gJCgnPGRpdiBpZD0iaHRtbF8wYjU3NjdhZGE5MGQ0ZDdlYWRiYTAwZTAyZGM1YWRlYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U1VTUElDSU9VUyBPQ0M8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNmNTZkOTg1ZjJkMzQxM2ZiOGQ1ZGE0ODY4ZjVkZWMyLnNldENvbnRlbnQoaHRtbF8wYjU3NjdhZGE5MGQ0ZDdlYWRiYTAwZTAyZGM1YWRlYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzQ3NDU4NjZkYzA1ZTQ0OTJhYjg3OTEyZTRlMDZlMjIwLmJpbmRQb3B1cChwb3B1cF8zZjU2ZDk4NWYyZDM0MTNmYjhkNWRhNDg2OGY1ZGVjMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9lY2NlNWZkMTA1Mjk0ZDAwOTMwODYyMDNiY2NmNDIwYiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyMzk3NDgyNDE2MDksLTEyMi4zOTQ5Mjg0NzU4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDc1OTQ4ZTczY2QxNDA5ZmFkODUyZDM3MTQwODk5ZDAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjViOTNmMTE1NTk1NGEyNTg0NWJmYjlkMGU4OGI0MTMgPSAkKCc8ZGl2IGlkPSJodG1sXzI1YjkzZjExNTU5NTRhMjU4NDViZmI5ZDBlODhiNDEzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDc1OTQ4ZTczY2QxNDA5ZmFkODUyZDM3MTQwODk5ZDAuc2V0Q29udGVudChodG1sXzI1YjkzZjExNTU5NTRhMjU4NDViZmI5ZDBlODhiNDEzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZWNjZTVmZDEwNTI5NGQwMDkzMDg2MjAzYmNjZjQyMGIuYmluZFBvcHVwKHBvcHVwXzQ3NTk0OGU3M2NkMTQwOWZhZDg1MmQzNzE0MDg5OWQwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzE5YzE2NTA3ZTEzOTQ5NmFiODZmZGUxNTdlYjYzZDc3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg4MzIzNTQ0OTkwNCwtMTIyLjQxMTg1NzAzMjU0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzRhNTZkZTQwMDQ2NGNmZTgzNDQwZmE4MDUyZDBiY2IgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzkxNTljMmUwMzk1NGNkYmFlMmZmNjBkOTFhODNkNTggPSAkKCc8ZGl2IGlkPSJodG1sXzc5MTU5YzJlMDM5NTRjZGJhZTJmZjYwZDkxYTgzZDU4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MQVJDRU5ZL1RIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNGE1NmRlNDAwNDY0Y2ZlODM0NDBmYTgwNTJkMGJjYi5zZXRDb250ZW50KGh0bWxfNzkxNTljMmUwMzk1NGNkYmFlMmZmNjBkOTFhODNkNTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8xOWMxNjUwN2UxMzk0OTZhYjg2ZmRlMTU3ZWI2M2Q3Ny5iaW5kUG9wdXAocG9wdXBfYzRhNTZkZTQwMDQ2NGNmZTgzNDQwZmE4MDUyZDBiY2IpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNDcyMjBkYTRmNGIxNDFkYTllNjFhODEwNzczMDU1YTQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NTU5OTc3MzM5ODU2LC0xMjIuNDA5NDM1NjE3MTA2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjVmNzg5MzNhYmM0NGZlZTk4OTBiZTJhYzBjMjRlNjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGMyMjEzYmVhNTU2NDI0NGIxMzllNzdhN2RmZmVmMTIgPSAkKCc8ZGl2IGlkPSJodG1sXzhjMjIxM2JlYTU1NjQyNDRiMTM5ZTc3YTdkZmZlZjEyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjVmNzg5MzNhYmM0NGZlZTk4OTBiZTJhYzBjMjRlNjEuc2V0Q29udGVudChodG1sXzhjMjIxM2JlYTU1NjQyNDRiMTM5ZTc3YTdkZmZlZjEyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNDcyMjBkYTRmNGIxNDFkYTllNjFhODEwNzczMDU1YTQuYmluZFBvcHVwKHBvcHVwXzY1Zjc4OTMzYWJjNDRmZWU5ODkwYmUyYWMwYzI0ZTYxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2JkOTkyNWRiZWEwNzRiNWFiNGVlYWY2YzlkMzAzNmFjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg3MDc5ODE0NDQ0MywtMTIyLjQyNTg4MzM1ODE0OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVkYTFlOWM0NWNhNzRlZWFhYTIxZGQzMWNiYmJjYTc0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I2Yjg0Y2I1ODQ0NjRkNWJiNDUwNzQxZDM4ZmZjNzIwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E1Y2UxZWZmMGJmYjRmOThiZmZjZGE1NjU5NDRjY2UyID0gJCgnPGRpdiBpZD0iaHRtbF9hNWNlMWVmZjBiZmI0Zjk4YmZmY2RhNTY1OTQ0Y2NlMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iNmI4NGNiNTg0NDY0ZDViYjQ1MDc0MWQzOGZmYzcyMC5zZXRDb250ZW50KGh0bWxfYTVjZTFlZmYwYmZiNGY5OGJmZmNkYTU2NTk0NGNjZTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9iZDk5MjVkYmVhMDc0YjVhYjRlZWFmNmM5ZDMwMzZhYy5iaW5kUG9wdXAocG9wdXBfYjZiODRjYjU4NDQ2NGQ1YmI0NTA3NDFkMzhmZmM3MjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfODA0YmY1NjcwOTJjNDlmNDgzZmFkZTBlMTg5Zjk0MDggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MzYwMzc0NDY2ODYyMDQsLTEyMi40MTUxMjY1NDMwMDEwMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVkYTFlOWM0NWNhNzRlZWFhYTIxZGQzMWNiYmJjYTc0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZhMDQ2ZDFlZTZjNzQ3YWJiZjJkMWM4NTc1MzNiMTI0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg2YmNmZmY3ODdmNzQxMGRiNTdlOGZjYzE3NjQyYzRiID0gJCgnPGRpdiBpZD0iaHRtbF84NmJjZmZmNzg3Zjc0MTBkYjU3ZThmY2MxNzY0MmM0YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mYTA0NmQxZWU2Yzc0N2FiYmYyZDFjODU3NTMzYjEyNC5zZXRDb250ZW50KGh0bWxfODZiY2ZmZjc4N2Y3NDEwZGI1N2U4ZmNjMTc2NDJjNGIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84MDRiZjU2NzA5MmM0OWY0ODNmYWRlMGUxODlmOTQwOC5iaW5kUG9wdXAocG9wdXBfZmEwNDZkMWVlNmM3NDdhYmJmMmQxYzg1NzUzM2IxMjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfY2ZjOTNlZTcyOGMwNDEzNThmYWIyMzczYTE4Yzk4OWYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MTI3Njc4ODQ4MjEsLTEyMi40MzE5MjgwMTEwODldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZGExZTljNDVjYTc0ZWVhYWEyMWRkMzFjYmJiY2E3NCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lNTdjMDg0MjBhM2U0YmMyYjFiZmM3Y2ZkYWRlOTQ2NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85MzBlYTcxMzUyNjY0MmQ4OGI2NzU0MGU1MmI5MDIzMCA9ICQoJzxkaXYgaWQ9Imh0bWxfOTMwZWE3MTM1MjY2NDJkODhiNjc1NDBlNTJiOTAyMzAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lNTdjMDg0MjBhM2U0YmMyYjFiZmM3Y2ZkYWRlOTQ2Ni5zZXRDb250ZW50KGh0bWxfOTMwZWE3MTM1MjY2NDJkODhiNjc1NDBlNTJiOTAyMzApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jZmM5M2VlNzI4YzA0MTM1OGZhYjIzNzNhMThjOTg5Zi5iaW5kUG9wdXAocG9wdXBfZTU3YzA4NDIwYTNlNGJjMmIxYmZjN2NmZGFkZTk0NjYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMWMwMGIzYWU4Y2EyNDg4ZTg3YzJjZmU5NzQ0Y2FjZjYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODk1NzEwMjU1ODYzLC0xMjIuNDAyMTYzNzEzNjE4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjM4ZWMwNjE2NzYzNGQ5Yjk2ZWRiNzJmZjAzOTlmMDMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzJlYzM1YWU4ODU2NDY2ZmI1MTY3MjY2ODMwY2I0NmQgPSAkKCc8ZGl2IGlkPSJodG1sX2MyZWMzNWFlODg1NjQ2NmZiNTE2NzI2NjgzMGNiNDZkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EUlVOS0VOTkVTUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjM4ZWMwNjE2NzYzNGQ5Yjk2ZWRiNzJmZjAzOTlmMDMuc2V0Q29udGVudChodG1sX2MyZWMzNWFlODg1NjQ2NmZiNTE2NzI2NjgzMGNiNDZkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMWMwMGIzYWU4Y2EyNDg4ZTg3YzJjZmU5NzQ0Y2FjZjYuYmluZFBvcHVwKHBvcHVwX2YzOGVjMDYxNjc2MzRkOWI5NmVkYjcyZmYwMzk5ZjAzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2I1NjljYmRhMzVjNzRjNTA4ZjVkYjlkMzNmMGNhMDBjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzMwNzQyOTE2OTU1OSwtMTIyLjQyOTMwNjcyODM3Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVkYTFlOWM0NWNhNzRlZWFhYTIxZGQzMWNiYmJjYTc0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc1ZGRiYTliYTdiNTRjZTk5ZDg4N2FiMDdmYjcxOWY1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM3YzE3M2UwNmY4MTQzMmY5YmYzNTJiOGU1OTI5YWFmID0gJCgnPGRpdiBpZD0iaHRtbF8zN2MxNzNlMDZmODE0MzJmOWJmMzUyYjhlNTkyOWFhZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc1ZGRiYTliYTdiNTRjZTk5ZDg4N2FiMDdmYjcxOWY1LnNldENvbnRlbnQoaHRtbF8zN2MxNzNlMDZmODE0MzJmOWJmMzUyYjhlNTkyOWFhZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2I1NjljYmRhMzVjNzRjNTA4ZjVkYjlkMzNmMGNhMDBjLmJpbmRQb3B1cChwb3B1cF83NWRkYmE5YmE3YjU0Y2U5OWQ4ODdhYjA3ZmI3MTlmNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl82ODYwYThkYzUwNGI0MDRiYjI5NGFlOGNkMjIzYzI4OCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MzgzNjU1NjUzNDc5NCwtMTIyLjQxMzc5MDk3Mjc4MDk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGZmYTgxOGM3NWFhNDVmNThlOTE3OTQxZGM3ZmUyYTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzMyMDAzNWYzYzhkNDE1MmE3M2YzMzE2ZTllZjAyYzMgPSAkKCc8ZGl2IGlkPSJodG1sXzMzMjAwMzVmM2M4ZDQxNTJhNzNmMzMxNmU5ZWYwMmMzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WQU5EQUxJU008L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBmZmE4MThjNzVhYTQ1ZjU4ZTkxNzk0MWRjN2ZlMmEzLnNldENvbnRlbnQoaHRtbF8zMzIwMDM1ZjNjOGQ0MTUyYTczZjMzMTZlOWVmMDJjMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzY4NjBhOGRjNTA0YjQwNGJiMjk0YWU4Y2QyMjNjMjg4LmJpbmRQb3B1cChwb3B1cF8wZmZhODE4Yzc1YWE0NWY1OGU5MTc5NDFkYzdmZTJhMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8yNjJmZWU5NzI5YzU0Mjg2OGU4NzE5ZmNmNDM3MjY3YyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczMDc0MjkxNjk1NTksLTEyMi40MjkzMDY3MjgzNzZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZGExZTljNDVjYTc0ZWVhYWEyMWRkMzFjYmJiY2E3NCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jNjBhMWRiZDM5Mjg0M2UzODgyZmFhOTM4ZmYyMzhiNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mZDZhMzRlMzE2MDI0YTgzOTcxNTQxMzdhYmViMTk0MCA9ICQoJzxkaXYgaWQ9Imh0bWxfZmQ2YTM0ZTMxNjAyNGE4Mzk3MTU0MTM3YWJlYjE5NDAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNjBhMWRiZDM5Mjg0M2UzODgyZmFhOTM4ZmYyMzhiNC5zZXRDb250ZW50KGh0bWxfZmQ2YTM0ZTMxNjAyNGE4Mzk3MTU0MTM3YWJlYjE5NDApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8yNjJmZWU5NzI5YzU0Mjg2OGU4NzE5ZmNmNDM3MjY3Yy5iaW5kUG9wdXAocG9wdXBfYzYwYTFkYmQzOTI4NDNlMzg4MmZhYTkzOGZmMjM4YjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZDUyNGE2YTBlYWYzNGY4Njg4NGViN2VmOTZlZmExMTggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MzczNjIzNjA1MjEyOTYsLTEyMi40MjIwNjcxODQ5MzddLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZGExZTljNDVjYTc0ZWVhYWEyMWRkMzFjYmJiY2E3NCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80MjQ0N2FlNjJiYWY0ZjM3YTQ4YTQzYjZhMjI5YjMxMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMThhNjc5YzgwOWE0ZWZlYmNhYTgwMzY3NmE2MWUzYiA9ICQoJzxkaXYgaWQ9Imh0bWxfZDE4YTY3OWM4MDlhNGVmZWJjYWE4MDM2NzZhNjFlM2IiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNFQ09OREFSWSBDT0RFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDI0NDdhZTYyYmFmNGYzN2E0OGE0M2I2YTIyOWIzMTEuc2V0Q29udGVudChodG1sX2QxOGE2NzljODA5YTRlZmViY2FhODAzNjc2YTYxZTNiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZDUyNGE2YTBlYWYzNGY4Njg4NGViN2VmOTZlZmExMTguYmluZFBvcHVwKHBvcHVwXzQyNDQ3YWU2MmJhZjRmMzdhNDhhNDNiNmEyMjliMzExKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2U1OTRkZWU3OTQzZjQzYTlhMzI5ZWMzNWZjNDliMjg1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzM3MzYyMzYwNTIxMjk2LC0xMjIuNDIyMDY3MTg0OTM3XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTIwNzhiNjdlOWJmNDUxOTkwMWYyMmRhODIxNjA0YTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDY0YzE1MjVkMWRmNDk5ZTliYjQ4MjFmZTk3ZDMyZjQgPSAkKCc8ZGl2IGlkPSJodG1sX2Q2NGMxNTI1ZDFkZjQ5OWU5YmI0ODIxZmU5N2QzMmY0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WQU5EQUxJU008L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkyMDc4YjY3ZTliZjQ1MTk5MDFmMjJkYTgyMTYwNGEzLnNldENvbnRlbnQoaHRtbF9kNjRjMTUyNWQxZGY0OTllOWJiNDgyMWZlOTdkMzJmNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2U1OTRkZWU3OTQzZjQzYTlhMzI5ZWMzNWZjNDliMjg1LmJpbmRQb3B1cChwb3B1cF85MjA3OGI2N2U5YmY0NTE5OTAxZjIyZGE4MjE2MDRhMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl84M2YwZTI0MjNkMGU0MGNmODkxZTljZTJkZmUzOTlmMyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NTk5ODgzMjM3OTc5NiwtMTIyLjQxMTc0NzM3MTkyNF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVkYTFlOWM0NWNhNzRlZWFhYTIxZGQzMWNiYmJjYTc0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E0NGFhYzg1ODhlZTQ0Mjk4ZTZlNjBjYWUyZWNjN2Q0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRmMjc0MGQ4OTRlZTQ4ZTVhMWNhNzYzMjk4ZGE5ZDcyID0gJCgnPGRpdiBpZD0iaHRtbF80ZjI3NDBkODk0ZWU0OGU1YTFjYTc2MzI5OGRhOWQ3MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U1VTUElDSU9VUyBPQ0M8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E0NGFhYzg1ODhlZTQ0Mjk4ZTZlNjBjYWUyZWNjN2Q0LnNldENvbnRlbnQoaHRtbF80ZjI3NDBkODk0ZWU0OGU1YTFjYTc2MzI5OGRhOWQ3Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzgzZjBlMjQyM2QwZTQwY2Y4OTFlOWNlMmRmZTM5OWYzLmJpbmRQb3B1cChwb3B1cF9hNDRhYWM4NTg4ZWU0NDI5OGU2ZTYwY2FlMmVjYzdkNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl83MzE2MGZkZDUwY2M0NDMzOGQ3NGJlMjMwYzBhMWUxMiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2MzM3NTgwNTgwNTksLTEyMi40MjA0MzQ3MjQ1NTI5OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVkYTFlOWM0NWNhNzRlZWFhYTIxZGQzMWNiYmJjYTc0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdiNTg0NGJhYzZlNDQwNmY5MzA2ZDZiYWM4ODk3MzFiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI3MjYzNzBhYjYzYzQ5MmViODE0Yzc5YjE3NmU4YjExID0gJCgnPGRpdiBpZD0iaHRtbF8yNzI2MzcwYWI2M2M0OTJlYjgxNGM3OWIxNzZlOGIxMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdiNTg0NGJhYzZlNDQwNmY5MzA2ZDZiYWM4ODk3MzFiLnNldENvbnRlbnQoaHRtbF8yNzI2MzcwYWI2M2M0OTJlYjgxNGM3OWIxNzZlOGIxMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzczMTYwZmRkNTBjYzQ0MzM4ZDc0YmUyMzBjMGExZTEyLmJpbmRQb3B1cChwb3B1cF83YjU4NDRiYWM2ZTQ0MDZmOTMwNmQ2YmFjODg5NzMxYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl83MzJhZjI4MTEzODE0OWVhYWVhZjlkNWJhMTBjZmZhYSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NTAyMjY2MjI3ODYsLTEyMi40MTE5ODc2NDM1OTUwMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVkYTFlOWM0NWNhNzRlZWFhYTIxZGQzMWNiYmJjYTc0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ3NDMxOGFiNTJiNzQyOTNiZjJkNDNjYmExNTE1NGE0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBlOTdiZTkxYjE1ZTRlOWRiOWVlNmZlNmEzYTUzOWZjID0gJCgnPGRpdiBpZD0iaHRtbF8wZTk3YmU5MWIxNWU0ZTlkYjllZTZmZTZhM2E1MzlmYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80NzQzMThhYjUyYjc0MjkzYmYyZDQzY2JhMTUxNTRhNC5zZXRDb250ZW50KGh0bWxfMGU5N2JlOTFiMTVlNGU5ZGI5ZWU2ZmU2YTNhNTM5ZmMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl83MzJhZjI4MTEzODE0OWVhYWVhZjlkNWJhMTBjZmZhYS5iaW5kUG9wdXAocG9wdXBfNDc0MzE4YWI1MmI3NDI5M2JmMmQ0M2NiYTE1MTU0YTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNTZlODJlYjA4M2RiNDE4MWE3ZWFhNTg5OTNmNmY4ZDEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzQ2MjA2NDkxMDY0OTUsLTEyMi41MDAzODA0Mjc5MTVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZGExZTljNDVjYTc0ZWVhYWEyMWRkMzFjYmJiY2E3NCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zMzVkMmE5M2QyMDI0NTQ4OTUyZWNlZThlZmQ3MmQ4NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82NDk2MDg4NjgxZTE0YTliYjU0ZDE1MGJmYzA2ZDZlMSA9ICQoJzxkaXYgaWQ9Imh0bWxfNjQ5NjA4ODY4MWUxNGE5YmI1NGQxNTBiZmMwNmQ2ZTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zMzVkMmE5M2QyMDI0NTQ4OTUyZWNlZThlZmQ3MmQ4NC5zZXRDb250ZW50KGh0bWxfNjQ5NjA4ODY4MWUxNGE5YmI1NGQxNTBiZmMwNmQ2ZTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl81NmU4MmViMDgzZGI0MTgxYTdlYWE1ODk5M2Y2ZjhkMS5iaW5kUG9wdXAocG9wdXBfMzM1ZDJhOTNkMjAyNDU0ODk1MmVjZWU4ZWZkNzJkODQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfN2ViOWYxYjk0MjM4NDZmMWEyNDNhYjlhOGQ2ZWM4MjUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzUxOTE4MjY3MjE3LC0xMjIuNDY2NTU4NzgwNjgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWRhMWU5YzQ1Y2E3NGVlYWFhMjFkZDMxY2JiYmNhNzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjk1NTQwZTk0ZjE4NGJmMmIwMGM5MGE2OTJiZjUzNGQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjA2NTM0ZmE3YzZmNDIyYWI5ZTMyODM5ZDRhYzI5NGQgPSAkKCc8ZGl2IGlkPSJodG1sX2YwNjUzNGZhN2M2ZjQyMmFiOWUzMjgzOWQ0YWMyOTRkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5ST0JCRVJZPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82OTU1NDBlOTRmMTg0YmYyYjAwYzkwYTY5MmJmNTM0ZC5zZXRDb250ZW50KGh0bWxfZjA2NTM0ZmE3YzZmNDIyYWI5ZTMyODM5ZDRhYzI5NGQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl83ZWI5ZjFiOTQyMzg0NmYxYTI0M2FiOWE4ZDZlYzgyNS5iaW5kUG9wdXAocG9wdXBfNjk1NTQwZTk0ZjE4NGJmMmIwMGM5MGE2OTJiZjUzNGQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNWNkYzZhNmNkOTE5NDczNDk2YTJjMDE0YjQwYTc0MGEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDkwODQxNzI5MDI4LC0xMjIuNDg2OTI1OTYwMTE0MDFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZGExZTljNDVjYTc0ZWVhYWEyMWRkMzFjYmJiY2E3NCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNjc3NDhmN2RjMzA0ODI4ODNmMjhjZDhmNDJlNjg1YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hMDY0M2ZmMGJhNDY0OTNlOGU4NGYxYjMzYTc0MjliZSA9ICQoJzxkaXYgaWQ9Imh0bWxfYTA2NDNmZjBiYTQ2NDkzZThlODRmMWIzM2E3NDI5YmUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wNjc3NDhmN2RjMzA0ODI4ODNmMjhjZDhmNDJlNjg1Yy5zZXRDb250ZW50KGh0bWxfYTA2NDNmZjBiYTQ2NDkzZThlODRmMWIzM2E3NDI5YmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl81Y2RjNmE2Y2Q5MTk0NzM0OTZhMmMwMTRiNDBhNzQwYS5iaW5kUG9wdXAocG9wdXBfMDY3NzQ4ZjdkYzMwNDgyODgzZjI4Y2Q4ZjQyZTY4NWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfY2EyYmU2MjMxMmI2NDcwY2JjMWM4ODA1ZTJlNDY2MmQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43Njg1MzYwMTIzNTgzLC0xMjIuNDE1NjE2MzM4MzE5OTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZGExZTljNDVjYTc0ZWVhYWEyMWRkMzFjYmJiY2E3NCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMDkxNWEzNDU5ZTM0MThhYWJhZTdhYTRkN2U3MTg1YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wNGU0Zjc3MzNmZGU0ZjMxOTBiYjA4ZGVlNzI4NGNlYSA9ICQoJzxkaXYgaWQ9Imh0bWxfMDRlNGY3NzMzZmRlNGYzMTkwYmIwOGRlZTcyODRjZWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTA5MTVhMzQ1OWUzNDE4YWFiYWU3YWE0ZDdlNzE4NWMuc2V0Q29udGVudChodG1sXzA0ZTRmNzczM2ZkZTRmMzE5MGJiMDhkZWU3Mjg0Y2VhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfY2EyYmU2MjMxMmI2NDcwY2JjMWM4ODA1ZTJlNDY2MmQuYmluZFBvcHVwKHBvcHVwX2EwOTE1YTM0NTllMzQxOGFhYmFlN2FhNGQ3ZTcxODVjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2E5MmMyZTdmMzhiOTQ1NGRiZWVjNGI5Nzg2ZDlmOGExID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY0NDI5NzcxNDA3NCwtMTIyLjQ0OTc1MTY1MjU2M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVkYTFlOWM0NWNhNzRlZWFhYTIxZGQzMWNiYmJjYTc0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FhMzZjZmU5Nzc0MTQwMmNhN2I3NWQxODVkMTY3MjRlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y1ZjJjYWZiYjE4OTQ5MWViYzc1ZDRlNjVmMTc5M2UxID0gJCgnPGRpdiBpZD0iaHRtbF9mNWYyY2FmYmIxODk0OTFlYmM3NWQ0ZTY1ZjE3OTNlMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QlVSR0xBUlk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FhMzZjZmU5Nzc0MTQwMmNhN2I3NWQxODVkMTY3MjRlLnNldENvbnRlbnQoaHRtbF9mNWYyY2FmYmIxODk0OTFlYmM3NWQ0ZTY1ZjE3OTNlMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2E5MmMyZTdmMzhiOTQ1NGRiZWVjNGI5Nzg2ZDlmOGExLmJpbmRQb3B1cChwb3B1cF9hYTM2Y2ZlOTc3NDE0MDJjYTdiNzVkMTg1ZDE2NzI0ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9hNjAzMWNkODdlMjE0ZjU0OWYzZDhmOTk3YzYzYWExNCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NDQyOTc3MTQwNzQsLTEyMi40NDk3NTE2NTI1NjNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZGExZTljNDVjYTc0ZWVhYWEyMWRkMzFjYmJiY2E3NCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85ODdmMjY5MTJlN2Q0MDIzYmM5NDhhYmU1NzU3NDBhMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jN2M1OGE4Y2JjNmE0YWFjYWRmYmFkZGU5Yzg5Mzg1MiA9ICQoJzxkaXYgaWQ9Imh0bWxfYzdjNThhOGNiYzZhNGFhY2FkZmJhZGRlOWM4OTM4NTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxBUkNFTlkvVEhFRlQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk4N2YyNjkxMmU3ZDQwMjNiYzk0OGFiZTU3NTc0MGExLnNldENvbnRlbnQoaHRtbF9jN2M1OGE4Y2JjNmE0YWFjYWRmYmFkZGU5Yzg5Mzg1Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2E2MDMxY2Q4N2UyMTRmNTQ5ZjNkOGY5OTdjNjNhYTE0LmJpbmRQb3B1cChwb3B1cF85ODdmMjY5MTJlN2Q0MDIzYmM5NDhhYmU1NzU3NDBhMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9mMDA0YmYyY2E0NmI0YjEyOGEzZTQ1YThmNzk2MTZiNyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczNTI2ODE0NjkwODM5NiwtMTIyLjQ3MjcxNTc1OTYzMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVkYTFlOWM0NWNhNzRlZWFhYTIxZGQzMWNiYmJjYTc0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFhNzFlY2NjYWQxODRiNGE4ZjUwZjVkZWZjNjhkZWRmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzEyMmFmOGI0ZDRjYTQyZmI4ZTE0Njg1YTNiZmNjYzlkID0gJCgnPGRpdiBpZD0iaHRtbF8xMjJhZjhiNGQ0Y2E0MmZiOGUxNDY4NWEzYmZjY2M5ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TEFSQ0VOWS9USEVGVDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWE3MWVjY2NhZDE4NGI0YThmNTBmNWRlZmM2OGRlZGYuc2V0Q29udGVudChodG1sXzEyMmFmOGI0ZDRjYTQyZmI4ZTE0Njg1YTNiZmNjYzlkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZjAwNGJmMmNhNDZiNGIxMjhhM2U0NWE4Zjc5NjE2YjcuYmluZFBvcHVwKHBvcHVwXzFhNzFlY2NjYWQxODRiNGE4ZjUwZjVkZWZjNjhkZWRmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBmZWF0dXJlX2dyb3VwXzRmYzE4YTcwZjI4MTQzODRiNTNiZTVmMTdkNjBmMDAxID0gTC5mZWF0dXJlR3JvdXAoCiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF81ZGExZTljNDVjYTc0ZWVhYWEyMWRkMzFjYmJiY2E3NCk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGIzOWFkNTQ2ZjRlNGQwNWE1YzUxYjBiM2FhNDg5YzIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzU0MjA3MDY3MTEsLTEyMi40MDM0MDQ3OTE0Nzg5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF80ZmMxOGE3MGYyODE0Mzg0YjUzYmU1ZjE3ZDYwZjAwMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzgyYWVhZTdiMDNiNTQyNDY4NDQ4N2YwNDI1Yjc0OGMyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1NDIwNzA2NzExLC0xMjIuNDAzNDA0NzkxNDc4OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGZjMThhNzBmMjgxNDM4NGI1M2JlNWYxN2Q2MGYwMDEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hMGExMGMxNzA1NmQ0NzliYmUwMmRjNTcxMmVlNzk3MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyOTk4MDk2NzI5OTU5NiwtMTIyLjM4ODg1NjIwNDI5Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF80ZmMxOGE3MGYyODE0Mzg0YjUzYmU1ZjE3ZDYwZjAwMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ2OTgzZDNiNjg3OTRkOGFhMjY1NjZiNjE5MTVlYzNmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg1Nzg4Mzc2Njg4NzksLTEyMi40MTI5NzA1Mzc1OTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGZjMThhNzBmMjgxNDM4NGI1M2JlNWYxN2Q2MGYwMDEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jYTllOTNjMmI4YjE0NjQ4YWQxODkxY2Q1NDBhNGZjOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NTA1MDEyMTQ2NjgsLTEyMi40MTk2NzE3ODAyOTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGZjMThhNzBmMjgxNDM4NGI1M2JlNWYxN2Q2MGYwMDEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80YjRlNDAwN2ViYzI0MmRkYmU2YjljYmU0MjQzMTQ4NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4ODAxODU1NTgyOSwtMTIyLjQyNjA3NzE3NzM3NDk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzRmYzE4YTcwZjI4MTQzODRiNTNiZTVmMTdkNjBmMDAxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzk0ZGM0MGVhN2Y0NDNjNzgwOTFkZGU2Zjc1MjM2OWIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODA4Nzg5MzYwMjE0LC0xMjIuNDA1NzIxNDU0NTY3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzRmYzE4YTcwZjI4MTQzODRiNTNiZTVmMTdkNjBmMDAxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjA1ZDgzODI4OTM0NDIxNjhhNTcyMTJiNTQ3ZjVmZTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODM5ODA1NTkyNjM0LC0xMjIuNDExNzc4Mjk1OTkyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzRmYzE4YTcwZjI4MTQzODRiNTNiZTVmMTdkNjBmMDAxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2Y0Y2NkZmI0ODhjNDQxNWIzMzRkNmYwYWVkMzFjYTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzU3ODc2MjE4MjkyOTUsLTEyMi4zOTMzNTcyNDE0NTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGZjMThhNzBmMjgxNDM4NGI1M2JlNWYxN2Q2MGYwMDEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lODg3ODU2ZGE1NDk0Y2NjODQzODRlNzM1YjliMDc3ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyMDk2Njk2MTU0OTksLTEyMi4zODcxODE2MzU5OTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGZjMThhNzBmMjgxNDM4NGI1M2JlNWYxN2Q2MGYwMDEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wZDQ4ZTZmOTkyYTE0ZTYyODg0NDk4YzM0M2UwNDA2ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NDQ3ODE1Nzg2OTUwNSwtMTIyLjQ3NzM3NjUyNDAwMjk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzRmYzE4YTcwZjI4MTQzODRiNTNiZTVmMTdkNjBmMDAxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWYyMGJiN2NiZGM2NDA5NjkzODExOWVlYjZjMmM0NmEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDU3Mzg5NDI5NjU0OTUsLTEyMi40Nzc5NjAzMjcyOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGZjMThhNzBmMjgxNDM4NGI1M2JlNWYxN2Q2MGYwMDEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hOGI2OTQwM2NiODk0MWE2YTA0NThjOTMxYTFlZTc2YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczNTY5NzAyNzU0ODIwNiwtMTIyLjM3Njc1NzY1NTUzMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzRmYzE4YTcwZjI4MTQzODRiNTNiZTVmMTdkNjBmMDAxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2VmODQ5NmQwNzgwNDBjMjkyODdiNjcyZDY4ZmI3MTQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjkyNzA1MTk5NTkyLC0xMjIuNDMyMzI1ODcxMDI4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzRmYzE4YTcwZjI4MTQzODRiNTNiZTVmMTdkNjBmMDAxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzA4ZmVjYmNjMDhlNGY5YmI2M2E0YmFmMjA3Y2UzMzcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43OTE2NDI5ODIzODQsLTEyMi40MDA5MDg2OTg4ODk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF80ZmMxOGE3MGYyODE0Mzg0YjUzYmU1ZjE3ZDYwZjAwMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdmNDgzYjZiNTFkMTQyODI5Y2U0OWVlZjcwZTAyYzU1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzNzA2OTMwMTU0NSwtMTIyLjQwODU5NTExMDg2OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF80ZmMxOGE3MGYyODE0Mzg0YjUzYmU1ZjE3ZDYwZjAwMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM2NGNmNWJlNTVlODRmNmM5YTQ5MTRjOWFjMjA1ZGU0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzU3Mjg5NTkwNDU3Nzk1LC0xMjIuNDA2ODcwNDAyMDgyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzRmYzE4YTcwZjI4MTQzODRiNTNiZTVmMTdkNjBmMDAxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjk4YjY4MGJlNTNhNGJjODhmY2RiMWM0NjViOGZhNGUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDg5MDYzMDUxODI5LC0xMjIuNDIwMzU0NzgwODYwOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGZjMThhNzBmMjgxNDM4NGI1M2JlNWYxN2Q2MGYwMDEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wYjBhMGYzNTVkYjA0ZDcyOWE4ZTUyYTJmMWM5NjM1OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcxNTc2NTQyNjk5NSwtMTIyLjQzOTkwOTc2Njc3Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF80ZmMxOGE3MGYyODE0Mzg0YjUzYmU1ZjE3ZDYwZjAwMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JkZmQ2MmYxNjMzNDRjM2ZhYTAzZmEwZTQ3YTFiZTBhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzNTY5OTM4NjkxOCwtMTIyLjQwODQyMTExNjkyMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF80ZmMxOGE3MGYyODE0Mzg0YjUzYmU1ZjE3ZDYwZjAwMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA1YTFmOWNkZjUxODQ4MGI4OTA4MzkxMTJjNjJkYjY5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzczNjE4NjI3NjQ1NjA0LC0xMjIuNDIyMzE1NjcwNzQ5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzRmYzE4YTcwZjI4MTQzODRiNTNiZTVmMTdkNjBmMDAxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDY2MDA0OGY3MTdjNGQ4ZWIxN2Y2ODE4MDQwZTM2MzEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43OTI4NDEyODQwNDQ3MDUsLTEyMi40MjQ1MTk4MzUwMDkwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF80ZmMxOGE3MGYyODE0Mzg0YjUzYmU1ZjE3ZDYwZjAwMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M4MWI2NGVkZTc3YjQzMTNhZjNmZjFkMjU4NTBlZTk0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzU0MDk4Njg4MjA2Nzk1LC0xMjIuNDE0MjMzODQ5MDM3OThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGZjMThhNzBmMjgxNDM4NGI1M2JlNWYxN2Q2MGYwMDEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xMDkyMTdhZjAyZWI0MzdjYmI5MzQ0YThkY2E4NWM5NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc1NDA5ODY4ODIwNjc5NSwtMTIyLjQxNDIzMzg0OTAzNzk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzRmYzE4YTcwZjI4MTQzODRiNTNiZTVmMTdkNjBmMDAxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2U1ZjM4Zjk4NWQ4NDVlZWI0NzAxMGY5MTdhZjIwMmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzE0OTM5OTY5NDE2LC0xMjIuNTA3NzUwMTMxMDA0MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGZjMThhNzBmMjgxNDM4NGI1M2JlNWYxN2Q2MGYwMDEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wNTk1MzU0MTNkYTQ0MjdkOTliODJmM2NjZWQ5YTY5MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcxODMwMjIwNDc2NjAwNSwtMTIyLjQ3NDQ0NDYzOTU5NDk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzRmYzE4YTcwZjI4MTQzODRiNTNiZTVmMTdkNjBmMDAxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWE5Y2Q3ZTM3ZmE4NDUxOTllOGYzMGFjYjIzZGFmNjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjQ1NzUyMzE3NjE1LC0xMjIuNDI3NTYyNTk2OTg1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzRmYzE4YTcwZjI4MTQzODRiNTNiZTVmMTdkNjBmMDAxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzExMjllZDgxYTVjNDQzM2JiN2M3NjBlYjA3MGQzODUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODc0Mzc4MzA5MTEyLC0xMjIuNDE5MjAzMDA0MjY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzRmYzE4YTcwZjI4MTQzODRiNTNiZTVmMTdkNjBmMDAxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2VlZTY3MWQ1YTM1NGQ0YjgyNjMwMjVlMWRiMzY3NDMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDkzNjg4Mjg0NTMyLC0xMjIuNDEyNjkwMTQyMzA4MDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGZjMThhNzBmMjgxNDM4NGI1M2JlNWYxN2Q2MGYwMDEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lZWYzZjY2YmJhNjc0MjkxOTYzMmQ4Y2VjYjJkZDE4ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcwOTIwMTA0NjIzNzksLTEyMi40MzQ2MDkyODAzNTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGZjMThhNzBmMjgxNDM4NGI1M2JlNWYxN2Q2MGYwMDEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iYTJmNWVlOTU5NDQ0MjliYmJlYTczMzkyYmU0MGFlNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NzkyMDkzNzU1MzI5NSwtMTIyLjQxMDg4MjgyNTU1MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF80ZmMxOGE3MGYyODE0Mzg0YjUzYmU1ZjE3ZDYwZjAwMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E5MzA4MDgxODFlZjQ0MTQ4OTRmMDNjYzIyYmNmMmI4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuODAwNDU2NjQ3MTAzODksLTEyMi40MDE0MzI3NTQ3MjIwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF80ZmMxOGE3MGYyODE0Mzg0YjUzYmU1ZjE3ZDYwZjAwMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhhNjMyYTk4YTQ0NDQ1N2NiODYwZmM2YmU0MWUwYjBmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzQzNTU1MDU0MjI2NSwtMTIyLjQyMTEyODAyOTUwNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF80ZmMxOGE3MGYyODE0Mzg0YjUzYmU1ZjE3ZDYwZjAwMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzcyYmI4ODQ5YmU5ZjQ2MTY5Y2YzMmU3YzE2NWI4NjViID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg2NTY0NzYwNzY4NSwtMTIyLjQwNzI0NDA4NzAzMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF80ZmMxOGE3MGYyODE0Mzg0YjUzYmU1ZjE3ZDYwZjAwMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhmMWEwZDFkYWQxNzQyMGFhNmY4NTM3YzVlNzQxNjNmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzYxNTY1NTkyODA0NSwtMTIyLjQyMzgwMzAwMTkwMDk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzRmYzE4YTcwZjI4MTQzODRiNTNiZTVmMTdkNjBmMDAxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDg5MWUzYjgxZDg1NGM2M2IxMTU3MGVhMGQ0ZGRkM2QgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjE1NjU1OTI4MDQ1LC0xMjIuNDIzODAzMDAxOTAwOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGZjMThhNzBmMjgxNDM4NGI1M2JlNWYxN2Q2MGYwMDEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83YzQxNTUzNzc4N2Q0OWQ4ODA0Nzk4ZjEzYmMyNzdjNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0NDE5Mjc1MDg5MzIwNSwtMTIyLjQ0NDY4NTQ4MjI3M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF80ZmMxOGE3MGYyODE0Mzg0YjUzYmU1ZjE3ZDYwZjAwMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIwZDIxN2E2MGIxOTQ1MmU4OWE2NDhmNGYxNmQ2ZjI4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1NDY5MjgyMDA0MSwtMTIyLjQxNTc1NzAzOTE5Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF80ZmMxOGE3MGYyODE0Mzg0YjUzYmU1ZjE3ZDYwZjAwMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RmZTQ5ZmMyYTYxMDRjNzY5OTVlZWE3ODI0MzBmYmE5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzI4NTI4MDYyNzQ2NSwtMTIyLjQ3NTY0NzQ2MDc4NTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzRmYzE4YTcwZjI4MTQzODRiNTNiZTVmMTdkNjBmMDAxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWIwNTQ2Y2E2ZTk2NGJhNzhkNzEzYjlmZmIwNGNmMmMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDI4NTE3Mzc0NDQ4OTQsLTEyMi40MjA5Njc0NDA1NjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGZjMThhNzBmMjgxNDM4NGI1M2JlNWYxN2Q2MGYwMDEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mZTRlZmM5MDEwOWQ0Mzc5YWRlZGQxZTY0NmE0MWJkYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MjExOTg0ODg5MzEsLTEyMi40MTU2Njk2NjE0NDNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGZjMThhNzBmMjgxNDM4NGI1M2JlNWYxN2Q2MGYwMDEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82NGZmYjA0YTliODY0ZDYwOGRjN2UyYzk5YjQzZmYwYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3OTE2NzQyMTg5NjMsLTEyMi40MDYzNDY0MjU2MzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGZjMThhNzBmMjgxNDM4NGI1M2JlNWYxN2Q2MGYwMDEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81YzI4ZjM1NTgzODI0OTc3YThmNGU2MWU2YWM2YjRjYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NTcxODQzOTUyODIsLTEyMi40MDk1Mjk5MTMyNzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGZjMThhNzBmMjgxNDM4NGI1M2JlNWYxN2Q2MGYwMDEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zMWI5NTllMzRjNTE0NzY1OWQ4N2ZkZTYxNjJlNDRmOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NTQyMDcwNjcxMSwtMTIyLjQwMzQwNDc5MTQ3ODk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzRmYzE4YTcwZjI4MTQzODRiNTNiZTVmMTdkNjBmMDAxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTAxMWQ2ZTUzMjk4NDVhNmE0NTQyMTExNzk4YTM2OTMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43Njc1MjQzMDg3ODMsLTEyMi40MTA3MzgwOTczMTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGZjMThhNzBmMjgxNDM4NGI1M2JlNWYxN2Q2MGYwMDEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hZDZmNjAxNGNhMDA0YWM2YjljMTc5YWMwMGM1Y2M4MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NzUyNDMwODc4MywtMTIyLjQxMDczODA5NzMxNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF80ZmMxOGE3MGYyODE0Mzg0YjUzYmU1ZjE3ZDYwZjAwMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBjYjljZjg5ZDE3YjQ2MTViMmM1YTdiMjlmY2M3YWQ1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzEzMTA4MzQzMzI2NCwtMTIyLjQ0NDMxNDAyNTE4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF80ZmMxOGE3MGYyODE0Mzg0YjUzYmU1ZjE3ZDYwZjAwMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U0MTZiNjRiMDhiZjQ4MzM5ZmY4NWRkMzAzN2Q3ZjY2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzEzMTA4MzQzMzI2NCwtMTIyLjQ0NDMxNDAyNTE4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF80ZmMxOGE3MGYyODE0Mzg0YjUzYmU1ZjE3ZDYwZjAwMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JlYWNmMzVlNjZkODRmMjRhZDM0MWIwMDVkNTE3ZGFhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY2MDE2MDExNDEwMywtMTIyLjQwMzY0NDYyMDQzOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF80ZmMxOGE3MGYyODE0Mzg0YjUzYmU1ZjE3ZDYwZjAwMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVjNjE1MTZiZWQ4ZTRlOWU5NjFiYmM1YzcyMzE2MTk1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY2MDE2MDExNDEwMywtMTIyLjQwMzY0NDYyMDQzOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF80ZmMxOGE3MGYyODE0Mzg0YjUzYmU1ZjE3ZDYwZjAwMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2EzMTkzNzc4ZGQ3YTQ3YjlhNTM5MzMzZTQ4ZWJkZWY0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc2MjMxMDQwNDc1OCwtMTIyLjQxNDcxNDI5NTU3ODk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzRmYzE4YTcwZjI4MTQzODRiNTNiZTVmMTdkNjBmMDAxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzg3MzIzNzJlZDhmNDUxMDk3ZDc3MjEwNDYxYzhjZjEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzYyMzEwNDA0NzU4LC0xMjIuNDE0NzE0Mjk1NTc4OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGZjMThhNzBmMjgxNDM4NGI1M2JlNWYxN2Q2MGYwMDEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NTgzNDk1ZDAxOGE0M2IyYmYwN2RlMTEwN2IwMDc4NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NzUxMTg4OTU2OTUsLTEyMi40MTgwNDU0NTI3NjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGZjMThhNzBmMjgxNDM4NGI1M2JlNWYxN2Q2MGYwMDEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wM2M3NmMwNTI3YmY0ZTU1OWI0ZWMwZmZmZWMwMDAyZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MjAyMzg0Nzg5NzUsLTEyMi40MDExNjE1NTU2MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGZjMThhNzBmMjgxNDM4NGI1M2JlNWYxN2Q2MGYwMDEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kMGY3NWZmYzU5ZjQ0NjBjOTJiNGRjMjU2NmQ0NTFlNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyNzAwNTMxOTYyOTk5NSwtMTIyLjQwMzQwODY2OTE5MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF80ZmMxOGE3MGYyODE0Mzg0YjUzYmU1ZjE3ZDYwZjAwMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU1YjA1Y2RlMDk4MDQ4MTdhMzM0ZDliN2I0NDMyZDE5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzODM0NDM3NDE0MSwtMTIyLjQxMjkzMDUyMjA1OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF80ZmMxOGE3MGYyODE0Mzg0YjUzYmU1ZjE3ZDYwZjAwMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdkYjNhYTQ2ZmU2ZDQzMjFiMDc5NjE1OGI3MGEyMjY3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzUzMDE4NjUzNzQ0NjA0LC0xMjIuNDE4NTg3MTcyMjE5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzRmYzE4YTcwZjI4MTQzODRiNTNiZTVmMTdkNjBmMDAxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTYxMGM5MjYzNjFiNDc1ZDlmMDMzYjlmNTYxZmFmNTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzQwNDE4Mzg1MDQxLC0xMjIuNDE0MzcwNjI3NDk1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzRmYzE4YTcwZjI4MTQzODRiNTNiZTVmMTdkNjBmMDAxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTRmMjFmN2I1YjMzNDY1NWFiMWUxMDg5MDdiMjYxYWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43OTA1Mzg5OTM3MjUsLTEyMi40MDM5MTU2ODE1NzEwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF80ZmMxOGE3MGYyODE0Mzg0YjUzYmU1ZjE3ZDYwZjAwMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA3ZDBjZTYxOTkxNjQ1YTVhOTEzMzI5MjBjMmRkN2QzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzMDk5ODI0NDU5MjEsLTEyMi40MTkxODMwOTYzNjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGZjMThhNzBmMjgxNDM4NGI1M2JlNWYxN2Q2MGYwMDEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mZDVlZmQ4M2QwMDU0NzFhYWEwZTFiMjU5ZmUwNTdhYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0MDczNjA1NDgzNTc5LC0xMjIuMzg4NzUzMDQ2OTk3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzRmYzE4YTcwZjI4MTQzODRiNTNiZTVmMTdkNjBmMDAxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDY2Njc3ZGU5NDFjNDM3YjhmZDU4YmFhOGVjNjFmYmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzQ5OTEyOTQ0MzY2LC0xMjIuNDM3Nzk5NzAzNDY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzRmYzE4YTcwZjI4MTQzODRiNTNiZTVmMTdkNjBmMDAxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDRkNzg4MzcyZDQ2NDAwOGE4NmRiNTc1M2QwMDI1OTkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzcwOTAyNzQzNjY5LC0xMjIuNDIxMzMyNjg0NjMzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzRmYzE4YTcwZjI4MTQzODRiNTNiZTVmMTdkNjBmMDAxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDk1NjZjMWFhMDcwNDcxMzg5ZGExZjM1MTU3MDI3NzkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzcwOTAyNzQzNjY5LC0xMjIuNDIxMzMyNjg0NjMzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzRmYzE4YTcwZjI4MTQzODRiNTNiZTVmMTdkNjBmMDAxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjAzNDE3M2RkZmIyNDEzOTk3ZDA5N2MxYzRkNmRhN2IgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODIyNDU4MjIzOTE3LC0xMjIuNDQ2NjEyOTc4ODM5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzRmYzE4YTcwZjI4MTQzODRiNTNiZTVmMTdkNjBmMDAxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTM2NjRlZDA0NDlmNGY1OWEwZjI4OGFjYjQ5OTViNTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MzAwMzc5OTk1MTI3OTUsLTEyMi40MDQ1OTQxNDA2MzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGZjMThhNzBmMjgxNDM4NGI1M2JlNWYxN2Q2MGYwMDEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iYmNmNzk1MGU0NzE0NTAyYTFhNzliMmE3MDVhYzg3ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc5NTMzMzgyNjc0MzYsLTEyMi4zOTczNzM3NDAwNjZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGZjMThhNzBmMjgxNDM4NGI1M2JlNWYxN2Q2MGYwMDEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mNmUwMzAwMmNhYWQ0NzZjOTkyNjJkZmJlODY0MDkyZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NzUxNTg3NDE2MjI5NSwtMTIyLjQwNzQzNDk4OTUyM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF80ZmMxOGE3MGYyODE0Mzg0YjUzYmU1ZjE3ZDYwZjAwMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhiZTcxNzQ1Mzk1MjRmOGViNDE1ZjdiOTcwMWJkYTUzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc4NTIzMzc3NjAzMiwtMTIyLjQwMzQ2NDA4MDAzM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF80ZmMxOGE3MGYyODE0Mzg0YjUzYmU1ZjE3ZDYwZjAwMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk1NzkwMDhmZjIyMDQwYzViNzAwNGI2MDEyMDQ3MzNhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc4NTIzMzc3NjAzMiwtMTIyLjQwMzQ2NDA4MDAzM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF80ZmMxOGE3MGYyODE0Mzg0YjUzYmU1ZjE3ZDYwZjAwMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhlNzk5NDUzYWFlMTRjNjY5MjFkZGY1ZGZlMWUyODllID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzczMjkxODA2OTAyOTk2LC0xMjIuNDM2NjE0MTgxMzMxMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGZjMThhNzBmMjgxNDM4NGI1M2JlNWYxN2Q2MGYwMDEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jYThlMDNjNGExN2E0MTE3OWU3ZTcxNGEzNjdhYWY2OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MDUyNzU3ODUwOSwtMTIyLjM5Njg0OTAxNTE3MjAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzRmYzE4YTcwZjI4MTQzODRiNTNiZTVmMTdkNjBmMDAxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGZiYjBlODk1N2NjNDQ0ZWEyNjU3MWM0NzBhNGJhMjEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODA1Mjc1Nzg1MDksLTEyMi4zOTY4NDkwMTUxNzIwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF80ZmMxOGE3MGYyODE0Mzg0YjUzYmU1ZjE3ZDYwZjAwMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY4ZmYyYmQ5NzZiNjQ2NzBhMDZmMGUyM2Q3MDQ3NzQ0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzI4NDE4MDcwNjYwMjA0LC0xMjIuNDUwMDAwNzkwNDQ1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzRmYzE4YTcwZjI4MTQzODRiNTNiZTVmMTdkNjBmMDAxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzZhMTg5ZjlhMGUyNGFhNGFlMjc2NDhiMmZkMmNiY2IgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjkyMTE0NjQ3MzU5LC0xMjIuNDAwODM0MjgzMDMxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzRmYzE4YTcwZjI4MTQzODRiNTNiZTVmMTdkNjBmMDAxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzk0ZDYxMmUyYmE0NDNkYTkzYjY0YWYwNGVkNjNjMGQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODgwMDY1MzI0MzkyMDUsLTEyMi4zOTk4MDIxNDU3OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGZjMThhNzBmMjgxNDM4NGI1M2JlNWYxN2Q2MGYwMDEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hYmRhODA5ZTc1MTM0OTk0ODFkYTA0ZGU5YjA5MDRjNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyMzk3NDgyNDE2MDksLTEyMi4zOTQ5Mjg0NzU4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzRmYzE4YTcwZjI4MTQzODRiNTNiZTVmMTdkNjBmMDAxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmZiMWY5MjYyODY3NDIzNzhlZWJmNTg4MTcxMTYyNzcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjM5NzQ4MjQxNjA5LC0xMjIuMzk0OTI4NDc1OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF80ZmMxOGE3MGYyODE0Mzg0YjUzYmU1ZjE3ZDYwZjAwMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU5NDUyNGE3YWJkOTQwMDI5YjUzMmY3ZTI2MWZlZWUzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzIzOTc0ODI0MTYwOSwtMTIyLjM5NDkyODQ3NThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGZjMThhNzBmMjgxNDM4NGI1M2JlNWYxN2Q2MGYwMDEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84NGZkODM2NWZlYmI0MDMzODExM2MxNjZlNzM0MzM3NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4ODMyMzU0NDk5MDQsLTEyMi40MTE4NTcwMzI1NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF80ZmMxOGE3MGYyODE0Mzg0YjUzYmU1ZjE3ZDYwZjAwMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM1MzcyZjBjZmY3YjQxNjg5ZWVlYTgyNjMzZTU2NDU5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzU1OTk3NzMzOTg1NiwtMTIyLjQwOTQzNTYxNzEwNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF80ZmMxOGE3MGYyODE0Mzg0YjUzYmU1ZjE3ZDYwZjAwMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdhYjZlNmY1NzY1MTRjYTY4MjMyNDhlZTEzMGViNDRkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg3MDc5ODE0NDQ0MywtMTIyLjQyNTg4MzM1ODE0OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF80ZmMxOGE3MGYyODE0Mzg0YjUzYmU1ZjE3ZDYwZjAwMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZjZjVjNThlZGRiNTRhNmE5NDc1ZWQwNzdkNzY2ZGVhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzM2MDM3NDQ2Njg2MjA0LC0xMjIuNDE1MTI2NTQzMDAxMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGZjMThhNzBmMjgxNDM4NGI1M2JlNWYxN2Q2MGYwMDEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80NDMwM2M5MzUxNGI0YmJkYjRjOWQyMTgxMGFhOWQwZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcxMjc2Nzg4NDgyMSwtMTIyLjQzMTkyODAxMTA4OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF80ZmMxOGE3MGYyODE0Mzg0YjUzYmU1ZjE3ZDYwZjAwMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2MyZGE1ZDAwZGFjMDRlYmNhODQ2ZGYxZTk4MjM2NzRlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg5NTcxMDI1NTg2MywtMTIyLjQwMjE2MzcxMzYxOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF80ZmMxOGE3MGYyODE0Mzg0YjUzYmU1ZjE3ZDYwZjAwMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2UxYzBiOWNmN2E4YzRlYzU5NjliMjQ3YTQ2ZDkzZTY3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzMwNzQyOTE2OTU1OSwtMTIyLjQyOTMwNjcyODM3Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF80ZmMxOGE3MGYyODE0Mzg0YjUzYmU1ZjE3ZDYwZjAwMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U4MGUzYzQ3NWFkYzRmN2E4M2FhYTgyMDA4ZGQwZTQ4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzODM2NTU2NTM0Nzk0LC0xMjIuNDEzNzkwOTcyNzgwOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGZjMThhNzBmMjgxNDM4NGI1M2JlNWYxN2Q2MGYwMDEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80ZjNkY2M0NmEyNmE0M2Q0YTExOWNlYzY4NDY5NmJjOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczMDc0MjkxNjk1NTksLTEyMi40MjkzMDY3MjgzNzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGZjMThhNzBmMjgxNDM4NGI1M2JlNWYxN2Q2MGYwMDEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yMTJmYTUxMTVhNTA0ZDNhYTc4MmM5YjVhMTlmYzU0ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczNzM2MjM2MDUyMTI5NiwtMTIyLjQyMjA2NzE4NDkzN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF80ZmMxOGE3MGYyODE0Mzg0YjUzYmU1ZjE3ZDYwZjAwMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRjNzcxNDE3M2Q2MzQwMmQ5M2MzMmVmNzVlMjgwYzI5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzM3MzYyMzYwNTIxMjk2LC0xMjIuNDIyMDY3MTg0OTM3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzRmYzE4YTcwZjI4MTQzODRiNTNiZTVmMTdkNjBmMDAxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWI4MzYwY2ZhMGY4NDFlZDhhMjBiZTAyZWJkYjIxMGYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODU5OTg4MzIzNzk3OTYsLTEyMi40MTE3NDczNzE5MjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGZjMThhNzBmMjgxNDM4NGI1M2JlNWYxN2Q2MGYwMDEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zMGNmZWIzNGQyMjI0MDRmODYxY2QwYzExNWJlOGM3MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2MzM3NTgwNTgwNTksLTEyMi40MjA0MzQ3MjQ1NTI5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF80ZmMxOGE3MGYyODE0Mzg0YjUzYmU1ZjE3ZDYwZjAwMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RhYjUzYTI1NDNmYzRkYjY4ZjAwNGJlZDNhMDI5N2I2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg1MDIyNjYyMjc4NiwtMTIyLjQxMTk4NzY0MzU5NTAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzRmYzE4YTcwZjI4MTQzODRiNTNiZTVmMTdkNjBmMDAxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjdlMmIyOGNhN2RhNDc1MGFlMGEzNmNjZjkxYjE4OGUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzQ2MjA2NDkxMDY0OTUsLTEyMi41MDAzODA0Mjc5MTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGZjMThhNzBmMjgxNDM4NGI1M2JlNWYxN2Q2MGYwMDEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mNWFjY2E5YWNjNDE0ZDM0OWNjODMxMmRhZTE3NzQ5MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NTE5MTgyNjcyMTcsLTEyMi40NjY1NTg3ODA2ODNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGZjMThhNzBmMjgxNDM4NGI1M2JlNWYxN2Q2MGYwMDEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80MzA0YzhiYjliYzc0MmFlYmRlZDIyMGJhOThhZGIwMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0OTA4NDE3MjkwMjgsLTEyMi40ODY5MjU5NjAxMTQwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF80ZmMxOGE3MGYyODE0Mzg0YjUzYmU1ZjE3ZDYwZjAwMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBmYTMyMWYwMDg1YzQzNmU4N2YyNzU0YWFjZmNjZjI5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY4NTM2MDEyMzU4MywtMTIyLjQxNTYxNjMzODMxOTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzRmYzE4YTcwZjI4MTQzODRiNTNiZTVmMTdkNjBmMDAxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2Y5NzQ5OWRmNTkzNDVhMDhmODAzMzUwMjQ3ODcwMTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjQ0Mjk3NzE0MDc0LC0xMjIuNDQ5NzUxNjUyNTYzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzRmYzE4YTcwZjI4MTQzODRiNTNiZTVmMTdkNjBmMDAxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTZmZmMxMGJhY2FhNGZhYzg3OWRlMzM1YjlmODRhZGYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjQ0Mjk3NzE0MDc0LC0xMjIuNDQ5NzUxNjUyNTYzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzRmYzE4YTcwZjI4MTQzODRiNTNiZTVmMTdkNjBmMDAxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGQ0N2EwMDZkMTU3NGVjOThhZTNiMzFjYjI1NTFlYTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MzUyNjgxNDY5MDgzOTYsLTEyMi40NzI3MTU3NTk2MzFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNGZjMThhNzBmMjgxNDM4NGI1M2JlNWYxN2Q2MGYwMDEpOwogICAgICAgICAgICAKPC9zY3JpcHQ+ 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 0x7ff4ed5f2c18>"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# instantiate a feature group for the incidents in the dataframe\n",
"incidents = folium.map.FeatureGroup()\n",
"\n",
"# loop through the 100 crimes and add each to the incidents feature group\n",
"for lat, lng, in zip(df_incidents.Y, df_incidents.X):\n",
" incidents.add_child(\n",
" folium.features.CircleMarker(\n",
" [lat, lng],\n",
" radius=5, # define how big you want the circle markers to be\n",
" color='yellow',\n",
" fill=True,\n",
" fill_color='blue',\n",
" fill_opacity=0.6\n",
" )\n",
" )\n",
"\n",
"# add pop-up text to each marker on the map\n",
"latitudes = list(df_incidents.Y)\n",
"longitudes = list(df_incidents.X)\n",
"labels = list(df_incidents.Category)\n",
"\n",
"for lat, lng, label in zip(latitudes, longitudes, labels):\n",
" folium.Marker([lat, lng], popup=label).add_to(sanfran_map) \n",
" \n",
"# add incidents to map\n",
"sanfran_map.add_child(incidents)"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Isn't this really cool? Now you are able to know what crime category occurred at each marker.\n",
"\n",
"If you find the map to be so congested will all these markers, there are two remedies to this problem. The simpler solution is to remove these location markers and just add the text to the circle markers themselves as follows:"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"jupyter": {
"outputs_hidden": false
},
"new_sheet": false,
"run_control": {
"read_only": 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+ICNtYXBfOTg0Y2JlMWU4OTRjNDBlYWI0MzYzYjU3NmM3ZGUwODkgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzk4NGNiZTFlODk0YzQwZWFiNDM2M2I1NzZjN2RlMDg5IiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF85ODRjYmUxZTg5NGM0MGVhYjQzNjNiNTc2YzdkZTA4OSA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF85ODRjYmUxZTg5NGM0MGVhYjQzNjNiNTc2YzdkZTA4OScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbMzcuNzcsLTEyMi40Ml0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiAxMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfNzE4NWRkMjQ2YWMwNGIzZDk2OGZhOTczMjE5ZDFlZWUgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2JlMWU4OTRjNDBlYWI0MzYzYjU3NmM3ZGUwODkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JiY2Y3YjE0YTkyODRkMjFhYzdhYjY0ZWQyYzljZDI0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1NDIwNzA2NzExLC0xMjIuNDAzNDA0NzkxNDc4OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjYmUxZTg5NGM0MGVhYjQzNjNiNTc2YzdkZTA4OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hZDI1NzkwMDEzODA0M2ExYmU0NTViYjAzZjczMWFlZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mOGFhZTEwMGI2NDQ0MTZiOWI3ZGY2Nzk1NDg5NWQzMCA9ICQoJzxkaXYgaWQ9Imh0bWxfZjhhYWUxMDBiNjQ0NDE2YjliN2RmNjc5NTQ4OTVkMzAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldFQVBPTiBMQVdTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hZDI1NzkwMDEzODA0M2ExYmU0NTViYjAzZjczMWFlZS5zZXRDb250ZW50KGh0bWxfZjhhYWUxMDBiNjQ0NDE2YjliN2RmNjc5NTQ4OTVkMzApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmJjZjdiMTRhOTI4NGQyMWFjN2FiNjRlZDJjOWNkMjQuYmluZFBvcHVwKHBvcHVwX2FkMjU3OTAwMTM4MDQzYTFiZTQ1NWJiMDNmNzMxYWVlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUyODExNDk3NjBlMTRiZTc4YWQ1MzAwMjY0OWQ0MzU3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1NDIwNzA2NzExLC0xMjIuNDAzNDA0NzkxNDc4OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjYmUxZTg5NGM0MGVhYjQzNjNiNTc2YzdkZTA4OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80YzM2ZTM3MzJiZTE0MGFlYWRjMmY0NzQ1M2E0MzE2YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMzE2MmU3OWQ3ZDE0ODkxYjRkM2JiZGIxYTFlNjU0OCA9ICQoJzxkaXYgaWQ9Imh0bWxfZDMxNjJlNzlkN2QxNDg5MWI0ZDNiYmRiMWExZTY1NDgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldFQVBPTiBMQVdTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80YzM2ZTM3MzJiZTE0MGFlYWRjMmY0NzQ1M2E0MzE2Yi5zZXRDb250ZW50KGh0bWxfZDMxNjJlNzlkN2QxNDg5MWI0ZDNiYmRiMWExZTY1NDgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTI4MTE0OTc2MGUxNGJlNzhhZDUzMDAyNjQ5ZDQzNTcuYmluZFBvcHVwKHBvcHVwXzRjMzZlMzczMmJlMTQwYWVhZGMyZjQ3NDUzYTQzMTZiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAzMjJlMWY0NzI4YjQ1OWI4OGNhZTQxMmFmNjBjZGQ0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzI5OTgwOTY3Mjk5NTk2LC0xMjIuMzg4ODU2MjA0MjkyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2JlMWU4OTRjNDBlYWI0MzYzYjU3NmM3ZGUwODkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzFmZjJhNzU2MGQ2NDRlYmEzNGQ3OTRjYjk4YWYzYjYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDBlZDcxY2FlNzQyNDk0N2E5MDM3NTFkM2ZiMzRhZDMgPSAkKCc8ZGl2IGlkPSJodG1sX2QwZWQ3MWNhZTc0MjQ5NDdhOTAzNzUxZDNmYjM0YWQzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XQVJSQU5UUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzFmZjJhNzU2MGQ2NDRlYmEzNGQ3OTRjYjk4YWYzYjYuc2V0Q29udGVudChodG1sX2QwZWQ3MWNhZTc0MjQ5NDdhOTAzNzUxZDNmYjM0YWQzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzAzMjJlMWY0NzI4YjQ1OWI4OGNhZTQxMmFmNjBjZGQ0LmJpbmRQb3B1cChwb3B1cF8zMWZmMmE3NTYwZDY0NGViYTM0ZDc5NGNiOThhZjNiNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xMDExNjRmZDg1NDU0ZGFjODNmNDZlNmMwNWQ1NTNhMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NTc4ODM3NjY4ODc5LC0xMjIuNDEyOTcwNTM3NTkxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2JlMWU4OTRjNDBlYWI0MzYzYjU3NmM3ZGUwODkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzUzY2Q3MDVmNzViNDQ0OThjMGY0NmZkZTU2ZThhYjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2Q5ODkxMWFmZDA2NDZjMGFlNTU2Mjg1NTI3MTAwOWQgPSAkKCc8ZGl2IGlkPSJodG1sX2NkOTg5MTFhZmQwNjQ2YzBhZTU1NjI4NTUyNzEwMDlkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OT04tQ1JJTUlOQUw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM1M2NkNzA1Zjc1YjQ0NDk4YzBmNDZmZGU1NmU4YWI5LnNldENvbnRlbnQoaHRtbF9jZDk4OTExYWZkMDY0NmMwYWU1NTYyODU1MjcxMDA5ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xMDExNjRmZDg1NDU0ZGFjODNmNDZlNmMwNWQ1NTNhMS5iaW5kUG9wdXAocG9wdXBfMzUzY2Q3MDVmNzViNDQ0OThjMGY0NmZkZTU2ZThhYjkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2FmNTk5ZWQzMWNjNDI2YmJhNTNjYTUzNjc5ZGNmNDkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjUwNTAxMjE0NjY4LC0xMjIuNDE5NjcxNzgwMjk2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2JlMWU4OTRjNDBlYWI0MzYzYjU3NmM3ZGUwODkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGQ0MDllOGY5YTc5NDkyMzgwYzljZWJlNDFlYTI3NDcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2JmOGU4NzM5ZmNiNDgyZGI2NTVkYTFkNjAzODM4MTggPSAkKCc8ZGl2IGlkPSJodG1sXzdiZjhlODczOWZjYjQ4MmRiNjU1ZGExZDYwMzgzODE4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OT04tQ1JJTUlOQUw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RkNDA5ZThmOWE3OTQ5MjM4MGM5Y2ViZTQxZWEyNzQ3LnNldENvbnRlbnQoaHRtbF83YmY4ZTg3MzlmY2I0ODJkYjY1NWRhMWQ2MDM4MzgxOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zYWY1OTllZDMxY2M0MjZiYmE1M2NhNTM2NzlkY2Y0OS5iaW5kUG9wdXAocG9wdXBfZGQ0MDllOGY5YTc5NDkyMzgwYzljZWJlNDFlYTI3NDcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDIyZDEyODhlZmFjNDI5YjhmODM4ODI3ZGM2YmFhYzUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODgwMTg1NTU4MjksLTEyMi40MjYwNzcxNzczNzQ5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNiZTFlODk0YzQwZWFiNDM2M2I1NzZjN2RlMDg5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I2MDU2OWUzY2RiMTQ3M2JhYWEyN2NlMWY5Y2ZkZGYxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ0MzczMGVmNGMyODQ3NDM5YWNmYjM3YTZhNTc0MjJkID0gJCgnPGRpdiBpZD0iaHRtbF80NDM3MzBlZjRjMjg0NzQzOWFjZmIzN2E2YTU3NDIyZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QVNTQVVMVDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjYwNTY5ZTNjZGIxNDczYmFhYTI3Y2UxZjljZmRkZjEuc2V0Q29udGVudChodG1sXzQ0MzczMGVmNGMyODQ3NDM5YWNmYjM3YTZhNTc0MjJkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzAyMmQxMjg4ZWZhYzQyOWI4ZjgzODgyN2RjNmJhYWM1LmJpbmRQb3B1cChwb3B1cF9iNjA1NjllM2NkYjE0NzNiYWFhMjdjZTFmOWNmZGRmMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84N2VlZTJmMWIxMjc0MzM3YWU0YWQyYjNhYzYwMWYwMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MDg3ODkzNjAyMTQsLTEyMi40MDU3MjE0NTQ1NjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjYmUxZTg5NGM0MGVhYjQzNjNiNTc2YzdkZTA4OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hM2M2ZTI2MWIzYmU0M2E3OWEwNWJjNTMxNmZjN2RlNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xMzYxZWMyZmM4YTc0ZDY0ODhmNmEwZDE4OGJlMWIxNCA9ICQoJzxkaXYgaWQ9Imh0bWxfMTM2MWVjMmZjOGE3NGQ2NDg4ZjZhMGQxODhiZTFiMTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hM2M2ZTI2MWIzYmU0M2E3OWEwNWJjNTMxNmZjN2RlNS5zZXRDb250ZW50KGh0bWxfMTM2MWVjMmZjOGE3NGQ2NDg4ZjZhMGQxODhiZTFiMTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODdlZWUyZjFiMTI3NDMzN2FlNGFkMmIzYWM2MDFmMDIuYmluZFBvcHVwKHBvcHVwX2EzYzZlMjYxYjNiZTQzYTc5YTA1YmM1MzE2ZmM3ZGU1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzYyNmE0Njc0MGUyMjRjZTA4ZTRhNDIxN2QxNmVjMGIzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzOTgwNTU5MjYzNCwtMTIyLjQxMTc3ODI5NTk5Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNiZTFlODk0YzQwZWFiNDM2M2I1NzZjN2RlMDg5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FjY2VjZmZiZTUzMDQyZmQ4OTY0ZGJkZjkyYmQyMDRkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU1NDA4ZmJjNjBlNDRhNGE4OTIxNjQ3YjMxNjg4MTZkID0gJCgnPGRpdiBpZD0iaHRtbF81NTQwOGZiYzYwZTQ0YTRhODkyMTY0N2IzMTY4ODE2ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hY2NlY2ZmYmU1MzA0MmZkODk2NGRiZGY5MmJkMjA0ZC5zZXRDb250ZW50KGh0bWxfNTU0MDhmYmM2MGU0NGE0YTg5MjE2NDdiMzE2ODgxNmQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjI2YTQ2NzQwZTIyNGNlMDhlNGE0MjE3ZDE2ZWMwYjMuYmluZFBvcHVwKHBvcHVwX2FjY2VjZmZiZTUzMDQyZmQ4OTY0ZGJkZjkyYmQyMDRkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2YwMjg2MDVkYjI0NzRkYmViMDhlMTQ2NmRlZTYxNjg2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1Nzg3NjIxODI5Mjk1LC0xMjIuMzkzMzU3MjQxNDUxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2JlMWU4OTRjNDBlYWI0MzYzYjU3NmM3ZGUwODkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTdkMjg4MWEyOGJiNGNkMWI3YjZiNDJhYjRmZDExYzIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODkxNWY4YmQ1OGQ1NGMzYzhmZDY3YmE0YmNiYTIwYTcgPSAkKCc8ZGl2IGlkPSJodG1sXzg5MTVmOGJkNThkNTRjM2M4ZmQ2N2JhNGJjYmEyMGE3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XQVJSQU5UUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTdkMjg4MWEyOGJiNGNkMWI3YjZiNDJhYjRmZDExYzIuc2V0Q29udGVudChodG1sXzg5MTVmOGJkNThkNTRjM2M4ZmQ2N2JhNGJjYmEyMGE3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2YwMjg2MDVkYjI0NzRkYmViMDhlMTQ2NmRlZTYxNjg2LmJpbmRQb3B1cChwb3B1cF81N2QyODgxYTI4YmI0Y2QxYjdiNmI0MmFiNGZkMTFjMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80NDRkZjdjOGM0ZjI0MzJlYmJlOGVkOTg2Y2RkOWI4OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyMDk2Njk2MTU0OTksLTEyMi4zODcxODE2MzU5OTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjYmUxZTg5NGM0MGVhYjQzNjNiNTc2YzdkZTA4OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80MDgwZjBhNzc3MTM0ZTBmYTdhODVkYWFhNzliYjE5MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82YTE3MzEyNDk3NDI0MjM1ODk1N2JhNjYzMTk5YzI2MiA9ICQoJzxkaXYgaWQ9Imh0bWxfNmExNzMxMjQ5NzQyNDIzNTg5NTdiYTY2MzE5OWMyNjIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1JU1NJTkcgUEVSU09OPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MDgwZjBhNzc3MTM0ZTBmYTdhODVkYWFhNzliYjE5MS5zZXRDb250ZW50KGh0bWxfNmExNzMxMjQ5NzQyNDIzNTg5NTdiYTY2MzE5OWMyNjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDQ0ZGY3YzhjNGYyNDMyZWJiZThlZDk4NmNkZDliODkuYmluZFBvcHVwKHBvcHVwXzQwODBmMGE3NzcxMzRlMGZhN2E4NWRhYWE3OWJiMTkxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZhYTM0YTJhODI3YjQwOGFiODMyZmY4ZmFlNmM1ZjY3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY0NDc4MTU3ODY5NTA1LC0xMjIuNDc3Mzc2NTI0MDAyOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjYmUxZTg5NGM0MGVhYjQzNjNiNTc2YzdkZTA4OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zYzA5Yzg1Yjc4ZTI0YWIxYTk0MjQxZjhmMWJlM2Q2ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jZWY5ZGFhOTdhMGE0Mzg1YjhmNDVhMmY2MWM2ZTIxZiA9ICQoJzxkaXYgaWQ9Imh0bWxfY2VmOWRhYTk3YTBhNDM4NWI4ZjQ1YTJmNjFjNmUyMWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxBUkNFTlkvVEhFRlQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNjMDljODViNzhlMjRhYjFhOTQyNDFmOGYxYmUzZDZkLnNldENvbnRlbnQoaHRtbF9jZWY5ZGFhOTdhMGE0Mzg1YjhmNDVhMmY2MWM2ZTIxZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82YWEzNGEyYTgyN2I0MDhhYjgzMmZmOGZhZTZjNWY2Ny5iaW5kUG9wdXAocG9wdXBfM2MwOWM4NWI3OGUyNGFiMWE5NDI0MWY4ZjFiZTNkNmQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWUyMGQxNzkzNDE3NDczYmIzZThiZjg1NmFkZTYxODkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDU3Mzg5NDI5NjU0OTUsLTEyMi40Nzc5NjAzMjcyOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjYmUxZTg5NGM0MGVhYjQzNjNiNTc2YzdkZTA4OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kODEzNWNmZGM3ZGM0YzFiOTI2YmFkZWYxYzMwOWNlZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yNTNlYzMxNmEyMzU0MTUyOGEzMDkwODFhYjliNjk5ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfMjUzZWMzMTZhMjM1NDE1MjhhMzA5MDgxYWI5YjY5OWUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDgxMzVjZmRjN2RjNGMxYjkyNmJhZGVmMWMzMDljZWQuc2V0Q29udGVudChodG1sXzI1M2VjMzE2YTIzNTQxNTI4YTMwOTA4MWFiOWI2OTllKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzVlMjBkMTc5MzQxNzQ3M2JiM2U4YmY4NTZhZGU2MTg5LmJpbmRQb3B1cChwb3B1cF9kODEzNWNmZGM3ZGM0YzFiOTI2YmFkZWYxYzMwOWNlZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yNzE0NDM5YmM0N2M0YjRiYmVlZWQxOGJiOThiNzg4NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczNTY5NzAyNzU0ODIwNiwtMTIyLjM3Njc1NzY1NTUzMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2JlMWU4OTRjNDBlYWI0MzYzYjU3NmM3ZGUwODkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTQ2MzM5YWM2ZGI1NDgzMzk3MjcxYzk2OTVlZWExMjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTg5YTlmMzIwYTYwNGI0Mjk3ZmYxN2I4Y2Q4Njc5NDYgPSAkKCc8ZGl2IGlkPSJodG1sXzE4OWE5ZjMyMGE2MDRiNDI5N2ZmMTdiOGNkODY3OTQ2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTQ2MzM5YWM2ZGI1NDgzMzk3MjcxYzk2OTVlZWExMjIuc2V0Q29udGVudChodG1sXzE4OWE5ZjMyMGE2MDRiNDI5N2ZmMTdiOGNkODY3OTQ2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI3MTQ0MzliYzQ3YzRiNGJiZWVlZDE4YmI5OGI3ODg2LmJpbmRQb3B1cChwb3B1cF9lNDYzMzlhYzZkYjU0ODMzOTcyNzFjOTY5NWVlYTEyMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80NDc4YTdlMDQyNjk0NGUxYWFmMzBlMDk3MTkwNzhjMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyOTI3MDUxOTk1OTIsLTEyMi40MzIzMjU4NzEwMjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjYmUxZTg5NGM0MGVhYjQzNjNiNTc2YzdkZTA4OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81NGUyZGRjMDkxYjM0N2U3YjgxYTZmNTJjMzU5ZjEwYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81MjAyMjM3YTc1N2U0MWU4OGVhNjBmNTYyNDUxNzQ4NyA9ICQoJzxkaXYgaWQ9Imh0bWxfNTIwMjIzN2E3NTdlNDFlODhlYTYwZjU2MjQ1MTc0ODciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFTU0FVTFQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU0ZTJkZGMwOTFiMzQ3ZTdiODFhNmY1MmMzNTlmMTBiLnNldENvbnRlbnQoaHRtbF81MjAyMjM3YTc1N2U0MWU4OGVhNjBmNTYyNDUxNzQ4Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80NDc4YTdlMDQyNjk0NGUxYWFmMzBlMDk3MTkwNzhjMS5iaW5kUG9wdXAocG9wdXBfNTRlMmRkYzA5MWIzNDdlN2I4MWE2ZjUyYzM1OWYxMGIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2NlY2EwYzQ1NjYzNDAwZmJjOGI0Y2Y0YzVlNWU1YTkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43OTE2NDI5ODIzODQsLTEyMi40MDA5MDg2OTg4ODk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNiZTFlODk0YzQwZWFiNDM2M2I1NzZjN2RlMDg5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJjYjM0YWNjMmFiYzQ5ODFhMTE2NTUzNzBkZWZkZWQ1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzlhN2UzYzlhZjA2ZTRiMDliMDVlODkyMzA1YWU0NjMxID0gJCgnPGRpdiBpZD0iaHRtbF85YTdlM2M5YWYwNmU0YjA5YjA1ZTg5MjMwNWFlNDYzMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QlVSR0xBUlk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJjYjM0YWNjMmFiYzQ5ODFhMTE2NTUzNzBkZWZkZWQ1LnNldENvbnRlbnQoaHRtbF85YTdlM2M5YWYwNmU0YjA5YjA1ZTg5MjMwNWFlNDYzMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jY2VjYTBjNDU2NjM0MDBmYmM4YjRjZjRjNWU1ZTVhOS5iaW5kUG9wdXAocG9wdXBfMmNiMzRhY2MyYWJjNDk4MWExMTY1NTM3MGRlZmRlZDUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTU3YzUwN2FmOTIxNDgwM2JmMTE4YzU5NTBjYjFhMmEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODM3MDY5MzAxNTQ1LC0xMjIuNDA4NTk1MTEwODY5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2JlMWU4OTRjNDBlYWI0MzYzYjU3NmM3ZGUwODkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTk1NDEzZTdmMzY3NDVjYzk1YTExMTVjM2YxZTI5ODMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTJmYzNlZThhMGM3NGU3MzllZjM2MWQ3MDA5YTczMTUgPSAkKCc8ZGl2IGlkPSJodG1sXzkyZmMzZWU4YTBjNzRlNzM5ZWYzNjFkNzAwOWE3MzE1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TVE9MRU4gUFJPUEVSVFk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE5NTQxM2U3ZjM2NzQ1Y2M5NWExMTE1YzNmMWUyOTgzLnNldENvbnRlbnQoaHRtbF85MmZjM2VlOGEwYzc0ZTczOWVmMzYxZDcwMDlhNzMxNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lNTdjNTA3YWY5MjE0ODAzYmYxMThjNTk1MGNiMWEyYS5iaW5kUG9wdXAocG9wdXBfMTk1NDEzZTdmMzY3NDVjYzk1YTExMTVjM2YxZTI5ODMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTc4YTMxYzVhYzIyNDc0MGJiYzYxOTA4MmRkNmFiZTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NTcyODk1OTA0NTc3OTUsLTEyMi40MDY4NzA0MDIwODJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjYmUxZTg5NGM0MGVhYjQzNjNiNTc2YzdkZTA4OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kNDhkNDdiODY1YmI0NjE3YmRkNjg3YTE5MDhkYmE0MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83M2EyN2FmY2VjODQ0MDIzYmU5NTk5NmU2ZTU2MGI5YyA9ICQoJzxkaXYgaWQ9Imh0bWxfNzNhMjdhZmNlYzg0NDAyM2JlOTU5OTZlNmU1NjBiOWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJPQkJFUlk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q0OGQ0N2I4NjViYjQ2MTdiZGQ2ODdhMTkwOGRiYTQyLnNldENvbnRlbnQoaHRtbF83M2EyN2FmY2VjODQ0MDIzYmU5NTk5NmU2ZTU2MGI5Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hNzhhMzFjNWFjMjI0NzQwYmJjNjE5MDgyZGQ2YWJlMC5iaW5kUG9wdXAocG9wdXBfZDQ4ZDQ3Yjg2NWJiNDYxN2JkZDY4N2ExOTA4ZGJhNDIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTg4YzgyM2ExOWM5NGQ3MWI1MzlkOTY0NmZjMjFjZTQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDg5MDYzMDUxODI5LC0xMjIuNDIwMzU0NzgwODYwOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjYmUxZTg5NGM0MGVhYjQzNjNiNTc2YzdkZTA4OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83MTdkZGI3MzMxYTg0MTBiOTE0ODY2ZmY1MmJiNzg1NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hNWJmYzRkOTMyZmI0YjhlOGE5OGQ4YmI0ZDIyNDc2YiA9ICQoJzxkaXYgaWQ9Imh0bWxfYTViZmM0ZDkzMmZiNGI4ZThhOThkOGJiNGQyMjQ3NmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFTU0FVTFQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzcxN2RkYjczMzFhODQxMGI5MTQ4NjZmZjUyYmI3ODU2LnNldENvbnRlbnQoaHRtbF9hNWJmYzRkOTMyZmI0YjhlOGE5OGQ4YmI0ZDIyNDc2Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xODhjODIzYTE5Yzk0ZDcxYjUzOWQ5NjQ2ZmMyMWNlNC5iaW5kUG9wdXAocG9wdXBfNzE3ZGRiNzMzMWE4NDEwYjkxNDg2NmZmNTJiYjc4NTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzc4NjAzNzJmNWE4NDNlZWFjMjA2NGZmZmUwODI1OGUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MTU3NjU0MjY5OTUsLTEyMi40Mzk5MDk3NjY3NzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjYmUxZTg5NGM0MGVhYjQzNjNiNTc2YzdkZTA4OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yNTBjMjc4NmY1ODY0Njk0OGVkYjgwZDc1ZDBiNjE1MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lOGUxYWFiNjQ3NDU0OTExOWFmMmY4NTg5YTRkNDMzOSA9ICQoJzxkaXYgaWQ9Imh0bWxfZThlMWFhYjY0NzQ1NDkxMTlhZjJmODU4OWE0ZDQzMzkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFTU0FVTFQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI1MGMyNzg2ZjU4NjQ2OTQ4ZWRiODBkNzVkMGI2MTUyLnNldENvbnRlbnQoaHRtbF9lOGUxYWFiNjQ3NDU0OTExOWFmMmY4NTg5YTRkNDMzOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83Nzg2MDM3MmY1YTg0M2VlYWMyMDY0ZmZmZTA4MjU4ZS5iaW5kUG9wdXAocG9wdXBfMjUwYzI3ODZmNTg2NDY5NDhlZGI4MGQ3NWQwYjYxNTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWQ4N2IzNTFmMGQxNDFkZjhlOGQ2Mjc5MWNjMWQ1NDEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODM1Njk5Mzg2OTE4LC0xMjIuNDA4NDIxMTE2OTIyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2JlMWU4OTRjNDBlYWI0MzYzYjU3NmM3ZGUwODkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTJlMzgxN2EwMTdjNGNiNjgwYzg5NzdjYjYzNTFlZjQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmQ5Yzc4MTY1NDFmNDk5ODk3NmEwYjg4ZmI5NzYwMDcgPSAkKCc8ZGl2IGlkPSJodG1sX2ZkOWM3ODE2NTQxZjQ5OTg5NzZhMGI4OGZiOTc2MDA3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MQVJDRU5ZL1RIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hMmUzODE3YTAxN2M0Y2I2ODBjODk3N2NiNjM1MWVmNC5zZXRDb250ZW50KGh0bWxfZmQ5Yzc4MTY1NDFmNDk5ODk3NmEwYjg4ZmI5NzYwMDcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWQ4N2IzNTFmMGQxNDFkZjhlOGQ2Mjc5MWNjMWQ1NDEuYmluZFBvcHVwKHBvcHVwX2EyZTM4MTdhMDE3YzRjYjY4MGM4OTc3Y2I2MzUxZWY0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM4YzUwMjcyMGRlYjQyNWY4YmQzYTlkODVhN2Y1NzA1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzczNjE4NjI3NjQ1NjA0LC0xMjIuNDIyMzE1NjcwNzQ5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2JlMWU4OTRjNDBlYWI0MzYzYjU3NmM3ZGUwODkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzdlNjQ5YmY3N2QwNDIyNDg2MTI2ZWE1OWIzY2I2MTEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGIzYzhmZTFiZGEwNDVhMTk3ZTc4NmQ2OWVjYTcyZDAgPSAkKCc8ZGl2IGlkPSJodG1sXzBiM2M4ZmUxYmRhMDQ1YTE5N2U3ODZkNjllY2E3MmQwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GUkFVRDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzdlNjQ5YmY3N2QwNDIyNDg2MTI2ZWE1OWIzY2I2MTEuc2V0Q29udGVudChodG1sXzBiM2M4ZmUxYmRhMDQ1YTE5N2U3ODZkNjllY2E3MmQwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzM4YzUwMjcyMGRlYjQyNWY4YmQzYTlkODVhN2Y1NzA1LmJpbmRQb3B1cChwb3B1cF83N2U2NDliZjc3ZDA0MjI0ODYxMjZlYTU5YjNjYjYxMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84NjdkNGNlZjBiM2Y0OTM4YjM0ZDM2NTQwNWIwNjI2YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc5Mjg0MTI4NDA0NDcwNSwtMTIyLjQyNDUxOTgzNTAwOTAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2JlMWU4OTRjNDBlYWI0MzYzYjU3NmM3ZGUwODkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2U5OGNmZjY3NTA0NGVkZmI3Njk2OGZjZDA1MWIxZjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDhjNmFjNTE3ODZhNDE0ZmIxODJjOTdlZjJlYzE5OWMgPSAkKCc8ZGl2IGlkPSJodG1sX2Q4YzZhYzUxNzg2YTQxNGZiMTgyYzk3ZWYyZWMxOTljIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XQVJSQU5UUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2U5OGNmZjY3NTA0NGVkZmI3Njk2OGZjZDA1MWIxZjEuc2V0Q29udGVudChodG1sX2Q4YzZhYzUxNzg2YTQxNGZiMTgyYzk3ZWYyZWMxOTljKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg2N2Q0Y2VmMGIzZjQ5MzhiMzRkMzY1NDA1YjA2MjZiLmJpbmRQb3B1cChwb3B1cF8zZTk4Y2ZmNjc1MDQ0ZWRmYjc2OTY4ZmNkMDUxYjFmMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80ZWRmMWViNjhhODM0NDJkOTU2Yjc0YzQ3NTFkNTAwYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc1NDA5ODY4ODIwNjc5NSwtMTIyLjQxNDIzMzg0OTAzNzk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2JlMWU4OTRjNDBlYWI0MzYzYjU3NmM3ZGUwODkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjg0MzNhM2YwMTE0NDAxY2EwOThlMjc5OWRjNjI1NTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODNhZWUzN2EyMzZjNDYxMWJjMTM1NjQzMzEzMzViN2IgPSAkKCc8ZGl2IGlkPSJodG1sXzgzYWVlMzdhMjM2YzQ2MTFiYzEzNTY0MzMxMzM1YjdiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EUlVHL05BUkNPVElDPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yODQzM2EzZjAxMTQ0MDFjYTA5OGUyNzk5ZGM2MjU1NC5zZXRDb250ZW50KGh0bWxfODNhZWUzN2EyMzZjNDYxMWJjMTM1NjQzMzEzMzViN2IpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGVkZjFlYjY4YTgzNDQyZDk1NmI3NGM0NzUxZDUwMGMuYmluZFBvcHVwKHBvcHVwXzI4NDMzYTNmMDExNDQwMWNhMDk4ZTI3OTlkYzYyNTU0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQyNzliMjczYjc3YzQ5NmY4NDlhMDVhNDNmZjg1ZWZkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzU0MDk4Njg4MjA2Nzk1LC0xMjIuNDE0MjMzODQ5MDM3OThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjYmUxZTg5NGM0MGVhYjQzNjNiNTc2YzdkZTA4OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85MmVjYzcxYTIyOWE0NjI1YTA4MWJiOWRlZDYwYTFmMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iZWVlN2E1ODMyMWM0N2E3OWUwNGRiYmI0YzU4ZjIwMiA9ICQoJzxkaXYgaWQ9Imh0bWxfYmVlZTdhNTgzMjFjNDdhNzllMDRkYmJiNGM1OGYyMDIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85MmVjYzcxYTIyOWE0NjI1YTA4MWJiOWRlZDYwYTFmMC5zZXRDb250ZW50KGh0bWxfYmVlZTdhNTgzMjFjNDdhNzllMDRkYmJiNGM1OGYyMDIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDI3OWIyNzNiNzdjNDk2Zjg0OWEwNWE0M2ZmODVlZmQuYmluZFBvcHVwKHBvcHVwXzkyZWNjNzFhMjI5YTQ2MjVhMDgxYmI5ZGVkNjBhMWYwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRmMmY4OTEzNTQ1NTQwNDE5YTdkNTZhNDc0ZWMyNjE4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzcxNDkzOTk2OTQxNiwtMTIyLjUwNzc1MDEzMTAwNDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2JlMWU4OTRjNDBlYWI0MzYzYjU3NmM3ZGUwODkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGRhZDA2MmEzOTg0NDcxNThlMmZhYzMwMDcwNTIwMDQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2QwNzI4MWNmNmUwNGEyM2IwNGYzZDQwMWRiMDUwN2UgPSAkKCc8ZGl2IGlkPSJodG1sXzdkMDcyODFjZjZlMDRhMjNiMDRmM2Q0MDFkYjA1MDdlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BU1NBVUxUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kZGFkMDYyYTM5ODQ0NzE1OGUyZmFjMzAwNzA1MjAwNC5zZXRDb250ZW50KGh0bWxfN2QwNzI4MWNmNmUwNGEyM2IwNGYzZDQwMWRiMDUwN2UpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGYyZjg5MTM1NDU1NDA0MTlhN2Q1NmE0NzRlYzI2MTguYmluZFBvcHVwKHBvcHVwX2RkYWQwNjJhMzk4NDQ3MTU4ZTJmYWMzMDA3MDUyMDA0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc1MWM4ZGNjM2I5ZDQyZTFhNDY0YzI3ZjFhZjY1NjBkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzE4MzAyMjA0NzY2MDA1LC0xMjIuNDc0NDQ0NjM5NTk0OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjYmUxZTg5NGM0MGVhYjQzNjNiNTc2YzdkZTA4OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81NjQwNjM3ZmQ0NGM0MjNlOTEzODViODg5ZTJhNzM0ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lMjQ0OWI4ODUxNjU0MjAzOGMxZjRkMWYzMmM3ZmVkNiA9ICQoJzxkaXYgaWQ9Imh0bWxfZTI0NDliODg1MTY1NDIwMzhjMWY0ZDFmMzJjN2ZlZDYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81NjQwNjM3ZmQ0NGM0MjNlOTEzODViODg5ZTJhNzM0ZS5zZXRDb250ZW50KGh0bWxfZTI0NDliODg1MTY1NDIwMzhjMWY0ZDFmMzJjN2ZlZDYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzUxYzhkY2MzYjlkNDJlMWE0NjRjMjdmMWFmNjU2MGQuYmluZFBvcHVwKHBvcHVwXzU2NDA2MzdmZDQ0YzQyM2U5MTM4NWI4ODllMmE3MzRlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NiYTU0YTMwMjQ2YzQ0Yjg4OTgyMGY0NGI4ZGMxZTVkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY0NTc1MjMxNzYxNSwtMTIyLjQyNzU2MjU5Njk4NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNiZTFlODk0YzQwZWFiNDM2M2I1NzZjN2RlMDg5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNjMmM2NGIwYzk5OTQxYTliYzRjNTRmZmE5ODAzNDVkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ExMWFkODQzZDViYTQ3MDA4Y2Y2NjI1N2IwMjM0MGYzID0gJCgnPGRpdiBpZD0iaHRtbF9hMTFhZDg0M2Q1YmE0NzAwOGNmNjYyNTdiMDIzNDBmMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNjMmM2NGIwYzk5OTQxYTliYzRjNTRmZmE5ODAzNDVkLnNldENvbnRlbnQoaHRtbF9hMTFhZDg0M2Q1YmE0NzAwOGNmNjYyNTdiMDIzNDBmMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jYmE1NGEzMDI0NmM0NGI4ODk4MjBmNDRiOGRjMWU1ZC5iaW5kUG9wdXAocG9wdXBfM2MyYzY0YjBjOTk5NDFhOWJjNGM1NGZmYTk4MDM0NWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTFkOGI4MWM0YWU1NDI0N2E4NmU5NGEzZDI3OWE5NTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODc0Mzc4MzA5MTEyLC0xMjIuNDE5MjAzMDA0MjY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2JlMWU4OTRjNDBlYWI0MzYzYjU3NmM3ZGUwODkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDY3OTIxMDNkNzA4NGJlODhkMGU1NzExNjg4MWU2ZTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjY0OTg4ZTFjZDAxNGY2NGE4MDEzYjk3MWUwMDFlOWQgPSAkKCc8ZGl2IGlkPSJodG1sX2Y2NDk4OGUxY2QwMTRmNjRhODAxM2I5NzFlMDAxZTlkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CVVJHTEFSWTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDY3OTIxMDNkNzA4NGJlODhkMGU1NzExNjg4MWU2ZTQuc2V0Q29udGVudChodG1sX2Y2NDk4OGUxY2QwMTRmNjRhODAxM2I5NzFlMDAxZTlkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzUxZDhiODFjNGFlNTQyNDdhODZlOTRhM2QyNzlhOTU4LmJpbmRQb3B1cChwb3B1cF80Njc5MjEwM2Q3MDg0YmU4OGQwZTU3MTE2ODgxZTZlNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jMGJkM2UwN2U2MmQ0NTRlOTRiYmVjNTQzYjFjMDI4YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0OTM2ODgyODQ1MzIsLTEyMi40MTI2OTAxNDIzMDgwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNiZTFlODk0YzQwZWFiNDM2M2I1NzZjN2RlMDg5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NjMGUxNDM3M2E1OTRiZTc5NWRhMjllZTkwOGRkMTE2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZlN2Q5ZDViYmUwNTRmMWRhMjliMWUyOWRhMzhlMTJiID0gJCgnPGRpdiBpZD0iaHRtbF9mZTdkOWQ1YmJlMDU0ZjFkYTI5YjFlMjlkYTM4ZTEyYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NjMGUxNDM3M2E1OTRiZTc5NWRhMjllZTkwOGRkMTE2LnNldENvbnRlbnQoaHRtbF9mZTdkOWQ1YmJlMDU0ZjFkYTI5YjFlMjlkYTM4ZTEyYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jMGJkM2UwN2U2MmQ0NTRlOTRiYmVjNTQzYjFjMDI4Yi5iaW5kUG9wdXAocG9wdXBfY2MwZTE0MzczYTU5NGJlNzk1ZGEyOWVlOTA4ZGQxMTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmM2ODY3YjVkZmZmNDJmMjk5YThmNjJlNDYyN2FlYjUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MDkyMDEwNDYyMzc5LC0xMjIuNDM0NjA5MjgwMzUyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2JlMWU4OTRjNDBlYWI0MzYzYjU3NmM3ZGUwODkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDk4NmQ4OGJhNjFmNDNiMDgxNzY2MTYzZjZmYjE4MjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2MwN2U1NTk4ZjE4NDU0ZmFhNjQ3YTMwNWJkZjJjYWEgPSAkKCc8ZGl2IGlkPSJodG1sX2NjMDdlNTU5OGYxODQ1NGZhYTY0N2EzMDViZGYyY2FhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OT04tQ1JJTUlOQUw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q5ODZkODhiYTYxZjQzYjA4MTc2NjE2M2Y2ZmIxODI3LnNldENvbnRlbnQoaHRtbF9jYzA3ZTU1OThmMTg0NTRmYWE2NDdhMzA1YmRmMmNhYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yYzY4NjdiNWRmZmY0MmYyOTlhOGY2MmU0NjI3YWViNS5iaW5kUG9wdXAocG9wdXBfZDk4NmQ4OGJhNjFmNDNiMDgxNzY2MTYzZjZmYjE4MjcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjI5ZmMyYzZiYjgyNDllMmJkMDA5NDQ4NDk4Y2VlM2QgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODc5MjA5Mzc1NTMyOTUsLTEyMi40MTA4ODI4MjU1NTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjYmUxZTg5NGM0MGVhYjQzNjNiNTc2YzdkZTA4OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83Mzc2YTZhYjUwYmY0OTQ1YjQzM2JlN2MyMDRmMmZlNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xNjcyZWJmZTdhODY0NzdiOGFmNGZiOTI4NmRhOGRhNiA9ICQoJzxkaXYgaWQ9Imh0bWxfMTY3MmViZmU3YTg2NDc3YjhhZjRmYjkyODZkYThkYTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlZFSElDTEUgVEhFRlQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzczNzZhNmFiNTBiZjQ5NDViNDMzYmU3YzIwNGYyZmU1LnNldENvbnRlbnQoaHRtbF8xNjcyZWJmZTdhODY0NzdiOGFmNGZiOTI4NmRhOGRhNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yMjlmYzJjNmJiODI0OWUyYmQwMDk0NDg0OThjZWUzZC5iaW5kUG9wdXAocG9wdXBfNzM3NmE2YWI1MGJmNDk0NWI0MzNiZTdjMjA0ZjJmZTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjEzNTVlMzM4ZDMyNGM2MDllMDlkMTRiMmRlMzc1YmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy44MDA0NTY2NDcxMDM4OSwtMTIyLjQwMTQzMjc1NDcyMjAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2JlMWU4OTRjNDBlYWI0MzYzYjU3NmM3ZGUwODkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTkyNjAyMTk5YTc1NDZhNmJkZTQyZWVhNTJhZjMxZTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzJiY2ZhMTYwZjU1NGM3N2JmMTkzYjM2ZmVlNzk2MGUgPSAkKCc8ZGl2IGlkPSJodG1sX2MyYmNmYTE2MGY1NTRjNzdiZjE5M2IzNmZlZTc5NjBlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WRUhJQ0xFIFRIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lOTI2MDIxOTlhNzU0NmE2YmRlNDJlZWE1MmFmMzFlNS5zZXRDb250ZW50KGh0bWxfYzJiY2ZhMTYwZjU1NGM3N2JmMTkzYjM2ZmVlNzk2MGUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjEzNTVlMzM4ZDMyNGM2MDllMDlkMTRiMmRlMzc1YmYuYmluZFBvcHVwKHBvcHVwX2U5MjYwMjE5OWE3NTQ2YTZiZGU0MmVlYTUyYWYzMWU1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q5NTMxMDE1MzBmMjRlMjk5MjA0YTVjYThiZjE0MzdiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzQzNTU1MDU0MjI2NSwtMTIyLjQyMTEyODAyOTUwNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNiZTFlODk0YzQwZWFiNDM2M2I1NzZjN2RlMDg5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNmNjA2ODRmMDNiYTQzNTU5NDgwNzVmYWY0ZDQ1NDRlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFjMWFiNmYxNzdhMTQ5OTNiMDg4YWViMTQ1OTRjYjAxID0gJCgnPGRpdiBpZD0iaHRtbF8xYzFhYjZmMTc3YTE0OTkzYjA4OGFlYjE0NTk0Y2IwMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TEFSQ0VOWS9USEVGVDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2Y2MDY4NGYwM2JhNDM1NTk0ODA3NWZhZjRkNDU0NGUuc2V0Q29udGVudChodG1sXzFjMWFiNmYxNzdhMTQ5OTNiMDg4YWViMTQ1OTRjYjAxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q5NTMxMDE1MzBmMjRlMjk5MjA0YTVjYThiZjE0MzdiLmJpbmRQb3B1cChwb3B1cF8zZjYwNjg0ZjAzYmE0MzU1OTQ4MDc1ZmFmNGQ0NTQ0ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yYzQ1YTRhN2NmNjM0NjUxYjMxZGQ3YzM1MDA0YTk2NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NjU2NDc2MDc2ODUsLTEyMi40MDcyNDQwODcwMzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjYmUxZTg5NGM0MGVhYjQzNjNiNTc2YzdkZTA4OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85YjgwYmMwYTdjMTc0M2ExODQwZTU5N2FiMzVlOGQ4ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zYjZjYzAyZjUwNmM0MzRkOWY1ZWI1ZjljOGY0MGMxMSA9ICQoJzxkaXYgaWQ9Imh0bWxfM2I2Y2MwMmY1MDZjNDM0ZDlmNWViNWY5YzhmNDBjMTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFTU0FVTFQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzliODBiYzBhN2MxNzQzYTE4NDBlNTk3YWIzNWU4ZDhlLnNldENvbnRlbnQoaHRtbF8zYjZjYzAyZjUwNmM0MzRkOWY1ZWI1ZjljOGY0MGMxMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yYzQ1YTRhN2NmNjM0NjUxYjMxZGQ3YzM1MDA0YTk2NC5iaW5kUG9wdXAocG9wdXBfOWI4MGJjMGE3YzE3NDNhMTg0MGU1OTdhYjM1ZThkOGUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjExY2JjMmJmY2JmNDFmOTg3MjU4NjBkMmRkMjNkODAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjE1NjU1OTI4MDQ1LC0xMjIuNDIzODAzMDAxOTAwOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjYmUxZTg5NGM0MGVhYjQzNjNiNTc2YzdkZTA4OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85MTQ3YTYxZDE3NmY0Y2Q3OWU0MDYxNTM3N2ViMWI4NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80NzFkMGJhNDU5NTE0ZDc5YmJlOTc1NDY3NGMyZjY5ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfNDcxZDBiYTQ1OTUxNGQ3OWJiZTk3NTQ2NzRjMmY2OWQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJFQ09WRVJFRCBWRUhJQ0xFPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85MTQ3YTYxZDE3NmY0Y2Q3OWU0MDYxNTM3N2ViMWI4Ny5zZXRDb250ZW50KGh0bWxfNDcxZDBiYTQ1OTUxNGQ3OWJiZTk3NTQ2NzRjMmY2OWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjExY2JjMmJmY2JmNDFmOTg3MjU4NjBkMmRkMjNkODAuYmluZFBvcHVwKHBvcHVwXzkxNDdhNjFkMTc2ZjRjZDc5ZTQwNjE1Mzc3ZWIxYjg3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUyMGQyYzEzYTkzOTQ4Y2ZhNzg5OGVmZTcxNDA4ODc3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzYxNTY1NTkyODA0NSwtMTIyLjQyMzgwMzAwMTkwMDk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2JlMWU4OTRjNDBlYWI0MzYzYjU3NmM3ZGUwODkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWY5ZTE4MjhjMjY3NDY0N2IxZTU4YmIzYTkzZTg1ZTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWEzYTAzNTZkNWMyNDEyZDgzNTJiYzhjM2VlMzJiYWIgPSAkKCc8ZGl2IGlkPSJodG1sXzFhM2EwMzU2ZDVjMjQxMmQ4MzUyYmM4YzNlZTMyYmFiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWY5ZTE4MjhjMjY3NDY0N2IxZTU4YmIzYTkzZTg1ZTguc2V0Q29udGVudChodG1sXzFhM2EwMzU2ZDVjMjQxMmQ4MzUyYmM4YzNlZTMyYmFiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzUyMGQyYzEzYTkzOTQ4Y2ZhNzg5OGVmZTcxNDA4ODc3LmJpbmRQb3B1cChwb3B1cF9hZjllMTgyOGMyNjc0NjQ3YjFlNThiYjNhOTNlODVlOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83OGVhYzllYzdjNjk0MGRkOTdhMjUyMDRhNjg3OGFkMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0NDE5Mjc1MDg5MzIwNSwtMTIyLjQ0NDY4NTQ4MjI3M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNiZTFlODk0YzQwZWFiNDM2M2I1NzZjN2RlMDg5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMyODg2ZWQ4MTQyODRkZGU4N2RlMjY1MjYwNTgyMzc2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFmMWEyNTJkYTJiZTQ3Zjg5ZjM3MjJmZDljNzQ5MGQwID0gJCgnPGRpdiBpZD0iaHRtbF8xZjFhMjUyZGEyYmU0N2Y4OWYzNzIyZmQ5Yzc0OTBkMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zMjg4NmVkODE0Mjg0ZGRlODdkZTI2NTI2MDU4MjM3Ni5zZXRDb250ZW50KGh0bWxfMWYxYTI1MmRhMmJlNDdmODlmMzcyMmZkOWM3NDkwZDApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzhlYWM5ZWM3YzY5NDBkZDk3YTI1MjA0YTY4NzhhZDIuYmluZFBvcHVwKHBvcHVwXzMyODg2ZWQ4MTQyODRkZGU4N2RlMjY1MjYwNTgyMzc2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M0ZDY4N2U3NjMzYzQ4YzJiZTJhYzA3YTZkMWNiZWYzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1NDY5MjgyMDA0MSwtMTIyLjQxNTc1NzAzOTE5Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNiZTFlODk0YzQwZWFiNDM2M2I1NzZjN2RlMDg5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZjZTVlMWYwOTQ0ZDRjMDk5Y2Q5ZDA0YjgzM2M1MGZjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZkYmQxOGEyMDNhMTQzM2I5OTQ0YzAyYjk3NDkxNWYzID0gJCgnPGRpdiBpZD0iaHRtbF9mZGJkMThhMjAzYTE0MzNiOTk0NGMwMmI5NzQ5MTVmMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82Y2U1ZTFmMDk0NGQ0YzA5OWNkOWQwNGI4MzNjNTBmYy5zZXRDb250ZW50KGh0bWxfZmRiZDE4YTIwM2ExNDMzYjk5NDRjMDJiOTc0OTE1ZjMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzRkNjg3ZTc2MzNjNDhjMmJlMmFjMDdhNmQxY2JlZjMuYmluZFBvcHVwKHBvcHVwXzZjZTVlMWYwOTQ0ZDRjMDk5Y2Q5ZDA0YjgzM2M1MGZjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M1MGNkYTI0YTIyYTQ3MjliYjcxMmNlZTg1YjY2YTAxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzI4NTI4MDYyNzQ2NSwtMTIyLjQ3NTY0NzQ2MDc4NTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2JlMWU4OTRjNDBlYWI0MzYzYjU3NmM3ZGUwODkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjVmYmY5MTAyNmZhNDY3ODgxM2JmZjdkODdjNGRiZGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGY3ODkzYzAzNTc2NDMwMjhiMTJlMDFmNTUxNTg4ZDIgPSAkKCc8ZGl2IGlkPSJodG1sXzhmNzg5M2MwMzU3NjQzMDI4YjEyZTAxZjU1MTU4OGQyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5ST0JCRVJZPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82NWZiZjkxMDI2ZmE0Njc4ODEzYmZmN2Q4N2M0ZGJkZi5zZXRDb250ZW50KGh0bWxfOGY3ODkzYzAzNTc2NDMwMjhiMTJlMDFmNTUxNTg4ZDIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzUwY2RhMjRhMjJhNDcyOWJiNzEyY2VlODViNjZhMDEuYmluZFBvcHVwKHBvcHVwXzY1ZmJmOTEwMjZmYTQ2Nzg4MTNiZmY3ZDg3YzRkYmRmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2VjMDBhNmQ0Y2MzYTQxNTdhNDcxNzg0ZWVhMDM0MGE1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzQyODUxNzM3NDQ0ODk0LC0xMjIuNDIwOTY3NDQwNTY0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2JlMWU4OTRjNDBlYWI0MzYzYjU3NmM3ZGUwODkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDhlZDU5NmFiZWVhNGNjYTlhYzMyYzZjOGJmOWY4NmYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmYxMTQ3YzFkMmRiNDVkNmE2N2EzMmEwZGVhN2M5YzQgPSAkKCc8ZGl2IGlkPSJodG1sXzZmMTE0N2MxZDJkYjQ1ZDZhNjdhMzJhMGRlYTdjOWM0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDhlZDU5NmFiZWVhNGNjYTlhYzMyYzZjOGJmOWY4NmYuc2V0Q29udGVudChodG1sXzZmMTE0N2MxZDJkYjQ1ZDZhNjdhMzJhMGRlYTdjOWM0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2VjMDBhNmQ0Y2MzYTQxNTdhNDcxNzg0ZWVhMDM0MGE1LmJpbmRQb3B1cChwb3B1cF8wOGVkNTk2YWJlZWE0Y2NhOWFjMzJjNmM4YmY5Zjg2Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81YzA1NWQ4YTNlMDc0Mzk0YmQwMTQwNjZhNDI3ZjQyNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MjExOTg0ODg5MzEsLTEyMi40MTU2Njk2NjE0NDNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjYmUxZTg5NGM0MGVhYjQzNjNiNTc2YzdkZTA4OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mMDI0NTlkM2E2YmE0ZTUxYjhmNzg1NGFjNGUwYTIzNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80MDIzNDlkMGFjM2Y0MDI1YWVhMzE4Y2E4MTU0ODYzMSA9ICQoJzxkaXYgaWQ9Imh0bWxfNDAyMzQ5ZDBhYzNmNDAyNWFlYTMxOGNhODE1NDg2MzEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlZBTkRBTElTTTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjAyNDU5ZDNhNmJhNGU1MWI4Zjc4NTRhYzRlMGEyMzQuc2V0Q29udGVudChodG1sXzQwMjM0OWQwYWMzZjQwMjVhZWEzMThjYTgxNTQ4NjMxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzVjMDU1ZDhhM2UwNzQzOTRiZDAxNDA2NmE0MjdmNDI0LmJpbmRQb3B1cChwb3B1cF9mMDI0NTlkM2E2YmE0ZTUxYjhmNzg1NGFjNGUwYTIzNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jNTdiOWVmNDI5YzY0NmJiODIyN2E3Mzg0MmVmODNmNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3OTE2NzQyMTg5NjMsLTEyMi40MDYzNDY0MjU2MzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjYmUxZTg5NGM0MGVhYjQzNjNiNTc2YzdkZTA4OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mM2QyYzQ4OTQzYWQ0MzY2ODFjNmNhN2M1YjJjN2Q1ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zN2Q3MjFkMGVmMzI0ZDIwYjFmMDU4NThhZTc3NDQ5ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfMzdkNzIxZDBlZjMyNGQyMGIxZjA1ODU4YWU3NzQ0OWUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFTU0FVTFQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2YzZDJjNDg5NDNhZDQzNjY4MWM2Y2E3YzViMmM3ZDVlLnNldENvbnRlbnQoaHRtbF8zN2Q3MjFkMGVmMzI0ZDIwYjFmMDU4NThhZTc3NDQ5ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jNTdiOWVmNDI5YzY0NmJiODIyN2E3Mzg0MmVmODNmNC5iaW5kUG9wdXAocG9wdXBfZjNkMmM0ODk0M2FkNDM2NjgxYzZjYTdjNWIyYzdkNWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2IxYzNhOWE2ZDkzNGI4ZmJiOWIwYzAxNjc0MmMzM2IgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjU3MTg0Mzk1MjgyLC0xMjIuNDA5NTI5OTEzMjc4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2JlMWU4OTRjNDBlYWI0MzYzYjU3NmM3ZGUwODkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDI0OTM2MTY1MjZiNGE0OWJlNWFkY2Y0YTQ5ZWE2ZDQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTY5Y2NhMDg4MzRhNDhlMDgzODQzZjIzYTEwODI5MmMgPSAkKCc8ZGl2IGlkPSJodG1sX2E2OWNjYTA4ODM0YTQ4ZTA4Mzg0M2YyM2ExMDgyOTJjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MQVJDRU5ZL1RIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MjQ5MzYxNjUyNmI0YTQ5YmU1YWRjZjRhNDllYTZkNC5zZXRDb250ZW50KGh0bWxfYTY5Y2NhMDg4MzRhNDhlMDgzODQzZjIzYTEwODI5MmMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2IxYzNhOWE2ZDkzNGI4ZmJiOWIwYzAxNjc0MmMzM2IuYmluZFBvcHVwKHBvcHVwXzQyNDkzNjE2NTI2YjRhNDliZTVhZGNmNGE0OWVhNmQ0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQzMGU2MDU2M2QyYzQ5OTVhN2ZhMmU5NjMyYjhlM2MxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1NDIwNzA2NzExLC0xMjIuNDAzNDA0NzkxNDc4OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjYmUxZTg5NGM0MGVhYjQzNjNiNTc2YzdkZTA4OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNjMzNTBmMjA1ZTc0MDY3YWM2ZGE4NmU5YjMwZWNiYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kYzU2OTFlMmYyMjY0YjdkYmM0YzJkMzZmNzUzZDdjNCA9ICQoJzxkaXYgaWQ9Imh0bWxfZGM1NjkxZTJmMjI2NGI3ZGJjNGMyZDM2Zjc1M2Q3YzQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDYzMzUwZjIwNWU3NDA2N2FjNmRhODZlOWIzMGVjYmMuc2V0Q29udGVudChodG1sX2RjNTY5MWUyZjIyNjRiN2RiYzRjMmQzNmY3NTNkN2M0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQzMGU2MDU2M2QyYzQ5OTVhN2ZhMmU5NjMyYjhlM2MxLmJpbmRQb3B1cChwb3B1cF8wNjMzNTBmMjA1ZTc0MDY3YWM2ZGE4NmU5YjMwZWNiYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mOTVmMjliZGUwNGM0NTQxOTUxYjkzNTgzYzUwYzIwMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NzUyNDMwODc4MywtMTIyLjQxMDczODA5NzMxNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNiZTFlODk0YzQwZWFiNDM2M2I1NzZjN2RlMDg5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JhYTMyNmIzMTE4YTQ0MWY4MjZjNDZhYmEzM2U2NDRiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzkzZWU5YThjMDg4YTQ0N2JhNGNkNjlkOGYzMzkxNjNjID0gJCgnPGRpdiBpZD0iaHRtbF85M2VlOWE4YzA4OGE0NDdiYTRjZDY5ZDhmMzM5MTYzYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QlVSR0xBUlk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JhYTMyNmIzMTE4YTQ0MWY4MjZjNDZhYmEzM2U2NDRiLnNldENvbnRlbnQoaHRtbF85M2VlOWE4YzA4OGE0NDdiYTRjZDY5ZDhmMzM5MTYzYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mOTVmMjliZGUwNGM0NTQxOTUxYjkzNTgzYzUwYzIwMS5iaW5kUG9wdXAocG9wdXBfYmFhMzI2YjMxMThhNDQxZjgyNmM0NmFiYTMzZTY0NGIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTM3MGQ0M2JhNWM5NGE3YmI0ODAxOTk0Mjk5MGE3ZjcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43Njc1MjQzMDg3ODMsLTEyMi40MTA3MzgwOTczMTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjYmUxZTg5NGM0MGVhYjQzNjNiNTc2YzdkZTA4OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jYWFiZjUzMGY2YjQ0NTM2ODJlOTc2YzIwZjc2OWJmYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kOWQxMjQxMjEzMzM0MTFmOGJjZDM3YTdlMDFkNzc0YiA9ICQoJzxkaXYgaWQ9Imh0bWxfZDlkMTI0MTIxMzMzNDExZjhiY2QzN2E3ZTAxZDc3NGIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFSU09OPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jYWFiZjUzMGY2YjQ0NTM2ODJlOTc2YzIwZjc2OWJmYi5zZXRDb250ZW50KGh0bWxfZDlkMTI0MTIxMzMzNDExZjhiY2QzN2E3ZTAxZDc3NGIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTM3MGQ0M2JhNWM5NGE3YmI0ODAxOTk0Mjk5MGE3ZjcuYmluZFBvcHVwKHBvcHVwX2NhYWJmNTMwZjZiNDQ1MzY4MmU5NzZjMjBmNzY5YmZiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk1Njg4NmI0ODJiODRiNTk4NTk0YTlhMDE1ODAxZTYwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzEzMTA4MzQzMzI2NCwtMTIyLjQ0NDMxNDAyNTE4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNiZTFlODk0YzQwZWFiNDM2M2I1NzZjN2RlMDg5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RhOGJiZGJiZTk5YjQ4NWI5MWNkY2M3N2MwYmFhM2M1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFjMDcwZGFlZTVmMDRhOGNiMmQ5ZGQxN2YxZTE1ZjJiID0gJCgnPGRpdiBpZD0iaHRtbF8xYzA3MGRhZWU1ZjA0YThjYjJkOWRkMTdmMWUxNWYyYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QlVSR0xBUlk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RhOGJiZGJiZTk5YjQ4NWI5MWNkY2M3N2MwYmFhM2M1LnNldENvbnRlbnQoaHRtbF8xYzA3MGRhZWU1ZjA0YThjYjJkOWRkMTdmMWUxNWYyYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85NTY4ODZiNDgyYjg0YjU5ODU5NGE5YTAxNTgwMWU2MC5iaW5kUG9wdXAocG9wdXBfZGE4YmJkYmJlOTliNDg1YjkxY2RjYzc3YzBiYWEzYzUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDc1YThkN2I1OWE5NDYxMmEyMzg1NDJjYjU0ZmE2ZTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MTMxMDgzNDMzMjY0LC0xMjIuNDQ0MzE0MDI1MTg4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2JlMWU4OTRjNDBlYWI0MzYzYjU3NmM3ZGUwODkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGViYzEzYzg2M2ViNGYyNTgyNGY5OTIyNmQ2ZjQ4YzkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTE0MjdjOTYzYWRiNGQ4ZGEzNTI1ZDAzZTRjMzdkZGYgPSAkKCc8ZGl2IGlkPSJodG1sX2ExNDI3Yzk2M2FkYjRkOGRhMzUyNWQwM2U0YzM3ZGRmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EUlVHL05BUkNPVElDPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wZWJjMTNjODYzZWI0ZjI1ODI0Zjk5MjI2ZDZmNDhjOS5zZXRDb250ZW50KGh0bWxfYTE0MjdjOTYzYWRiNGQ4ZGEzNTI1ZDAzZTRjMzdkZGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDc1YThkN2I1OWE5NDYxMmEyMzg1NDJjYjU0ZmE2ZTIuYmluZFBvcHVwKHBvcHVwXzBlYmMxM2M4NjNlYjRmMjU4MjRmOTkyMjZkNmY0OGM5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzYyMTIyMzVjMjQzNjQzNWFhZTg5ZGVmOTJhZTA1OWQ4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY2MDE2MDExNDEwMywtMTIyLjQwMzY0NDYyMDQzOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNiZTFlODk0YzQwZWFiNDM2M2I1NzZjN2RlMDg5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E4NjFlYTViZWVhMzRhODU5YjdlNzI3N2Q5NDRiOTVlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZhMjNiMTg4MWU1NzQ2YjJiZGVjN2Y4MzNkMGEwNTMwID0gJCgnPGRpdiBpZD0iaHRtbF9mYTIzYjE4ODFlNTc0NmIyYmRlYzdmODMzZDBhMDUzMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TUlTU0lORyBQRVJTT048L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E4NjFlYTViZWVhMzRhODU5YjdlNzI3N2Q5NDRiOTVlLnNldENvbnRlbnQoaHRtbF9mYTIzYjE4ODFlNTc0NmIyYmRlYzdmODMzZDBhMDUzMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82MjEyMjM1YzI0MzY0MzVhYWU4OWRlZjkyYWUwNTlkOC5iaW5kUG9wdXAocG9wdXBfYTg2MWVhNWJlZWEzNGE4NTliN2U3Mjc3ZDk0NGI5NWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjZlMTFhYjM4ZGIwNDc4YzgxODA1MjM2ODhmNzQ1MGMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjYwMTYwMTE0MTAzLC0xMjIuNDAzNjQ0NjIwNDM5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2JlMWU4OTRjNDBlYWI0MzYzYjU3NmM3ZGUwODkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODNiOGNmMzZhYThkNGEwZDk1NmY5NGY3ZWZiZDkyYjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjYwZTYzYTM2OGVhNDVmODk4NTI3NDBmMzkxNmQ2N2MgPSAkKCc8ZGl2IGlkPSJodG1sX2I2MGU2M2EzNjhlYTQ1Zjg5ODUyNzQwZjM5MTZkNjdjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NSVNTSU5HIFBFUlNPTjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODNiOGNmMzZhYThkNGEwZDk1NmY5NGY3ZWZiZDkyYjkuc2V0Q29udGVudChodG1sX2I2MGU2M2EzNjhlYTQ1Zjg5ODUyNzQwZjM5MTZkNjdjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2I2ZTExYWIzOGRiMDQ3OGM4MTgwNTIzNjg4Zjc0NTBjLmJpbmRQb3B1cChwb3B1cF84M2I4Y2YzNmFhOGQ0YTBkOTU2Zjk0ZjdlZmJkOTJiOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82N2M1NWE4OWFmYzM0NGYyYTgyZmEwNjM0NGRjNmM0ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NjIzMTA0MDQ3NTgsLTEyMi40MTQ3MTQyOTU1Nzg5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNiZTFlODk0YzQwZWFiNDM2M2I1NzZjN2RlMDg5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E1OWM1Nzg3NGQ0MDQ1OThhNTJjMTlhMDRlMDE0OWU2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY0MTVlZjdmOTUzNDRlZWFhNzkwODBkOTllYjU0NGY2ID0gJCgnPGRpdiBpZD0iaHRtbF82NDE1ZWY3Zjk1MzQ0ZWVhYTc5MDgwZDk5ZWI1NDRmNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QVNTQVVMVDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTU5YzU3ODc0ZDQwNDU5OGE1MmMxOWEwNGUwMTQ5ZTYuc2V0Q29udGVudChodG1sXzY0MTVlZjdmOTUzNDRlZWFhNzkwODBkOTllYjU0NGY2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY3YzU1YTg5YWZjMzQ0ZjJhODJmYTA2MzQ0ZGM2YzRkLmJpbmRQb3B1cChwb3B1cF9hNTljNTc4NzRkNDA0NTk4YTUyYzE5YTA0ZTAxNDllNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81NmVkMTIxNmQwY2M0MTJjYjJhY2ZlYjE1OTMyZjVjZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NjIzMTA0MDQ3NTgsLTEyMi40MTQ3MTQyOTU1Nzg5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNiZTFlODk0YzQwZWFiNDM2M2I1NzZjN2RlMDg5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc5NTVkMjU3NGU4NzQ3Y2RhNDUxODlkNWMzNzg1NjJhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FlYTk1OTc1NjBkNDQ4OGU5MzBkZDU1MzFkNzQ3ZjVkID0gJCgnPGRpdiBpZD0iaHRtbF9hZWE5NTk3NTYwZDQ0ODhlOTMwZGQ1NTMxZDc0N2Y1ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TUlTU0lORyBQRVJTT048L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc5NTVkMjU3NGU4NzQ3Y2RhNDUxODlkNWMzNzg1NjJhLnNldENvbnRlbnQoaHRtbF9hZWE5NTk3NTYwZDQ0ODhlOTMwZGQ1NTMxZDc0N2Y1ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81NmVkMTIxNmQwY2M0MTJjYjJhY2ZlYjE1OTMyZjVjZi5iaW5kUG9wdXAocG9wdXBfNzk1NWQyNTc0ZTg3NDdjZGE0NTE4OWQ1YzM3ODU2MmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjYwYjEwN2E4NjkwNGJiMWI4NDIxMmVmM2M2NjI2MmIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43Nzc1MTE4ODk1Njk1LC0xMjIuNDE4MDQ1NDUyNzY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2JlMWU4OTRjNDBlYWI0MzYzYjU3NmM3ZGUwODkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTJiNzU2ZjA0ODUxNGU3ODk5NjljOWY2YzdkNDk1YjMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTViMmFlMzliMzAzNDMzZWFmMjAxMGVhOGY2ZjliNjUgPSAkKCc8ZGl2IGlkPSJodG1sXzk1YjJhZTM5YjMwMzQzM2VhZjIwMTBlYThmNmY5YjY1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WRUhJQ0xFIFRIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hMmI3NTZmMDQ4NTE0ZTc4OTk2OWM5ZjZjN2Q0OTViMy5zZXRDb250ZW50KGh0bWxfOTViMmFlMzliMzAzNDMzZWFmMjAxMGVhOGY2ZjliNjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjYwYjEwN2E4NjkwNGJiMWI4NDIxMmVmM2M2NjI2MmIuYmluZFBvcHVwKHBvcHVwX2EyYjc1NmYwNDg1MTRlNzg5OTY5YzlmNmM3ZDQ5NWIzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzgzM2ViZDExZWIxZjQyYWRhZTcxMDM1YmZkOGU1NTRmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgyMDIzODQ3ODk3NSwtMTIyLjQwMTE2MTU1NTYwMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNiZTFlODk0YzQwZWFiNDM2M2I1NzZjN2RlMDg5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JhNTAzZjhjNGUwNDQxNDg5ZGYyNTI0MGZmZGUxODgwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRlNTMwZWI0YTJjYzRkODhhMzI0Zjg3YWYxZDViN2VhID0gJCgnPGRpdiBpZD0iaHRtbF80ZTUzMGViNGEyY2M0ZDg4YTMyNGY4N2FmMWQ1YjdlYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JhNTAzZjhjNGUwNDQxNDg5ZGYyNTI0MGZmZGUxODgwLnNldENvbnRlbnQoaHRtbF80ZTUzMGViNGEyY2M0ZDg4YTMyNGY4N2FmMWQ1YjdlYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84MzNlYmQxMWViMWY0MmFkYWU3MTAzNWJmZDhlNTU0Zi5iaW5kUG9wdXAocG9wdXBfYmE1MDNmOGM0ZTA0NDE0ODlkZjI1MjQwZmZkZTE4ODApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzU0OTUwNGY2MjUyNDdlYWFhZjY2MzZiODE0MDIxOTEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjcwMDUzMTk2Mjk5OTUsLTEyMi40MDM0MDg2NjkxOTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjYmUxZTg5NGM0MGVhYjQzNjNiNTc2YzdkZTA4OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yNjExNWFiNjZkNWU0ZWQ5OTkxY2Q5OTIwMzc0NWYxNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jN2ZhMGI0ZGMxNmE0NDhhODEyMDM4YzQ4NThkN2MyZiA9ICQoJzxkaXYgaWQ9Imh0bWxfYzdmYTBiNGRjMTZhNDQ4YTgxMjAzOGM0ODU4ZDdjMmYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldBUlJBTlRTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yNjExNWFiNjZkNWU0ZWQ5OTkxY2Q5OTIwMzc0NWYxNC5zZXRDb250ZW50KGh0bWxfYzdmYTBiNGRjMTZhNDQ4YTgxMjAzOGM0ODU4ZDdjMmYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzU0OTUwNGY2MjUyNDdlYWFhZjY2MzZiODE0MDIxOTEuYmluZFBvcHVwKHBvcHVwXzI2MTE1YWI2NmQ1ZTRlZDk5OTFjZDk5MjAzNzQ1ZjE0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJkZjlkZjQ5ODc3ODRkYjQ4ZDJhODc3MTU0NmYyMzk1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzODM0NDM3NDE0MSwtMTIyLjQxMjkzMDUyMjA1OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNiZTFlODk0YzQwZWFiNDM2M2I1NzZjN2RlMDg5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUwYzUzNjljNTE5ZDRjMzZiMGQ0ZjQ4NDdiMWU5MDI2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk3YTE1NWJjYWE5YTQzMGE5MGU3MTFjMzllOTE1OTY5ID0gJCgnPGRpdiBpZD0iaHRtbF85N2ExNTViY2FhOWE0MzBhOTBlNzExYzM5ZTkxNTk2OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VkFOREFMSVNNPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MGM1MzY5YzUxOWQ0YzM2YjBkNGY0ODQ3YjFlOTAyNi5zZXRDb250ZW50KGh0bWxfOTdhMTU1YmNhYTlhNDMwYTkwZTcxMWMzOWU5MTU5NjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmRmOWRmNDk4Nzc4NGRiNDhkMmE4NzcxNTQ2ZjIzOTUuYmluZFBvcHVwKHBvcHVwXzUwYzUzNjljNTE5ZDRjMzZiMGQ0ZjQ4NDdiMWU5MDI2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IzYzVjYjYxYWU1YTRlMjRhNjc5YTg0ZDkyMjkyMjVjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzUzMDE4NjUzNzQ0NjA0LC0xMjIuNDE4NTg3MTcyMjE5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2JlMWU4OTRjNDBlYWI0MzYzYjU3NmM3ZGUwODkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzkzNDhjYmJlNzhmNDBjYTg3NzIxNzQxNmI1YjJlOGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTcyMTM3NGM5MTRjNGZjNzljY2RkYjJhNWZkMGRkODMgPSAkKCc8ZGl2IGlkPSJodG1sXzk3MjEzNzRjOTE0YzRmYzc5Y2NkZGIyYTVmZDBkZDgzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OT04tQ1JJTUlOQUw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc5MzQ4Y2JiZTc4ZjQwY2E4NzcyMTc0MTZiNWIyZThjLnNldENvbnRlbnQoaHRtbF85NzIxMzc0YzkxNGM0ZmM3OWNjZGRiMmE1ZmQwZGQ4Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iM2M1Y2I2MWFlNWE0ZTI0YTY3OWE4NGQ5MjI5MjI1Yy5iaW5kUG9wdXAocG9wdXBfNzkzNDhjYmJlNzhmNDBjYTg3NzIxNzQxNmI1YjJlOGMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOThmMDAxOGNmOTVmNGI2MDlmNTQ2ODI1ZWU4MzQyYzcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzQwNDE4Mzg1MDQxLC0xMjIuNDE0MzcwNjI3NDk1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2JlMWU4OTRjNDBlYWI0MzYzYjU3NmM3ZGUwODkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2FjMzVkOGM4N2YwNGQxOTkxZWRkZDBlYmQzMWY3ZGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjNiOGFhZjc0MTkzNDFhYmExZGNiNjRmNzc3OWNhMGUgPSAkKCc8ZGl2IGlkPSJodG1sXzIzYjhhYWY3NDE5MzQxYWJhMWRjYjY0Zjc3NzljYTBlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GUkFVRDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2FjMzVkOGM4N2YwNGQxOTkxZWRkZDBlYmQzMWY3ZGMuc2V0Q29udGVudChodG1sXzIzYjhhYWY3NDE5MzQxYWJhMWRjYjY0Zjc3NzljYTBlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk4ZjAwMThjZjk1ZjRiNjA5ZjU0NjgyNWVlODM0MmM3LmJpbmRQb3B1cChwb3B1cF9jYWMzNWQ4Yzg3ZjA0ZDE5OTFlZGRkMGViZDMxZjdkYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hZGVmMDlmMjRjZDQ0ZTdmOWM3YzExNWRmYWQ5M2FiYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc5MDUzODk5MzcyNSwtMTIyLjQwMzkxNTY4MTU3MTAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2JlMWU4OTRjNDBlYWI0MzYzYjU3NmM3ZGUwODkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmE3YzQ4MDk3MDZjNDJjNjg0ZDk4NTNhMTU5NWRiMjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODMxYmYxZGY2Y2NhNDgzMGIyZDQzMDhhNTM4YWU0NzggPSAkKCc8ZGl2IGlkPSJodG1sXzgzMWJmMWRmNmNjYTQ4MzBiMmQ0MzA4YTUzOGFlNDc4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BU1NBVUxUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yYTdjNDgwOTcwNmM0MmM2ODRkOTg1M2ExNTk1ZGIyNS5zZXRDb250ZW50KGh0bWxfODMxYmYxZGY2Y2NhNDgzMGIyZDQzMDhhNTM4YWU0NzgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWRlZjA5ZjI0Y2Q0NGU3ZjljN2MxMTVkZmFkOTNhYmMuYmluZFBvcHVwKHBvcHVwXzJhN2M0ODA5NzA2YzQyYzY4NGQ5ODUzYTE1OTVkYjI1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2VjOTgyYzIzOTdmMzRkYTBiNzBiNDI1ZWUxZTNiMjlhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzMDk5ODI0NDU5MjEsLTEyMi40MTkxODMwOTYzNjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjYmUxZTg5NGM0MGVhYjQzNjNiNTc2YzdkZTA4OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81ZWJjNmI1NmY5ODM0ZGYyOTkzMzAyZTVmYzU4NGM0MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80Y2E2MjI1NTUxMmI0NmRiOGIzNjNlZWNlODc0OTU3MCA9ICQoJzxkaXYgaWQ9Imh0bWxfNGNhNjIyNTU1MTJiNDZkYjhiMzYzZWVjZTg3NDk1NzAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81ZWJjNmI1NmY5ODM0ZGYyOTkzMzAyZTVmYzU4NGM0MC5zZXRDb250ZW50KGh0bWxfNGNhNjIyNTU1MTJiNDZkYjhiMzYzZWVjZTg3NDk1NzApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWM5ODJjMjM5N2YzNGRhMGI3MGI0MjVlZTFlM2IyOWEuYmluZFBvcHVwKHBvcHVwXzVlYmM2YjU2Zjk4MzRkZjI5OTMzMDJlNWZjNTg0YzQwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2MwNzUzMzA5YjM5NTQ4MDQ5MjMxZTBhNWJiMjdiZjdmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzQwNzM2MDU0ODM1NzksLTEyMi4zODg3NTMwNDY5OTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjYmUxZTg5NGM0MGVhYjQzNjNiNTc2YzdkZTA4OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lZWY5ODc0YWE1NTQ0MjdmYmFmZTk4N2I2YjM3YjcyMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mYWM3N2U1NjEzNGQ0OGI5YmZjMDc5NGVlMDM0ZDliOSA9ICQoJzxkaXYgaWQ9Imh0bWxfZmFjNzdlNTYxMzRkNDhiOWJmYzA3OTRlZTAzNGQ5YjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lZWY5ODc0YWE1NTQ0MjdmYmFmZTk4N2I2YjM3YjcyMi5zZXRDb250ZW50KGh0bWxfZmFjNzdlNTYxMzRkNDhiOWJmYzA3OTRlZTAzNGQ5YjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzA3NTMzMDliMzk1NDgwNDkyMzFlMGE1YmIyN2JmN2YuYmluZFBvcHVwKHBvcHVwX2VlZjk4NzRhYTU1NDQyN2ZiYWZlOTg3YjZiMzdiNzIyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA3NzFlZTU3ZjI1MjRlMjA5NWQwNjhlY2UxOTgzOTE2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc0OTkxMjk0NDM2NiwtMTIyLjQzNzc5OTcwMzQ2OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNiZTFlODk0YzQwZWFiNDM2M2I1NzZjN2RlMDg5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZmMWM5ODRkNzE2YTRhMDdiOWFhNDc0NTJhZmZkYmY2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MwZDI3ZWMwM2Q5ZjRmN2Q5ODZjZmM4NWNjODcyYzg1ID0gJCgnPGRpdiBpZD0iaHRtbF9jMGQyN2VjMDNkOWY0ZjdkOTg2Y2ZjODVjYzg3MmM4NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TEFSQ0VOWS9USEVGVDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmYxYzk4NGQ3MTZhNGEwN2I5YWE0NzQ1MmFmZmRiZjYuc2V0Q29udGVudChodG1sX2MwZDI3ZWMwM2Q5ZjRmN2Q5ODZjZmM4NWNjODcyYzg1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA3NzFlZTU3ZjI1MjRlMjA5NWQwNjhlY2UxOTgzOTE2LmJpbmRQb3B1cChwb3B1cF82ZjFjOTg0ZDcxNmE0YTA3YjlhYTQ3NDUyYWZmZGJmNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lZTE1ZDVmMDMyNmQ0YmI1YTFmMWQ3N2NkZjNhNThkOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NzA5MDI3NDM2NjksLTEyMi40MjEzMzI2ODQ2MzNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjYmUxZTg5NGM0MGVhYjQzNjNiNTc2YzdkZTA4OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wZDFiODJkOTJkZTQ0NDllOTczOTM4Njc4M2MwMDhhMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81MmRjN2Y3MTg3MWE0ZmUyYTJiODQyZTg5ZTE5MjM2MSA9ICQoJzxkaXYgaWQ9Imh0bWxfNTJkYzdmNzE4NzFhNGZlMmEyYjg0MmU4OWUxOTIzNjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1JU1NJTkcgUEVSU09OPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wZDFiODJkOTJkZTQ0NDllOTczOTM4Njc4M2MwMDhhMy5zZXRDb250ZW50KGh0bWxfNTJkYzdmNzE4NzFhNGZlMmEyYjg0MmU4OWUxOTIzNjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWUxNWQ1ZjAzMjZkNGJiNWExZjFkNzdjZGYzYTU4ZDkuYmluZFBvcHVwKHBvcHVwXzBkMWI4MmQ5MmRlNDQ0OWU5NzM5Mzg2NzgzYzAwOGEzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU0OThjZWZjNmZmYzRlYzA4ZjAzODBmMjQwNjBiYzQzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc3MDkwMjc0MzY2OSwtMTIyLjQyMTMzMjY4NDYzM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNiZTFlODk0YzQwZWFiNDM2M2I1NzZjN2RlMDg5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRlZjQwZjdlOTY0ZDRjYjRiOTFlZjgyN2ZhZThlZTliID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRhZjZkOTZmMTdjYzRkNWU4NGFlZTFiODkzMGNjMWMwID0gJCgnPGRpdiBpZD0iaHRtbF80YWY2ZDk2ZjE3Y2M0ZDVlODRhZWUxYjg5MzBjYzFjMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TUlTU0lORyBQRVJTT048L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRlZjQwZjdlOTY0ZDRjYjRiOTFlZjgyN2ZhZThlZTliLnNldENvbnRlbnQoaHRtbF80YWY2ZDk2ZjE3Y2M0ZDVlODRhZWUxYjg5MzBjYzFjMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81NDk4Y2VmYzZmZmM0ZWMwOGYwMzgwZjI0MDYwYmM0My5iaW5kUG9wdXAocG9wdXBfNGVmNDBmN2U5NjRkNGNiNGI5MWVmODI3ZmFlOGVlOWIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDk4ODE5NWUyNjJhNDQ4MDhhMmE4NTMxN2I0NjRhZTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODIyNDU4MjIzOTE3LC0xMjIuNDQ2NjEyOTc4ODM5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2JlMWU4OTRjNDBlYWI0MzYzYjU3NmM3ZGUwODkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2JiNGEyOGUxNmIzNDUzODhkNjg5YjMzNTcyMDc4ODIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTNjYmI5MDkxM2IwNDVhNGE1MzYxNDJiZjJhYTA3NTMgPSAkKCc8ZGl2IGlkPSJodG1sXzEzY2JiOTA5MTNiMDQ1YTRhNTM2MTQyYmYyYWEwNzUzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XQVJSQU5UUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2JiNGEyOGUxNmIzNDUzODhkNjg5YjMzNTcyMDc4ODIuc2V0Q29udGVudChodG1sXzEzY2JiOTA5MTNiMDQ1YTRhNTM2MTQyYmYyYWEwNzUzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ5ODgxOTVlMjYyYTQ0ODA4YTJhODUzMTdiNDY0YWU3LmJpbmRQb3B1cChwb3B1cF9jYmI0YTI4ZTE2YjM0NTM4OGQ2ODliMzM1NzIwNzg4Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81M2IzNDRkOWMzY2I0MmY2OGRjOWM3OWU0NWRjYzVhMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczMDAzNzk5OTUxMjc5NSwtMTIyLjQwNDU5NDE0MDYzNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNiZTFlODk0YzQwZWFiNDM2M2I1NzZjN2RlMDg5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUxYWM2N2RkZTNhODQ2Njg4OGNmZmM4ZGY1YWI0ZTE2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU1YWUxNzJkYmFiZDQ0Nzc5NTkzZjcwYTg0MGNiZDQzID0gJCgnPGRpdiBpZD0iaHRtbF81NWFlMTcyZGJhYmQ0NDc3OTU5M2Y3MGE4NDBjYmQ0MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MWFjNjdkZGUzYTg0NjY4ODhjZmZjOGRmNWFiNGUxNi5zZXRDb250ZW50KGh0bWxfNTVhZTE3MmRiYWJkNDQ3Nzk1OTNmNzBhODQwY2JkNDMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTNiMzQ0ZDljM2NiNDJmNjhkYzljNzllNDVkY2M1YTEuYmluZFBvcHVwKHBvcHVwXzUxYWM2N2RkZTNhODQ2Njg4OGNmZmM4ZGY1YWI0ZTE2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y2Y2U5OTIyNmQ1MzQ2NDhiMWJhZmZkOWE4YWE1MDMwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzk1MzMzODI2NzQzNiwtMTIyLjM5NzM3Mzc0MDA2Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNiZTFlODk0YzQwZWFiNDM2M2I1NzZjN2RlMDg5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzYwZmMxNTllMjE3MzQzMTBiYzMyZGY3MWVkNzliMzc4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzcyZTQ2YjRkODE3ZDRiOGM4YjJmNTU2NzZlZmQzYjI4ID0gJCgnPGRpdiBpZD0iaHRtbF83MmU0NmI0ZDgxN2Q0YjhjOGIyZjU1Njc2ZWZkM2IyOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MGZjMTU5ZTIxNzM0MzEwYmMzMmRmNzFlZDc5YjM3OC5zZXRDb250ZW50KGh0bWxfNzJlNDZiNGQ4MTdkNGI4YzhiMmY1NTY3NmVmZDNiMjgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjZjZTk5MjI2ZDUzNDY0OGIxYmFmZmQ5YThhYTUwMzAuYmluZFBvcHVwKHBvcHVwXzYwZmMxNTllMjE3MzQzMTBiYzMyZGY3MWVkNzliMzc4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E3ZTgxYWViNmU2ZTRkMmE5YjY4YWQyMmY1ZWI0YzM3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg3NTE1ODc0MTYyMjk1LC0xMjIuNDA3NDM0OTg5NTIzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2JlMWU4OTRjNDBlYWI0MzYzYjU3NmM3ZGUwODkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDhkMTBhZDg1NDk4NDcyNjlmZjEyOGE0Zjc3MGFiYzcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDdjYmE3Y2FiOTllNGU2Njk0MDlhZWVlM2M4MzFhMjggPSAkKCc8ZGl2IGlkPSJodG1sX2Q3Y2JhN2NhYjk5ZTRlNjY5NDA5YWVlZTNjODMxYTI4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XQVJSQU5UUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDhkMTBhZDg1NDk4NDcyNjlmZjEyOGE0Zjc3MGFiYzcuc2V0Q29udGVudChodG1sX2Q3Y2JhN2NhYjk5ZTRlNjY5NDA5YWVlZTNjODMxYTI4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2E3ZTgxYWViNmU2ZTRkMmE5YjY4YWQyMmY1ZWI0YzM3LmJpbmRQb3B1cChwb3B1cF80OGQxMGFkODU0OTg0NzI2OWZmMTI4YTRmNzcwYWJjNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82OGIyOGI0MjJkNDQ0NzhiOTdkMDI3MmE1YTVkNGVjZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3ODUyMzM3NzYwMzIsLTEyMi40MDM0NjQwODAwMzNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjYmUxZTg5NGM0MGVhYjQzNjNiNTc2YzdkZTA4OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84ZTgxMGU3YTRlMTg0NjFkYmVjN2M3YTNhYjY4MzllNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81MjA0YzkyOWUwY2Q0OTEzYjQwMjMwZWQzNWVjZGQ5ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfNTIwNGM5MjllMGNkNDkxM2I0MDIzMGVkMzVlY2RkOWUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBST1NUSVRVVElPTjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOGU4MTBlN2E0ZTE4NDYxZGJlYzdjN2EzYWI2ODM5ZTYuc2V0Q29udGVudChodG1sXzUyMDRjOTI5ZTBjZDQ5MTNiNDAyMzBlZDM1ZWNkZDllKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY4YjI4YjQyMmQ0NDQ3OGI5N2QwMjcyYTVhNWQ0ZWNkLmJpbmRQb3B1cChwb3B1cF84ZTgxMGU3YTRlMTg0NjFkYmVjN2M3YTNhYjY4MzllNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xZGUzNWIxOTE3ZGQ0YmM3ODJhNTBiY2IzOWQ2ZWM5MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3ODUyMzM3NzYwMzIsLTEyMi40MDM0NjQwODAwMzNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjYmUxZTg5NGM0MGVhYjQzNjNiNTc2YzdkZTA4OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mYTVmOGU5OTRmZTQ0MDZjOGNkZmRhOTIyNWUwYjZiNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lNzg3Y2Q2ZmQ4OTc0YmI4OTc3NTIyYjI4ZWY2MDgyZSA9ICQoJzxkaXYgaWQ9Imh0bWxfZTc4N2NkNmZkODk3NGJiODk3NzUyMmIyOGVmNjA4MmUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mYTVmOGU5OTRmZTQ0MDZjOGNkZmRhOTIyNWUwYjZiNC5zZXRDb250ZW50KGh0bWxfZTc4N2NkNmZkODk3NGJiODk3NzUyMmIyOGVmNjA4MmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWRlMzViMTkxN2RkNGJjNzgyYTUwYmNiMzlkNmVjOTIuYmluZFBvcHVwKHBvcHVwX2ZhNWY4ZTk5NGZlNDQwNmM4Y2RmZGE5MjI1ZTBiNmI0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRiMTNlZmU5YmJkMTQyYmNiZjA2MWQxYjg5YmUyMTJhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzczMjkxODA2OTAyOTk2LC0xMjIuNDM2NjE0MTgxMzMxMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjYmUxZTg5NGM0MGVhYjQzNjNiNTc2YzdkZTA4OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zNTc3MmQ1NmM2YzQ0NjM5YjRlMjVmYzIyN2M5YzdhOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82MGY3ODAzMWVmMTk0ZjI1YTQ1MTRkNjRjMmMwMGM2YiA9ICQoJzxkaXYgaWQ9Imh0bWxfNjBmNzgwMzFlZjE5NGYyNWE0NTE0ZDY0YzJjMDBjNmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzU3NzJkNTZjNmM0NDYzOWI0ZTI1ZmMyMjdjOWM3YTkuc2V0Q29udGVudChodG1sXzYwZjc4MDMxZWYxOTRmMjVhNDUxNGQ2NGMyYzAwYzZiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzRiMTNlZmU5YmJkMTQyYmNiZjA2MWQxYjg5YmUyMTJhLmJpbmRQb3B1cChwb3B1cF8zNTc3MmQ1NmM2YzQ0NjM5YjRlMjVmYzIyN2M5YzdhOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jMWI1YmJlZjFkNjY0OWM0YjRlOTM4MDAxM2MwZTc5NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MDUyNzU3ODUwOSwtMTIyLjM5Njg0OTAxNTE3MjAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2JlMWU4OTRjNDBlYWI0MzYzYjU3NmM3ZGUwODkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTRjMDEyZDZhNzUzNDk5YWE5ZmI5Y2FmOTBjOTk0ZmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGNkZDUwNTVkMmM4NGM2ZjgzMzNiODBjOGE5Nzk3MTYgPSAkKCc8ZGl2IGlkPSJodG1sXzhjZGQ1MDU1ZDJjODRjNmY4MzMzYjgwYzhhOTc5NzE2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EUlVHL05BUkNPVElDPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81NGMwMTJkNmE3NTM0OTlhYTlmYjljYWY5MGM5OTRmZC5zZXRDb250ZW50KGh0bWxfOGNkZDUwNTVkMmM4NGM2ZjgzMzNiODBjOGE5Nzk3MTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzFiNWJiZWYxZDY2NDljNGI0ZTkzODAwMTNjMGU3OTcuYmluZFBvcHVwKHBvcHVwXzU0YzAxMmQ2YTc1MzQ5OWFhOWZiOWNhZjkwYzk5NGZkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IxNjhhM2RiMzcwOTQ4ODE4MjM3MWRiYTFjNDhmZGI0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgwNTI3NTc4NTA5LC0xMjIuMzk2ODQ5MDE1MTcyMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjYmUxZTg5NGM0MGVhYjQzNjNiNTc2YzdkZTA4OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mNTUyZjk1MmRmY2U0ZjY4OWIyNzdkZTZhNjg0NzkwMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85ZmFiZTIyOWE5MTc0YzZkYmNlMzVjNGU3NjA4NjkwNCA9ICQoJzxkaXYgaWQ9Imh0bWxfOWZhYmUyMjlhOTE3NGM2ZGJjZTM1YzRlNzYwODY5MDQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldBUlJBTlRTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mNTUyZjk1MmRmY2U0ZjY4OWIyNzdkZTZhNjg0NzkwMC5zZXRDb250ZW50KGh0bWxfOWZhYmUyMjlhOTE3NGM2ZGJjZTM1YzRlNzYwODY5MDQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjE2OGEzZGIzNzA5NDg4MTgyMzcxZGJhMWM0OGZkYjQuYmluZFBvcHVwKHBvcHVwX2Y1NTJmOTUyZGZjZTRmNjg5YjI3N2RlNmE2ODQ3OTAwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk4MmZjY2U5MjUzNjQwZDhhODE4MTc3MWExYjI2YTM3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzI4NDE4MDcwNjYwMjA0LC0xMjIuNDUwMDAwNzkwNDQ1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2JlMWU4OTRjNDBlYWI0MzYzYjU3NmM3ZGUwODkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzg3YTA2MTg2MTc3NDZkY2I2ZTQ0MmVlODAyODc0MmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmI3OGYwZDgyZjY2NDgyYmEyNTc4MjM3MTBiNzJlODUgPSAkKCc8ZGl2IGlkPSJodG1sX2JiNzhmMGQ4MmY2NjQ4MmJhMjU3ODIzNzEwYjcyZTg1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MQVJDRU5ZL1RIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zODdhMDYxODYxNzc0NmRjYjZlNDQyZWU4MDI4NzQyZS5zZXRDb250ZW50KGh0bWxfYmI3OGYwZDgyZjY2NDgyYmEyNTc4MjM3MTBiNzJlODUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTgyZmNjZTkyNTM2NDBkOGE4MTgxNzcxYTFiMjZhMzcuYmluZFBvcHVwKHBvcHVwXzM4N2EwNjE4NjE3NzQ2ZGNiNmU0NDJlZTgwMjg3NDJlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNmZTcyN2I0ZjVlZDRhMjY4YTg5MWU5N2IxNzlmN2ZmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzI5MjExNDY0NzM1OSwtMTIyLjQwMDgzNDI4MzAzMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNiZTFlODk0YzQwZWFiNDM2M2I1NzZjN2RlMDg5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdlYjM3ZDkwNzIyYjQ3N2FiZjE0YjlkMzczMzg3YjE2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYwMzYwNjE3NTAxYTQ3MmI5MGZlMjM3NjAxZmFlYmJjID0gJCgnPGRpdiBpZD0iaHRtbF82MDM2MDYxNzUwMWE0NzJiOTBmZTIzNzYwMWZhZWJiYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdlYjM3ZDkwNzIyYjQ3N2FiZjE0YjlkMzczMzg3YjE2LnNldENvbnRlbnQoaHRtbF82MDM2MDYxNzUwMWE0NzJiOTBmZTIzNzYwMWZhZWJiYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zZmU3MjdiNGY1ZWQ0YTI2OGE4OTFlOTdiMTc5ZjdmZi5iaW5kUG9wdXAocG9wdXBfN2ViMzdkOTA3MjJiNDc3YWJmMTRiOWQzNzMzODdiMTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTJhMWJkNzI3M2MzNGQ1ZGE3NzAyNmQ3OGRkZTI3NjggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODgwMDY1MzI0MzkyMDUsLTEyMi4zOTk4MDIxNDU3OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjYmUxZTg5NGM0MGVhYjQzNjNiNTc2YzdkZTA4OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84YzQ2YWMwYTJmMDY0NzNlYTFhMTFhODdjM2Q3MWY0YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lMTVmMzA0MzFhMzE0ODEwYTg5ZTVjOTJjNjA5MWU1ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfZTE1ZjMwNDMxYTMxNDgxMGE4OWU1YzkyYzYwOTFlNWQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxBUkNFTlkvVEhFRlQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhjNDZhYzBhMmYwNjQ3M2VhMWExMWE4N2MzZDcxZjRjLnNldENvbnRlbnQoaHRtbF9lMTVmMzA0MzFhMzE0ODEwYTg5ZTVjOTJjNjA5MWU1ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81MmExYmQ3MjczYzM0ZDVkYTc3MDI2ZDc4ZGRlMjc2OC5iaW5kUG9wdXAocG9wdXBfOGM0NmFjMGEyZjA2NDczZWExYTExYTg3YzNkNzFmNGMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjQ4MmEzNGUzZGZmNDMxZjg1YjA4OGUzOTU4MjY5YmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjM5NzQ4MjQxNjA5LC0xMjIuMzk0OTI4NDc1OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNiZTFlODk0YzQwZWFiNDM2M2I1NzZjN2RlMDg5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgwNGM4ZjA0OTkxZjRmNmViMjQ5OTAyYzliOTA5OTFjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FkZmQyODg2OGQ2OTRmNjJhOTgzNWY2OTBjZGRiYTNkID0gJCgnPGRpdiBpZD0iaHRtbF9hZGZkMjg4NjhkNjk0ZjYyYTk4MzVmNjkwY2RkYmEzZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U0VDT05EQVJZIENPREVTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MDRjOGYwNDk5MWY0ZjZlYjI0OTkwMmM5YjkwOTkxYy5zZXRDb250ZW50KGh0bWxfYWRmZDI4ODY4ZDY5NGY2MmE5ODM1ZjY5MGNkZGJhM2QpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjQ4MmEzNGUzZGZmNDMxZjg1YjA4OGUzOTU4MjY5YmYuYmluZFBvcHVwKHBvcHVwXzgwNGM4ZjA0OTkxZjRmNmViMjQ5OTAyYzliOTA5OTFjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IyNWRmNWM0YzA1NTQyYzhhYmM1MTU1YjNlMmY4ODhlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzIzOTc0ODI0MTYwOSwtMTIyLjM5NDkyODQ3NThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjYmUxZTg5NGM0MGVhYjQzNjNiNTc2YzdkZTA4OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kY2IxZTgzZmI4ZTM0MjllYjFkN2ViNjExOGRhNTc2MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lYjNhZjg3NzM1ZjA0YTMwYTRjNDcwMzM3MTBjNmQwMiA9ICQoJzxkaXYgaWQ9Imh0bWxfZWIzYWY4NzczNWYwNGEzMGE0YzQ3MDMzNzEwYzZkMDIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNVU1BJQ0lPVVMgT0NDPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kY2IxZTgzZmI4ZTM0MjllYjFkN2ViNjExOGRhNTc2Mi5zZXRDb250ZW50KGh0bWxfZWIzYWY4NzczNWYwNGEzMGE0YzQ3MDMzNzEwYzZkMDIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjI1ZGY1YzRjMDU1NDJjOGFiYzUxNTViM2UyZjg4OGUuYmluZFBvcHVwKHBvcHVwX2RjYjFlODNmYjhlMzQyOWViMWQ3ZWI2MTE4ZGE1NzYyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ExYjNmMzdmOWMwYjRkN2U5NmU2NGRhYWY0OGYzYmYyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzIzOTc0ODI0MTYwOSwtMTIyLjM5NDkyODQ3NThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjYmUxZTg5NGM0MGVhYjQzNjNiNTc2YzdkZTA4OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lMGFlNTc5M2Q4ZmU0MmI4YTgxNTBjOTM0YThkZjM2ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iYjU5YzFiMzZlOWM0Y2JlYTdhZjQ2ZGUxMzU1MGJjNyA9ICQoJzxkaXYgaWQ9Imh0bWxfYmI1OWMxYjM2ZTljNGNiZWE3YWY0NmRlMTM1NTBiYzciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lMGFlNTc5M2Q4ZmU0MmI4YTgxNTBjOTM0YThkZjM2ZS5zZXRDb250ZW50KGh0bWxfYmI1OWMxYjM2ZTljNGNiZWE3YWY0NmRlMTM1NTBiYzcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTFiM2YzN2Y5YzBiNGQ3ZTk2ZTY0ZGFhZjQ4ZjNiZjIuYmluZFBvcHVwKHBvcHVwX2UwYWU1NzkzZDhmZTQyYjhhODE1MGM5MzRhOGRmMzZlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNiZjg3ZTBmNGM5MDQyYjNhMjAzNjk1ZDcyYjk3YWVhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg4MzIzNTQ0OTkwNCwtMTIyLjQxMTg1NzAzMjU0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2JlMWU4OTRjNDBlYWI0MzYzYjU3NmM3ZGUwODkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjc3ZThjYjY5MTUwNDU2NmFkZDliMDAxNjQ5ZTlkMzUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzczODkxNDkwODc2NDdhNzhlNjgyZmYxMTI0YmU5YzEgPSAkKCc8ZGl2IGlkPSJodG1sX2M3Mzg5MTQ5MDg3NjQ3YTc4ZTY4MmZmMTEyNGJlOWMxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MQVJDRU5ZL1RIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mNzdlOGNiNjkxNTA0NTY2YWRkOWIwMDE2NDllOWQzNS5zZXRDb250ZW50KGh0bWxfYzczODkxNDkwODc2NDdhNzhlNjgyZmYxMTI0YmU5YzEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2JmODdlMGY0YzkwNDJiM2EyMDM2OTVkNzJiOTdhZWEuYmluZFBvcHVwKHBvcHVwX2Y3N2U4Y2I2OTE1MDQ1NjZhZGQ5YjAwMTY0OWU5ZDM1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I5ZjI0MzdhZjU5YjRmZDU4YjI4ZmZmYjc0NGU1MzFhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzU1OTk3NzMzOTg1NiwtMTIyLjQwOTQzNTYxNzEwNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNiZTFlODk0YzQwZWFiNDM2M2I1NzZjN2RlMDg5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I2NjVlOTE4MzFmYTQ2NTM4OGJkN2M5MmRlYWE4M2I0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE3NzFkMmVkMGNmZTRhZjZiNjJkNzRjODI2NTI4M2EzID0gJCgnPGRpdiBpZD0iaHRtbF8xNzcxZDJlZDBjZmU0YWY2YjYyZDc0YzgyNjUyODNhMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I2NjVlOTE4MzFmYTQ2NTM4OGJkN2M5MmRlYWE4M2I0LnNldENvbnRlbnQoaHRtbF8xNzcxZDJlZDBjZmU0YWY2YjYyZDc0YzgyNjUyODNhMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iOWYyNDM3YWY1OWI0ZmQ1OGIyOGZmZmI3NDRlNTMxYS5iaW5kUG9wdXAocG9wdXBfYjY2NWU5MTgzMWZhNDY1Mzg4YmQ3YzkyZGVhYTgzYjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTgzMGU4N2IyNzNmNGIyNjhmNzM5ZTFhOGUyMDJkMGIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODcwNzk4MTQ0NDQzLC0xMjIuNDI1ODgzMzU4MTQ4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2JlMWU4OTRjNDBlYWI0MzYzYjU3NmM3ZGUwODkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWYzMmJkNmQ5ZmMyNDllNWJkYzcwNzYxY2U1OWI2MjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzYwMzIwZTgwOTUyNDA4NWEzMzc3MDJhMzhmN2FjODEgPSAkKCc8ZGl2IGlkPSJodG1sXzc2MDMyMGU4MDk1MjQwODVhMzM3NzAyYTM4ZjdhYzgxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OT04tQ1JJTUlOQUw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFmMzJiZDZkOWZjMjQ5ZTViZGM3MDc2MWNlNTliNjIyLnNldENvbnRlbnQoaHRtbF83NjAzMjBlODA5NTI0MDg1YTMzNzcwMmEzOGY3YWM4MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hODMwZTg3YjI3M2Y0YjI2OGY3MzllMWE4ZTIwMmQwYi5iaW5kUG9wdXAocG9wdXBfMWYzMmJkNmQ5ZmMyNDllNWJkYzcwNzYxY2U1OWI2MjIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGY0NjZhMDRlYzU3NDY2NGE3MWNkYWI3ZGQ0MTk4NDcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MzYwMzc0NDY2ODYyMDQsLTEyMi40MTUxMjY1NDMwMDEwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNiZTFlODk0YzQwZWFiNDM2M2I1NzZjN2RlMDg5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI2Y2Y5NjcwNTBkZDRkYmVhMGRmZDcwZDQwNmMyYzg3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2YyZjk0ZGJmOTEwOTQ3MzdhYzU5ZjUwMWY3NzVlY2Q5ID0gJCgnPGRpdiBpZD0iaHRtbF9mMmY5NGRiZjkxMDk0NzM3YWM1OWY1MDFmNzc1ZWNkOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yNmNmOTY3MDUwZGQ0ZGJlYTBkZmQ3MGQ0MDZjMmM4Ny5zZXRDb250ZW50KGh0bWxfZjJmOTRkYmY5MTA5NDczN2FjNTlmNTAxZjc3NWVjZDkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGY0NjZhMDRlYzU3NDY2NGE3MWNkYWI3ZGQ0MTk4NDcuYmluZFBvcHVwKHBvcHVwXzI2Y2Y5NjcwNTBkZDRkYmVhMGRmZDcwZDQwNmMyYzg3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzkzNzExNjgyNjkzYjRjOThiY2UyYTFmOTJiOWE2MTI2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzEyNzY3ODg0ODIxLC0xMjIuNDMxOTI4MDExMDg5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2JlMWU4OTRjNDBlYWI0MzYzYjU3NmM3ZGUwODkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjgxYmVkNThlZjU4NGUwODg3NjcxOTZjMWM0Y2ZhMmEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2NlZDkxOTRmM2QzNGRmN2JmMWUyNGM2NDJmNzdjOGQgPSAkKCc8ZGl2IGlkPSJodG1sX2NjZWQ5MTk0ZjNkMzRkZjdiZjFlMjRjNjQyZjc3YzhkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjgxYmVkNThlZjU4NGUwODg3NjcxOTZjMWM0Y2ZhMmEuc2V0Q29udGVudChodG1sX2NjZWQ5MTk0ZjNkMzRkZjdiZjFlMjRjNjQyZjc3YzhkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzkzNzExNjgyNjkzYjRjOThiY2UyYTFmOTJiOWE2MTI2LmJpbmRQb3B1cChwb3B1cF82ODFiZWQ1OGVmNTg0ZTA4ODc2NzE5NmMxYzRjZmEyYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zOWY5NzBiNDJkNzY0Mzg2YTRjZGUyNDBlOGYyMGM3NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4OTU3MTAyNTU4NjMsLTEyMi40MDIxNjM3MTM2MThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjYmUxZTg5NGM0MGVhYjQzNjNiNTc2YzdkZTA4OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xMjExYzk4MTQxMTI0MzkwYjVjNjVkZjA5MWRhODMxMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85MTAwYTdkNDM0ZmU0NzAwYjdjYTE1NjQxYTU2YmFjZCA9ICQoJzxkaXYgaWQ9Imh0bWxfOTEwMGE3ZDQzNGZlNDcwMGI3Y2ExNTY0MWE1NmJhY2QiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRSVU5LRU5ORVNTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xMjExYzk4MTQxMTI0MzkwYjVjNjVkZjA5MWRhODMxMy5zZXRDb250ZW50KGh0bWxfOTEwMGE3ZDQzNGZlNDcwMGI3Y2ExNTY0MWE1NmJhY2QpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzlmOTcwYjQyZDc2NDM4NmE0Y2RlMjQwZThmMjBjNzcuYmluZFBvcHVwKHBvcHVwXzEyMTFjOTgxNDExMjQzOTBiNWM2NWRmMDkxZGE4MzEzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I4ODkxZDQ3MjkxNjQwMGI5ZTJmZDcxZDU3NjI5OTYzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzMwNzQyOTE2OTU1OSwtMTIyLjQyOTMwNjcyODM3Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNiZTFlODk0YzQwZWFiNDM2M2I1NzZjN2RlMDg5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRiMzE3ZDdhNmIxMDRhMzFhOTkzNjAwZTgzNWQ0YWNkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI5ZGE1MTM0ZWNhNTQ4OWFhYjFjNzJkZDhhZGEzY2Y5ID0gJCgnPGRpdiBpZD0iaHRtbF8yOWRhNTEzNGVjYTU0ODlhYWIxYzcyZGQ4YWRhM2NmOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRiMzE3ZDdhNmIxMDRhMzFhOTkzNjAwZTgzNWQ0YWNkLnNldENvbnRlbnQoaHRtbF8yOWRhNTEzNGVjYTU0ODlhYWIxYzcyZGQ4YWRhM2NmOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iODg5MWQ0NzI5MTY0MDBiOWUyZmQ3MWQ1NzYyOTk2My5iaW5kUG9wdXAocG9wdXBfNGIzMTdkN2E2YjEwNGEzMWE5OTM2MDBlODM1ZDRhY2QpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMGUxYjAwYzc5OGU1NDM0Y2FhOTVjYmE0ZTZlNTdlZGUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODM4MzY1NTY1MzQ3OTQsLTEyMi40MTM3OTA5NzI3ODA5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNiZTFlODk0YzQwZWFiNDM2M2I1NzZjN2RlMDg5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFiOTNiNmVkNjE2ZDRkNWZiNjI0ZWFhNWYyMjM2NGNlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E2YjI5YTIyY2RmYzQ0NWU5ZGJhZGI1NjE5NDQ4NTlhID0gJCgnPGRpdiBpZD0iaHRtbF9hNmIyOWEyMmNkZmM0NDVlOWRiYWRiNTYxOTQ0ODU5YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VkFOREFMSVNNPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xYjkzYjZlZDYxNmQ0ZDVmYjYyNGVhYTVmMjIzNjRjZS5zZXRDb250ZW50KGh0bWxfYTZiMjlhMjJjZGZjNDQ1ZTlkYmFkYjU2MTk0NDg1OWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMGUxYjAwYzc5OGU1NDM0Y2FhOTVjYmE0ZTZlNTdlZGUuYmluZFBvcHVwKHBvcHVwXzFiOTNiNmVkNjE2ZDRkNWZiNjI0ZWFhNWYyMjM2NGNlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM2MmUzMmY0NDU3NTQxMTNhN2FiMmExYzkzMmZmYjhlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzMwNzQyOTE2OTU1OSwtMTIyLjQyOTMwNjcyODM3Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNiZTFlODk0YzQwZWFiNDM2M2I1NzZjN2RlMDg5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2YwNTQ5NTAwOTk0NTRjMWRhZDc3MTY0OTI4MjgwNjFmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I1NjY4NmJlZGViNjQ3MzU5M2M4ODU3OTJlZWE3OTc2ID0gJCgnPGRpdiBpZD0iaHRtbF9iNTY2ODZiZWRlYjY0NzM1OTNjODg1NzkyZWVhNzk3NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2YwNTQ5NTAwOTk0NTRjMWRhZDc3MTY0OTI4MjgwNjFmLnNldENvbnRlbnQoaHRtbF9iNTY2ODZiZWRlYjY0NzM1OTNjODg1NzkyZWVhNzk3Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zNjJlMzJmNDQ1NzU0MTEzYTdhYjJhMWM5MzJmZmI4ZS5iaW5kUG9wdXAocG9wdXBfZjA1NDk1MDA5OTQ1NGMxZGFkNzcxNjQ5MjgyODA2MWYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmE1ZTkwMGQ0NTRjNGJhMTg0MGY2MjhlZjIwMWZkNzcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MzczNjIzNjA1MjEyOTYsLTEyMi40MjIwNjcxODQ5MzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjYmUxZTg5NGM0MGVhYjQzNjNiNTc2YzdkZTA4OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82ODdlMzhhYmM3OGE0YTZlOWI5NTliN2RlNzNjYjQ1MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMTlhZGVlY2U5ZGY0ZTY5YmQ5ZGM1MjM5YTNkMTRlOCA9ICQoJzxkaXYgaWQ9Imh0bWxfZDE5YWRlZWNlOWRmNGU2OWJkOWRjNTIzOWEzZDE0ZTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNFQ09OREFSWSBDT0RFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjg3ZTM4YWJjNzhhNGE2ZTliOTU5YjdkZTczY2I0NTIuc2V0Q29udGVudChodG1sX2QxOWFkZWVjZTlkZjRlNjliZDlkYzUyMzlhM2QxNGU4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzJhNWU5MDBkNDU0YzRiYTE4NDBmNjI4ZWYyMDFmZDc3LmJpbmRQb3B1cChwb3B1cF82ODdlMzhhYmM3OGE0YTZlOWI5NTliN2RlNzNjYjQ1Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jYmUxYzFmZGI4NzE0YzBhYWU5MjM4ZjQ4NjkxOGY1NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczNzM2MjM2MDUyMTI5NiwtMTIyLjQyMjA2NzE4NDkzN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNiZTFlODk0YzQwZWFiNDM2M2I1NzZjN2RlMDg5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU3MzdjNzhkYzU3YzRhMjBhZjgzMzQxY2UxODE4N2FiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FkMjFhM2I5MjA5ZDQxOTA5ZTkxZDJkMDgxNzZjZDI4ID0gJCgnPGRpdiBpZD0iaHRtbF9hZDIxYTNiOTIwOWQ0MTkwOWU5MWQyZDA4MTc2Y2QyOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VkFOREFMSVNNPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81NzM3Yzc4ZGM1N2M0YTIwYWY4MzM0MWNlMTgxODdhYi5zZXRDb250ZW50KGh0bWxfYWQyMWEzYjkyMDlkNDE5MDllOTFkMmQwODE3NmNkMjgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2JlMWMxZmRiODcxNGMwYWFlOTIzOGY0ODY5MThmNTcuYmluZFBvcHVwKHBvcHVwXzU3MzdjNzhkYzU3YzRhMjBhZjgzMzQxY2UxODE4N2FiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdiODhmZWQzZTA5NDQ0MWM4NWFjODEyNWQ0ZTkxNzdlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg1OTk4ODMyMzc5Nzk2LC0xMjIuNDExNzQ3MzcxOTI0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2JlMWU4OTRjNDBlYWI0MzYzYjU3NmM3ZGUwODkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTM5ZTEyYjEwYzdkNGQwMDlkZTdmZWI1ODRhNzRiYjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDBiZWYyNzMxNGYwNDVjYjk0ODE3ZmI4YmU3ZDFjMTAgPSAkKCc8ZGl2IGlkPSJodG1sXzAwYmVmMjczMTRmMDQ1Y2I5NDgxN2ZiOGJlN2QxYzEwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TVVNQSUNJT1VTIE9DQzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTM5ZTEyYjEwYzdkNGQwMDlkZTdmZWI1ODRhNzRiYjcuc2V0Q29udGVudChodG1sXzAwYmVmMjczMTRmMDQ1Y2I5NDgxN2ZiOGJlN2QxYzEwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzdiODhmZWQzZTA5NDQ0MWM4NWFjODEyNWQ0ZTkxNzdlLmJpbmRQb3B1cChwb3B1cF9hMzllMTJiMTBjN2Q0ZDAwOWRlN2ZlYjU4NGE3NGJiNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kYWZhM2YyMThjZWY0NTZkYmZkOWE3OTAwNTZiOTI0NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2MzM3NTgwNTgwNTksLTEyMi40MjA0MzQ3MjQ1NTI5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNiZTFlODk0YzQwZWFiNDM2M2I1NzZjN2RlMDg5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2EzOGQzMWY4YTBlNzQwY2Q4MmI1MzA3Nzg1MTY2MzQ4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2YwYjMxYmZlYTliMzRjYzc4MTQ4ZmNjMTM0ZjgzNTJlID0gJCgnPGRpdiBpZD0iaHRtbF9mMGIzMWJmZWE5YjM0Y2M3ODE0OGZjYzEzNGY4MzUyZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EzOGQzMWY4YTBlNzQwY2Q4MmI1MzA3Nzg1MTY2MzQ4LnNldENvbnRlbnQoaHRtbF9mMGIzMWJmZWE5YjM0Y2M3ODE0OGZjYzEzNGY4MzUyZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kYWZhM2YyMThjZWY0NTZkYmZkOWE3OTAwNTZiOTI0NC5iaW5kUG9wdXAocG9wdXBfYTM4ZDMxZjhhMGU3NDBjZDgyYjUzMDc3ODUxNjYzNDgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2ZjMDUyY2ZkMmZhNDUzZWJjZmEyMTQ1ZWQxZTdmOGUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODUwMjI2NjIyNzg2LC0xMjIuNDExOTg3NjQzNTk1MDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjYmUxZTg5NGM0MGVhYjQzNjNiNTc2YzdkZTA4OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hZWEwODcyNWY4ODE0MmU4YWJkOTVjNmY5NTk3ODEzMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lYmI1OWFkMmIxNzY0N2QzYTFiMzg4YzRkMzRjMWJkYSA9ICQoJzxkaXYgaWQ9Imh0bWxfZWJiNTlhZDJiMTc2NDdkM2ExYjM4OGM0ZDM0YzFiZGEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWVhMDg3MjVmODgxNDJlOGFiZDk1YzZmOTU5NzgxMzEuc2V0Q29udGVudChodG1sX2ViYjU5YWQyYjE3NjQ3ZDNhMWIzODhjNGQzNGMxYmRhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNmYzA1MmNmZDJmYTQ1M2ViY2ZhMjE0NWVkMWU3ZjhlLmJpbmRQb3B1cChwb3B1cF9hZWEwODcyNWY4ODE0MmU4YWJkOTVjNmY5NTk3ODEzMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iNmVmNjVkOGE2NjM0MDJlYjU3Y2JjODFjOGQ4NGFiYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NDYyMDY0OTEwNjQ5NSwtMTIyLjUwMDM4MDQyNzkxNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNiZTFlODk0YzQwZWFiNDM2M2I1NzZjN2RlMDg5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzlmOTVlMjI1MjE3ZDRlNjBiZDcwODUyMWZiYzAzZDJjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2IxYTI3MjI4YTYxYTQwZjM5MWI2NGU0Y2Q1MGE0NGUyID0gJCgnPGRpdiBpZD0iaHRtbF9iMWEyNzIyOGE2MWE0MGYzOTFiNjRlNGNkNTBhNDRlMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzlmOTVlMjI1MjE3ZDRlNjBiZDcwODUyMWZiYzAzZDJjLnNldENvbnRlbnQoaHRtbF9iMWEyNzIyOGE2MWE0MGYzOTFiNjRlNGNkNTBhNDRlMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iNmVmNjVkOGE2NjM0MDJlYjU3Y2JjODFjOGQ4NGFiYy5iaW5kUG9wdXAocG9wdXBfOWY5NWUyMjUyMTdkNGU2MGJkNzA4NTIxZmJjMDNkMmMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjZiNDYwYmJjZmMwNDQ2MzgyMjM1ZDM2MWU3MDBlNTUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzUxOTE4MjY3MjE3LC0xMjIuNDY2NTU4NzgwNjgzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2JlMWU4OTRjNDBlYWI0MzYzYjU3NmM3ZGUwODkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGE5NTMzYTc0Y2JjNGY0OGI5Zjk0Nzc2MDkwMjI4ZWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGEzMWNiNWQxNjE3NDc0NmIzNTY4ZWE1NTVkYWVhNTUgPSAkKCc8ZGl2IGlkPSJodG1sXzRhMzFjYjVkMTYxNzQ3NDZiMzU2OGVhNTU1ZGFlYTU1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5ST0JCRVJZPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kYTk1MzNhNzRjYmM0ZjQ4YjlmOTQ3NzYwOTAyMjhlYy5zZXRDb250ZW50KGh0bWxfNGEzMWNiNWQxNjE3NDc0NmIzNTY4ZWE1NTVkYWVhNTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjZiNDYwYmJjZmMwNDQ2MzgyMjM1ZDM2MWU3MDBlNTUuYmluZFBvcHVwKHBvcHVwX2RhOTUzM2E3NGNiYzRmNDhiOWY5NDc3NjA5MDIyOGVjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E0ZDIwYTFhY2RiYTRhZTZhODAzMTA1YzBjZjMyMmNkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzQ5MDg0MTcyOTAyOCwtMTIyLjQ4NjkyNTk2MDExNDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2JlMWU4OTRjNDBlYWI0MzYzYjU3NmM3ZGUwODkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODkwYjRjOGRiOGZkNDgwZDgzOWY0YTcxOGYzMzcyNTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2I1NjM3YTI4YzUxNDBlYzhmZWM0ZmFhNTlhYzI5MzUgPSAkKCc8ZGl2IGlkPSJodG1sX2NiNTYzN2EyOGM1MTQwZWM4ZmVjNGZhYTU5YWMyOTM1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODkwYjRjOGRiOGZkNDgwZDgzOWY0YTcxOGYzMzcyNTMuc2V0Q29udGVudChodG1sX2NiNTYzN2EyOGM1MTQwZWM4ZmVjNGZhYTU5YWMyOTM1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2E0ZDIwYTFhY2RiYTRhZTZhODAzMTA1YzBjZjMyMmNkLmJpbmRQb3B1cChwb3B1cF84OTBiNGM4ZGI4ZmQ0ODBkODM5ZjRhNzE4ZjMzNzI1Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xNzFiNTVkNGI3MTA0MjE1YTAwN2JmMGZhYWNmMmY4NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2ODUzNjAxMjM1ODMsLTEyMi40MTU2MTYzMzgzMTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNiZTFlODk0YzQwZWFiNDM2M2I1NzZjN2RlMDg5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2IyOWJkZWJjNDAzYjQ1NzJiYzA2ZTg0NWQ5MmRiZmZkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E0MzQ4YTFlZmNiZTQ1NjQ5YmRmMjZkOTc2ZDAzMWY2ID0gJCgnPGRpdiBpZD0iaHRtbF9hNDM0OGExZWZjYmU0NTY0OWJkZjI2ZDk3NmQwMzFmNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iMjliZGViYzQwM2I0NTcyYmMwNmU4NDVkOTJkYmZmZC5zZXRDb250ZW50KGh0bWxfYTQzNDhhMWVmY2JlNDU2NDliZGYyNmQ5NzZkMDMxZjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTcxYjU1ZDRiNzEwNDIxNWEwMDdiZjBmYWFjZjJmODcuYmluZFBvcHVwKHBvcHVwX2IyOWJkZWJjNDAzYjQ1NzJiYzA2ZTg0NWQ5MmRiZmZkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE2OTA2NGNhNjM5YTRjZmY4MjBlZDA3MmE5MTNjZWQ1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY0NDI5NzcxNDA3NCwtMTIyLjQ0OTc1MTY1MjU2M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNiZTFlODk0YzQwZWFiNDM2M2I1NzZjN2RlMDg5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg3MjVhZjBjMTQ2OTQ2NTZhNDM1NDI5ZjBlZWJkMzUzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNlZjExZDZmMjE2NzQyZGI4NjkyMTU4ZGExYjlmNzRkID0gJCgnPGRpdiBpZD0iaHRtbF8zZWYxMWQ2ZjIxNjc0MmRiODY5MjE1OGRhMWI5Zjc0ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QlVSR0xBUlk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg3MjVhZjBjMTQ2OTQ2NTZhNDM1NDI5ZjBlZWJkMzUzLnNldENvbnRlbnQoaHRtbF8zZWYxMWQ2ZjIxNjc0MmRiODY5MjE1OGRhMWI5Zjc0ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xNjkwNjRjYTYzOWE0Y2ZmODIwZWQwNzJhOTEzY2VkNS5iaW5kUG9wdXAocG9wdXBfODcyNWFmMGMxNDY5NDY1NmE0MzU0MjlmMGVlYmQzNTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjg2YTk4MDFjYWZlNDdmM2FjNzA3YTcyYWYzYzRmMDAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjQ0Mjk3NzE0MDc0LC0xMjIuNDQ5NzUxNjUyNTYzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2JlMWU4OTRjNDBlYWI0MzYzYjU3NmM3ZGUwODkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2NhNjhhMzdiY2E2NDg0MmEyZWJlNGE4NDA0ZjdmN2YgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmZlNThkODBhNjE1NDU3Yzk5MDkxMjEwNjQxYThkNDMgPSAkKCc8ZGl2IGlkPSJodG1sX2ZmZTU4ZDgwYTYxNTQ1N2M5OTA5MTIxMDY0MWE4ZDQzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MQVJDRU5ZL1RIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zY2E2OGEzN2JjYTY0ODQyYTJlYmU0YTg0MDRmN2Y3Zi5zZXRDb250ZW50KGh0bWxfZmZlNThkODBhNjE1NDU3Yzk5MDkxMjEwNjQxYThkNDMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjg2YTk4MDFjYWZlNDdmM2FjNzA3YTcyYWYzYzRmMDAuYmluZFBvcHVwKHBvcHVwXzNjYTY4YTM3YmNhNjQ4NDJhMmViZTRhODQwNGY3ZjdmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I3YWUzZGIxY2RjMDQ2OWVhNzUxYTA2ZWJiYmMyZWUwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzM1MjY4MTQ2OTA4Mzk2LC0xMjIuNDcyNzE1NzU5NjMxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2JlMWU4OTRjNDBlYWI0MzYzYjU3NmM3ZGUwODkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjg1MjQyN2Q0ZDlhNGZlNzkwY2VhZmZmYmY4OGVlMTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDM3ZGFkZGQ2NDRjNDdhYTk5MWNmNDcyNGQ3N2M4YWMgPSAkKCc8ZGl2IGlkPSJodG1sXzQzN2RhZGRkNjQ0YzQ3YWE5OTFjZjQ3MjRkNzdjOGFjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MQVJDRU5ZL1RIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ODUyNDI3ZDRkOWE0ZmU3OTBjZWFmZmZiZjg4ZWUxOS5zZXRDb250ZW50KGh0bWxfNDM3ZGFkZGQ2NDRjNDdhYTk5MWNmNDcyNGQ3N2M4YWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjdhZTNkYjFjZGMwNDY5ZWE3NTFhMDZlYmJiYzJlZTAuYmluZFBvcHVwKHBvcHVwXzY4NTI0MjdkNGQ5YTRmZTc5MGNlYWZmZmJmODhlZTE5KTsKCiAgICAgICAgICAgIAogICAgICAgIAo8L3NjcmlwdD4= 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 0x7ff4ed505ef0>"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# create map and display it\n",
"sanfran_map = folium.Map(location=[latitude, longitude], zoom_start=12)\n",
"\n",
"# loop through the 100 crimes and add each to the map\n",
"for lat, lng, label in zip(df_incidents.Y, df_incidents.X, df_incidents.Category):\n",
" folium.features.CircleMarker(\n",
" [lat, lng],\n",
" radius=5, # define how big you want the circle markers to be\n",
" color='yellow',\n",
" fill=True,\n",
" popup=label,\n",
" fill_color='blue',\n",
" fill_opacity=0.6\n",
" ).add_to(sanfran_map)\n",
"\n",
"# show map\n",
"sanfran_map"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"The other proper remedy is to group the markers into different clusters. Each cluster is then represented by the number of crimes in each neighborhood. These clusters can be thought of as pockets of San Francisco which you can then analyze separately.\n",
"\n",
"To implement this, we start off by instantiating a *MarkerCluster* object and adding all the data points in the dataframe to this object."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"jupyter": {
"outputs_hidden": false
},
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"from folium import plugins\n",
"\n",
"# let's start again with a clean copy of the map of San Francisco\n",
"sanfran_map = folium.Map(location = [latitude, longitude], zoom_start = 12)\n",
"\n",
"# instantiate a mark cluster object for the incidents in the dataframe\n",
"incidents = plugins.MarkerCluster().add_to(sanfran_map)\n",
"\n",
"# loop through the dataframe and add each data point to the mark cluster\n",
"for lat, lng, label, in zip(df_incidents.Y, df_incidents.X, df_incidents.Category):\n",
" folium.Marker(\n",
" location=[lat, lng],\n",
" icon=None,\n",
" popup=label,\n",
" ).add_to(incidents)\n",
"\n",
"# display map\n",
"sanfran_map"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Notice how when you zoom out all the way, all markers are grouped into one cluster, *the global cluster*, of 100 markers or crimes, which is the total number of crimes in our dataframe. Once you start zooming in, the *global cluster* will start breaking up into smaller clusters. Zooming in all the way will result in individual markers."
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"# Choropleth Maps <a id=\"8\"></a>\n",
"\n",
"A `Choropleth` map is a thematic map in which areas are shaded or patterned in proportion to the measurement of the statistical variable being displayed on the map, such as population density or per-capita income. The choropleth map provides an easy way to visualize how a measurement varies across a geographic area or it shows the level of variability within a region. Below is a `Choropleth` map of the US depicting the population by square mile per state.\n",
"\n",
"<img src = \"https://s3-api.us-geo.objectstorage.softlayer.net/cf-courses-data/CognitiveClass/DV0101EN/labs/Images/2000_census_population_density_map_by_state.png\" width = 600> "
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Now, let's create our own `Choropleth` map of the world depicting immigration from various countries to Canada.\n",
"\n",
"Let's first download and import our primary Canadian immigration dataset using *pandas* `read_excel()` method. Normally, before we can do that, we would need to download a module which *pandas* requires to read in excel files. This module is **xlrd**. For your convenience, we have pre-installed this module, so you would not have to worry about that. Otherwise, you would need to run the following line of code to install the **xlrd** module:\n",
"```\n",
"!conda install -c anaconda xlrd --yes\n",
"```"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Download the dataset and read it into a *pandas* dataframe:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"jupyter": {
"outputs_hidden": false
},
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"df_can = pd.read_excel('https://s3-api.us-geo.objectstorage.softlayer.net/cf-courses-data/CognitiveClass/DV0101EN/labs/Data_Files/Canada.xlsx',\n",
" sheet_name='Canada by Citizenship',\n",
" skiprows=range(20),\n",
" skipfooter=2)\n",
"\n",
"print('Data downloaded and read into a dataframe!')"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Let's take a look at the first five items in our dataset."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"jupyter": {
"outputs_hidden": false
},
"new_sheet": false,
"run_control": {
"read_only": false
},
"scrolled": true
},
"outputs": [],
"source": [
"df_can.head()"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Let's find out how many entries there are in our dataset."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"jupyter": {
"outputs_hidden": false
},
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"# print the dimensions of the dataframe\n",
"print(df_can.shape)"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Clean up data. We will make some modifications to the original dataset to make it easier to create our visualizations. Refer to *Introduction to Matplotlib and Line Plots* and *Area Plots, Histograms, and Bar Plots* notebooks for a detailed description of this preprocessing."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"jupyter": {
"outputs_hidden": false
},
"new_sheet": false,
"run_control": {
"read_only": false
},
"scrolled": true
},
"outputs": [],
"source": [
"# clean up the dataset to remove unnecessary columns (eg. REG) \n",
"df_can.drop(['AREA','REG','DEV','Type','Coverage'], axis=1, inplace=True)\n",
"\n",
"# let's rename the columns so that they make sense\n",
"df_can.rename(columns={'OdName':'Country', 'AreaName':'Continent','RegName':'Region'}, inplace=True)\n",
"\n",
"# for sake of consistency, let's also make all column labels of type string\n",
"df_can.columns = list(map(str, df_can.columns))\n",
"\n",
"# add total column\n",
"df_can['Total'] = df_can.sum(axis=1)\n",
"\n",
"# years that we will be using in this lesson - useful for plotting later on\n",
"years = list(map(str, range(1980, 2014)))\n",
"print ('data dimensions:', df_can.shape)"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Let's take a look at the first five items of our cleaned dataframe."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"jupyter": {
"outputs_hidden": false
},
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"df_can.head()"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"In order to create a `Choropleth` map, we need a GeoJSON file that defines the areas/boundaries of the state, county, or country that we are interested in. In our case, since we are endeavoring to create a world map, we want a GeoJSON that defines the boundaries of all world countries. For your convenience, we will be providing you with this file, so let's go ahead and download it. Let's name it **world_countries.json**."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"jupyter": {
"outputs_hidden": false
},
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"# download countries geojson file\n",
"!wget --quiet https://s3-api.us-geo.objectstorage.softlayer.net/cf-courses-data/CognitiveClass/DV0101EN/labs/Data_Files/world_countries.json -O world_countries.json\n",
" \n",
"print('GeoJSON file downloaded!')"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Now that we have the GeoJSON file, let's create a world map, centered around **[0, 0]** *latitude* and *longitude* values, with an intial zoom level of 2, and using *Mapbox Bright* style."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"jupyter": {
"outputs_hidden": false
},
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"world_geo = r'world_countries.json' # geojson file\n",
"\n",
"# create a plain world map\n",
"world_map = folium.Map(location=[0, 0], zoom_start=2, tiles='Mapbox Bright')"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"And now to create a `Choropleth` map, we will use the *choropleth* method with the following main parameters:\n",
"\n",
"1. geo_data, which is the GeoJSON file.\n",
"2. data, which is the dataframe containing the data.\n",
"3. columns, which represents the columns in the dataframe that will be used to create the `Choropleth` map.\n",
"4. key_on, which is the key or variable in the GeoJSON file that contains the name of the variable of interest. To determine that, you will need to open the GeoJSON file using any text editor and note the name of the key or variable that contains the name of the countries, since the countries are our variable of interest. In this case, **name** is the key in the GeoJSON file that contains the name of the countries. Note that this key is case_sensitive, so you need to pass exactly as it exists in the GeoJSON file."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"button": false,
"collapsed": true,
"deletable": true,
"jupyter": {
"outputs_hidden": true
},
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"# generate choropleth map using the total immigration of each country to Canada from 1980 to 2013\n",
"world_map.choropleth(\n",
" geo_data=world_geo,\n",
" data=df_can,\n",
" columns=['Country', 'Total'],\n",
" key_on='feature.properties.name',\n",
" fill_color='YlOrRd', \n",
" fill_opacity=0.7, \n",
" line_opacity=0.2,\n",
" legend_name='Immigration to Canada'\n",
")\n",
"\n",
"# display map\n",
"world_map"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"As per our `Choropleth` map legend, the darker the color of a country and the closer the color to red, the higher the number of immigrants from that country. Accordingly, the highest immigration over the course of 33 years (from 1980 to 2013) was from China, India, and the Philippines, followed by Poland, Pakistan, and interestingly, the US."
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Notice how the legend is displaying a negative boundary or threshold. Let's fix that by defining our own thresholds and starting with 0 instead of -6,918!"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"jupyter": {
"outputs_hidden": false
},
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"world_geo = r'world_countries.json'\n",
"\n",
"# create a numpy array of length 6 and has linear spacing from the minium total immigration to the maximum total immigration\n",
"threshold_scale = np.linspace(df_can['Total'].min(),\n",
" df_can['Total'].max(),\n",
" 6, dtype=int)\n",
"threshold_scale = threshold_scale.tolist() # change the numpy array to a list\n",
"threshold_scale[-1] = threshold_scale[-1] + 1 # make sure that the last value of the list is greater than the maximum immigration\n",
"\n",
"# let Folium determine the scale.\n",
"world_map = folium.Map(location=[0, 0], zoom_start=2, tiles='Mapbox Bright')\n",
"world_map.choropleth(\n",
" geo_data=world_geo,\n",
" data=df_can,\n",
" columns=['Country', 'Total'],\n",
" key_on='feature.properties.name',\n",
" threshold_scale=threshold_scale,\n",
" fill_color='YlOrRd', \n",
" fill_opacity=0.7, \n",
" line_opacity=0.2,\n",
" legend_name='Immigration to Canada',\n",
" reset=True\n",
")\n",
"world_map"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Much better now! Feel free to play around with the data and perhaps create `Choropleth` maps for individuals years, or perhaps decades, and see how they compare with the entire period from 1980 to 2013."
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"### Thank you for completing this lab!\n",
"\n",
"This notebook was created by [Alex Aklson](https://www.linkedin.com/in/aklson/). I hope you found this lab interesting and educational. Feel free to contact me if you have any questions!"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"This notebook is part of a course on **Coursera** called *Data Visualization with Python*. If you accessed this notebook outside the course, you can take this course online by clicking [here](http://cocl.us/DV0101EN_Coursera_Week3_LAB2)."
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"<hr>\n",
"\n",
"Copyright &copy; 2019 [Cognitive Class](https://cognitiveclass.ai/?utm_source=bducopyrightlink&utm_medium=dswb&utm_campaign=bdu). This notebook and its source code are released under the terms of the [MIT License](https://bigdatauniversity.com/mit-license/)."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python",
"language": "python",
"name": "conda-env-python-py"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.11"
},
"widgets": {
"state": {},
"version": "1.1.2"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment