Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/illinker-test-assets.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLarry Ewing <lewing@microsoft.com>2019-03-09 22:59:12 +0300
committerLarry Ewing <lewing@microsoft.com>2019-03-09 23:00:48 +0300
commit0210ce4ddb1ba21cb01b16981cdde9f87bb0dce8 (patch)
tree97ed6732a827300a4ac71fa2d3792173b5f18787
parentb4d665157054d1a8f03d9f0f749fbfe5c4493f04 (diff)
Add blazor E2E test assets
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/App.cshtml1
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/BenchmarkEvent.cs17
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/Microsoft.AspNetCore.Blazor.E2EPerformance.csproj11
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/Pages/Index.cshtml11
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/Pages/Json.cshtml98
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/Pages/RenderList.cshtml75
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/Pages/_ViewImports.cshtml1
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/Program.cs19
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/Shared/MainLayout.cshtml13
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/Startup.cs20
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/_ViewImports.cshtml6
-rwxr-xr-xwasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Blazor.Buildbin0 -> 184048 bytes
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Blazor.E2EPerformance.blazor.configbin0 -> 518 bytes
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Blazor.E2EPerformance.dllbin0 -> 19968 bytes
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Blazor.E2EPerformance.pdbbin0 -> 13168 bytes
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Blazor.dllbin0 -> 30720 bytes
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Blazor.pdbbin0 -> 9480 bytes
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Components.Browser.dllbin0 -> 10752 bytes
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Components.Browser.pdbbin0 -> 2248 bytes
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Components.Browser.xml68
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Components.dllbin0 -> 171520 bytes
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Components.pdbbin0 -> 71992 bytes
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Components.xml4530
-rwxr-xr-xwasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dllbin0 -> 37968 bytes
-rwxr-xr-xwasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.Extensions.DependencyInjection.dllbin0 -> 63568 bytes
-rwxr-xr-xwasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.JSInterop.dllbin0 -> 50768 bytes
-rwxr-xr-xwasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Mono.WebAssembly.Interop.dllbin0 -> 15952 bytes
-rwxr-xr-xwasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/System.ComponentModel.Annotations.dllbin0 -> 79432 bytes
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Blazor.E2EPerformance.dllbin0 -> 19456 bytes
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Blazor.E2EPerformance.pdbbin0 -> 5820 bytes
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Blazor.dllbin0 -> 30208 bytes
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Blazor.pdbbin0 -> 8960 bytes
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Components.Browser.dllbin0 -> 10752 bytes
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Components.Browser.pdbbin0 -> 1836 bytes
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Components.dllbin0 -> 169984 bytes
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Components.pdbbin0 -> 70964 bytes
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.Extensions.DependencyInjection.Abstractions.dllbin0 -> 28160 bytes
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.Extensions.DependencyInjection.dllbin0 -> 53760 bytes
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.JSInterop.dllbin0 -> 40960 bytes
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Mono.WebAssembly.Interop.dllbin0 -> 6144 bytes
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/System.ComponentModel.Annotations.dllbin0 -> 70144 bytes
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/System.Core.dllbin0 -> 333824 bytes
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/System.Net.Http.dllbin0 -> 68096 bytes
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/System.dllbin0 -> 266752 bytes
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/mscorlib.dllbin0 -> 1984512 bytes
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/blazor.boot.json1
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/components.server.js13562
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/components.webassembly.js2332
-rwxr-xr-xwasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/wasm/mono.js4
-rwxr-xr-xwasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/wasm/mono.wasmbin0 -> 1953399 bytes
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/appStartup.js15
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/index.js6
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/jsonHandling.js57
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/jsonHandlingData.js2
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/lib/bootstrap.min.css7
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/lib/minibench/README.md17
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/lib/minibench/minibench.js486
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/lib/minibench/style.css19
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/renderList.js45
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/util/BenchmarkEvents.js21
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/util/BlazorApp.js25
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/util/DOM.js7
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/blazor-frame.html24
-rw-r--r--wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/index.html17
-rw-r--r--wasm/wasm.sln14
65 files changed, 21531 insertions, 0 deletions
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/App.cshtml b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/App.cshtml
new file mode 100644
index 0000000..7f4cf93
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/App.cshtml
@@ -0,0 +1 @@
+<Router AppAssembly=typeof(Program).Assembly />
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/BenchmarkEvent.cs b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/BenchmarkEvent.cs
new file mode 100644
index 0000000..bdf98fd
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/BenchmarkEvent.cs
@@ -0,0 +1,17 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using Microsoft.JSInterop;
+
+namespace Microsoft.AspNetCore.Blazor.E2EPerformance
+{
+ public static class BenchmarkEvent
+ {
+ public static void Send(IJSRuntime jsRuntime, string name)
+ {
+ ((IJSInProcessRuntime)jsRuntime).Invoke<object>(
+ "receiveBenchmarkEvent",
+ name);
+ }
+ }
+}
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/Microsoft.AspNetCore.Blazor.E2EPerformance.csproj b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/Microsoft.AspNetCore.Blazor.E2EPerformance.csproj
new file mode 100644
index 0000000..a488d15
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/Microsoft.AspNetCore.Blazor.E2EPerformance.csproj
@@ -0,0 +1,11 @@
+<Project Sdk="Microsoft.NET.Sdk.Web">
+
+ <PropertyGroup>
+ <TargetFramework>netstandard2.0</TargetFramework>
+ <ReferenceBlazorBuildLocally>true</ReferenceBlazorBuildLocally>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <Reference Include="Microsoft.AspNetCore.Blazor" />
+ </ItemGroup>
+</Project>
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/Pages/Index.cshtml b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/Pages/Index.cshtml
new file mode 100644
index 0000000..870c79b
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/Pages/Index.cshtml
@@ -0,0 +1,11 @@
+@page "/"
+@inject IJSRuntime JSRuntime
+
+Hello, world!
+
+@functions {
+ protected override void OnAfterRender()
+ {
+ BenchmarkEvent.Send(JSRuntime, "Rendered index.cshtml");
+ }
+}
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/Pages/Json.cshtml b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/Pages/Json.cshtml
new file mode 100644
index 0000000..9deb601
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/Pages/Json.cshtml
@@ -0,0 +1,98 @@
+@page "/json"
+@inject IJSRuntime JSRuntime
+
+<h2>JSON performance</h2>
+
+<p><button id="reset-all" onclick=@Reset>Reset</button></p>
+
+<button id="serialize-small" onclick=@SerializeSmall>Serialize (small)</button>
+<button id="serialize-large" onclick=@SerializeLarge>Serialize (large)</button>
+
+<p><pre style="border: 1px solid black; overflow: scroll;">@serializedValue</pre></p>
+@if (serializedValue != null)
+{
+ <p>Serialized length: <strong id="serialized-length">@serializedValue.Length</strong> chars</p>
+}
+
+<button id="deserialize-small" onclick=@DeserializeSmall>Deserialize (small)</button>
+<button id="deserialize-large" onclick=@DeserializeLarge>Deserialize (large)</button>
+
+@if (numPeopleDeserialized > 0)
+{
+ <p>Deserialized <strong id="deserialized-count">@numPeopleDeserialized</strong> people</p>
+}
+
+@functions {
+ static string[] Clearances = new[] { "Alpha", "Beta", "Gamma", "Delta", "Epsilon" };
+ Person smallOrgChart = GenerateOrgChart(1, 4);
+ Person largeOrgChart = GenerateOrgChart(5, 4);
+ string smallOrgChartJson;
+ string largeOrgChartJson;
+ int numPeopleDeserialized;
+
+ protected override void OnInit()
+ {
+ smallOrgChartJson = Microsoft.JSInterop.Json.Serialize(smallOrgChart);
+ largeOrgChartJson = Microsoft.JSInterop.Json.Serialize(largeOrgChart);
+ }
+
+ protected override void OnAfterRender()
+ {
+ BenchmarkEvent.Send(JSRuntime, "Finished JSON processing");
+ }
+
+ string serializedValue;
+
+ void Reset()
+ {
+ serializedValue = null;
+ numPeopleDeserialized = 0;
+ }
+
+ void SerializeSmall()
+ => serializedValue = Microsoft.JSInterop.Json.Serialize(smallOrgChart);
+
+ void SerializeLarge()
+ => serializedValue = Microsoft.JSInterop.Json.Serialize(largeOrgChart);
+
+ void DeserializeSmall()
+ => numPeopleDeserialized = Deserialize(smallOrgChartJson);
+
+ void DeserializeLarge()
+ => numPeopleDeserialized = Deserialize(largeOrgChartJson);
+
+ static Person GenerateOrgChart(int totalDepth, int numDescendantsPerNode, int thisDepth = 0, string namePrefix = null, int siblingIndex = 0)
+ {
+ var name = $"{namePrefix ?? "CEO"} - Subordinate {siblingIndex}";
+ var rng = new Random(0);
+ return new Person
+ {
+ Name = name,
+ IsAdmin = siblingIndex % 2 == 0,
+ Salary = 10000000 / (thisDepth + 1),
+ SecurityClearances = Clearances
+ .ToDictionary(c => c, _ => (object)(rng.Next(0, 2) == 0)),
+ Subordinates = Enumerable.Range(0, thisDepth < totalDepth ? numDescendantsPerNode : 0)
+ .Select(index => GenerateOrgChart(totalDepth, numDescendantsPerNode, thisDepth + 1, name, index))
+ .ToList()
+ };
+ }
+
+ static int Deserialize(string json)
+ {
+ var ceo = Microsoft.JSInterop.Json.Deserialize<Person>(json);
+ return CountPeople(ceo);
+ }
+
+ static int CountPeople(Person root)
+ => 1 + (root.Subordinates?.Sum(CountPeople) ?? 0);
+
+ class Person
+ {
+ public string Name { get; set; }
+ public int Salary { get; set; }
+ public bool IsAdmin { get; set; }
+ public List<Person> Subordinates { get; set; }
+ public Dictionary<string, object> SecurityClearances { get; set; }
+ }
+}
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/Pages/RenderList.cshtml b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/Pages/RenderList.cshtml
new file mode 100644
index 0000000..0a9ad97
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/Pages/RenderList.cshtml
@@ -0,0 +1,75 @@
+@page "/renderlist"
+@inject IJSRuntime JSRuntime
+
+<h2>Render List</h2>
+
+Number of items: <input id="num-items" type="number" bind=@numItems />
+<button id="show-list" onclick=@Show>Show</button>
+<button id="hide-list" onclick=@Hide>Hide</button>
+
+@if (show)
+{
+ <table class='table'>
+ <thead>
+ <tr>
+ <th>Date</th>
+ <th>Temp. (C)</th>
+ <th>Temp. (F)</th>
+ <th>Summary</th>
+ </tr>
+ </thead>
+ <tbody>
+ @foreach (var forecast in GenerateForecasts(numItems))
+ {
+ <tr>
+ <td>@forecast.DateFormatted</td>
+ <td>@forecast.TemperatureC</td>
+ <td>@forecast.TemperatureF</td>
+ <td>@forecast.Summary</td>
+ </tr>
+ }
+ </tbody>
+ </table>
+}
+
+@functions {
+ int numItems = 10;
+ bool show = false;
+
+ void Hide()
+ {
+ show = false;
+ }
+
+ void Show()
+ {
+ show = true;
+ }
+
+ protected override void OnAfterRender()
+ {
+ BenchmarkEvent.Send(JSRuntime, "Finished rendering list");
+ }
+
+ static IEnumerable<WeatherForecast> GenerateForecasts(int count)
+ {
+ for (var i = 0; i < count; i++)
+ {
+ yield return new WeatherForecast
+ {
+ DateFormatted = DateTime.Now.AddDays(i).ToShortDateString(),
+ TemperatureC = i % 100,
+ TemperatureF = (int)((i % 100) * 1.8) + 32,
+ Summary = $"Item {i}",
+ };
+ }
+ }
+
+ class WeatherForecast
+ {
+ public string DateFormatted { get; set; }
+ public int TemperatureC { get; set; }
+ public int TemperatureF { get; set; }
+ public string Summary { get; set; }
+ }
+}
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/Pages/_ViewImports.cshtml b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/Pages/_ViewImports.cshtml
new file mode 100644
index 0000000..0f24eda
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/Pages/_ViewImports.cshtml
@@ -0,0 +1 @@
+@layout MainLayout
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/Program.cs b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/Program.cs
new file mode 100644
index 0000000..f498eb0
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/Program.cs
@@ -0,0 +1,19 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using Microsoft.AspNetCore.Blazor.Hosting;
+
+namespace Microsoft.AspNetCore.Blazor.E2EPerformance
+{
+ public class Program
+ {
+ public static void Main(string[] args)
+ {
+ CreateHostBuilder(args).Build().Run();
+ }
+
+ public static IWebAssemblyHostBuilder CreateHostBuilder(string[] args) =>
+ BlazorWebAssemblyHost.CreateDefaultBuilder()
+ .UseBlazorStartup<Startup>();
+ }
+}
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/Shared/MainLayout.cshtml b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/Shared/MainLayout.cshtml
new file mode 100644
index 0000000..259daf4
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/Shared/MainLayout.cshtml
@@ -0,0 +1,13 @@
+@inherits LayoutComponentBase
+
+<h1>E2E Performance</h1>
+
+<a href="">Home</a> |
+<a href="renderlist">RenderList</a> |
+<a href="json">JSON</a>
+
+<hr/>
+
+<div>
+ @Body
+</div>
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/Startup.cs b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/Startup.cs
new file mode 100644
index 0000000..7422cd8
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/Startup.cs
@@ -0,0 +1,20 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using Microsoft.AspNetCore.Components.Builder;
+using Microsoft.Extensions.DependencyInjection;
+
+namespace Microsoft.AspNetCore.Blazor.E2EPerformance
+{
+ public class Startup
+ {
+ public void ConfigureServices(IServiceCollection services)
+ {
+ }
+
+ public void Configure(IComponentsApplicationBuilder app)
+ {
+ app.AddComponent<App>("app");
+ }
+ }
+}
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/_ViewImports.cshtml b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/_ViewImports.cshtml
new file mode 100644
index 0000000..aaba22f
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/_ViewImports.cshtml
@@ -0,0 +1,6 @@
+@using System.Net.Http
+@using Microsoft.AspNetCore.Components.Layouts
+@using Microsoft.AspNetCore.Components.Routing
+@using Microsoft.JSInterop
+@using Microsoft.AspNetCore.Blazor.E2EPerformance
+@using Microsoft.AspNetCore.Blazor.E2EPerformance.Shared
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Blazor.Build b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Blazor.Build
new file mode 100755
index 0000000..5c5aef1
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Blazor.Build
Binary files differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Blazor.E2EPerformance.blazor.config b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Blazor.E2EPerformance.blazor.config
new file mode 100644
index 0000000..92f028a
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Blazor.E2EPerformance.blazor.config
Binary files differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Blazor.E2EPerformance.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Blazor.E2EPerformance.dll
new file mode 100644
index 0000000..a46b8aa
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Blazor.E2EPerformance.dll
Binary files differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Blazor.E2EPerformance.pdb b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Blazor.E2EPerformance.pdb
new file mode 100644
index 0000000..c53d541
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Blazor.E2EPerformance.pdb
Binary files differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Blazor.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Blazor.dll
new file mode 100644
index 0000000..e9120e7
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Blazor.dll
Binary files differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Blazor.pdb b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Blazor.pdb
new file mode 100644
index 0000000..d16331b
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Blazor.pdb
Binary files differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Components.Browser.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Components.Browser.dll
new file mode 100644
index 0000000..73f7d6f
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Components.Browser.dll
Binary files differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Components.Browser.pdb b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Components.Browser.pdb
new file mode 100644
index 0000000..d06f033
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Components.Browser.pdb
Binary files differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Components.Browser.xml b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Components.Browser.xml
new file mode 100644
index 0000000..a29c7c4
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Components.Browser.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0"?>
+<doc>
+ <assembly>
+ <name>Microsoft.AspNetCore.Components.Browser</name>
+ </assembly>
+ <members>
+ <member name="T:Microsoft.AspNetCore.Components.Browser.RendererRegistry">
+ <summary>
+ Framework infrastructure, not intended to be used by application code.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Browser.RendererRegistry.Current">
+ <summary>
+ Framework infrastructure, not intended to be used by application code.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Browser.RendererRegistry.SetCurrentRendererRegistry(Microsoft.AspNetCore.Components.Browser.RendererRegistry)">
+ <summary>
+ Framework infrastructure, not intended by used by application code.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Browser.RendererRegistry.Add(Microsoft.AspNetCore.Components.Rendering.Renderer)">
+ <summary>
+ Framework infrastructure, not intended by used by application code.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Browser.RendererRegistry.Find(System.Int32)">
+ <summary>
+ Framework infrastructure, not intended by used by application code.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Browser.RendererRegistry.TryRemove(System.Int32)">
+ <summary>
+ Framework infrastructure, not intended by used by application code.
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.Browser.RendererRegistryEventDispatcher">
+ <summary>
+ Provides mechanisms for dispatching events to components in a <see cref="T:Microsoft.AspNetCore.Components.Rendering.Renderer"/>.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Browser.RendererRegistryEventDispatcher.DispatchEvent(Microsoft.AspNetCore.Components.Browser.RendererRegistryEventDispatcher.BrowserEventDescriptor,System.String)">
+ <summary>
+ For framework use only.
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.Browser.RendererRegistryEventDispatcher.BrowserEventDescriptor">
+ <summary>
+ For framework use only.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Browser.RendererRegistryEventDispatcher.BrowserEventDescriptor.BrowserRendererId">
+ <summary>
+ For framework use only.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Browser.RendererRegistryEventDispatcher.BrowserEventDescriptor.EventHandlerId">
+ <summary>
+ For framework use only.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Browser.RendererRegistryEventDispatcher.BrowserEventDescriptor.EventArgsType">
+ <summary>
+ For framework use only.
+ </summary>
+ </member>
+ </members>
+</doc>
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Components.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Components.dll
new file mode 100644
index 0000000..0a67d89
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Components.dll
Binary files differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Components.pdb b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Components.pdb
new file mode 100644
index 0000000..8b13f2f
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Components.pdb
Binary files differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Components.xml b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Components.xml
new file mode 100644
index 0000000..b9e4735
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Components.xml
@@ -0,0 +1,4530 @@
+<?xml version="1.0"?>
+<doc>
+ <assembly>
+ <name>Microsoft.AspNetCore.Components</name>
+ </assembly>
+ <members>
+ <member name="T:Microsoft.AspNetCore.Components.BindAttributes">
+ <summary>
+ Infrastructure for the discovery of <c>bind</c> attributes for markup elements.
+ </summary>
+ <remarks>
+ To extend the set of <c>bind</c> attributes, define a public class named
+ <c>BindAttributes</c> and annotate it with the appropriate attributes.
+ </remarks>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.BindElementAttribute">
+ <summary>
+ Configures options for binding specific element types.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.BindElementAttribute.#ctor(System.String,System.String,System.String,System.String)">
+ <summary>
+ Constructs an instance of <see cref="T:Microsoft.AspNetCore.Components.BindElementAttribute"/>.
+ </summary>
+ <param name="element">The tag name of the element.</param>
+ <param name="suffix">The suffix value. For example, set this to <code>value</code> for <code>bind-value</code>, or set this to <code>null</code> for <code>bind</code>.</param>
+ <param name="valueAttribute">The name of the value attribute to be bound.</param>
+ <param name="changeAttribute">The name of an attribute that will register an associated change event.</param>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.BindElementAttribute.Element">
+ <summary>
+ Gets the tag name of the element.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.BindElementAttribute.Suffix">
+ <summary>
+ Gets the suffix value.
+ For example, this will be <code>value</code> to mean <code>bind-value</code>, or <code>null</code> to mean <code>bind</code>.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.BindElementAttribute.ValueAttribute">
+ <summary>
+ Gets the name of the value attribute to be bound.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.BindElementAttribute.ChangeAttribute">
+ <summary>
+ Gets the name of an attribute that will register an associated change event.
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.BindInputElementAttribute">
+ <summary>
+ Configures options for binding subtypes of an HTML <code>input</code> element.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.BindInputElementAttribute.#ctor(System.String,System.String,System.String,System.String)">
+ <summary>
+ Constructs an instance of <see cref="T:Microsoft.AspNetCore.Components.BindInputElementAttribute"/>.
+ </summary>
+ <param name="type">The value of the element's <code>type</code> attribute.</param>
+ <param name="suffix">The suffix value.</param>
+ <param name="valueAttribute">The name of the value attribute to be bound.</param>
+ <param name="changeAttribute">The name of an attribute that will register an associated change event.</param>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.BindInputElementAttribute.Type">
+ <summary>
+ Gets the value of the element's <code>type</code> attribute.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.BindInputElementAttribute.Suffix">
+ <summary>
+ Gets the suffix value.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.BindInputElementAttribute.ValueAttribute">
+ <summary>
+ Gets the name of the value attribute to be bound.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.BindInputElementAttribute.ChangeAttribute">
+ <summary>
+ Gets the name of an attribute that will register an associated change event.
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.BindMethods">
+ <summary>
+ Methods used internally by @bind syntax. Not intended to be used directly.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.BindMethods.GetValue``1(``0)">
+ <summary>
+ Not intended to be used directly.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.BindMethods.GetValue(System.DateTime,System.String)">
+ <summary>
+ Not intended to be used directly.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.BindMethods.GetEventHandlerValue``1(System.String)">
+ <summary>
+ Not intended to be used directly.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.BindMethods.GetEventHandlerValue``1(System.Action)">
+ <summary>
+ Not intended to be used directly.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.BindMethods.GetEventHandlerValue``1(System.Func{System.Threading.Tasks.Task})">
+ <summary>
+ Not intended to be used directly.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.BindMethods.GetEventHandlerValue``1(System.Action{``0})">
+ <summary>
+ Not intended to be used directly.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.BindMethods.GetEventHandlerValue``1(System.Func{``0,System.Threading.Tasks.Task})">
+ <summary>
+ Not intended to be used directly.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.BindMethods.GetEventHandlerValue``1(Microsoft.AspNetCore.Components.EventCallback)">
+ <summary>
+ Not intended to be used directly.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.BindMethods.GetEventHandlerValue``1(Microsoft.AspNetCore.Components.EventCallback{``0})">
+ <summary>
+ Not intended to be used directly.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.BindMethods.SetValueHandler(System.Action{System.String},System.String)">
+ <summary>
+ Not intended to be used directly.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.BindMethods.SetValueHandler(System.Action{System.Boolean},System.Boolean)">
+ <summary>
+ Not intended to be used directly.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.BindMethods.SetValueHandler(System.Action{System.Nullable{System.Boolean}},System.Nullable{System.Boolean})">
+ <summary>
+ Not intended to be used directly.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.BindMethods.SetValueHandler(System.Action{System.Int32},System.Int32)">
+ <summary>
+ Not intended to be used directly.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.BindMethods.SetValueHandler(System.Action{System.Nullable{System.Int32}},System.Nullable{System.Int32})">
+ <summary>
+ Not intended to be used directly.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.BindMethods.SetValueHandler(System.Action{System.Int64},System.Int64)">
+ <summary>
+ Not intended to be used directly.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.BindMethods.SetValueHandler(System.Action{System.Nullable{System.Int64}},System.Nullable{System.Int64})">
+ <summary>
+ Not intended to be used directly.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.BindMethods.SetValueHandler(System.Action{System.Single},System.Single)">
+ <summary>
+ Not intended to be used directly.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.BindMethods.SetValueHandler(System.Action{System.Nullable{System.Single}},System.Nullable{System.Single})">
+ <summary>
+ Not intended to be used directly.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.BindMethods.SetValueHandler(System.Action{System.Double},System.Double)">
+ <summary>
+ Not intended to be used directly.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.BindMethods.SetValueHandler(System.Action{System.Nullable{System.Double}},System.Nullable{System.Double})">
+ <summary>
+ Not intended to be used directly.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.BindMethods.SetValueHandler(System.Action{System.Decimal},System.Decimal)">
+ <summary>
+ Not intended to be used directly.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.BindMethods.SetValueHandler(System.Action{System.Nullable{System.Decimal}},System.Nullable{System.Decimal})">
+ <summary>
+ Not intended to be used directly.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.BindMethods.SetValueHandler(System.Action{System.DateTime},System.DateTime)">
+ <summary>
+ Not intended to be used directly.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.BindMethods.SetValueHandler(System.Action{System.DateTime},System.DateTime,System.String)">
+ <summary>
+ Not intended to be used directly.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.BindMethods.SetValueHandler``1(System.Action{``0},``0)">
+ <summary>
+ Not intended to be used directly.
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.CascadingParameterAttribute">
+ <summary>
+ Denotes the target member as a cascading component parameter. Its value will be
+ supplied by the closest ancestor <see cref="T:Microsoft.AspNetCore.Components.CascadingValue`1"/> component that
+ supplies values with a compatible type and name.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.CascadingParameterAttribute.Name">
+ <summary>
+ If specified, the parameter value will be supplied by the closest
+ ancestor <see cref="T:Microsoft.AspNetCore.Components.CascadingValue`1"/> that supplies a value with
+ this name.
+
+ If null, the parameter value will be supplied by the closest ancestor
+ <see cref="T:Microsoft.AspNetCore.Components.CascadingValue`1"/> that supplies a value with a compatible
+ type.
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.CascadingValue`1">
+ <summary>
+ A component that provides a cascading value to all descendant components.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.CascadingValue`1.ChildContent">
+ <summary>
+ The content to which the value should be provided.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.CascadingValue`1.Value">
+ <summary>
+ The value to be provided.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.CascadingValue`1.Name">
+ <summary>
+ Optionally gives a name to the provided value. Descendant components
+ will be able to receive the value by specifying this name.
+
+ If no name is specified, then descendant components will receive the
+ value based the type of value they are requesting.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.CascadingValue`1.IsFixed">
+ <summary>
+ If true, indicates that <see cref="P:Microsoft.AspNetCore.Components.CascadingValue`1.Value"/> will not change. This is a
+ performance optimization that allows the framework to skip setting up
+ change notifications. Set this flag only if you will not change
+ <see cref="P:Microsoft.AspNetCore.Components.CascadingValue`1.Value"/> during the component's lifetime.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.CascadingValue`1.Configure(Microsoft.AspNetCore.Components.RenderHandle)">
+ <inheritdoc />
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.CascadingValue`1.SetParametersAsync(Microsoft.AspNetCore.Components.ParameterCollection)">
+ <inheritdoc />
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.ComponentBase">
+ <summary>
+ Optional base class for components. Alternatively, components may
+ implement <see cref="T:Microsoft.AspNetCore.Components.IComponent"/> directly.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.ComponentBase.BuildRenderTreeMethodName">
+ <summary>
+ Specifies the name of the <see cref="N:Microsoft.AspNetCore.Components.RenderTree"/>-building method.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.ComponentBase.#ctor">
+ <summary>
+ Constructs an instance of <see cref="T:Microsoft.AspNetCore.Components.ComponentBase"/>.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.ComponentBase.BuildRenderTree(Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder)">
+ <summary>
+ Renders the component to the supplied <see cref="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder"/>.
+ </summary>
+ <param name="builder">A <see cref="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder"/> that will receive the render output.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.ComponentBase.OnInit">
+ <summary>
+ Method invoked when the component is ready to start, having received its
+ initial parameters from its parent in the render tree.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.ComponentBase.OnInitAsync">
+ <summary>
+ Method invoked when the component is ready to start, having received its
+ initial parameters from its parent in the render tree.
+
+ Override this method if you will perform an asynchronous operation and
+ want the component to refresh when that operation is completed.
+ </summary>
+ <returns>A <see cref="T:System.Threading.Tasks.Task"/> representing any asynchronous operation.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.ComponentBase.OnParametersSet">
+ <summary>
+ Method invoked when the component has received parameters from its parent in
+ the render tree, and the incoming values have been assigned to properties.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.ComponentBase.OnParametersSetAsync">
+ <summary>
+ Method invoked when the component has received parameters from its parent in
+ the render tree, and the incoming values have been assigned to properties.
+ </summary>
+ <returns>A <see cref="T:System.Threading.Tasks.Task"/> representing any asynchronous operation.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.ComponentBase.StateHasChanged">
+ <summary>
+ Notifies the component that its state has changed. When applicable, this will
+ cause the component to be re-rendered.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.ComponentBase.ShouldRender">
+ <summary>
+ Returns a flag to indicate whether the component should render.
+ </summary>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.ComponentBase.OnAfterRender">
+ <summary>
+ Method invoked after each time the component has been rendered.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.ComponentBase.OnAfterRenderAsync">
+ <summary>
+ Method invoked after each time the component has been rendered. Note that the component does
+ not automatically re-render after the completion of any returned <see cref="T:System.Threading.Tasks.Task"/>, because
+ that would cause an infinite render loop.
+ </summary>
+ <returns>A <see cref="T:System.Threading.Tasks.Task"/> representing any asynchronous operation.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.ComponentBase.Invoke(System.Action)">
+ <summary>
+ Executes the supplied work item on the associated renderer's
+ synchronization context.
+ </summary>
+ <param name="workItem">The work item to execute.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.ComponentBase.InvokeAsync(System.Func{System.Threading.Tasks.Task})">
+ <summary>
+ Executes the supplied work item on the associated renderer's
+ synchronization context.
+ </summary>
+ <param name="workItem">The work item to execute.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.ComponentBase.SetParametersAsync(Microsoft.AspNetCore.Components.ParameterCollection)">
+ <summary>
+ Method invoked to apply initial or updated parameters to the component.
+ </summary>
+ <param name="parameters">The parameters to apply.</param>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.ComponentResolver">
+ <summary>
+ Resolves components for an application.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.ComponentResolver.ResolveComponents(System.Reflection.Assembly)">
+ <summary>
+ Lists all the types
+ </summary>
+ <param name="appAssembly"></param>
+ <returns></returns>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.ElementRef">
+ <summary>
+ Represents a reference to a rendered element.
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.EventCallback">
+ <summary>
+ A bound event handler delegate.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.EventCallback.Factory">
+ <summary>
+ Gets a reference to the <see cref="T:Microsoft.AspNetCore.Components.EventCallbackFactory"/>.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.EventCallback.Empty">
+ <summary>
+ Gets an empty <see cref="T:Microsoft.AspNetCore.Components.EventCallback`1"/>.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallback.#ctor(Microsoft.AspNetCore.Components.IHandleEvent,System.MulticastDelegate)">
+ <summary>
+ Creates the new <see cref="T:Microsoft.AspNetCore.Components.EventCallback`1"/>.
+ </summary>
+ <param name="receiver">The event receiver.</param>
+ <param name="delegate">The delegate to bind.</param>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.EventCallback.HasDelegate">
+ <summary>
+ Gets a value that indicates whether the delegate associated with this event dispatcher is non-null.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallback.InvokeAsync(System.Object)">
+ <summary>
+ Invokes the delegate associated with this binding and dispatches an event notification to the
+ appropriate component.
+ </summary>
+ <param name="arg">The argument.</param>
+ <returns>A <see cref="T:System.Threading.Tasks.Task"/> which completes asynchronously once event processing has completed.</returns>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.EventCallback`1">
+ <summary>
+ A bound event handler delegate.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallback`1.#ctor(Microsoft.AspNetCore.Components.IHandleEvent,System.MulticastDelegate)">
+ <summary>
+ Creates the new <see cref="T:Microsoft.AspNetCore.Components.EventCallback`1"/>.
+ </summary>
+ <param name="receiver">The event receiver.</param>
+ <param name="delegate">The delegate to bind.</param>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.EventCallback`1.HasDelegate">
+ <summary>
+ Gets a value that indicates whether the delegate associated with this event dispatcher is non-null.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallback`1.InvokeAsync(`0)">
+ <summary>
+ Invokes the delegate associated with this binding and dispatches an event notification to the
+ appropriate component.
+ </summary>
+ <param name="arg">The argument.</param>
+ <returns>A <see cref="T:System.Threading.Tasks.Task"/> which completes asynchronously once event processing has completed.</returns>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.EventCallbackFactory">
+ <summary>
+ A factory for creating <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/> and <see cref="T:Microsoft.AspNetCore.Components.EventCallback`1"/>
+ instances.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactory.Create(System.Object,Microsoft.AspNetCore.Components.EventCallback)">
+ <summary>
+ Returns the provided <paramref name="callback"/>. For internal framework use only.
+ </summary>
+ <param name="receiver"></param>
+ <param name="callback"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactory.Create(System.Object,System.Action)">
+ <summary>
+ Creates an <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/> for the provided <paramref name="receiver"/> and
+ <paramref name="callback"/>.
+ </summary>
+ <param name="receiver">The event receiver.</param>
+ <param name="callback">The event callback.</param>
+ <returns>The <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/>.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactory.Create(System.Object,System.Action{System.Object})">
+ <summary>
+ Creates an <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/> for the provided <paramref name="receiver"/> and
+ <paramref name="callback"/>.
+ </summary>
+ <param name="receiver">The event receiver.</param>
+ <param name="callback">The event callback.</param>
+ <returns>The <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/>.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactory.Create(System.Object,System.Func{System.Threading.Tasks.Task})">
+ <summary>
+ Creates an <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/> for the provided <paramref name="receiver"/> and
+ <paramref name="callback"/>.
+ </summary>
+ <param name="receiver">The event receiver.</param>
+ <param name="callback">The event callback.</param>
+ <returns>The <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/>.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactory.Create(System.Object,System.Func{System.Object,System.Threading.Tasks.Task})">
+ <summary>
+ Creates an <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/> for the provided <paramref name="receiver"/> and
+ <paramref name="callback"/>.
+ </summary>
+ <param name="receiver">The event receiver.</param>
+ <param name="callback">The event callback.</param>
+ <returns>The <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/>.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactory.Create``1(System.Object,System.String)">
+ <summary>
+ Returns the provided <paramref name="callback"/>. For internal framework use only.
+ </summary>
+ <param name="receiver"></param>
+ <param name="callback"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactory.Create``1(System.Object,Microsoft.AspNetCore.Components.EventCallback)">
+ <summary>
+ Returns the provided <paramref name="callback"/>. For internal framework use only.
+ </summary>
+ <param name="receiver"></param>
+ <param name="callback"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactory.Create``1(System.Object,Microsoft.AspNetCore.Components.EventCallback{``0})">
+ <summary>
+ Returns the provided <paramref name="callback"/>. For internal framework use only.
+ </summary>
+ <param name="receiver"></param>
+ <param name="callback"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactory.Create``1(System.Object,System.Action)">
+ <summary>
+ Creates an <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/> for the provided <paramref name="receiver"/> and
+ <paramref name="callback"/>.
+ </summary>
+ <param name="receiver">The event receiver.</param>
+ <param name="callback">The event callback.</param>
+ <returns>The <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/>.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactory.Create``1(System.Object,System.Action{``0})">
+ <summary>
+ Creates an <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/> for the provided <paramref name="receiver"/> and
+ <paramref name="callback"/>.
+ </summary>
+ <param name="receiver">The event receiver.</param>
+ <param name="callback">The event callback.</param>
+ <returns>The <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/>.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactory.Create``1(System.Object,System.Func{System.Threading.Tasks.Task})">
+ <summary>
+ Creates an <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/> for the provided <paramref name="receiver"/> and
+ <paramref name="callback"/>.
+ </summary>
+ <param name="receiver">The event receiver.</param>
+ <param name="callback">The event callback.</param>
+ <returns>The <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/>.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactory.Create``1(System.Object,System.Func{``0,System.Threading.Tasks.Task})">
+ <summary>
+ Creates an <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/> for the provided <paramref name="receiver"/> and
+ <paramref name="callback"/>.
+ </summary>
+ <param name="receiver">The event receiver.</param>
+ <param name="callback">The event callback.</param>
+ <returns>The <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/>.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactory.CreateInferred``1(System.Object,System.Action{``0},``0)">
+ <summary>
+ Creates an <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/> for the provided <paramref name="receiver"/> and
+ <paramref name="callback"/>. For internal framework use only.
+ </summary>
+ <param name="receiver"></param>
+ <param name="callback"></param>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactory.CreateInferred``1(System.Object,System.Func{``0,System.Threading.Tasks.Task},``0)">
+ <summary>
+ Creates an <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/> for the provided <paramref name="receiver"/> and
+ <paramref name="callback"/>. For internal framework use only.
+ </summary>
+ <param name="receiver"></param>
+ <param name="callback"></param>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions">
+ <summary>
+ Contains extension methods for two-way binding using <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/>. For internal use only.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(Microsoft.AspNetCore.Components.EventCallbackFactory,System.Object,System.Action{System.String},System.String)">
+ <summary>
+ For internal use only.
+ </summary>
+ <param name="factory"></param>
+ <param name="receiver"></param>
+ <param name="setter"></param>
+ <param name="existingValue"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(Microsoft.AspNetCore.Components.EventCallbackFactory,System.Object,System.Action{System.Boolean},System.Boolean)">
+ <summary>
+ For internal use only.
+ </summary>
+ <param name="factory"></param>
+ <param name="receiver"></param>
+ <param name="setter"></param>
+ <param name="existingValue"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(Microsoft.AspNetCore.Components.EventCallbackFactory,System.Object,System.Action{System.Nullable{System.Boolean}},System.Nullable{System.Boolean})">
+ <summary>
+ For internal use only.
+ </summary>
+ <param name="factory"></param>
+ <param name="receiver"></param>
+ <param name="setter"></param>
+ <param name="existingValue"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(Microsoft.AspNetCore.Components.EventCallbackFactory,System.Object,System.Action{System.Int32},System.Int32)">
+ <summary>
+ For internal use only.
+ </summary>
+ <param name="factory"></param>
+ <param name="receiver"></param>
+ <param name="setter"></param>
+ <param name="existingValue"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(Microsoft.AspNetCore.Components.EventCallbackFactory,System.Object,System.Action{System.Nullable{System.Int32}},System.Nullable{System.Int32})">
+ <summary>
+ For internal use only.
+ </summary>
+ <param name="factory"></param>
+ <param name="receiver"></param>
+ <param name="setter"></param>
+ <param name="existingValue"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(Microsoft.AspNetCore.Components.EventCallbackFactory,System.Object,System.Action{System.Int64},System.Int64)">
+ <summary>
+ For internal use only.
+ </summary>
+ <param name="factory"></param>
+ <param name="receiver"></param>
+ <param name="setter"></param>
+ <param name="existingValue"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(Microsoft.AspNetCore.Components.EventCallbackFactory,System.Object,System.Action{System.Nullable{System.Int64}},System.Nullable{System.Int64})">
+ <summary>
+ For internal use only.
+ </summary>
+ <param name="factory"></param>
+ <param name="receiver"></param>
+ <param name="setter"></param>
+ <param name="existingValue"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(Microsoft.AspNetCore.Components.EventCallbackFactory,System.Object,System.Action{System.Single},System.Single)">
+ <summary>
+ For internal use only.
+ </summary>
+ <param name="factory"></param>
+ <param name="receiver"></param>
+ <param name="setter"></param>
+ <param name="existingValue"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(Microsoft.AspNetCore.Components.EventCallbackFactory,System.Object,System.Action{System.Nullable{System.Single}},System.Nullable{System.Single})">
+ <summary>
+ For internal use only.
+ </summary>
+ <param name="factory"></param>
+ <param name="receiver"></param>
+ <param name="setter"></param>
+ <param name="existingValue"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(Microsoft.AspNetCore.Components.EventCallbackFactory,System.Object,System.Action{System.Double},System.Double)">
+ <summary>
+ For internal use only.
+ </summary>
+ <param name="factory"></param>
+ <param name="receiver"></param>
+ <param name="setter"></param>
+ <param name="existingValue"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(Microsoft.AspNetCore.Components.EventCallbackFactory,System.Object,System.Action{System.Nullable{System.Double}},System.Nullable{System.Double})">
+ <summary>
+ For internal use only.
+ </summary>
+ <param name="factory"></param>
+ <param name="receiver"></param>
+ <param name="setter"></param>
+ <param name="existingValue"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(Microsoft.AspNetCore.Components.EventCallbackFactory,System.Object,System.Action{System.Decimal},System.Decimal)">
+ <summary>
+ For internal use only.
+ </summary>
+ <param name="factory"></param>
+ <param name="receiver"></param>
+ <param name="setter"></param>
+ <param name="existingValue"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(Microsoft.AspNetCore.Components.EventCallbackFactory,System.Object,System.Action{System.Nullable{System.Decimal}},System.Nullable{System.Decimal})">
+ <summary>
+ For internal use only.
+ </summary>
+ <param name="factory"></param>
+ <param name="receiver"></param>
+ <param name="setter"></param>
+ <param name="existingValue"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(Microsoft.AspNetCore.Components.EventCallbackFactory,System.Object,System.Action{System.DateTime},System.DateTime)">
+ <summary>
+ For internal use only.
+ </summary>
+ <param name="factory"></param>
+ <param name="receiver"></param>
+ <param name="setter"></param>
+ <param name="existingValue"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(Microsoft.AspNetCore.Components.EventCallbackFactory,System.Object,System.Action{System.DateTime},System.DateTime,System.String)">
+ <summary>
+ For internal use only.
+ </summary>
+ <param name="factory"></param>
+ <param name="receiver"></param>
+ <param name="setter"></param>
+ <param name="existingValue"></param>
+ <param name="format"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder``1(Microsoft.AspNetCore.Components.EventCallbackFactory,System.Object,System.Action{``0},``0)">
+ <summary>
+ For internal use only.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="factory"></param>
+ <param name="receiver"></param>
+ <param name="setter"></param>
+ <param name="existingValue"></param>
+ <returns></returns>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.EventCallbackFactoryUIEventArgsExtensions">
+ <summary>
+ Provides extension methods for <see cref="T:Microsoft.AspNetCore.Components.EventCallbackFactory"/> and <see cref="T:Microsoft.AspNetCore.Components.UIEventArgs"/> types. For internal
+ framework use.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactoryUIEventArgsExtensions.Create(Microsoft.AspNetCore.Components.EventCallbackFactory,System.Object,System.Action{Microsoft.AspNetCore.Components.UIEventArgs})">
+ <summary>
+ Creates an <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/> for the provided <paramref name="receiver"/> and
+ <paramref name="callback"/>.
+ </summary>
+ <param name="factory">The <see cref="T:Microsoft.AspNetCore.Components.EventCallbackFactory"/>.</param>
+ <param name="receiver">The event receiver.</param>
+ <param name="callback">The event callback.</param>
+ <returns>The <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/>.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactoryUIEventArgsExtensions.Create(Microsoft.AspNetCore.Components.EventCallbackFactory,System.Object,System.Func{Microsoft.AspNetCore.Components.UIEventArgs,System.Threading.Tasks.Task})">
+ <summary>
+ Creates an <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/> for the provided <paramref name="receiver"/> and
+ <paramref name="callback"/>.
+ </summary>
+ <param name="factory">The <see cref="T:Microsoft.AspNetCore.Components.EventCallbackFactory"/>.</param>
+ <param name="receiver">The event receiver.</param>
+ <param name="callback">The event callback.</param>
+ <returns>The <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/>.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactoryUIEventArgsExtensions.Create(Microsoft.AspNetCore.Components.EventCallbackFactory,System.Object,System.Action{Microsoft.AspNetCore.Components.UIChangeEventArgs})">
+ <summary>
+ Creates an <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/> for the provided <paramref name="receiver"/> and
+ <paramref name="callback"/>.
+ </summary>
+ <param name="factory">The <see cref="T:Microsoft.AspNetCore.Components.EventCallbackFactory"/>.</param>
+ <param name="receiver">The event receiver.</param>
+ <param name="callback">The event callback.</param>
+ <returns>The <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/>.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactoryUIEventArgsExtensions.Create(Microsoft.AspNetCore.Components.EventCallbackFactory,System.Object,System.Func{Microsoft.AspNetCore.Components.UIChangeEventArgs,System.Threading.Tasks.Task})">
+ <summary>
+ Creates an <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/> for the provided <paramref name="receiver"/> and
+ <paramref name="callback"/>.
+ </summary>
+ <param name="factory">The <see cref="T:Microsoft.AspNetCore.Components.EventCallbackFactory"/>.</param>
+ <param name="receiver">The event receiver.</param>
+ <param name="callback">The event callback.</param>
+ <returns>The <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/>.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactoryUIEventArgsExtensions.Create(Microsoft.AspNetCore.Components.EventCallbackFactory,System.Object,System.Action{Microsoft.AspNetCore.Components.UIClipboardEventArgs})">
+ <summary>
+ Creates an <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/> for the provided <paramref name="receiver"/> and
+ <paramref name="callback"/>.
+ </summary>
+ <param name="factory">The <see cref="T:Microsoft.AspNetCore.Components.EventCallbackFactory"/>.</param>
+ <param name="receiver">The event receiver.</param>
+ <param name="callback">The event callback.</param>
+ <returns>The <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/>.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactoryUIEventArgsExtensions.Create(Microsoft.AspNetCore.Components.EventCallbackFactory,System.Object,System.Func{Microsoft.AspNetCore.Components.UIClipboardEventArgs,System.Threading.Tasks.Task})">
+ <summary>
+ Creates an <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/> for the provided <paramref name="receiver"/> and
+ <paramref name="callback"/>.
+ </summary>
+ <param name="factory">The <see cref="T:Microsoft.AspNetCore.Components.EventCallbackFactory"/>.</param>
+ <param name="receiver">The event receiver.</param>
+ <param name="callback">The event callback.</param>
+ <returns>The <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/>.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactoryUIEventArgsExtensions.Create(Microsoft.AspNetCore.Components.EventCallbackFactory,System.Object,System.Action{Microsoft.AspNetCore.Components.UIDragEventArgs})">
+ <summary>
+ Creates an <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/> for the provided <paramref name="receiver"/> and
+ <paramref name="callback"/>.
+ </summary>
+ <param name="factory">The <see cref="T:Microsoft.AspNetCore.Components.EventCallbackFactory"/>.</param>
+ <param name="receiver">The event receiver.</param>
+ <param name="callback">The event callback.</param>
+ <returns>The <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/>.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactoryUIEventArgsExtensions.Create(Microsoft.AspNetCore.Components.EventCallbackFactory,System.Object,System.Func{Microsoft.AspNetCore.Components.UIDragEventArgs,System.Threading.Tasks.Task})">
+ <summary>
+ Creates an <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/> for the provided <paramref name="receiver"/> and
+ <paramref name="callback"/>.
+ </summary>
+ <param name="factory">The <see cref="T:Microsoft.AspNetCore.Components.EventCallbackFactory"/>.</param>
+ <param name="receiver">The event receiver.</param>
+ <param name="callback">The event callback.</param>
+ <returns>The <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/>.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactoryUIEventArgsExtensions.Create(Microsoft.AspNetCore.Components.EventCallbackFactory,System.Object,System.Action{Microsoft.AspNetCore.Components.UIErrorEventArgs})">
+ <summary>
+ Creates an <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/> for the provided <paramref name="receiver"/> and
+ <paramref name="callback"/>.
+ </summary>
+ <param name="factory">The <see cref="T:Microsoft.AspNetCore.Components.EventCallbackFactory"/>.</param>
+ <param name="receiver">The event receiver.</param>
+ <param name="callback">The event callback.</param>
+ <returns>The <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/>.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactoryUIEventArgsExtensions.Create(Microsoft.AspNetCore.Components.EventCallbackFactory,System.Object,System.Func{Microsoft.AspNetCore.Components.UIErrorEventArgs,System.Threading.Tasks.Task})">
+ <summary>
+ Creates an <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/> for the provided <paramref name="receiver"/> and
+ <paramref name="callback"/>.
+ </summary>
+ <param name="factory">The <see cref="T:Microsoft.AspNetCore.Components.EventCallbackFactory"/>.</param>
+ <param name="receiver">The event receiver.</param>
+ <param name="callback">The event callback.</param>
+ <returns>The <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/>.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactoryUIEventArgsExtensions.Create(Microsoft.AspNetCore.Components.EventCallbackFactory,System.Object,System.Action{Microsoft.AspNetCore.Components.UIFocusEventArgs})">
+ <summary>
+ Creates an <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/> for the provided <paramref name="receiver"/> and
+ <paramref name="callback"/>.
+ </summary>
+ <param name="factory">The <see cref="T:Microsoft.AspNetCore.Components.EventCallbackFactory"/>.</param>
+ <param name="receiver">The event receiver.</param>
+ <param name="callback">The event callback.</param>
+ <returns>The <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/>.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactoryUIEventArgsExtensions.Create(Microsoft.AspNetCore.Components.EventCallbackFactory,System.Object,System.Func{Microsoft.AspNetCore.Components.UIFocusEventArgs,System.Threading.Tasks.Task})">
+ <summary>
+ Creates an <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/> for the provided <paramref name="receiver"/> and
+ <paramref name="callback"/>.
+ </summary>
+ <param name="factory">The <see cref="T:Microsoft.AspNetCore.Components.EventCallbackFactory"/>.</param>
+ <param name="receiver">The event receiver.</param>
+ <param name="callback">The event callback.</param>
+ <returns>The <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/>.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactoryUIEventArgsExtensions.Create(Microsoft.AspNetCore.Components.EventCallbackFactory,System.Object,System.Action{Microsoft.AspNetCore.Components.UIKeyboardEventArgs})">
+ <summary>
+ Creates an <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/> for the provided <paramref name="receiver"/> and
+ <paramref name="callback"/>.
+ </summary>
+ <param name="factory">The <see cref="T:Microsoft.AspNetCore.Components.EventCallbackFactory"/>.</param>
+ <param name="receiver">The event receiver.</param>
+ <param name="callback">The event callback.</param>
+ <returns>The <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/>.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactoryUIEventArgsExtensions.Create(Microsoft.AspNetCore.Components.EventCallbackFactory,System.Object,System.Func{Microsoft.AspNetCore.Components.UIKeyboardEventArgs,System.Threading.Tasks.Task})">
+ <summary>
+ Creates an <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/> for the provided <paramref name="receiver"/> and
+ <paramref name="callback"/>.
+ </summary>
+ <param name="factory">The <see cref="T:Microsoft.AspNetCore.Components.EventCallbackFactory"/>.</param>
+ <param name="receiver">The event receiver.</param>
+ <param name="callback">The event callback.</param>
+ <returns>The <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/>.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactoryUIEventArgsExtensions.Create(Microsoft.AspNetCore.Components.EventCallbackFactory,System.Object,System.Action{Microsoft.AspNetCore.Components.UIMouseEventArgs})">
+ <summary>
+ Creates an <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/> for the provided <paramref name="receiver"/> and
+ <paramref name="callback"/>.
+ </summary>
+ <param name="factory">The <see cref="T:Microsoft.AspNetCore.Components.EventCallbackFactory"/>.</param>
+ <param name="receiver">The event receiver.</param>
+ <param name="callback">The event callback.</param>
+ <returns>The <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/>.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactoryUIEventArgsExtensions.Create(Microsoft.AspNetCore.Components.EventCallbackFactory,System.Object,System.Func{Microsoft.AspNetCore.Components.UIMouseEventArgs,System.Threading.Tasks.Task})">
+ <summary>
+ Creates an <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/> for the provided <paramref name="receiver"/> and
+ <paramref name="callback"/>.
+ </summary>
+ <param name="factory">The <see cref="T:Microsoft.AspNetCore.Components.EventCallbackFactory"/>.</param>
+ <param name="receiver">The event receiver.</param>
+ <param name="callback">The event callback.</param>
+ <returns>The <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/>.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactoryUIEventArgsExtensions.Create(Microsoft.AspNetCore.Components.EventCallbackFactory,System.Object,System.Action{Microsoft.AspNetCore.Components.UIPointerEventArgs})">
+ <summary>
+ Creates an <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/> for the provided <paramref name="receiver"/> and
+ <paramref name="callback"/>.
+ </summary>
+ <param name="factory">The <see cref="T:Microsoft.AspNetCore.Components.EventCallbackFactory"/>.</param>
+ <param name="receiver">The event receiver.</param>
+ <param name="callback">The event callback.</param>
+ <returns>The <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/>.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactoryUIEventArgsExtensions.Create(Microsoft.AspNetCore.Components.EventCallbackFactory,System.Object,System.Func{Microsoft.AspNetCore.Components.UIPointerEventArgs,System.Threading.Tasks.Task})">
+ <summary>
+ Creates an <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/> for the provided <paramref name="receiver"/> and
+ <paramref name="callback"/>.
+ </summary>
+ <param name="factory">The <see cref="T:Microsoft.AspNetCore.Components.EventCallbackFactory"/>.</param>
+ <param name="receiver">The event receiver.</param>
+ <param name="callback">The event callback.</param>
+ <returns>The <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/>.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactoryUIEventArgsExtensions.Create(Microsoft.AspNetCore.Components.EventCallbackFactory,System.Object,System.Action{Microsoft.AspNetCore.Components.UIProgressEventArgs})">
+ <summary>
+ Creates an <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/> for the provided <paramref name="receiver"/> and
+ <paramref name="callback"/>.
+ </summary>
+ <param name="factory">The <see cref="T:Microsoft.AspNetCore.Components.EventCallbackFactory"/>.</param>
+ <param name="receiver">The event receiver.</param>
+ <param name="callback">The event callback.</param>
+ <returns>The <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/>.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactoryUIEventArgsExtensions.Create(Microsoft.AspNetCore.Components.EventCallbackFactory,System.Object,System.Func{Microsoft.AspNetCore.Components.UIProgressEventArgs,System.Threading.Tasks.Task})">
+ <summary>
+ Creates an <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/> for the provided <paramref name="receiver"/> and
+ <paramref name="callback"/>.
+ </summary>
+ <param name="factory">The <see cref="T:Microsoft.AspNetCore.Components.EventCallbackFactory"/>.</param>
+ <param name="receiver">The event receiver.</param>
+ <param name="callback">The event callback.</param>
+ <returns>The <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/>.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactoryUIEventArgsExtensions.Create(Microsoft.AspNetCore.Components.EventCallbackFactory,System.Object,System.Action{Microsoft.AspNetCore.Components.UITouchEventArgs})">
+ <summary>
+ Creates an <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/> for the provided <paramref name="receiver"/> and
+ <paramref name="callback"/>.
+ </summary>
+ <param name="factory">The <see cref="T:Microsoft.AspNetCore.Components.EventCallbackFactory"/>.</param>
+ <param name="receiver">The event receiver.</param>
+ <param name="callback">The event callback.</param>
+ <returns>The <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/>.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactoryUIEventArgsExtensions.Create(Microsoft.AspNetCore.Components.EventCallbackFactory,System.Object,System.Func{Microsoft.AspNetCore.Components.UITouchEventArgs,System.Threading.Tasks.Task})">
+ <summary>
+ Creates an <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/> for the provided <paramref name="receiver"/> and
+ <paramref name="callback"/>.
+ </summary>
+ <param name="factory">The <see cref="T:Microsoft.AspNetCore.Components.EventCallbackFactory"/>.</param>
+ <param name="receiver">The event receiver.</param>
+ <param name="callback">The event callback.</param>
+ <returns>The <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/>.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactoryUIEventArgsExtensions.Create(Microsoft.AspNetCore.Components.EventCallbackFactory,System.Object,System.Action{Microsoft.AspNetCore.Components.UIWheelEventArgs})">
+ <summary>
+ Creates an <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/> for the provided <paramref name="receiver"/> and
+ <paramref name="callback"/>.
+ </summary>
+ <param name="factory">The <see cref="T:Microsoft.AspNetCore.Components.EventCallbackFactory"/>.</param>
+ <param name="receiver">The event receiver.</param>
+ <param name="callback">The event callback.</param>
+ <returns>The <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/>.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackFactoryUIEventArgsExtensions.Create(Microsoft.AspNetCore.Components.EventCallbackFactory,System.Object,System.Func{Microsoft.AspNetCore.Components.UIWheelEventArgs,System.Threading.Tasks.Task})">
+ <summary>
+ Creates an <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/> for the provided <paramref name="receiver"/> and
+ <paramref name="callback"/>.
+ </summary>
+ <param name="factory">The <see cref="T:Microsoft.AspNetCore.Components.EventCallbackFactory"/>.</param>
+ <param name="receiver">The event receiver.</param>
+ <param name="callback">The event callback.</param>
+ <returns>The <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/>.</returns>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.EventCallbackWorkItem">
+ <summary>
+ Wraps a callback delegate associated with an event.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.EventCallbackWorkItem.Empty">
+ <summary>
+ An empty <see cref="T:Microsoft.AspNetCore.Components.EventCallbackWorkItem"/>.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackWorkItem.#ctor(System.MulticastDelegate)">
+ <summary>
+ Creates a new <see cref="T:Microsoft.AspNetCore.Components.EventCallbackWorkItem"/> with the provided <paramref name="delegate"/>.
+ </summary>
+ <param name="delegate">The callback delegate.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventCallbackWorkItem.InvokeAsync(System.Object)">
+ <summary>
+ Invokes the delegate associated with this <see cref="T:Microsoft.AspNetCore.Components.EventCallbackWorkItem"/>.
+ </summary>
+ <param name="arg">The argument to provide to the delegate. May be <c>null</c>.</param>
+ <returns>A <see cref="T:System.Threading.Tasks.Task"/> then will complete asynchronously once the delegate has completed.</returns>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.EventHandlerAttribute">
+ <summary>
+ Associates an event argument type with an event attribute name.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.EventHandlerAttribute.#ctor(System.String,System.Type)">
+ <summary>
+ Constructs an instance of <see cref="T:Microsoft.AspNetCore.Components.EventHandlerAttribute"/>.
+ </summary>
+ <param name="attributeName"></param>
+ <param name="eventArgsType"></param>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.EventHandlerAttribute.AttributeName">
+ <summary>
+ Gets the attribute name.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.EventHandlerAttribute.EventArgsType">
+ <summary>
+ Gets the event argument type.
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.EventHandlers">
+ <summary>
+ Holds <see cref="T:System.EventHandler"/> attributes to configure the mappings between event names and
+ event argument types.
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.Forms.DataAnnotationsValidator">
+ <summary>
+ Adds Data Annotations validation support to an <see cref="T:Microsoft.AspNetCore.Components.Forms.EditContext"/>.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.DataAnnotationsValidator.OnInit">
+ <inheritdoc />
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.Forms.EditContext">
+ <summary>
+ Holds metadata related to a data editing process, such as flags to indicate which
+ fields have been modified and the current set of validation messages.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.EditContext.#ctor(System.Object)">
+ <summary>
+ Constructs an instance of <see cref="T:Microsoft.AspNetCore.Components.Forms.EditContext"/>.
+ </summary>
+ <param name="model">The model object for the <see cref="T:Microsoft.AspNetCore.Components.Forms.EditContext"/>. This object should hold the data being edited, for example as a set of properties.</param>
+ </member>
+ <member name="E:Microsoft.AspNetCore.Components.Forms.EditContext.OnFieldChanged">
+ <summary>
+ An event that is raised when a field value changes.
+ </summary>
+ </member>
+ <member name="E:Microsoft.AspNetCore.Components.Forms.EditContext.OnValidationRequested">
+ <summary>
+ An event that is raised when validation is requested.
+ </summary>
+ </member>
+ <member name="E:Microsoft.AspNetCore.Components.Forms.EditContext.OnValidationStateChanged">
+ <summary>
+ An event that is raised when validation state has changed.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.EditContext.Field(System.String)">
+ <summary>
+ Supplies a <see cref="T:Microsoft.AspNetCore.Components.Forms.FieldIdentifier"/> corresponding to a specified field name
+ on this <see cref="T:Microsoft.AspNetCore.Components.Forms.EditContext"/>'s <see cref="P:Microsoft.AspNetCore.Components.Forms.EditContext.Model"/>.
+ </summary>
+ <param name="fieldName">The name of the editable field.</param>
+ <returns>A <see cref="T:Microsoft.AspNetCore.Components.Forms.FieldIdentifier"/> corresponding to a specified field name on this <see cref="T:Microsoft.AspNetCore.Components.Forms.EditContext"/>'s <see cref="P:Microsoft.AspNetCore.Components.Forms.EditContext.Model"/>.</returns>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Forms.EditContext.Model">
+ <summary>
+ Gets the model object for this <see cref="T:Microsoft.AspNetCore.Components.Forms.EditContext"/>.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.EditContext.NotifyFieldChanged(Microsoft.AspNetCore.Components.Forms.FieldIdentifier@)">
+ <summary>
+ Signals that the value for the specified field has changed.
+ </summary>
+ <param name="fieldIdentifier">Identifies the field whose value has been changed.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.EditContext.NotifyValidationStateChanged">
+ <summary>
+ Signals that some aspect of validation state has changed.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.EditContext.MarkAsUnmodified(Microsoft.AspNetCore.Components.Forms.FieldIdentifier@)">
+ <summary>
+ Clears any modification flag that may be tracked for the specified field.
+ </summary>
+ <param name="fieldIdentifier">Identifies the field whose modification flag (if any) should be cleared.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.EditContext.MarkAsUnmodified">
+ <summary>
+ Clears all modification flags within this <see cref="T:Microsoft.AspNetCore.Components.Forms.EditContext"/>.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.EditContext.IsModified">
+ <summary>
+ Determines whether any of the fields in this <see cref="T:Microsoft.AspNetCore.Components.Forms.EditContext"/> have been modified.
+ </summary>
+ <returns>True if any of the fields in this <see cref="T:Microsoft.AspNetCore.Components.Forms.EditContext"/> have been modified; otherwise false.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.EditContext.GetValidationMessages">
+ <summary>
+ Gets the current validation messages across all fields.
+
+ This method does not perform validation itself. It only returns messages determined by previous validation actions.
+ </summary>
+ <returns>The current validation messages.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.EditContext.GetValidationMessages(Microsoft.AspNetCore.Components.Forms.FieldIdentifier)">
+ <summary>
+ Gets the current validation messages for the specified field.
+
+ This method does not perform validation itself. It only returns messages determined by previous validation actions.
+ </summary>
+ <param name="fieldIdentifier">Identifies the field whose current validation messages should be returned.</param>
+ <returns>The current validation messages for the specified field.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.EditContext.IsModified(Microsoft.AspNetCore.Components.Forms.FieldIdentifier@)">
+ <summary>
+ Determines whether the specified fields in this <see cref="T:Microsoft.AspNetCore.Components.Forms.EditContext"/> has been modified.
+ </summary>
+ <returns>True if the field has been modified; otherwise false.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.EditContext.Validate">
+ <summary>
+ Validates this <see cref="T:Microsoft.AspNetCore.Components.Forms.EditContext"/>.
+ </summary>
+ <returns>True if there are no validation messages after validation; otherwise false.</returns>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.Forms.EditContextDataAnnotationsExtensions">
+ <summary>
+ Extension methods to add DataAnnotations validation to an <see cref="T:Microsoft.AspNetCore.Components.Forms.EditContext"/>.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.EditContextDataAnnotationsExtensions.AddDataAnnotationsValidation(Microsoft.AspNetCore.Components.Forms.EditContext)">
+ <summary>
+ Adds DataAnnotations validation support to the <see cref="T:Microsoft.AspNetCore.Components.Forms.EditContext"/>.
+ </summary>
+ <param name="editContext">The <see cref="T:Microsoft.AspNetCore.Components.Forms.EditContext"/>.</param>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.Forms.EditContextExpressionExtensions">
+ <summary>
+ Provides extension methods to simplify using <see cref="T:Microsoft.AspNetCore.Components.Forms.EditContext"/> with expressions.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.EditContextExpressionExtensions.GetValidationMessages(Microsoft.AspNetCore.Components.Forms.EditContext,System.Linq.Expressions.Expression{System.Func{System.Object}})">
+ <summary>
+ Gets the current validation messages for the specified field.
+
+ This method does not perform validation itself. It only returns messages determined by previous validation actions.
+ </summary>
+ <param name="editContext">The <see cref="T:Microsoft.AspNetCore.Components.Forms.EditContext"/>.</param>
+ <param name="accessor">Identifies the field whose current validation messages should be returned.</param>
+ <returns>The current validation messages for the specified field.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.EditContextExpressionExtensions.IsModified(Microsoft.AspNetCore.Components.Forms.EditContext,System.Linq.Expressions.Expression{System.Func{System.Object}})">
+ <summary>
+ Determines whether the specified fields in this <see cref="T:Microsoft.AspNetCore.Components.Forms.EditContext"/> has been modified.
+ </summary>
+ <param name="editContext">The <see cref="T:Microsoft.AspNetCore.Components.Forms.EditContext"/>.</param>
+ <param name="accessor">Identifies the field whose current validation messages should be returned.</param>
+ <returns>True if the field has been modified; otherwise false.</returns>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.Forms.EditContextFieldClassExtensions">
+ <summary>
+ Provides extension methods to describe the state of <see cref="T:Microsoft.AspNetCore.Components.Forms.EditContext"/>
+ fields as CSS class names.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.EditContextFieldClassExtensions.FieldClass``1(Microsoft.AspNetCore.Components.Forms.EditContext,System.Linq.Expressions.Expression{System.Func{``0}})">
+ <summary>
+ Gets a string that indicates the status of the specified field. This will include
+ some combination of "modified", "valid", or "invalid", depending on the status of the field.
+ </summary>
+ <param name="editContext">The <see cref="T:Microsoft.AspNetCore.Components.Forms.EditContext"/>.</param>
+ <param name="accessor">An identifier for the field.</param>
+ <returns>A string that indicates the status of the field.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.EditContextFieldClassExtensions.FieldClass(Microsoft.AspNetCore.Components.Forms.EditContext,Microsoft.AspNetCore.Components.Forms.FieldIdentifier@)">
+ <summary>
+ Gets a string that indicates the status of the specified field. This will include
+ some combination of "modified", "valid", or "invalid", depending on the status of the field.
+ </summary>
+ <param name="editContext">The <see cref="T:Microsoft.AspNetCore.Components.Forms.EditContext"/>.</param>
+ <param name="fieldIdentifier">An identifier for the field.</param>
+ <returns>A string that indicates the status of the field.</returns>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.Forms.EditForm">
+ <summary>
+ Renders a form element that cascades an <see cref="P:Microsoft.AspNetCore.Components.Forms.EditForm.EditContext"/> to descendants.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.EditForm.#ctor">
+ <summary>
+ Constructs an instance of <see cref="T:Microsoft.AspNetCore.Components.Forms.EditForm"/>.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Forms.EditForm.EditContext">
+ <summary>
+ Supplies the edit context explicitly. If using this parameter, do not
+ also supply <see cref="P:Microsoft.AspNetCore.Components.Forms.EditForm.Model"/>, since the model value will be taken
+ from the <see cref="P:Microsoft.AspNetCore.Components.Forms.EditContext.Model"/> property.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Forms.EditForm.Model">
+ <summary>
+ Specifies the top-level model object for the form. An edit context will
+ be constructed for this model. If using this parameter, do not also supply
+ a value for <see cref="P:Microsoft.AspNetCore.Components.Forms.EditForm.EditContext"/>.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Forms.EditForm.ChildContent">
+ <summary>
+ Specifies the content to be rendered inside this <see cref="T:Microsoft.AspNetCore.Components.Forms.EditForm"/>.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Forms.EditForm.OnSubmit">
+ <summary>
+ A callback that will be invoked when the form is submitted.
+
+ If using this parameter, you are responsible for triggering any validation
+ manually, e.g., by calling <see cref="M:Microsoft.AspNetCore.Components.Forms.EditContext.Validate"/>.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Forms.EditForm.OnValidSubmit">
+ <summary>
+ A callback that will be invoked when the form is submitted and the
+ <see cref="P:Microsoft.AspNetCore.Components.Forms.EditForm.EditContext"/> is determined to be valid.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Forms.EditForm.OnInvalidSubmit">
+ <summary>
+ A callback that will be invoked when the form is submitted and the
+ <see cref="P:Microsoft.AspNetCore.Components.Forms.EditForm.EditContext"/> is determined to be invalid.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.EditForm.OnParametersSet">
+ <inheritdoc />
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.EditForm.BuildRenderTree(Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder)">
+ <inheritdoc />
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.Forms.FieldChangedEventArgs">
+ <summary>
+ Provides information about the <see cref="E:Microsoft.AspNetCore.Components.Forms.EditContext.OnFieldChanged"/> event.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Forms.FieldChangedEventArgs.FieldIdentifier">
+ <summary>
+ Identifies the field whose value has changed.
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.Forms.FieldIdentifier">
+ <summary>
+ Uniquely identifies a single field that can be edited. This may correspond to a property on a
+ model object, or can be any other named value.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.FieldIdentifier.Create``1(System.Linq.Expressions.Expression{System.Func{``0}})">
+ <summary>
+ Initializes a new instance of the <see cref="T:Microsoft.AspNetCore.Components.Forms.FieldIdentifier"/> structure.
+ </summary>
+ <param name="accessor">An expression that identifies an object member.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.FieldIdentifier.#ctor(System.Object,System.String)">
+ <summary>
+ Initializes a new instance of the <see cref="T:Microsoft.AspNetCore.Components.Forms.FieldIdentifier"/> structure.
+ </summary>
+ <param name="model">The object that owns the field.</param>
+ <param name="fieldName">The name of the editable field.</param>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Forms.FieldIdentifier.Model">
+ <summary>
+ Gets the object that owns the editable field.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Forms.FieldIdentifier.FieldName">
+ <summary>
+ Gets the name of the editable field.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.FieldIdentifier.GetHashCode">
+ <inheritdoc />
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.FieldIdentifier.Equals(System.Object)">
+ <inheritdoc />
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.Forms.InputBase`1">
+ <summary>
+ A base class for form input components. This base class automatically
+ integrates with an <see cref="T:Microsoft.AspNetCore.Components.Forms.EditContext"/>, which must be supplied
+ as a cascading parameter.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Forms.InputBase`1.Id">
+ <summary>
+ Gets a value for the component's 'id' attribute.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Forms.InputBase`1.Class">
+ <summary>
+ Gets a value for the component's 'class' attribute.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Forms.InputBase`1.Value">
+ <summary>
+ Gets or sets the value of the input. This should be used with two-way binding.
+ </summary>
+ <example>
+ bind-Value="@model.PropertyName"
+ </example>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Forms.InputBase`1.ValueChanged">
+ <summary>
+ Gets or sets a callback that updates the bound value.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Forms.InputBase`1.ValueExpression">
+ <summary>
+ Gets or sets an expression that identifies the bound value.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Forms.InputBase`1.EditContext">
+ <summary>
+ Gets the associated <see cref="T:Microsoft.AspNetCore.Components.Forms.EditContext"/>.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Forms.InputBase`1.FieldIdentifier">
+ <summary>
+ Gets the <see cref="P:Microsoft.AspNetCore.Components.Forms.InputBase`1.FieldIdentifier"/> for the bound value.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Forms.InputBase`1.CurrentValue">
+ <summary>
+ Gets or sets the current value of the input.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Forms.InputBase`1.CurrentValueAsString">
+ <summary>
+ Gets or sets the current value of the input, represented as a string.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.InputBase`1.FormatValueAsString(`0)">
+ <summary>
+ Formats the value as a string. Derived classes can override this to determine the formating used for <see cref="P:Microsoft.AspNetCore.Components.Forms.InputBase`1.CurrentValueAsString"/>.
+ </summary>
+ <param name="value">The value to format.</param>
+ <returns>A string representation of the value.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.InputBase`1.TryParseValueFromString(System.String,`0@,System.String@)">
+ <summary>
+ Parses a string to create an instance of <typeparamref name="T"/>. Derived classes can override this to change how
+ <see cref="P:Microsoft.AspNetCore.Components.Forms.InputBase`1.CurrentValueAsString"/> interprets incoming values.
+ </summary>
+ <param name="value">The string value to be parsed.</param>
+ <param name="result">An instance of <typeparamref name="T"/>.</param>
+ <param name="validationErrorMessage">If the value could not be parsed, provides a validation error message.</param>
+ <returns>True if the value could be parsed; otherwise false.</returns>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Forms.InputBase`1.FieldClass">
+ <summary>
+ Gets a string that indicates the status of the field being edited. This will include
+ some combination of "modified", "valid", or "invalid", depending on the status of the field.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Forms.InputBase`1.CssClass">
+ <summary>
+ Gets a CSS class string that combines the <see cref="P:Microsoft.AspNetCore.Components.Forms.InputBase`1.Class"/> and <see cref="P:Microsoft.AspNetCore.Components.Forms.InputBase`1.FieldClass"/>
+ properties. Derived components should typically use this value for the primary HTML element's
+ 'class' attribute.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.InputBase`1.SetParametersAsync(Microsoft.AspNetCore.Components.ParameterCollection)">
+ <inheritdoc />
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.Forms.InputCheckbox">
+ <summary>
+ An input component for editing <see cref="T:System.Boolean"/> values.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.InputCheckbox.BuildRenderTree(Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder)">
+ <inheritdoc />
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.InputCheckbox.TryParseValueFromString(System.String,System.Boolean@,System.String@)">
+ <inheritdoc />
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.Forms.InputDate`1">
+ <summary>
+ An input component for editing date values.
+ Supported types are <see cref="T:System.DateTime"/> and <see cref="T:System.DateTimeOffset"/>.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.InputDate`1.BuildRenderTree(Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder)">
+ <inheritdoc />
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.InputDate`1.FormatValueAsString(`0)">
+ <inheritdoc />
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.InputDate`1.TryParseValueFromString(System.String,`0@,System.String@)">
+ <inheritdoc />
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.Forms.InputNumber`1">
+ <summary>
+ An input component for editing numeric values.
+ Supported numeric types are <see cref="T:System.Int32"/>, <see cref="T:System.Int64"/>, <see cref="T:System.Single"/>, <see cref="T:System.Double"/>, <see cref="T:System.Decimal"/>.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.InputNumber`1.BuildRenderTree(Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder)">
+ <inheritdoc />
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.InputNumber`1.TryParseValueFromString(System.String,`0@,System.String@)">
+ <inheritdoc />
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.Forms.InputSelect`1">
+ <summary>
+ A dropdown selection component.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.InputSelect`1.BuildRenderTree(Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder)">
+ <inheritdoc />
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.InputSelect`1.TryParseValueFromString(System.String,`0@,System.String@)">
+ <inheritdoc />
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.Forms.InputText">
+ <summary>
+ An input component for editing <see cref="T:System.String"/> values.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.InputText.BuildRenderTree(Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder)">
+ <inheritdoc />
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.InputText.TryParseValueFromString(System.String,System.String@,System.String@)">
+ <inheritdoc />
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.Forms.InputTextArea">
+ <summary>
+ A multiline input component for editing <see cref="T:System.String"/> values.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.InputTextArea.BuildRenderTree(Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder)">
+ <inheritdoc />
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.InputTextArea.TryParseValueFromString(System.String,System.String@,System.String@)">
+ <inheritdoc />
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.Forms.ValidationMessage`1">
+ <summary>
+ Displays a list of validation messages for a specified field within a cascaded <see cref="T:Microsoft.AspNetCore.Components.Forms.EditContext"/>.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Forms.ValidationMessage`1.For">
+ <summary>
+ Specifies the field for which validation messages should be displayed.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.ValidationMessage`1.#ctor">
+ <summary>`
+ Constructs an instance of <see cref="T:Microsoft.AspNetCore.Components.Forms.ValidationSummary"/>.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.ValidationMessage`1.OnParametersSet">
+ <inheritdoc />
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.ValidationMessage`1.BuildRenderTree(Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder)">
+ <inheritdoc />
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.Forms.ValidationMessageStore">
+ <summary>
+ Holds validation messages for an <see cref="T:Microsoft.AspNetCore.Components.Forms.EditContext"/>.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.ValidationMessageStore.#ctor(Microsoft.AspNetCore.Components.Forms.EditContext)">
+ <summary>
+ Creates an instance of <see cref="T:Microsoft.AspNetCore.Components.Forms.ValidationMessageStore"/>.
+ </summary>
+ <param name="editContext">The <see cref="T:Microsoft.AspNetCore.Components.Forms.EditContext"/> with which this store should be associated.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.ValidationMessageStore.Add(Microsoft.AspNetCore.Components.Forms.FieldIdentifier@,System.String)">
+ <summary>
+ Adds a validation message for the specified field.
+ </summary>
+ <param name="fieldIdentifier">The identifier for the field.</param>
+ <param name="message">The validation message.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.ValidationMessageStore.AddRange(Microsoft.AspNetCore.Components.Forms.FieldIdentifier@,System.Collections.Generic.IEnumerable{System.String})">
+ <summary>
+ Adds the messages from the specified collection for the specified field.
+ </summary>
+ <param name="fieldIdentifier">The identifier for the field.</param>
+ <param name="messages">The validation messages to be added.</param>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Forms.ValidationMessageStore.Item(Microsoft.AspNetCore.Components.Forms.FieldIdentifier)">
+ <summary>
+ Gets the validation messages within this <see cref="T:Microsoft.AspNetCore.Components.Forms.ValidationMessageStore"/> for the specified field.
+
+ To get the validation messages across all validation message stores, use <see cref="M:Microsoft.AspNetCore.Components.Forms.EditContext.GetValidationMessages(Microsoft.AspNetCore.Components.Forms.FieldIdentifier)"/> instead
+ </summary>
+ <param name="fieldIdentifier">The identifier for the field.</param>
+ <returns>The validation messages for the specified field within this <see cref="T:Microsoft.AspNetCore.Components.Forms.ValidationMessageStore"/>.</returns>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Forms.ValidationMessageStore.Item(System.Linq.Expressions.Expression{System.Func{System.Object}})">
+ <summary>
+ Gets the validation messages within this <see cref="T:Microsoft.AspNetCore.Components.Forms.ValidationMessageStore"/> for the specified field.
+
+ To get the validation messages across all validation message stores, use <see cref="M:Microsoft.AspNetCore.Components.Forms.EditContext.GetValidationMessages(Microsoft.AspNetCore.Components.Forms.FieldIdentifier)"/> instead
+ </summary>
+ <param name="accessor">The identifier for the field.</param>
+ <returns>The validation messages for the specified field within this <see cref="T:Microsoft.AspNetCore.Components.Forms.ValidationMessageStore"/>.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.ValidationMessageStore.Clear">
+ <summary>
+ Removes all messages within this <see cref="T:Microsoft.AspNetCore.Components.Forms.ValidationMessageStore"/>.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.ValidationMessageStore.Clear(Microsoft.AspNetCore.Components.Forms.FieldIdentifier@)">
+ <summary>
+ Removes all messages within this <see cref="T:Microsoft.AspNetCore.Components.Forms.ValidationMessageStore"/> for the specified field.
+ </summary>
+ <param name="fieldIdentifier">The identifier for the field.</param>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.Forms.ValidationMessageStoreExpressionExtensions">
+ <summary>
+ Provides extension methods to simplify using <see cref="T:Microsoft.AspNetCore.Components.Forms.ValidationMessageStore"/> with expressions.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.ValidationMessageStoreExpressionExtensions.Add(Microsoft.AspNetCore.Components.Forms.ValidationMessageStore,System.Linq.Expressions.Expression{System.Func{System.Object}},System.String)">
+ <summary>
+ Adds a validation message for the specified field.
+ </summary>
+ <param name="store">The <see cref="T:Microsoft.AspNetCore.Components.Forms.ValidationMessageStore"/>.</param>
+ <param name="accessor">Identifies the field for which to add the message.</param>
+ <param name="message">The validation message.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.ValidationMessageStoreExpressionExtensions.AddRange(Microsoft.AspNetCore.Components.Forms.ValidationMessageStore,System.Linq.Expressions.Expression{System.Func{System.Object}},System.Collections.Generic.IEnumerable{System.String})">
+ <summary>
+ Adds the messages from the specified collection for the specified field.
+ </summary>
+ <param name="store">The <see cref="T:Microsoft.AspNetCore.Components.Forms.ValidationMessageStore"/>.</param>
+ <param name="accessor">Identifies the field for which to add the messages.</param>
+ <param name="messages">The validation messages to be added.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.ValidationMessageStoreExpressionExtensions.Clear(Microsoft.AspNetCore.Components.Forms.ValidationMessageStore,System.Linq.Expressions.Expression{System.Func{System.Object}})">
+ <summary>
+ Removes all messages within this <see cref="T:Microsoft.AspNetCore.Components.Forms.ValidationMessageStore"/> for the specified field.
+ </summary>
+ <param name="store">The <see cref="T:Microsoft.AspNetCore.Components.Forms.ValidationMessageStore"/>.</param>
+ <param name="accessor">Identifies the field for which to remove the messages.</param>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.Forms.ValidationRequestedEventArgs">
+ <summary>
+ Provides information about the <see cref="E:Microsoft.AspNetCore.Components.Forms.EditContext.OnValidationRequested"/> event.
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.Forms.ValidationStateChangedEventArgs">
+ <summary>
+ Provides information about the <see cref="E:Microsoft.AspNetCore.Components.Forms.EditContext.OnValidationStateChanged"/> event.
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.Forms.ValidationSummary">
+ <summary>
+ Displays a list of validation messages from a cascaded <see cref="T:Microsoft.AspNetCore.Components.Forms.EditContext"/>.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.ValidationSummary.#ctor">
+ <summary>`
+ Constructs an instance of <see cref="T:Microsoft.AspNetCore.Components.Forms.ValidationSummary"/>.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.ValidationSummary.OnParametersSet">
+ <inheritdoc />
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Forms.ValidationSummary.BuildRenderTree(Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder)">
+ <inheritdoc />
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.HttpClientJsonExtensions">
+ <summary>
+ Extension methods for working with JSON APIs.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.HttpClientJsonExtensions.GetJsonAsync``1(System.Net.Http.HttpClient,System.String)">
+ <summary>
+ Sends a GET request to the specified URI, and parses the JSON response body
+ to create an object of the generic type.
+ </summary>
+ <typeparam name="T">A type into which the response body can be JSON-deserialized.</typeparam>
+ <param name="httpClient">The <see cref="T:System.Net.Http.HttpClient"/>.</param>
+ <param name="requestUri">The URI that the request will be sent to.</param>
+ <returns>The response parsed as an object of the generic type.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.HttpClientJsonExtensions.PostJsonAsync(System.Net.Http.HttpClient,System.String,System.Object)">
+ <summary>
+ Sends a POST request to the specified URI, including the specified <paramref name="content"/>
+ in JSON-encoded format, and parses the JSON response body to create an object of the generic type.
+ </summary>
+ <param name="httpClient">The <see cref="T:System.Net.Http.HttpClient"/>.</param>
+ <param name="requestUri">The URI that the request will be sent to.</param>
+ <param name="content">Content for the request body. This will be JSON-encoded and sent as a string.</param>
+ <returns>The response parsed as an object of the generic type.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.HttpClientJsonExtensions.PostJsonAsync``1(System.Net.Http.HttpClient,System.String,System.Object)">
+ <summary>
+ Sends a POST request to the specified URI, including the specified <paramref name="content"/>
+ in JSON-encoded format, and parses the JSON response body to create an object of the generic type.
+ </summary>
+ <typeparam name="T">A type into which the response body can be JSON-deserialized.</typeparam>
+ <param name="httpClient">The <see cref="T:System.Net.Http.HttpClient"/>.</param>
+ <param name="requestUri">The URI that the request will be sent to.</param>
+ <param name="content">Content for the request body. This will be JSON-encoded and sent as a string.</param>
+ <returns>The response parsed as an object of the generic type.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.HttpClientJsonExtensions.PutJsonAsync(System.Net.Http.HttpClient,System.String,System.Object)">
+ <summary>
+ Sends a PUT request to the specified URI, including the specified <paramref name="content"/>
+ in JSON-encoded format.
+ </summary>
+ <param name="httpClient">The <see cref="T:System.Net.Http.HttpClient"/>.</param>
+ <param name="requestUri">The URI that the request will be sent to.</param>
+ <param name="content">Content for the request body. This will be JSON-encoded and sent as a string.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.HttpClientJsonExtensions.PutJsonAsync``1(System.Net.Http.HttpClient,System.String,System.Object)">
+ <summary>
+ Sends a PUT request to the specified URI, including the specified <paramref name="content"/>
+ in JSON-encoded format, and parses the JSON response body to create an object of the generic type.
+ </summary>
+ <typeparam name="T">A type into which the response body can be JSON-deserialized.</typeparam>
+ <param name="httpClient">The <see cref="T:System.Net.Http.HttpClient"/>.</param>
+ <param name="requestUri">The URI that the request will be sent to.</param>
+ <param name="content">Content for the request body. This will be JSON-encoded and sent as a string.</param>
+ <returns>The response parsed as an object of the generic type.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.HttpClientJsonExtensions.SendJsonAsync(System.Net.Http.HttpClient,System.Net.Http.HttpMethod,System.String,System.Object)">
+ <summary>
+ Sends an HTTP request to the specified URI, including the specified <paramref name="content"/>
+ in JSON-encoded format.
+ </summary>
+ <param name="httpClient">The <see cref="T:System.Net.Http.HttpClient"/>.</param>
+ <param name="method">The HTTP method.</param>
+ <param name="requestUri">The URI that the request will be sent to.</param>
+ <param name="content">Content for the request body. This will be JSON-encoded and sent as a string.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.HttpClientJsonExtensions.SendJsonAsync``1(System.Net.Http.HttpClient,System.Net.Http.HttpMethod,System.String,System.Object)">
+ <summary>
+ Sends an HTTP request to the specified URI, including the specified <paramref name="content"/>
+ in JSON-encoded format, and parses the JSON response body to create an object of the generic type.
+ </summary>
+ <typeparam name="T">A type into which the response body can be JSON-deserialized.</typeparam>
+ <param name="httpClient">The <see cref="T:System.Net.Http.HttpClient"/>.</param>
+ <param name="method">The HTTP method.</param>
+ <param name="requestUri">The URI that the request will be sent to.</param>
+ <param name="content">Content for the request body. This will be JSON-encoded and sent as a string.</param>
+ <returns>The response parsed as an object of the generic type.</returns>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.IComponent">
+ <summary>
+ Represents a UI component.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.IComponent.Configure(Microsoft.AspNetCore.Components.RenderHandle)">
+ <summary>
+ Initializes the component.
+ </summary>
+ <param name="renderHandle">A <see cref="T:Microsoft.AspNetCore.Components.RenderHandle"/> that allows the component to be rendered.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.IComponent.SetParametersAsync(Microsoft.AspNetCore.Components.ParameterCollection)">
+ <summary>
+ Sets parameters supplied by the component's parent in the render tree.
+ </summary>
+ <param name="parameters">The parameters.</param>
+ <returns>A <see cref="T:System.Threading.Tasks.Task"/> that completes when the component has finished updating and rendering itself.</returns>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.IHandleAfterRender">
+ <summary>
+ Interface implemented by components that receive notification that they have been rendered.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.IHandleAfterRender.OnAfterRenderAsync">
+ <summary>
+ Notifies the component that it has been rendered.
+ </summary>
+ <returns>A <see cref="T:System.Threading.Tasks.Task"/> that represents the asynchronous event handling operation.</returns>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.IHandleEvent">
+ <summary>
+ Interface implemented by components that receive notification of state changes.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.IHandleEvent.HandleEventAsync(Microsoft.AspNetCore.Components.EventCallbackWorkItem,System.Object)">
+ <summary>
+ Notifies the a state change has been triggered.
+ </summary>
+ <param name="item">The <see cref="T:Microsoft.AspNetCore.Components.EventCallbackWorkItem"/> associated with this event.</param>
+ <param name="arg">The argument associated with this event.</param>
+ <returns>
+ A <see cref="T:System.Threading.Tasks.Task"/> that completes once the component has processed the state change.
+ </returns>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.InjectAttribute">
+ <summary>
+ Indicates that the associated property should have a value injected from the
+ service provider during initialization.
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.Layouts.LayoutAttribute">
+ <summary>
+ Indicates that the associated component type uses a specified layout.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Layouts.LayoutAttribute.LayoutType">
+ <summary>
+ The type of the layout. The type myst implement <see cref="T:Microsoft.AspNetCore.Components.IComponent"/>
+ and must accept a parameter with the name 'Body'.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Layouts.LayoutAttribute.#ctor(System.Type)">
+ <summary>
+ Constructs an instance of <see cref="T:Microsoft.AspNetCore.Components.Layouts.LayoutAttribute"/>.
+ </summary>
+ <param name="layoutType">The type of the layout.</param>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.Layouts.LayoutComponentBase">
+ <summary>
+ Optional base class for components that represent a layout.
+ Alternatively, components may implement <see cref="T:Microsoft.AspNetCore.Components.IComponent"/> directly
+ and declare their own parameter named <see cref="P:Microsoft.AspNetCore.Components.Layouts.LayoutComponentBase.Body"/>.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Layouts.LayoutComponentBase.Body">
+ <summary>
+ Gets the content to be rendered inside the layout.
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.Layouts.LayoutDisplay">
+ <summary>
+ Displays the specified page component, rendering it inside its layout
+ and any further nested layouts.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Layouts.LayoutDisplay.Page">
+ <summary>
+ Gets or sets the type of the page component to display.
+ The type must implement <see cref="T:Microsoft.AspNetCore.Components.IComponent"/>.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Layouts.LayoutDisplay.PageParameters">
+ <summary>
+ Gets or sets the parameters to pass to the page.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Layouts.LayoutDisplay.Configure(Microsoft.AspNetCore.Components.RenderHandle)">
+ <inheritdoc />
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Layouts.LayoutDisplay.SetParametersAsync(Microsoft.AspNetCore.Components.ParameterCollection)">
+ <inheritdoc />
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.MarkupString">
+ <summary>
+ A string value that can be rendered as markup such as HTML.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.MarkupString.#ctor(System.String)">
+ <summary>
+ Constructs an instance of <see cref="T:Microsoft.AspNetCore.Components.MarkupString"/>.
+ </summary>
+ <param name="value">The value for the new instance.</param>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.MarkupString.Value">
+ <summary>
+ Gets the value of the <see cref="T:Microsoft.AspNetCore.Components.MarkupString"/>.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.MarkupString.op_Explicit(System.String)~Microsoft.AspNetCore.Components.MarkupString">
+ <summary>
+ Casts a <see cref="T:System.String"/> to a <see cref="T:Microsoft.AspNetCore.Components.MarkupString"/>.
+ </summary>
+ <param name="value">The <see cref="T:System.String"/> value.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.MarkupString.ToString">
+ <inheritdoc />
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.Parameter">
+ <summary>
+ Represents a single parameter supplied to an <see cref="T:Microsoft.AspNetCore.Components.IComponent"/>
+ by its parent in the render tree.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Parameter.Name">
+ <summary>
+ Gets the name of the parameter.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Parameter.Value">
+ <summary>
+ Gets the value being supplied for the parameter.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Parameter.Cascading">
+ <summary>
+ Gets a value to indicate whether the parameter is cascading, meaning that it
+ was supplied by a <see cref="T:Microsoft.AspNetCore.Components.CascadingValue`1"/>.
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.ParameterAttribute">
+ <summary>
+ Denotes the target member as a component parameter.
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.ParameterCollection">
+ <summary>
+ Represents a collection of parameters supplied to an <see cref="T:Microsoft.AspNetCore.Components.IComponent"/>
+ by its parent in the render tree.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.ParameterCollection.Empty">
+ <summary>
+ Gets an empty <see cref="T:Microsoft.AspNetCore.Components.ParameterCollection"/>.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.ParameterCollection.GetEnumerator">
+ <summary>
+ Returns an enumerator that iterates through the <see cref="T:Microsoft.AspNetCore.Components.ParameterCollection"/>.
+ </summary>
+ <returns>The enumerator.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.ParameterCollection.TryGetValue``1(System.String,``0@)">
+ <summary>
+ Gets the value of the parameter with the specified name.
+ </summary>
+ <typeparam name="T">The type of the value.</typeparam>
+ <param name="parameterName">The name of the parameter.</param>
+ <param name="result">Receives the result, if any.</param>
+ <returns>True if a matching parameter was found; false otherwise.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.ParameterCollection.GetValueOrDefault``1(System.String)">
+ <summary>
+ Gets the value of the parameter with the specified name, or a default value
+ if no such parameter exists in the collection.
+ </summary>
+ <typeparam name="T">The type of the value.</typeparam>
+ <param name="parameterName">The name of the parameter.</param>
+ <returns>The parameter value if found; otherwise the default value for the specified type.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.ParameterCollection.GetValueOrDefault``1(System.String,``0)">
+ <summary>
+ Gets the value of the parameter with the specified name, or a specified default value
+ if no such parameter exists in the collection.
+ </summary>
+ <typeparam name="T">The type of the value.</typeparam>
+ <param name="parameterName">The name of the parameter.</param>
+ <param name="defaultValue">The default value to return if no such parameter exists in the collection.</param>
+ <returns>The parameter value if found; otherwise <paramref name="defaultValue"/>.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.ParameterCollection.ToDictionary">
+ <summary>
+ Returns a dictionary populated with the contents of the <see cref="T:Microsoft.AspNetCore.Components.ParameterCollection"/>.
+ </summary>
+ <returns>A dictionary populated with the contents of the <see cref="T:Microsoft.AspNetCore.Components.ParameterCollection"/>.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.ParameterCollection.FromDictionary(System.Collections.Generic.IDictionary{System.String,System.Object})">
+ <summary>
+ Creates a new <see cref="T:Microsoft.AspNetCore.Components.ParameterCollection"/> from the given <see cref="T:System.Collections.Generic.IDictionary`2"/>.
+ </summary>
+ <param name="parameters">The <see cref="T:System.Collections.Generic.IDictionary`2"/> with the parameters.</param>
+ <returns>A <see cref="T:Microsoft.AspNetCore.Components.ParameterCollection"/>.</returns>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.ParameterCollectionExtensions">
+ <summary>
+ Extension methods for the <see cref="T:Microsoft.AspNetCore.Components.ParameterCollection"/> type.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.ParameterCollectionExtensions.SetParameterProperties(Microsoft.AspNetCore.Components.ParameterCollection@,System.Object)">
+ <summary>
+ For each parameter property on <paramref name="target"/>, updates its value to
+ match the corresponding entry in the <see cref="T:Microsoft.AspNetCore.Components.ParameterCollection"/>.
+ </summary>
+ <param name="parameterCollection">The <see cref="T:Microsoft.AspNetCore.Components.ParameterCollection"/>.</param>
+ <param name="target">An object that has a public writable property matching each parameter's name and type.</param>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.ParameterEnumerator">
+ <summary>
+ An enumerator that iterates through a <see cref="T:Microsoft.AspNetCore.Components.ParameterCollection"/>.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.ParameterEnumerator.Current">
+ <summary>
+ Gets the current value of the enumerator.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.ParameterEnumerator.MoveNext">
+ <summary>
+ Instructs the enumerator to move to the next value in the sequence.
+ </summary>
+ <returns>A flag to indicate whether or not there is a next value.</returns>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.RenderFragment">
+ <summary>
+ Represents a segment of UI content, implemented as a delegate that
+ writes the content to a <see cref="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder"/>.
+ </summary>
+ <param name="builder">The <see cref="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder"/> to which the content should be written.</param>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.RenderFragment`1">
+ <summary>
+ Represents a segment of UI content for an object of type <typeparamref name="T"/>, implemented as
+ a function that returns a <see cref="T:Microsoft.AspNetCore.Components.RenderFragment"/>.
+ </summary>
+ <typeparam name="T">The type of object.</typeparam>
+ <param name="value">The value used to build the content.</param>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.RenderHandle">
+ <summary>
+ Allows a component to notify the renderer that it should be rendered.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.RenderHandle.IsInitialized">
+ <summary>
+ Gets a value that indicates whether the <see cref="T:Microsoft.AspNetCore.Components.RenderHandle"/> has been
+ initialised and is ready to use.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderHandle.Render(Microsoft.AspNetCore.Components.RenderFragment)">
+ <summary>
+ Notifies the renderer that the component should be rendered.
+ </summary>
+ <param name="renderFragment">The content that should be rendered.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderHandle.Invoke(System.Action)">
+ <summary>
+ Executes the supplied work item on the renderer's
+ synchronization context.
+ </summary>
+ <param name="workItem">The work item to execute.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderHandle.InvokeAsync(System.Func{System.Threading.Tasks.Task})">
+ <summary>
+ Executes the supplied work item on the renderer's
+ synchronization context.
+ </summary>
+ <param name="workItem">The work item to execute.</param>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.Rendering.ComponentState">
+ <summary>
+ Tracks the rendering state associated with an <see cref="T:Microsoft.AspNetCore.Components.IComponent"/> instance
+ within the context of a <see cref="T:Microsoft.AspNetCore.Components.Rendering.Renderer"/>. This is an internal implementation
+ detail of <see cref="T:Microsoft.AspNetCore.Components.Rendering.Renderer"/>.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Rendering.ComponentState.#ctor(Microsoft.AspNetCore.Components.Rendering.Renderer,System.Int32,Microsoft.AspNetCore.Components.IComponent,Microsoft.AspNetCore.Components.Rendering.ComponentState)">
+ <summary>
+ Constructs an instance of <see cref="T:Microsoft.AspNetCore.Components.Rendering.ComponentState"/>.
+ </summary>
+ <param name="renderer">The <see cref="T:Microsoft.AspNetCore.Components.Rendering.Renderer"/> with which the new instance should be associated.</param>
+ <param name="componentId">The externally visible identifier for the <see cref="T:Microsoft.AspNetCore.Components.IComponent"/>. The identifier must be unique in the context of the <see cref="T:Microsoft.AspNetCore.Components.Rendering.Renderer"/>.</param>
+ <param name="component">The <see cref="T:Microsoft.AspNetCore.Components.IComponent"/> whose state is being tracked.</param>
+ <param name="parentComponentState">The <see cref="T:Microsoft.AspNetCore.Components.Rendering.ComponentState"/> for the parent component, or null if this is a root component.</param>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.Rendering.HtmlRenderer">
+ <summary>
+ A <see cref="T:Microsoft.AspNetCore.Components.Rendering.Renderer"/> that produces HTML.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Rendering.HtmlRenderer.#ctor(System.IServiceProvider,System.Func{System.String,System.String},Microsoft.AspNetCore.Components.Rendering.IDispatcher)">
+ <summary>
+ Initializes a new instance of <see cref="T:Microsoft.AspNetCore.Components.Rendering.HtmlRenderer"/>.
+ </summary>
+ <param name="serviceProvider">The <see cref="T:System.IServiceProvider"/> to use to instantiate components.</param>
+ <param name="htmlEncoder">A <see cref="T:System.Func`2"/> that will HTML encode the given string.</param>
+ <param name="dispatcher"></param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Rendering.HtmlRenderer.UpdateDisplayAsync(Microsoft.AspNetCore.Components.Rendering.RenderBatch@)">
+ <inheritdoc />
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Rendering.HtmlRenderer.RenderComponentAsync(System.Type,Microsoft.AspNetCore.Components.ParameterCollection)">
+ <summary>
+ Renders a component into a sequence of <see cref="T:System.String"/> fragments that represent the textual representation
+ of the HTML produced by the component.
+ </summary>
+ <param name="componentType">The type of the <see cref="T:Microsoft.AspNetCore.Components.IComponent"/>.</param>
+ <param name="initialParameters">A <see cref="T:Microsoft.AspNetCore.Components.ParameterCollection"/> with the initial parameters to render the component.</param>
+ <returns>A <see cref="T:System.Threading.Tasks.Task"/> that on completion returns a sequence of <see cref="T:System.String"/> fragments that represent the HTML text of the component.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Rendering.HtmlRenderer.RenderComponentAsync``1(Microsoft.AspNetCore.Components.ParameterCollection)">
+ <summary>
+ Renders a component into a sequence of <see cref="T:System.String"/> fragments that represent the textual representation
+ of the HTML produced by the component.
+ </summary>
+ <typeparam name="TComponent">The type of the <see cref="T:Microsoft.AspNetCore.Components.IComponent"/>.</typeparam>
+ <param name="initialParameters">A <see cref="T:Microsoft.AspNetCore.Components.ParameterCollection"/> with the initial parameters to render the component.</param>
+ <returns>A <see cref="T:System.Threading.Tasks.Task"/> that on completion returns a sequence of <see cref="T:System.String"/> fragments that represent the HTML text of the component.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Rendering.HtmlRenderer.HandleException(System.Exception)">
+ <inheritdoc />
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.Rendering.IDispatcher">
+ <summary>
+ Dispatches external actions to be executed on the context of a <see cref="T:Microsoft.AspNetCore.Components.Rendering.Renderer"/>.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Rendering.IDispatcher.Invoke(System.Action)">
+ <summary>
+ Invokes the given <see cref="T:System.Action"/> in the context of the associated <see cref="T:Microsoft.AspNetCore.Components.Rendering.Renderer"/>.
+ </summary>
+ <param name="action">The action to execute.</param>
+ <returns>A <see cref="T:System.Threading.Tasks.Task"/> that will be completed when the action has finished executing.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Rendering.IDispatcher.InvokeAsync(System.Func{System.Threading.Tasks.Task})">
+ <summary>
+ Invokes the given <see cref="T:System.Func`1"/> in the context of the associated <see cref="T:Microsoft.AspNetCore.Components.Rendering.Renderer"/>.
+ </summary>
+ <param name="asyncAction">The asynchronous action to execute.</param>
+ <returns>A <see cref="T:System.Threading.Tasks.Task"/> that will be completed when the action has finished executing.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Rendering.IDispatcher.Invoke``1(System.Func{``0})">
+ <summary>
+ Invokes the given <see cref="T:System.Func`1"/> in the context of the associated <see cref="T:Microsoft.AspNetCore.Components.Rendering.Renderer"/>.
+ </summary>
+ <param name="function">The function to execute.</param>
+ <returns>A <see cref="T:System.Threading.Tasks.Task`1"/> that will be completed when the function has finished executing.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Rendering.IDispatcher.InvokeAsync``1(System.Func{System.Threading.Tasks.Task{``0}})">
+ <summary>
+ Invokes the given <see cref="T:System.Func`1"/> in the context of the associated <see cref="T:Microsoft.AspNetCore.Components.Rendering.Renderer"/>.
+ </summary>
+ <param name="asyncFunction">The asynchronous function to execute.</param>
+ <returns>A <see cref="T:System.Threading.Tasks.Task`1"/> that will be completed when the function has finished executing.</returns>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.Rendering.RenderBatch">
+ <summary>
+ Describes a set of UI changes.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Rendering.RenderBatch.UpdatedComponents">
+ <summary>
+ Gets the changes to components that were added or updated.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Rendering.RenderBatch.ReferenceFrames">
+ <summary>
+ Gets render frames that may be referenced by entries in <see cref="P:Microsoft.AspNetCore.Components.Rendering.RenderBatch.UpdatedComponents"/>.
+ For example, edit entries of type <see cref="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeEditType.PrependFrame"/>
+ will point to an entry in this array to specify the subtree to be prepended.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Rendering.RenderBatch.DisposedComponentIDs">
+ <summary>
+ Gets the IDs of the components that were disposed.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Rendering.RenderBatch.DisposedEventHandlerIDs">
+ <summary>
+ Gets the IDs of the event handlers that were disposed.
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.Rendering.RenderBatchBuilder">
+ <summary>
+ Collects the data produced by the rendering system during the course
+ of rendering a single batch. This tracks both the final output data
+ and the intermediate states (such as the queue of components still to
+ be rendered).
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.Rendering.Renderer">
+ <summary>
+ Provides mechanisms for rendering hierarchies of <see cref="T:Microsoft.AspNetCore.Components.IComponent"/> instances,
+ dispatching events to them, and notifying when the user interface is being updated.
+ </summary>
+ </member>
+ <member name="E:Microsoft.AspNetCore.Components.Rendering.Renderer.UnhandledSynchronizationException">
+ <summary>
+ Allows the caller to handle exceptions from the SynchronizationContext when one is available.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Rendering.Renderer.#ctor(System.IServiceProvider)">
+ <summary>
+ Constructs an instance of <see cref="T:Microsoft.AspNetCore.Components.Rendering.Renderer"/>.
+ </summary>
+ <param name="serviceProvider">The <see cref="T:System.IServiceProvider"/> to be used when initializing components.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Rendering.Renderer.#ctor(System.IServiceProvider,Microsoft.AspNetCore.Components.Rendering.IDispatcher)">
+ <summary>
+ Constructs an instance of <see cref="T:Microsoft.AspNetCore.Components.Rendering.Renderer"/>.
+ </summary>
+ <param name="serviceProvider">The <see cref="T:System.IServiceProvider"/> to be used when initializing components.</param>
+ <param name="dispatcher">The <see cref="T:Microsoft.AspNetCore.Components.Rendering.IDispatcher"/> to be for invoking user actions into the <see cref="T:Microsoft.AspNetCore.Components.Rendering.Renderer"/> context.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Rendering.Renderer.CreateDefaultDispatcher">
+ <summary>
+ Creates an <see cref="T:Microsoft.AspNetCore.Components.Rendering.IDispatcher"/> that can be used with one or more <see cref="T:Microsoft.AspNetCore.Components.Rendering.Renderer"/>.
+ </summary>
+ <returns>The <see cref="T:Microsoft.AspNetCore.Components.Rendering.IDispatcher"/>.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Rendering.Renderer.InstantiateComponent(System.Type)">
+ <summary>
+ Constructs a new component of the specified type.
+ </summary>
+ <param name="componentType">The type of the component to instantiate.</param>
+ <returns>The component instance.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Rendering.Renderer.AssignRootComponentId(Microsoft.AspNetCore.Components.IComponent)">
+ <summary>
+ Associates the <see cref="T:Microsoft.AspNetCore.Components.IComponent"/> with the <see cref="T:Microsoft.AspNetCore.Components.Rendering.Renderer"/>, assigning
+ an identifier that is unique within the scope of the <see cref="T:Microsoft.AspNetCore.Components.Rendering.Renderer"/>.
+ </summary>
+ <param name="component">The component.</param>
+ <returns>The component's assigned identifier.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Rendering.Renderer.GetCurrentRenderTreeFrames(System.Int32)">
+ <summary>
+ Gets the current render tree for a given component.
+ </summary>
+ <param name="componentId">The id for the component.</param>
+ <returns>The <see cref="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder"/> representing the current render tree.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Rendering.Renderer.RenderRootComponentAsync(System.Int32)">
+ <summary>
+ Performs the first render for a root component, waiting for this component and all
+ children components to finish rendering in case there is any asynchronous work being
+ done by any of the components. After this, the root component
+ makes its own decisions about when to re-render, so there is no need to call
+ this more than once.
+ </summary>
+ <param name="componentId">The ID returned by <see cref="M:Microsoft.AspNetCore.Components.Rendering.Renderer.AssignRootComponentId(Microsoft.AspNetCore.Components.IComponent)"/>.</param>
+ <remarks>
+ Rendering a root component is an asynchronous operation. Clients may choose to not await the returned task to
+ start, but not wait for the entire render to complete.
+ </remarks>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Rendering.Renderer.RenderRootComponentAsync(System.Int32,Microsoft.AspNetCore.Components.ParameterCollection)">
+ <summary>
+ Performs the first render for a root component, waiting for this component and all
+ children components to finish rendering in case there is any asynchronous work being
+ done by any of the components. After this, the root component
+ makes its own decisions about when to re-render, so there is no need to call
+ this more than once.
+ </summary>
+ <param name="componentId">The ID returned by <see cref="M:Microsoft.AspNetCore.Components.Rendering.Renderer.AssignRootComponentId(Microsoft.AspNetCore.Components.IComponent)"/>.</param>
+ <param name="initialParameters">The <see cref="T:Microsoft.AspNetCore.Components.ParameterCollection"/>with the initial parameters to use for rendering.</param>
+ <remarks>
+ Rendering a root component is an asynchronous operation. Clients may choose to not await the returned task to
+ start, but not wait for the entire render to complete.
+ </remarks>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Rendering.Renderer.HandleException(System.Exception)">
+ <summary>
+ Allows derived types to handle exceptions during rendering. Defaults to rethrowing the original exception.
+ </summary>
+ <param name="exception">The <see cref="T:System.Exception"/>.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Rendering.Renderer.UpdateDisplayAsync(Microsoft.AspNetCore.Components.Rendering.RenderBatch@)">
+ <summary>
+ Updates the visible UI.
+ </summary>
+ <param name="renderBatch">The changes to the UI since the previous call.</param>
+ <returns>A <see cref="T:System.Threading.Tasks.Task"/> to represent the UI update process.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Rendering.Renderer.DispatchEventAsync(System.Int32,Microsoft.AspNetCore.Components.UIEventArgs)">
+ <summary>
+ Notifies the renderer that an event has occurred.
+ </summary>
+ <param name="eventHandlerId">The <see cref="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.AttributeEventHandlerId"/> value from the original event attribute.</param>
+ <param name="eventArgs">Arguments to be passed to the event handler.</param>
+ <returns>
+ A <see cref="T:System.Threading.Tasks.Task"/> which will complete once all asynchronous processing related to the event
+ has completed.
+ </returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Rendering.Renderer.Invoke(System.Action)">
+ <summary>
+ Executes the supplied work item on the renderer's
+ synchronization context.
+ </summary>
+ <param name="workItem">The work item to execute.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Rendering.Renderer.InvokeAsync(System.Func{System.Threading.Tasks.Task})">
+ <summary>
+ Executes the supplied work item on the renderer's
+ synchronization context.
+ </summary>
+ <param name="workItem">The work item to execute.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Rendering.Renderer.AddToRenderQueue(System.Int32,Microsoft.AspNetCore.Components.RenderFragment)">
+ <summary>
+ Schedules a render for the specified <paramref name="componentId"/>. Its display
+ will be populated using the specified <paramref name="renderFragment"/>.
+ </summary>
+ <param name="componentId">The ID of the component to render.</param>
+ <param name="renderFragment">A <see cref="T:Microsoft.AspNetCore.Components.RenderFragment"/> that will supply the updated UI contents.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Rendering.Renderer.Dispose(System.Boolean)">
+ <summary>
+ Releases all resources currently used by this <see cref="T:Microsoft.AspNetCore.Components.Rendering.Renderer"/> instance.
+ </summary>
+ <param name="disposing"><see langword="true"/> if this method is being invoked by <see cref="M:System.IDisposable.Dispose"/>, otherwise <see langword="false"/>.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Rendering.Renderer.Dispose">
+ <summary>
+ Releases all resources currently used by this <see cref="T:Microsoft.AspNetCore.Components.Rendering.Renderer"/> instance.
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.RenderTree.ArrayBuilder`1">
+ <summary>
+ Implements a list that uses an array of objects to store the elements.
+
+ This differs from a <see cref="T:System.Collections.Generic.List`1"/> in that
+ it not only grows as required but also shrinks if cleared with significant
+ excess capacity. This makes it useful for component rendering, because
+ components can be long-lived and re-render frequently, with the rendered size
+ varying dramatically depending on the user's navigation in the app.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderTree.ArrayBuilder`1.#ctor">
+ <summary>
+ Constructs a new instance of <see cref="T:Microsoft.AspNetCore.Components.RenderTree.ArrayBuilder`1"/>.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderTree.ArrayBuilder`1.#ctor(System.Int32)">
+ <summary>
+ Constructs a new instance of <see cref="T:Microsoft.AspNetCore.Components.RenderTree.ArrayBuilder`1"/>.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.RenderTree.ArrayBuilder`1.Count">
+ <summary>
+ Gets the number of items.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.RenderTree.ArrayBuilder`1.Buffer">
+ <summary>
+ Gets the underlying buffer.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderTree.ArrayBuilder`1.Append(`0@)">
+ <summary>
+ Appends a new item, automatically resizing the underlying array if necessary.
+ </summary>
+ <param name="item">The item to append.</param>
+ <returns>The index of the appended item.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderTree.ArrayBuilder`1.Overwrite(System.Int32,`0@)">
+ <summary>
+ Sets the supplied value at the specified index. The index must be within
+ range for the array.
+ </summary>
+ <param name="index">The index.</param>
+ <param name="value">The value.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderTree.ArrayBuilder`1.RemoveLast">
+ <summary>
+ Removes the last item.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderTree.ArrayBuilder`1.Clear">
+ <summary>
+ Marks the array as empty, also shrinking the underlying storage if it was
+ not being used to near its full capacity.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderTree.ArrayBuilder`1.ToRange">
+ <summary>
+ Produces an <see cref="T:Microsoft.AspNetCore.Components.RenderTree.ArrayRange`1"/> structure describing the current contents.
+ </summary>
+ <returns>The <see cref="T:Microsoft.AspNetCore.Components.RenderTree.ArrayRange`1"/>.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderTree.ArrayBuilder`1.ToSegment(System.Int32,System.Int32)">
+ <summary>
+ Produces an <see cref="T:System.ArraySegment`1"/> structure describing the selected contents.
+ </summary>
+ <param name="fromIndexInclusive">The index of the first item in the segment.</param>
+ <param name="toIndexExclusive">One plus the index of the last item in the segment.</param>
+ <returns>The <see cref="T:System.ArraySegment`1"/>.</returns>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.RenderTree.ArrayRange`1">
+ <summary>
+ Represents a range of elements in an array that are in use.
+ </summary>
+ <typeparam name="T">The array item type.</typeparam>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.ArrayRange`1.Array">
+ <summary>
+ Gets the underlying array instance.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.ArrayRange`1.Count">
+ <summary>
+ Gets the number of items in the array that are considered to be in use.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderTree.ArrayRange`1.#ctor(`0[],System.Int32)">
+ <summary>
+ Constructs an instance of <see cref="T:Microsoft.AspNetCore.Components.RenderTree.ArrayRange`1"/>.
+ </summary>
+ <param name="array">The array.</param>
+ <param name="count">The number of items in the array that are in use.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderTree.ArrayRange`1.System#Collections#Generic#IEnumerable{T}#GetEnumerator">
+ <inheritdoc />
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderTree.ArrayRange`1.System#Collections#IEnumerable#GetEnumerator">
+ <inheritdoc />
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderTree.ArrayRange`1.Clone">
+ <summary>
+ Creates a shallow clone of the instance.
+ </summary>
+ <returns></returns>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder">
+ <summary>
+ Provides methods for building a collection of <see cref="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame"/> entries.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder.ChildContent">
+ <summary>
+ The reserved parameter name used for supplying child content.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder.#ctor(Microsoft.AspNetCore.Components.Rendering.Renderer)">
+ <summary>
+ Constructs an instance of <see cref="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder"/>.
+ </summary>
+ <param name="renderer">The associated <see cref="T:Microsoft.AspNetCore.Components.Rendering.Renderer"/>.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder.OpenElement(System.Int32,System.String)">
+ <summary>
+ Appends a frame representing an element, i.e., a container for other frames.
+ In order for the <see cref="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder"/> state to be valid, you must
+ also call <see cref="M:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder.CloseElement"/> immediately after appending the
+ new element's child frames.
+ </summary>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="elementName">A value representing the type of the element.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder.CloseElement">
+ <summary>
+ Marks a previously appended element frame as closed. Calls to this method
+ must be balanced with calls to <see cref="M:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder.OpenElement(System.Int32,System.String)"/>.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder.AddMarkupContent(System.Int32,System.String)">
+ <summary>
+ Appends a frame representing markup content.
+ </summary>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="markupContent">Content for the new markup frame.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder.AddContent(System.Int32,System.String)">
+ <summary>
+ Appends a frame representing text content.
+ </summary>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="textContent">Content for the new text frame.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder.AddContent(System.Int32,Microsoft.AspNetCore.Components.RenderFragment)">
+ <summary>
+ Appends frames representing an arbitrary fragment of content.
+ </summary>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="fragment">Content to append.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder.AddContent``1(System.Int32,Microsoft.AspNetCore.Components.RenderFragment{``0},``0)">
+ <summary>
+ Appends frames representing an arbitrary fragment of content.
+ </summary>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="fragment">Content to append.</param>
+ <param name="value">The value used by <paramref name="fragment"/>.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder.AddContent(System.Int32,Microsoft.AspNetCore.Components.MarkupString)">
+ <summary>
+ Appends a frame representing markup content.
+ </summary>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="markupContent">Content for the new markup frame.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder.AddContent(System.Int32,System.Object)">
+ <summary>
+ Appends a frame representing text content.
+ </summary>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="textContent">Content for the new text frame.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder.AddAttribute(System.Int32,System.String,System.Boolean)">
+ <summary>
+ <para>
+ Appends a frame representing a bool-valued attribute.
+ </para>
+ <para>
+ The attribute is associated with the most recently added element. If the value is <c>false</c> and the
+ current element is not a component, the frame will be omitted.
+ </para>
+ </summary>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="name">The name of the attribute.</param>
+ <param name="value">The value of the attribute.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder.AddAttribute(System.Int32,System.String,System.String)">
+ <summary>
+ <para>
+ Appends a frame representing a string-valued attribute.
+ </para>
+ <para>
+ The attribute is associated with the most recently added element. If the value is <c>null</c> and the
+ current element is not a component, the frame will be omitted.
+ </para>
+ </summary>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="name">The name of the attribute.</param>
+ <param name="value">The value of the attribute.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder.AddAttribute(System.Int32,System.String,System.Action)">
+ <summary>
+ <para>
+ Appends a frame representing an <see cref="T:System.Action"/>-valued attribute.
+ </para>
+ <para>
+ The attribute is associated with the most recently added element. If the value is <c>null</c> and the
+ current element is not a component, the frame will be omitted.
+ </para>
+ </summary>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="name">The name of the attribute.</param>
+ <param name="value">The value of the attribute.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder.AddAttribute(System.Int32,System.String,System.Action{Microsoft.AspNetCore.Components.UIEventArgs})">
+ <summary>
+ <para>
+ Appends a frame representing an <see cref="T:System.Action`1"/>-valued attribute.
+ </para>
+ <para>
+ The attribute is associated with the most recently added element. If the value is <c>null</c> and the
+ current element is not a component, the frame will be omitted.
+ </para>
+ </summary>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="name">The name of the attribute.</param>
+ <param name="value">The value of the attribute.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder.AddAttribute(System.Int32,System.String,System.Func{System.Threading.Tasks.Task})">
+ <summary>
+ <para>
+ Appends a frame representing a <see cref="T:System.Func`1"/>-valued attribute.
+ </para>
+ <para>
+ The attribute is associated with the most recently added element. If the value is <c>null</c> and the
+ current element is not a component, the frame will be omitted.
+ </para>
+ </summary>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="name">The name of the attribute.</param>
+ <param name="value">The value of the attribute.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder.AddAttribute(System.Int32,System.String,System.Func{Microsoft.AspNetCore.Components.UIEventArgs,System.Threading.Tasks.Task})">
+ <summary>
+ <para>
+ Appends a frame representing a <see cref="T:System.Func`2"/>-valued attribute.
+ </para>
+ <para>
+ The attribute is associated with the most recently added element. If the value is <c>null</c> and the
+ current element is not a component, the frame will be omitted.
+ </para>
+ </summary>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="name">The name of the attribute.</param>
+ <param name="value">The value of the attribute.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder.AddAttribute(System.Int32,System.String,System.MulticastDelegate)">
+ <summary>
+ <para>
+ Appends a frame representing a delegate-valued attribute.
+ </para>
+ <para>
+ The attribute is associated with the most recently added element. If the value is <c>null</c> and the
+ current element is not a component, the frame will be omitted.
+ </para>
+ </summary>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="name">The name of the attribute.</param>
+ <param name="value">The value of the attribute.</param>
+ <remarks>
+ This method is provided for infrastructure purposes, and is used to be
+ <see cref="T:Microsoft.AspNetCore.Components.UIEventArgsRenderTreeBuilderExtensions"/> to provide support for delegates of specific
+ types. For a good programming experience when using a custom delegate type, define an
+ extension method similar to
+ <see cref="M:Microsoft.AspNetCore.Components.UIEventArgsRenderTreeBuilderExtensions.AddAttribute(Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder,System.Int32,System.String,System.Action{Microsoft.AspNetCore.Components.UIChangeEventArgs})"/>
+ that calls this method.
+ </remarks>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder.AddAttribute(System.Int32,System.String,Microsoft.AspNetCore.Components.EventCallback)">
+ <summary>
+ <para>
+ Appends a frame representing an <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/> attribute.
+ </para>
+ <para>
+ The attribute is associated with the most recently added element. If the value is <c>null</c> and the
+ current element is not a component, the frame will be omitted.
+ </para>
+ </summary>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="name">The name of the attribute.</param>
+ <param name="value">The value of the attribute.</param>
+ <remarks>
+ This method is provided for infrastructure purposes, and is used to support generated code
+ that uses <see cref="T:Microsoft.AspNetCore.Components.EventCallbackFactory"/>.
+ </remarks>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder.AddAttribute``1(System.Int32,System.String,Microsoft.AspNetCore.Components.EventCallback{``0})">
+ <summary>
+ <para>
+ Appends a frame representing an <see cref="T:Microsoft.AspNetCore.Components.EventCallback"/> attribute.
+ </para>
+ <para>
+ The attribute is associated with the most recently added element. If the value is <c>null</c> and the
+ current element is not a component, the frame will be omitted.
+ </para>
+ </summary>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="name">The name of the attribute.</param>
+ <param name="value">The value of the attribute.</param>
+ <remarks>
+ This method is provided for infrastructure purposes, and is used to support generated code
+ that uses <see cref="T:Microsoft.AspNetCore.Components.EventCallbackFactory"/>.
+ </remarks>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder.AddAttribute(System.Int32,System.String,System.Object)">
+ <summary>
+ Appends a frame representing a string-valued attribute.
+ The attribute is associated with the most recently added element. If the value is <c>null</c>, or
+ the <see cref="T:System.Boolean" /> value <c>false</c> and the current element is not a component, the
+ frame will be omitted.
+ </summary>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="name">The name of the attribute.</param>
+ <param name="value">The value of the attribute.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder.AddAttribute(System.Int32,Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame@)">
+ <summary>
+ <para>
+ Appends a frame representing an attribute.
+ </para>
+ <para>
+ The attribute is associated with the most recently added element.
+ </para>
+ </summary>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="frame">A <see cref="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame"/> holding the name and value of the attribute.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder.OpenComponent``1(System.Int32)">
+ <summary>
+ Appends a frame representing a child component.
+ </summary>
+ <typeparam name="TComponent">The type of the child component.</typeparam>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder.OpenComponent(System.Int32,System.Type)">
+ <summary>
+ Appends a frame representing a child component.
+ </summary>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="componentType">The type of the child component.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder.CloseComponent">
+ <summary>
+ Marks a previously appended component frame as closed. Calls to this method
+ must be balanced with calls to <see cref="M:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder.OpenComponent``1(System.Int32)"/>.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder.AddElementReferenceCapture(System.Int32,System.Action{Microsoft.AspNetCore.Components.ElementRef})">
+ <summary>
+ Appends a frame representing an instruction to capture a reference to the parent element.
+ </summary>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="elementReferenceCaptureAction">An action to be invoked whenever the reference value changes.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder.AddComponentReferenceCapture(System.Int32,System.Action{System.Object})">
+ <summary>
+ Appends a frame representing an instruction to capture a reference to the parent component.
+ </summary>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="componentReferenceCaptureAction">An action to be invoked whenever the reference value changes.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder.Clear">
+ <summary>
+ Clears the builder.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder.GetFrames">
+ <summary>
+ Returns the <see cref="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame"/> values that have been appended.
+ </summary>
+ <returns>An array range of <see cref="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame"/> values.</returns>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiff">
+ <summary>
+ Describes changes to a component's render tree between successive renders.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiff.ComponentId">
+ <summary>
+ Gets the ID of the component.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiff.Edits">
+ <summary>
+ Gets the changes to the render tree since a previous state.
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.DiffContext">
+ <summary>
+ Exists only so that the various methods in this class can call each other without
+ constantly building up long lists of parameters. Is private to this class, so the
+ fact that it's a mutable struct is manageable.
+
+ Always pass by ref to avoid copying, and because the 'SiblingIndex' is mutable.
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeEdit">
+ <summary>
+ Represents a single edit operation on a component's render tree.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeEdit.Type">
+ <summary>
+ Gets the type of the edit operation.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeEdit.SiblingIndex">
+ <summary>
+ Gets the index of the sibling frame that the edit relates to.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeEdit.ReferenceFrameIndex">
+ <summary>
+ Gets the index of related data in an associated render frames array. For example, if the
+ <see cref="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeEdit.Type"/> value is <see cref="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeEditType.PrependFrame"/>, gets the
+ index of the new frame data in an associated render tree.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeEdit.RemovedAttributeName">
+ <summary>
+ If the <see cref="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeEdit.Type"/> value is <see cref="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeEditType.RemoveAttribute"/>,
+ gets the name of the attribute that is being removed.
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeEditType">
+ <summary>
+ Describes the type of a render tree edit operation.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeEditType.PrependFrame">
+ <summary>
+ Indicates that a new frame should be inserted before the specified tree frame.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeEditType.RemoveFrame">
+ <summary>
+ Indicates that the specified tree frame should be removed.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeEditType.SetAttribute">
+ <summary>
+ Indicates that an attribute value should be applied to the specified frame.
+ This may be a change to an existing attribute, or the addition of a new attribute.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeEditType.RemoveAttribute">
+ <summary>
+ Indicates that a named attribute should be removed from the specified frame.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeEditType.UpdateText">
+ <summary>
+ Indicates that the text content of the specified frame (which must be a text frame)
+ should be updated.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeEditType.StepIn">
+ <summary>
+ Indicates that the edit position should move inside the specified frame.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeEditType.StepOut">
+ <summary>
+ Indicates that there are no further edit operations on the current frame, and the
+ edit position should move back to the parent frame.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeEditType.UpdateMarkup">
+ <summary>
+ Indicates that the markup content of the specified frame (which must be a markup frame)
+ should be updated.
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame">
+ <summary>
+ Represents an entry in a tree of user interface (UI) items.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.Sequence">
+ <summary>
+ Gets the sequence number of the frame. Sequence numbers indicate the relative source
+ positions of the instructions that inserted the frames. Sequence numbers are only
+ comparable within the same sequence (typically, the same source method).
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.FrameType">
+ <summary>
+ Describes the type of this frame.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.ElementSubtreeLength">
+ <summary>
+ If the <see cref="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.FrameType"/> property equals <see cref="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrameType.Element"/>
+ gets the number of frames in the subtree for which this frame is the root.
+ The value is zero if the frame has not yet been closed.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.ElementName">
+ <summary>
+ If the <see cref="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.FrameType"/> property equals <see cref="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrameType.Element"/>,
+ gets a name representing the type of the element. Otherwise, the value is undefined.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.TextContent">
+ <summary>
+ If the <see cref="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.FrameType"/> property equals <see cref="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrameType.Text"/>,
+ gets the content of the text frame. Otherwise, the value is undefined.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.AttributeEventHandlerId">
+ <summary>
+ If the <see cref="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.FrameType"/> property equals <see cref="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrameType.Attribute"/>
+ gets the ID of the corresponding event handler, if any.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.AttributeName">
+ <summary>
+ If the <see cref="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.FrameType"/> property equals <see cref="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrameType.Attribute"/>,
+ gets the attribute name. Otherwise, the value is undefined.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.AttributeValue">
+ <summary>
+ If the <see cref="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.FrameType"/> property equals <see cref="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrameType.Attribute"/>,
+ gets the attribute value. Otherwise, the value is undefined.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.ComponentSubtreeLength">
+ <summary>
+ If the <see cref="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.FrameType"/> property equals <see cref="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrameType.Component"/>
+ gets the number of frames in the subtree for which this frame is the root.
+ The value is zero if the frame has not yet been closed.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.ComponentId">
+ <summary>
+ If the <see cref="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.FrameType"/> property equals <see cref="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrameType.Component"/>,
+ gets the child component instance identifier.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.ComponentType">
+ <summary>
+ If the <see cref="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.FrameType"/> property equals <see cref="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrameType.Component"/>,
+ gets the type of the child component.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.ComponentState">
+ <summary>
+ If the <see cref="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.FrameType"/> property equals <see cref="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrameType.Component"/>,
+ gets the child component state object. Otherwise, the value is undefined.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.Component">
+ <summary>
+ If the <see cref="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.FrameType"/> property equals <see cref="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrameType.Component"/>,
+ gets the child component instance. Otherwise, the value is undefined.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.RegionSubtreeLength">
+ <summary>
+ If the <see cref="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.FrameType"/> property equals <see cref="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrameType.Region"/>
+ gets the number of frames in the subtree for which this frame is the root.
+ The value is zero if the frame has not yet been closed.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.ElementReferenceCaptureId">
+ <summary>
+ If the <see cref="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.FrameType"/> property equals <see cref="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrameType.ElementReferenceCapture"/>,
+ gets the ID of the reference capture. Otherwise, the value is undefined.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.ElementReferenceCaptureAction">
+ <summary>
+ If the <see cref="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.FrameType"/> property equals <see cref="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrameType.ElementReferenceCapture"/>,
+ gets the action that writes the reference to its target. Otherwise, the value is undefined.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.ComponentReferenceCaptureParentFrameIndex">
+ <summary>
+ If the <see cref="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.FrameType"/> property equals <see cref="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrameType.ComponentReferenceCapture"/>,
+ gets the index of the parent frame representing the component being captured. Otherwise, the value is undefined.
+ WARNING: This index can only be used in the context of the frame's original render tree. If the frame is
+ copied elsewhere, such as to the ReferenceFrames buffer of a RenderTreeDiff, then the index will
+ not relate to entries in that other buffer.
+ Currently there's no scenario where this matters, but if there was, we could change all of the subtree
+ initialization logic in RenderTreeDiffBuilder to walk the frames hierarchically, then it would know
+ the parent index at the point where it wants to initialize the ComponentReferenceCapture frame.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.ComponentReferenceCaptureAction">
+ <summary>
+ If the <see cref="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.FrameType"/> property equals <see cref="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrameType.ComponentReferenceCapture"/>,
+ gets the action that writes the reference to its target. Otherwise, the value is undefined.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.MarkupContent">
+ <summary>
+ If the <see cref="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.FrameType"/> property equals <see cref="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrameType.Markup"/>,
+ gets the content of the markup frame. Otherwise, the value is undefined.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.ToString">
+ <inheritdoc />
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrameType">
+ <summary>
+ Describes the type of a <see cref="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame"/>.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrameType.Element">
+ <summary>
+ Represents a container for other frames.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrameType.Text">
+ <summary>
+ Represents text content.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrameType.Attribute">
+ <summary>
+ Represents a key-value pair associated with another <see cref="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame"/>.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrameType.Component">
+ <summary>
+ Represents a child component.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrameType.Region">
+ <summary>
+ Defines the boundary around range of sibling frames that should be treated as an
+ unsplittable group for the purposes of diffing. This is typically used when appending
+ a tree fragment generated by external code, because the sequence numbers in that tree
+ fragment are not comparable to sequence numbers outside it.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrameType.ElementReferenceCapture">
+ <summary>
+ Represents an instruction to capture or update a reference to the parent element.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrameType.ComponentReferenceCapture">
+ <summary>
+ Represents an instruction to capture or update a reference to the parent component.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrameType.Markup">
+ <summary>
+ Represents a block of markup content.
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.RouteAttribute">
+ <summary>
+ Indicates that the associated component should match the specified route template pattern.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RouteAttribute.#ctor(System.String)">
+ <summary>
+ Constructs an instance of <see cref="T:Microsoft.AspNetCore.Components.RouteAttribute"/>.
+ </summary>
+ <param name="template">The route template.</param>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.RouteAttribute.Template">
+ <summary>
+ Gets the route template.
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.Routing.NavLink">
+ <summary>
+ A component that renders an anchor tag, automatically toggling its 'active'
+ class based on whether its 'href' matches the current URI.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Routing.NavLink.ActiveClass">
+ <summary>
+ Gets or sets the CSS class name applied to the NavLink when the
+ current route matches the NavLink href.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Routing.NavLink.Match">
+ <summary>
+ Gets or sets a value representing the URL matching behavior.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Routing.NavLink.Configure(Microsoft.AspNetCore.Components.RenderHandle)">
+ <inheritdoc />
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Routing.NavLink.SetParametersAsync(Microsoft.AspNetCore.Components.ParameterCollection)">
+ <inheritdoc />
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Routing.NavLink.Dispose">
+ <inheritdoc />
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.Routing.NavLinkMatch">
+ <summary>
+ Modifies the URL matching behavior for a <see cref="T:Microsoft.AspNetCore.Components.Routing.NavLink"/>.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.Routing.NavLinkMatch.Prefix">
+ <summary>
+ Specifies that the <see cref="T:Microsoft.AspNetCore.Components.Routing.NavLink"/> should be active when it matches any prefix
+ of the current URL.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.Routing.NavLinkMatch.All">
+ <summary>
+ Specifies that the <see cref="T:Microsoft.AspNetCore.Components.Routing.NavLink"/> should be active when it matches the entire
+ current URL.
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.Routing.Router">
+ <summary>
+ A component that displays whichever other component corresponds to the
+ current navigation location.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Routing.Router.AppAssembly">
+ <summary>
+ Gets or sets the assembly that should be searched, along with its referenced
+ assemblies, for components matching the URI.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.Routing.Router.FallbackComponent">
+ <summary>
+ Gets or sets the type of the component that should be used as a fallback when no match is found for the requested route.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Routing.Router.Configure(Microsoft.AspNetCore.Components.RenderHandle)">
+ <inheritdoc />
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Routing.Router.SetParametersAsync(Microsoft.AspNetCore.Components.ParameterCollection)">
+ <inheritdoc />
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Routing.Router.Dispose">
+ <inheritdoc />
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Routing.Router.Render(Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder,System.Type,System.Collections.Generic.IDictionary{System.String,System.Object})">
+ <inheritdoc />
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Routing.RouteTable.RouteComparison(Microsoft.AspNetCore.Components.Routing.RouteEntry,Microsoft.AspNetCore.Components.Routing.RouteEntry)">
+ <summary>
+ Route precedence algorithm.
+ We collect all the routes and sort them from most specific to
+ less specific. The specificity of a route is given by the specificity
+ of its segments and the position of those segments in the route.
+ * A literal segment is more specific than a parameter segment.
+ * A parameter segment with more constraints is more specific than one with fewer constraints
+ * Segment earlier in the route are evaluated before segments later in the route.
+ For example:
+ /Literal is more specific than /Parameter
+ /Route/With/{parameter} is more specific than /{multiple}/With/{parameters}
+ /Product/{id:int} is more specific than /Product/{id}
+
+ Routes can be ambiguous if:
+ They are composed of literals and those literals have the same values (case insensitive)
+ They are composed of a mix of literals and parameters, in the same relative order and the
+ literals have the same values.
+ For example:
+ * /literal and /Literal
+ /{parameter}/literal and /{something}/literal
+ /{parameter:constraint}/literal and /{something:constraint}/literal
+
+ To calculate the precedence we sort the list of routes as follows:
+ * Shorter routes go first.
+ * A literal wins over a parameter in precedence.
+ * For literals with different values (case insensitive) we choose the lexical order
+ * For parameters with different numbers of constraints, the one with more wins
+ If we get to the end of the comparison routing we've detected an ambiguous pair of routes.
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.Routing.TypeRouteConstraint`1">
+ <summary>
+ A route constraint that requires the value to be parseable as a specified type.
+ </summary>
+ <typeparam name="T">The type to which the value must be parseable.</typeparam>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.RuntimeHelpers">
+ <summary>
+ Used by generated code produced by the Components code generator. Not intended or supported
+ for use in application code.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(``0)">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Action)">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Func{System.Threading.Tasks.Task})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Action{Microsoft.AspNetCore.Components.Forms.EditContext})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Func{Microsoft.AspNetCore.Components.Forms.EditContext,System.Threading.Tasks.Task})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Action{Microsoft.AspNetCore.Components.UIEventArgs})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Func{Microsoft.AspNetCore.Components.UIEventArgs,System.Threading.Tasks.Task})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Action{Microsoft.AspNetCore.Components.UIChangeEventArgs})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Func{Microsoft.AspNetCore.Components.UIChangeEventArgs,System.Threading.Tasks.Task})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Action{Microsoft.AspNetCore.Components.UIClipboardEventArgs})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Func{Microsoft.AspNetCore.Components.UIClipboardEventArgs,System.Threading.Tasks.Task})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Action{Microsoft.AspNetCore.Components.UIDataTransferItem})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Func{Microsoft.AspNetCore.Components.UIDataTransferItem,System.Threading.Tasks.Task})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Action{Microsoft.AspNetCore.Components.UIDragEventArgs})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Func{Microsoft.AspNetCore.Components.UIDragEventArgs,System.Threading.Tasks.Task})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Action{Microsoft.AspNetCore.Components.UIErrorEventArgs})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Func{Microsoft.AspNetCore.Components.UIErrorEventArgs,System.Threading.Tasks.Task})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Action{Microsoft.AspNetCore.Components.UIFocusEventArgs})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Func{Microsoft.AspNetCore.Components.UIFocusEventArgs,System.Threading.Tasks.Task})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Action{Microsoft.AspNetCore.Components.UIKeyboardEventArgs})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Func{Microsoft.AspNetCore.Components.UIKeyboardEventArgs,System.Threading.Tasks.Task})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Action{Microsoft.AspNetCore.Components.UIMouseEventArgs})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Func{Microsoft.AspNetCore.Components.UIMouseEventArgs,System.Threading.Tasks.Task})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Action{Microsoft.AspNetCore.Components.UIPointerEventArgs})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Func{Microsoft.AspNetCore.Components.UIPointerEventArgs,System.Threading.Tasks.Task})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Action{Microsoft.AspNetCore.Components.UIProgressEventArgs})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Func{Microsoft.AspNetCore.Components.UIProgressEventArgs,System.Threading.Tasks.Task})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Action{Microsoft.AspNetCore.Components.UITouchEventArgs})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Func{Microsoft.AspNetCore.Components.UITouchEventArgs,System.Threading.Tasks.Task})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Action{Microsoft.AspNetCore.Components.UIWheelEventArgs})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Func{Microsoft.AspNetCore.Components.UIWheelEventArgs,System.Threading.Tasks.Task})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Action{System.Int32})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Func{System.Int32,System.Threading.Tasks.Task})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Action{System.Nullable{System.Int32}})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Func{System.Nullable{System.Int32},System.Threading.Tasks.Task})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Action{System.Int64})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Func{System.Int64,System.Threading.Tasks.Task})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Action{System.Nullable{System.Int64}})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Func{System.Nullable{System.Int64},System.Threading.Tasks.Task})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Action{System.Decimal})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Func{System.Decimal,System.Threading.Tasks.Task})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Action{System.Nullable{System.Decimal}})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Func{System.Nullable{System.Decimal},System.Threading.Tasks.Task})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Action{System.Single})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Func{System.Single,System.Threading.Tasks.Task})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Action{System.Nullable{System.Single}})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Func{System.Nullable{System.Single},System.Threading.Tasks.Task})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Action{System.Double})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Func{System.Double,System.Threading.Tasks.Task})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Action{System.Nullable{System.Double}})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Func{System.Nullable{System.Double},System.Threading.Tasks.Task})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Action{System.DateTime})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Func{System.DateTime,System.Threading.Tasks.Task})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Action{System.Nullable{System.DateTime}})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Func{System.Nullable{System.DateTime},System.Threading.Tasks.Task})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Action{System.Boolean})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Func{System.Boolean,System.Threading.Tasks.Task})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Action{System.Nullable{System.Boolean}})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Func{System.Nullable{System.Boolean},System.Threading.Tasks.Task})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Action{System.String})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Func{System.String,System.Threading.Tasks.Task})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Action{System.Object})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.RuntimeHelpers.TypeCheck``1(System.Func{System.Object,System.Threading.Tasks.Task})">
+ <summary>
+ Not intended for use by application code.
+ </summary>
+ <typeparam name="T"></typeparam>
+ <param name="value"></param>
+ <returns></returns>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.Services.IUriHelper">
+ <summary>
+ Helpers for working with URIs and navigation state.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Services.IUriHelper.GetAbsoluteUri">
+ <summary>
+ Gets the current absolute URI.
+ </summary>
+ <returns>The current absolute URI.</returns>
+ </member>
+ <member name="E:Microsoft.AspNetCore.Components.Services.IUriHelper.OnLocationChanged">
+ <summary>
+ An event that fires when the navigation location has changed.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Services.IUriHelper.ToAbsoluteUri(System.String)">
+ <summary>
+ Converts a relative URI into an absolute one (by resolving it
+ relative to the current absolute URI).
+ </summary>
+ <param name="href">The relative URI.</param>
+ <returns>The absolute URI.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Services.IUriHelper.GetBaseUri">
+ <summary>
+ Gets the base URI (with trailing slash) that can be prepended before relative URI paths to produce an absolute URI.
+ Typically this corresponds to the 'href' attribute on the document's &lt;base&gt; element.
+ </summary>
+ <returns>The URI prefix, which has a trailing slash.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Services.IUriHelper.ToBaseRelativePath(System.String,System.String)">
+ <summary>
+ Given a base URI (e.g., one previously returned by <see cref="M:Microsoft.AspNetCore.Components.Services.IUriHelper.GetBaseUri"/>),
+ converts an absolute URI into one relative to the base URI prefix.
+ </summary>
+ <param name="baseUri">The base URI prefix (e.g., previously returned by <see cref="M:Microsoft.AspNetCore.Components.Services.IUriHelper.GetBaseUri"/>).</param>
+ <param name="locationAbsolute">An absolute URI that is within the space of the base URI.</param>
+ <returns>A relative URI path.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Services.IUriHelper.NavigateTo(System.String)">
+ <summary>
+ Navigates to the specified URI.
+ </summary>
+ <param name="uri">The destination URI. This can be absolute, or relative to the base URI
+ (as returned by <see cref="M:Microsoft.AspNetCore.Components.Services.IUriHelper.GetBaseUri"/>).</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Services.IUriHelper.NavigateTo(System.String,System.Boolean)">
+ <summary>
+ Navigates to the specified URI.
+ </summary>
+ <param name="uri">The destination URI. This can be absolute, or relative to the base URI
+ (as returned by <see cref="M:Microsoft.AspNetCore.Components.Services.IUriHelper.GetBaseUri"/>).</param>
+ <param name="forceLoad">If true, bypasses client-side routing and forces the browser to load the new page from the server, whether or not the URI would normally be handled by the client-side router.</param>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.Services.UriHelperBase">
+ <summary>
+ A base class for <see cref="T:Microsoft.AspNetCore.Components.Services.IUriHelper"/> implementations.
+ </summary>
+ </member>
+ <member name="E:Microsoft.AspNetCore.Components.Services.UriHelperBase.OnLocationChanged">
+ <summary>
+ An event that fires when the navigation location has changed.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Services.UriHelperBase.NavigateTo(System.String)">
+ <summary>
+ Navigates to the specified URI.
+ </summary>
+ <param name="uri">The destination URI. This can be absolute, or relative to the base URI
+ (as returned by <see cref="M:Microsoft.AspNetCore.Components.Services.UriHelperBase.GetBaseUri"/>).</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Services.UriHelperBase.NavigateTo(System.String,System.Boolean)">
+ <summary>
+ Navigates to the specified URI.
+ </summary>
+ <param name="uri">The destination URI. This can be absolute, or relative to the base URI
+ (as returned by <see cref="M:Microsoft.AspNetCore.Components.Services.UriHelperBase.GetBaseUri"/>).</param>
+ <param name="forceLoad">If true, bypasses client-side routing and forces the browser to load the new page from the server, whether or not the URI would normally be handled by the client-side router.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Services.UriHelperBase.NavigateToCore(System.String,System.Boolean)">
+ <summary>
+ Navigates to the specified URI.
+ </summary>
+ <param name="uri">The destination URI. This can be absolute, or relative to the base URI
+ (as returned by <see cref="M:Microsoft.AspNetCore.Components.Services.UriHelperBase.GetBaseUri"/>).</param>
+ <param name="forceLoad">If true, bypasses client-side routing and forces the browser to load the new page from the server, whether or not the URI would normally be handled by the client-side router.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Services.UriHelperBase.InitializeState">
+ <summary>
+ Called to initialize BaseURI and current URI before those values the first time.
+ Override this method to dynamically calculate the those values.
+ </summary>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Services.UriHelperBase.GetAbsoluteUri">
+ <summary>
+ Gets the current absolute URI.
+ </summary>
+ <returns>The current absolute URI.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Services.UriHelperBase.GetBaseUri">
+ <summary>
+ Gets the base URI (with trailing slash) that can be prepended before relative URI paths to
+ produce an absolute URI. Typically this corresponds to the 'href' attribute on the
+ document's &lt;base&gt; element.
+ </summary>
+ <returns>The URI prefix, which has a trailing slash.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Services.UriHelperBase.ToAbsoluteUri(System.String)">
+ <summary>
+ Converts a relative URI into an absolute one (by resolving it
+ relative to the current absolute URI).
+ </summary>
+ <param name="href">The relative URI.</param>
+ <returns>The absolute URI.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Services.UriHelperBase.ToBaseRelativePath(System.String,System.String)">
+ <summary>
+ Given a base URI (e.g., one previously returned by <see cref="M:Microsoft.AspNetCore.Components.Services.UriHelperBase.GetBaseUri"/>),
+ converts an absolute URI into one relative to the base URI prefix.
+ </summary>
+ <param name="baseUri">
+ The base URI prefix (e.g., previously returned by <see cref="M:Microsoft.AspNetCore.Components.Services.UriHelperBase.GetBaseUri"/>).
+ </param>
+ <param name="locationAbsolute">An absolute URI that is within the space of the base URI.</param>
+ <returns>A relative URI path.</returns>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Services.UriHelperBase.SetAbsoluteUri(System.String)">
+ <summary>
+ Set the URI to the provided value.
+ </summary>
+ <param name="uri">The URI. Must be an absolute URI.</param>
+ <remarks>
+ Calling <see cref="M:Microsoft.AspNetCore.Components.Services.UriHelperBase.SetAbsoluteUri(System.String)"/> does not trigger <see cref="E:Microsoft.AspNetCore.Components.Services.UriHelperBase.OnLocationChanged"/>.
+ </remarks>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Services.UriHelperBase.SetAbsoluteBaseUri(System.String)">
+ <summary>
+ Sets the base URI to the provided value (after normalization).
+ </summary>
+ <param name="baseUri">The base URI. Must be an absolute URI.</param>
+ <remarks>
+ Calling <see cref="M:Microsoft.AspNetCore.Components.Services.UriHelperBase.SetAbsoluteBaseUri(System.String)"/> does not trigger <see cref="E:Microsoft.AspNetCore.Components.Services.UriHelperBase.OnLocationChanged"/>.
+ </remarks>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.Services.UriHelperBase.TriggerOnLocationChanged">
+ <summary>
+ Triggers the <see cref="E:Microsoft.AspNetCore.Components.Services.UriHelperBase.OnLocationChanged"/> event with the current URI value.
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.UIEventArgs">
+ <summary>
+ Supplies information about an event that is being raised.
+ </summary>
+ </member>
+ <member name="F:Microsoft.AspNetCore.Components.UIEventArgs.Empty">
+ <summary>
+ An empty instance of <see cref="T:Microsoft.AspNetCore.Components.UIEventArgs"/>.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIEventArgs.Type">
+ <summary>
+ Gets or sets the type of the event.
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.UIChangeEventArgs">
+ <summary>
+ Supplies information about an input change event that is being raised.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIChangeEventArgs.Value">
+ <summary>
+ Gets or sets the new value of the input. This may be a <see cref="T:System.String"/>
+ or a <see cref="T:System.Boolean"/>.
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.UIClipboardEventArgs">
+ <summary>
+ Supplies information about an clipboard event that is being raised.
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.UIDragEventArgs">
+ <summary>
+ Supplies information about an drag event that is being raised.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIDragEventArgs.Detail">
+ <summary>
+ A count of consecutive clicks that happened in a short amount of time, incremented by one.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIDragEventArgs.DataTransfer">
+ <summary>
+ The data that underlies a drag-and-drop operation, known as the drag data store.
+ See <see cref="P:Microsoft.AspNetCore.Components.UIDragEventArgs.DataTransfer"/>.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIDragEventArgs.ScreenX">
+ <summary>
+ The X coordinate of the mouse pointer in global (screen) coordinates.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIDragEventArgs.ScreenY">
+ <summary>
+ The Y coordinate of the mouse pointer in global (screen) coordinates.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIDragEventArgs.ClientX">
+ <summary>
+ The X coordinate of the mouse pointer in local (DOM content) coordinates.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIDragEventArgs.ClientY">
+ <summary>
+ The Y coordinate of the mouse pointer in local (DOM content) coordinates.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIDragEventArgs.Button">
+ <summary>
+ The button number that was pressed when the mouse event was fired:
+ Left button=0,
+ middle button=1 (if present),
+ right button=2.
+ For mice configured for left handed use in which the button actions are reversed the values are instead read from right to left.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIDragEventArgs.Buttons">
+ <summary>
+ The buttons being pressed when the mouse event was fired:
+ Left button=1,
+ Right button=2,
+ Middle (wheel) button=4,
+ 4th button (typically, "Browser Back" button)=8,
+ 5th button (typically, "Browser Forward" button)=16.
+ If two or more buttons are pressed, returns the logical sum of the values.
+ E.g., if Left button and Right button are pressed, returns 3 (=1 | 2).
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIDragEventArgs.CtrlKey">
+ <summary>
+ true if the control key was down when the event was fired. false otherwise.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIDragEventArgs.ShiftKey">
+ <summary>
+ true if the shift key was down when the event was fired. false otherwise.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIDragEventArgs.AltKey">
+ <summary>
+ true if the alt key was down when the event was fired. false otherwise.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIDragEventArgs.MetaKey">
+ <summary>
+ true if the meta key was down when the event was fired. false otherwise.
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.DataTransfer">
+ <summary>
+ The <see cref="T:Microsoft.AspNetCore.Components.DataTransfer"/> object is used to hold the data that is being dragged during a drag and drop operation.
+ It may hold one or more <see cref="T:Microsoft.AspNetCore.Components.UIDataTransferItem"/>, each of one or more data types.
+ For more information about drag and drop, see HTML Drag and Drop API.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.DataTransfer.DropEffect">
+ <summary>
+ Gets the type of drag-and-drop operation currently selected or sets the operation to a new type.
+ The value must be none, copy, link or move.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.DataTransfer.EffectAllowed">
+ <summary>
+ Provides all of the types of operations that are possible.
+ Must be one of none, copy, copyLink, copyMove, link, linkMove, move, all or uninitialized.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.DataTransfer.Files">
+ <summary>
+ Contains a list of all the local files available on the data transfer.
+ If the drag operation doesn't involve dragging files, this property is an empty list.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.DataTransfer.Items">
+ <summary>
+ Gives a <see cref="T:Microsoft.AspNetCore.Components.UIDataTransferItem"/> array which is a list of all of the drag data.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.DataTransfer.Types">
+ <summary>
+ An array of <see cref="T:System.String"/> giving the formats that were set in the dragstart event.
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.UIDataTransferItem">
+ <summary>
+ The <see cref="T:Microsoft.AspNetCore.Components.UIDataTransferItem"/> object represents one drag data item.
+ During a drag operation, each drag event has a dataTransfer property which contains a list of drag data items.
+ Each item in the list is a <see cref="T:Microsoft.AspNetCore.Components.UIDataTransferItem"/> object.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIDataTransferItem.Kind">
+ <summary>
+ The kind of drag data item, string or file
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIDataTransferItem.Type">
+ <summary>
+ The drag data item's type, typically a MIME type
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.UIErrorEventArgs">
+ <summary>
+ Supplies information about an error event that is being raised.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIErrorEventArgs.Message">
+ <summary>
+ Gets a a human-readable error message describing the problem.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIErrorEventArgs.Filename">
+ <summary>
+ Gets the name of the script file in which the error occurred.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIErrorEventArgs.Lineno">
+ <summary>
+ Gets the line number of the script file on which the error occurred.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIErrorEventArgs.Colno">
+ <summary>
+ Gets the column number of the script file on which the error occurred.
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.UIFocusEventArgs">
+ <summary>
+ Supplies information about a focus event that is being raised.
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.UIKeyboardEventArgs">
+ <summary>
+ Supplies information about a keyboard event that is being raised.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIKeyboardEventArgs.Key">
+ <summary>
+ The key value of the key represented by the event.
+ If the value has a printed representation, this attribute's value is the same as the char attribute.
+ Otherwise, it's one of the key value strings specified in 'Key values'.
+ If the key can't be identified, this is the string "Unidentified"
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIKeyboardEventArgs.Code">
+ <summary>
+ Holds a string that identifies the physical key being pressed.
+ The value is not affected by the current keyboard layout or modifier state, so a particular key will always return the same value.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIKeyboardEventArgs.Location">
+ <summary>
+ The location of the key on the device.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIKeyboardEventArgs.Repeat">
+ <summary>
+ true if a key has been depressed long enough to trigger key repetition, otherwise false.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIKeyboardEventArgs.CtrlKey">
+ <summary>
+ true if the control key was down when the event was fired. false otherwise.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIKeyboardEventArgs.ShiftKey">
+ <summary>
+ true if the shift key was down when the event was fired. false otherwise.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIKeyboardEventArgs.AltKey">
+ <summary>
+ true if the alt key was down when the event was fired. false otherwise.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIKeyboardEventArgs.MetaKey">
+ <summary>
+ true if the meta key was down when the event was fired. false otherwise.
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.UIMouseEventArgs">
+ <summary>
+ Supplies information about a mouse event that is being raised.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIMouseEventArgs.Detail">
+ <summary>
+ A count of consecutive clicks that happened in a short amount of time, incremented by one.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIMouseEventArgs.ScreenX">
+ <summary>
+ The X coordinate of the mouse pointer in global (screen) coordinates.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIMouseEventArgs.ScreenY">
+ <summary>
+ The Y coordinate of the mouse pointer in global (screen) coordinates.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIMouseEventArgs.ClientX">
+ <summary>
+ The X coordinate of the mouse pointer in local (DOM content) coordinates.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIMouseEventArgs.ClientY">
+ <summary>
+ The Y coordinate of the mouse pointer in local (DOM content) coordinates.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIMouseEventArgs.Button">
+ <summary>
+ The button number that was pressed when the mouse event was fired:
+ Left button=0,
+ middle button=1 (if present),
+ right button=2.
+ For mice configured for left handed use in which the button actions are reversed the values are instead read from right to left.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIMouseEventArgs.Buttons">
+ <summary>
+ The buttons being pressed when the mouse event was fired:
+ Left button=1,
+ Right button=2,
+ Middle (wheel) button=4,
+ 4th button (typically, "Browser Back" button)=8,
+ 5th button (typically, "Browser Forward" button)=16.
+ If two or more buttons are pressed, returns the logical sum of the values.
+ E.g., if Left button and Right button are pressed, returns 3 (=1 | 2).
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIMouseEventArgs.CtrlKey">
+ <summary>
+ true if the control key was down when the event was fired. false otherwise.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIMouseEventArgs.ShiftKey">
+ <summary>
+ true if the shift key was down when the event was fired. false otherwise.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIMouseEventArgs.AltKey">
+ <summary>
+ true if the alt key was down when the event was fired. false otherwise.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIMouseEventArgs.MetaKey">
+ <summary>
+ true if the meta key was down when the event was fired. false otherwise.
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.UIPointerEventArgs">
+ <summary>
+ Supplies information about a mouse event that is being raised.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIPointerEventArgs.PointerId">
+ <summary>
+ A unique identifier for the pointer causing the event.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIPointerEventArgs.Width">
+ <summary>
+ The width (magnitude on the X axis), in CSS pixels, of the contact geometry of the pointer.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIPointerEventArgs.Height">
+ <summary>
+ The height (magnitude on the Y axis), in CSS pixels, of the contact geometry of the pointer.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIPointerEventArgs.Pressure">
+ <summary>
+ The normalized pressure of the pointer input in the range of 0 to 1,
+ where 0 and 1 represent the minimum and maximum pressure the hardware is capable of detecting, respectively.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIPointerEventArgs.TiltX">
+ <summary>
+ The plane angle (in degrees, in the range of -90 to 90) between the Y-Z plane
+ and the plane containing both the transducer (e.g. pen stylus) axis and the Y axis.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIPointerEventArgs.TiltY">
+ <summary>
+ The plane angle (in degrees, in the range of -90 to 90) between the X-Z plane
+ and the plane containing both the transducer (e.g. pen stylus) axis and the X axis.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIPointerEventArgs.PointerType">
+ <summary>
+ Indicates the device type that caused the event.
+ Must be one of the strings mouse, pen or touch, or an empty string.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIPointerEventArgs.IsPrimary">
+ <summary>
+ Indicates if the pointer represents the primary pointer of this pointer type.
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.UIProgressEventArgs">
+ <summary>
+ Supplies information about a progress event that is being raised.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIProgressEventArgs.LengthComputable">
+ <summary>
+ Whether or not the total size of the transfer is known.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIProgressEventArgs.Loaded">
+ <summary>
+ The number of bytes transferred since the beginning of the operation.
+ This doesn't include headers and other overhead, but only the content itself.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIProgressEventArgs.Total">
+ <summary>
+ The total number of bytes of content that will be transferred during the operation.
+ If the total size is unknown, this value is zero.
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.UITouchEventArgs">
+ <summary>
+ Supplies information about a touch event that is being raised.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UITouchEventArgs.Detail">
+ <summary>
+ A count of consecutive clicks that happened in a short amount of time, incremented by one.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UITouchEventArgs.Touches">
+ <summary>
+ A list of <see cref="T:Microsoft.AspNetCore.Components.UITouchPoint"/> for every point of contact currently touching the surface.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UITouchEventArgs.TargetTouches">
+ <summary>
+ A list of <see cref="T:Microsoft.AspNetCore.Components.UITouchPoint"/> for every point of contact that is touching the surface and started on the element that is the target of the current event.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UITouchEventArgs.ChangedTouches">
+ <summary>
+ A list of Touches for every point of contact which contributed to the event.
+ For the touchstart event this must be a list of the touch points that just became active with the current event.
+ For the touchmove event this must be a list of the touch points that have moved since the last event.
+ For the touchend and touchcancel events this must be a list of the touch points that have just been removed from the surface.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UITouchEventArgs.CtrlKey">
+ <summary>
+ true if the control key was down when the event was fired. false otherwise.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UITouchEventArgs.ShiftKey">
+ <summary>
+ true if the shift key was down when the event was fired. false otherwise.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UITouchEventArgs.AltKey">
+ <summary>
+ true if the alt key was down when the event was fired. false otherwise.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UITouchEventArgs.MetaKey">
+ <summary>
+ true if the meta key was down when the event was fired. false otherwise.
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.UITouchPoint">
+ <summary>
+ Represents a single contact point on a touch-sensitive device.
+ The contact point is commonly a finger or stylus and the device may be a touchscreen or trackpad.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UITouchPoint.Identifier">
+ <summary>
+ A unique identifier for this Touch object.
+ A given touch point (say, by a finger) will have the same identifier for the duration of its movement around the surface.
+ This lets you ensure that you're tracking the same touch all the time.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UITouchPoint.ScreenX">
+ <summary>
+ The X coordinate of the touch point relative to the left edge of the screen.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UITouchPoint.ScreenY">
+ <summary>
+ The Y coordinate of the touch point relative to the top edge of the screen.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UITouchPoint.ClientX">
+ <summary>
+ The X coordinate of the touch point relative to the left edge of the browser viewport, not including any scroll offset.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UITouchPoint.ClientY">
+ <summary>
+ The Y coordinate of the touch point relative to the top edge of the browser viewport, not including any scroll offset.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UITouchPoint.PageX">
+ <summary>
+ The X coordinate of the touch point relative to the left edge of the document.
+ Unlike <see cref="P:Microsoft.AspNetCore.Components.UITouchPoint.ClientX"/>, this value includes the horizontal scroll offset, if any.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UITouchPoint.PageY">
+ <summary>
+ The Y coordinate of the touch point relative to the top of the document.
+ Unlike <see cref="P:Microsoft.AspNetCore.Components.UITouchPoint.ClientY"/>, this value includes the vertical scroll offset, if any.
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.UIWheelEventArgs">
+ <summary>
+ Supplies information about a mouse wheel event that is being raised.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIWheelEventArgs.DeltaX">
+ <summary>
+ The horizontal scroll amount.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIWheelEventArgs.DeltaY">
+ <summary>
+ The vertical scroll amount.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIWheelEventArgs.DeltaZ">
+ <summary>
+ The scroll amount for the z-axis.
+ </summary>
+ </member>
+ <member name="P:Microsoft.AspNetCore.Components.UIWheelEventArgs.DeltaMode">
+ <summary>
+ The unit of the delta values scroll amount.
+ </summary>
+ </member>
+ <member name="T:Microsoft.AspNetCore.Components.UIEventArgsRenderTreeBuilderExtensions">
+ <summary>
+ Extensions methods on <see cref="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder"/> for event handlers.
+ </summary>
+ <remarks>
+ <para>
+ These methods enable method-group to delegate conversion for delegates and methods that accept
+ types derived from <see cref="T:Microsoft.AspNetCore.Components.UIEventArgs"/>.
+ </para>
+ <para>
+ This enhances the programming experience for using event handlers with the render tree builder
+ in components written in pure C#. These extension methods make it possible to write code like:
+ <code>
+ builder.AddAttribute(0, "onkeypress", MyKeyPressHandler);
+ </code>
+ Where <c>void MyKeyPressHandler(UIKeyboardEventArgs e)</c> is a method defined in the same class.
+ In this example, the author knows that the <c>onclick</c> event is associated with the
+ <see cref="T:Microsoft.AspNetCore.Components.UIKeyboardEventArgs"/> event args type. The component author is responsible for
+ providing a delegate that matches the expected event args type, an error will result in a failure
+ at runtime.
+ </para>
+ <para>
+ When a component is authored in Razor (.cshtml), the Razor code generator will maintain a mapping
+ between event names and event arg types that can be used to generate more strongly typed code.
+ Generated code for the same case will look like:
+ <code>
+ builder.AddAttribute(0, "onkeypress", BindMethods.GetEventHandlerValue&lt;UIKeyboardEventArgs&gt;(MyKeyPressHandler));
+ </code>
+ </para>
+ </remarks>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.UIEventArgsRenderTreeBuilderExtensions.AddAttribute(Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder,System.Int32,System.String,System.Action{Microsoft.AspNetCore.Components.UIChangeEventArgs})">
+ <summary>
+ <para>
+ Appends a frame representing an <see cref="T:System.Action`1"/>-valued attribute.
+ </para>
+ <para>
+ The attribute is associated with the most recently added element. If the value is <c>null</c> and the
+ current element is not a component, the frame will be omitted.
+ </para>
+ </summary>
+ <param name="builder">The <see cref="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder"/>.</param>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="name">The name of the attribute.</param>
+ <param name="value">The value of the attribute.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.UIEventArgsRenderTreeBuilderExtensions.AddAttribute(Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder,System.Int32,System.String,System.Func{Microsoft.AspNetCore.Components.UIChangeEventArgs,System.Threading.Tasks.Task})">
+ <summary>
+ <para>
+ Appends a frame representing an <see cref="T:System.Func`2"/>-valued attribute.
+ </para>
+ <para>
+ The attribute is associated with the most recently added element. If the value is <c>null</c> and the
+ current element is not a component, the frame will be omitted.
+ </para>
+ </summary>
+ <param name="builder">The <see cref="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder"/>.</param>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="name">The name of the attribute.</param>
+ <param name="value">The value of the attribute.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.UIEventArgsRenderTreeBuilderExtensions.AddAttribute(Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder,System.Int32,System.String,System.Action{Microsoft.AspNetCore.Components.UIDragEventArgs})">
+ <summary>
+ <para>
+ Appends a frame representing an <see cref="T:System.Action`1"/>-valued attribute.
+ </para>
+ <para>
+ The attribute is associated with the most recently added element. If the value is <c>null</c> and the
+ current element is not a component, the frame will be omitted.
+ </para>
+ </summary>
+ <param name="builder">The <see cref="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder"/>.</param>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="name">The name of the attribute.</param>
+ <param name="value">The value of the attribute.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.UIEventArgsRenderTreeBuilderExtensions.AddAttribute(Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder,System.Int32,System.String,System.Func{Microsoft.AspNetCore.Components.UIDragEventArgs,System.Threading.Tasks.Task})">
+ <summary>
+ <para>
+ Appends a frame representing an <see cref="T:System.Func`2"/>-valued attribute.
+ </para>
+ <para>
+ The attribute is associated with the most recently added element. If the value is <c>null</c> and the
+ current element is not a component, the frame will be omitted.
+ </para>
+ </summary>
+ <param name="builder">The <see cref="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder"/>.</param>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="name">The name of the attribute.</param>
+ <param name="value">The value of the attribute.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.UIEventArgsRenderTreeBuilderExtensions.AddAttribute(Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder,System.Int32,System.String,System.Action{Microsoft.AspNetCore.Components.UIClipboardEventArgs})">
+ <summary>
+ <para>
+ Appends a frame representing an <see cref="T:System.Action`1"/>-valued attribute.
+ </para>
+ <para>
+ The attribute is associated with the most recently added element. If the value is <c>null</c> and the
+ current element is not a component, the frame will be omitted.
+ </para>
+ </summary>
+ <param name="builder">The <see cref="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder"/>.</param>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="name">The name of the attribute.</param>
+ <param name="value">The value of the attribute.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.UIEventArgsRenderTreeBuilderExtensions.AddAttribute(Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder,System.Int32,System.String,System.Func{Microsoft.AspNetCore.Components.UIClipboardEventArgs,System.Threading.Tasks.Task})">
+ <summary>
+ <para>
+ Appends a frame representing an <see cref="T:System.Func`2"/>-valued attribute.
+ </para>
+ <para>
+ The attribute is associated with the most recently added element. If the value is <c>null</c> and the
+ current element is not a component, the frame will be omitted.
+ </para>
+ </summary>
+ <param name="builder">The <see cref="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder"/>.</param>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="name">The name of the attribute.</param>
+ <param name="value">The value of the attribute.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.UIEventArgsRenderTreeBuilderExtensions.AddAttribute(Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder,System.Int32,System.String,System.Action{Microsoft.AspNetCore.Components.UIErrorEventArgs})">
+ <summary>
+ <para>
+ Appends a frame representing an <see cref="T:System.Action`1"/>-valued attribute.
+ </para>
+ <para>
+ The attribute is associated with the most recently added element. If the value is <c>null</c> and the
+ current element is not a component, the frame will be omitted.
+ </para>
+ </summary>
+ <param name="builder">The <see cref="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder"/>.</param>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="name">The name of the attribute.</param>
+ <param name="value">The value of the attribute.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.UIEventArgsRenderTreeBuilderExtensions.AddAttribute(Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder,System.Int32,System.String,System.Func{Microsoft.AspNetCore.Components.UIErrorEventArgs,System.Threading.Tasks.Task})">
+ <summary>
+ <para>
+ Appends a frame representing an <see cref="T:System.Func`2"/>-valued attribute.
+ </para>
+ <para>
+ The attribute is associated with the most recently added element. If the value is <c>null</c> and the
+ current element is not a component, the frame will be omitted.
+ </para>
+ </summary>
+ <param name="builder">The <see cref="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder"/>.</param>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="name">The name of the attribute.</param>
+ <param name="value">The value of the attribute.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.UIEventArgsRenderTreeBuilderExtensions.AddAttribute(Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder,System.Int32,System.String,System.Action{Microsoft.AspNetCore.Components.UIFocusEventArgs})">
+ <summary>
+ <para>
+ Appends a frame representing an <see cref="T:System.Action`1"/>-valued attribute.
+ </para>
+ <para>
+ The attribute is associated with the most recently added element. If the value is <c>null</c> and the
+ current element is not a component, the frame will be omitted.
+ </para>
+ </summary>
+ <param name="builder">The <see cref="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder"/>.</param>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="name">The name of the attribute.</param>
+ <param name="value">The value of the attribute.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.UIEventArgsRenderTreeBuilderExtensions.AddAttribute(Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder,System.Int32,System.String,System.Func{Microsoft.AspNetCore.Components.UIFocusEventArgs,System.Threading.Tasks.Task})">
+ <summary>
+ <para>
+ Appends a frame representing an <see cref="T:System.Func`2"/>-valued attribute.
+ </para>
+ <para>
+ The attribute is associated with the most recently added element. If the value is <c>null</c> and the
+ current element is not a component, the frame will be omitted.
+ </para>
+ </summary>
+ <param name="builder">The <see cref="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder"/>.</param>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="name">The name of the attribute.</param>
+ <param name="value">The value of the attribute.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.UIEventArgsRenderTreeBuilderExtensions.AddAttribute(Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder,System.Int32,System.String,System.Action{Microsoft.AspNetCore.Components.UIKeyboardEventArgs})">
+ <summary>
+ <para>
+ Appends a frame representing an <see cref="T:System.Action`1"/>-valued attribute.
+ </para>
+ <para>
+ The attribute is associated with the most recently added element. If the value is <c>null</c> and the
+ current element is not a component, the frame will be omitted.
+ </para>
+ </summary>
+ <param name="builder">The <see cref="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder"/>.</param>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="name">The name of the attribute.</param>
+ <param name="value">The value of the attribute.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.UIEventArgsRenderTreeBuilderExtensions.AddAttribute(Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder,System.Int32,System.String,System.Func{Microsoft.AspNetCore.Components.UIKeyboardEventArgs,System.Threading.Tasks.Task})">
+ <summary>
+ <para>
+ Appends a frame representing an <see cref="T:System.Func`2"/>-valued attribute.
+ </para>
+ <para>
+ The attribute is associated with the most recently added element. If the value is <c>null</c> and the
+ current element is not a component, the frame will be omitted.
+ </para>
+ </summary>
+ <param name="builder">The <see cref="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder"/>.</param>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="name">The name of the attribute.</param>
+ <param name="value">The value of the attribute.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.UIEventArgsRenderTreeBuilderExtensions.AddAttribute(Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder,System.Int32,System.String,System.Action{Microsoft.AspNetCore.Components.UIMouseEventArgs})">
+ <summary>
+ <para>
+ Appends a frame representing an <see cref="T:System.Action`1"/>-valued attribute.
+ </para>
+ <para>
+ The attribute is associated with the most recently added element. If the value is <c>null</c> and the
+ current element is not a component, the frame will be omitted.
+ </para>
+ </summary>
+ <param name="builder">The <see cref="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder"/>.</param>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="name">The name of the attribute.</param>
+ <param name="value">The value of the attribute.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.UIEventArgsRenderTreeBuilderExtensions.AddAttribute(Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder,System.Int32,System.String,System.Func{Microsoft.AspNetCore.Components.UIMouseEventArgs,System.Threading.Tasks.Task})">
+ <summary>
+ <para>
+ Appends a frame representing an <see cref="T:System.Func`2"/>-valued attribute.
+ </para>
+ <para>
+ The attribute is associated with the most recently added element. If the value is <c>null</c> and the
+ current element is not a component, the frame will be omitted.
+ </para>
+ </summary>
+ <param name="builder">The <see cref="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder"/>.</param>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="name">The name of the attribute.</param>
+ <param name="value">The value of the attribute.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.UIEventArgsRenderTreeBuilderExtensions.AddAttribute(Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder,System.Int32,System.String,System.Action{Microsoft.AspNetCore.Components.UIPointerEventArgs})">
+ <summary>
+ <para>
+ Appends a frame representing an <see cref="T:System.Action`1"/>-valued attribute.
+ </para>
+ <para>
+ The attribute is associated with the most recently added element. If the value is <c>null</c> and the
+ current element is not a component, the frame will be omitted.
+ </para>
+ </summary>
+ <param name="builder">The <see cref="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder"/>.</param>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="name">The name of the attribute.</param>
+ <param name="value">The value of the attribute.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.UIEventArgsRenderTreeBuilderExtensions.AddAttribute(Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder,System.Int32,System.String,System.Func{Microsoft.AspNetCore.Components.UIPointerEventArgs,System.Threading.Tasks.Task})">
+ <summary>
+ <para>
+ Appends a frame representing an <see cref="T:System.Func`2"/>-valued attribute.
+ </para>
+ <para>
+ The attribute is associated with the most recently added element. If the value is <c>null</c> and the
+ current element is not a component, the frame will be omitted.
+ </para>
+ </summary>
+ <param name="builder">The <see cref="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder"/>.</param>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="name">The name of the attribute.</param>
+ <param name="value">The value of the attribute.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.UIEventArgsRenderTreeBuilderExtensions.AddAttribute(Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder,System.Int32,System.String,System.Action{Microsoft.AspNetCore.Components.UIProgressEventArgs})">
+ <summary>
+ <para>
+ Appends a frame representing an <see cref="T:System.Action`1"/>-valued attribute.
+ </para>
+ <para>
+ The attribute is associated with the most recently added element. If the value is <c>null</c> and the
+ current element is not a component, the frame will be omitted.
+ </para>
+ </summary>
+ <param name="builder">The <see cref="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder"/>.</param>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="name">The name of the attribute.</param>
+ <param name="value">The value of the attribute.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.UIEventArgsRenderTreeBuilderExtensions.AddAttribute(Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder,System.Int32,System.String,System.Func{Microsoft.AspNetCore.Components.UIProgressEventArgs,System.Threading.Tasks.Task})">
+ <summary>
+ <para>
+ Appends a frame representing an <see cref="T:System.Func`2"/>-valued attribute.
+ </para>
+ <para>
+ The attribute is associated with the most recently added element. If the value is <c>null</c> and the
+ current element is not a component, the frame will be omitted.
+ </para>
+ </summary>
+ <param name="builder">The <see cref="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder"/>.</param>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="name">The name of the attribute.</param>
+ <param name="value">The value of the attribute.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.UIEventArgsRenderTreeBuilderExtensions.AddAttribute(Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder,System.Int32,System.String,System.Action{Microsoft.AspNetCore.Components.UITouchEventArgs})">
+ <summary>
+ <para>
+ Appends a frame representing an <see cref="T:System.Action`1"/>-valued attribute.
+ </para>
+ <para>
+ The attribute is associated with the most recently added element. If the value is <c>null</c> and the
+ current element is not a component, the frame will be omitted.
+ </para>
+ </summary>
+ <param name="builder">The <see cref="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder"/>.</param>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="name">The name of the attribute.</param>
+ <param name="value">The value of the attribute.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.UIEventArgsRenderTreeBuilderExtensions.AddAttribute(Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder,System.Int32,System.String,System.Func{Microsoft.AspNetCore.Components.UITouchEventArgs,System.Threading.Tasks.Task})">
+ <summary>
+ <para>
+ Appends a frame representing an <see cref="T:System.Func`2"/>-valued attribute.
+ </para>
+ <para>
+ The attribute is associated with the most recently added element. If the value is <c>null</c> and the
+ current element is not a component, the frame will be omitted.
+ </para>
+ </summary>
+ <param name="builder">The <see cref="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder"/>.</param>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="name">The name of the attribute.</param>
+ <param name="value">The value of the attribute.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.UIEventArgsRenderTreeBuilderExtensions.AddAttribute(Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder,System.Int32,System.String,System.Action{Microsoft.AspNetCore.Components.UIWheelEventArgs})">
+ <summary>
+ <para>
+ Appends a frame representing an <see cref="T:System.Action`1"/>-valued attribute.
+ </para>
+ <para>
+ The attribute is associated with the most recently added element. If the value is <c>null</c> and the
+ current element is not a component, the frame will be omitted.
+ </para>
+ </summary>
+ <param name="builder">The <see cref="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder"/>.</param>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="name">The name of the attribute.</param>
+ <param name="value">The value of the attribute.</param>
+ </member>
+ <member name="M:Microsoft.AspNetCore.Components.UIEventArgsRenderTreeBuilderExtensions.AddAttribute(Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder,System.Int32,System.String,System.Func{Microsoft.AspNetCore.Components.UIWheelEventArgs,System.Threading.Tasks.Task})">
+ <summary>
+ <para>
+ Appends a frame representing an <see cref="T:System.Func`2"/>-valued attribute.
+ </para>
+ <para>
+ The attribute is associated with the most recently added element. If the value is <c>null</c> and the
+ current element is not a component, the frame will be omitted.
+ </para>
+ </summary>
+ <param name="builder">The <see cref="T:Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder"/>.</param>
+ <param name="sequence">An integer that represents the position of the instruction in the source code.</param>
+ <param name="name">The name of the attribute.</param>
+ <param name="value">The value of the attribute.</param>
+ </member>
+ </members>
+</doc>
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll
new file mode 100755
index 0000000..80058b1
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll
Binary files differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.Extensions.DependencyInjection.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.Extensions.DependencyInjection.dll
new file mode 100755
index 0000000..a859ce6
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.Extensions.DependencyInjection.dll
Binary files differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.JSInterop.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.JSInterop.dll
new file mode 100755
index 0000000..efe4501
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.JSInterop.dll
Binary files differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Mono.WebAssembly.Interop.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Mono.WebAssembly.Interop.dll
new file mode 100755
index 0000000..1ac3342
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Mono.WebAssembly.Interop.dll
Binary files differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/System.ComponentModel.Annotations.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/System.ComponentModel.Annotations.dll
new file mode 100755
index 0000000..bff09e6
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/System.ComponentModel.Annotations.dll
Binary files differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Blazor.E2EPerformance.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Blazor.E2EPerformance.dll
new file mode 100644
index 0000000..e523046
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Blazor.E2EPerformance.dll
Binary files differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Blazor.E2EPerformance.pdb b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Blazor.E2EPerformance.pdb
new file mode 100644
index 0000000..cdfe9a8
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Blazor.E2EPerformance.pdb
Binary files differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Blazor.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Blazor.dll
new file mode 100644
index 0000000..5239765
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Blazor.dll
Binary files differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Blazor.pdb b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Blazor.pdb
new file mode 100644
index 0000000..9d77703
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Blazor.pdb
Binary files differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Components.Browser.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Components.Browser.dll
new file mode 100644
index 0000000..83845be
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Components.Browser.dll
Binary files differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Components.Browser.pdb b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Components.Browser.pdb
new file mode 100644
index 0000000..89798bf
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Components.Browser.pdb
Binary files differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Components.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Components.dll
new file mode 100644
index 0000000..7117b84
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Components.dll
Binary files differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Components.pdb b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Components.pdb
new file mode 100644
index 0000000..853acc5
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Components.pdb
Binary files differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.Extensions.DependencyInjection.Abstractions.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.Extensions.DependencyInjection.Abstractions.dll
new file mode 100644
index 0000000..7cd9149
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.Extensions.DependencyInjection.Abstractions.dll
Binary files differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.Extensions.DependencyInjection.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.Extensions.DependencyInjection.dll
new file mode 100644
index 0000000..9c1fdc0
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.Extensions.DependencyInjection.dll
Binary files differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.JSInterop.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.JSInterop.dll
new file mode 100644
index 0000000..0b1ea66
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.JSInterop.dll
Binary files differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Mono.WebAssembly.Interop.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Mono.WebAssembly.Interop.dll
new file mode 100644
index 0000000..872f078
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Mono.WebAssembly.Interop.dll
Binary files differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/System.ComponentModel.Annotations.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/System.ComponentModel.Annotations.dll
new file mode 100644
index 0000000..4815dad
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/System.ComponentModel.Annotations.dll
Binary files differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/System.Core.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/System.Core.dll
new file mode 100644
index 0000000..f9c71a5
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/System.Core.dll
Binary files differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/System.Net.Http.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/System.Net.Http.dll
new file mode 100644
index 0000000..e219d2d
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/System.Net.Http.dll
Binary files differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/System.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/System.dll
new file mode 100644
index 0000000..512abc3
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/System.dll
Binary files differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/mscorlib.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/mscorlib.dll
new file mode 100644
index 0000000..a6d8cb0
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/mscorlib.dll
Binary files differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/blazor.boot.json b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/blazor.boot.json
new file mode 100644
index 0000000..1cc3e35
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/blazor.boot.json
@@ -0,0 +1 @@
+{"main":"Microsoft.AspNetCore.Blazor.E2EPerformance.dll","entryPoint":"Microsoft.AspNetCore.Blazor.E2EPerformance.Program::Main","assemblyReferences":["Microsoft.AspNetCore.Blazor.dll","Microsoft.AspNetCore.Components.Browser.dll","Microsoft.AspNetCore.Components.dll","Microsoft.Extensions.DependencyInjection.Abstractions.dll","Microsoft.Extensions.DependencyInjection.dll","Microsoft.JSInterop.dll","Mono.WebAssembly.Interop.dll","mscorlib.dll","System.ComponentModel.Annotations.dll","System.Core.dll","System.dll","System.Net.Http.dll","Microsoft.AspNetCore.Blazor.E2EPerformance.pdb","Microsoft.AspNetCore.Blazor.pdb","Microsoft.AspNetCore.Components.Browser.pdb","Microsoft.AspNetCore.Components.pdb"],"cssReferences":[],"jsReferences":[],"linkerEnabled":true} \ No newline at end of file
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/components.server.js b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/components.server.js
new file mode 100644
index 0000000..f2ca64c
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/components.server.js
@@ -0,0 +1,13562 @@
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./Boot.Server.ts");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./Boot.Server.ts":
+/*!************************!*\
+ !*** ./Boot.Server.ts ***!
+ \************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+var __generator = (this && this.__generator) || function (thisArg, body) {
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
+ function verb(n) { return function (v) { return step([n, v]); }; }
+ function step(op) {
+ if (f) throw new TypeError("Generator is already executing.");
+ while (_) try {
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
+ if (y = 0, t) op = [op[0] & 2, t.value];
+ switch (op[0]) {
+ case 0: case 1: t = op; break;
+ case 4: _.label++; return { value: op[1], done: false };
+ case 5: _.label++; y = op[1]; op = [0]; continue;
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
+ default:
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
+ if (t[2]) _.ops.pop();
+ _.trys.pop(); continue;
+ }
+ op = body.call(thisArg, _);
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
+ }
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+__webpack_require__(/*! @dotnet/jsinterop */ "./node_modules/@dotnet/jsinterop/dist/Microsoft.JSInterop.js");
+__webpack_require__(/*! ./GlobalExports */ "./GlobalExports.ts");
+var signalR = __webpack_require__(/*! @aspnet/signalr */ "./node_modules/@aspnet/signalr/dist/esm/index.js");
+var signalr_protocol_msgpack_1 = __webpack_require__(/*! @aspnet/signalr-protocol-msgpack */ "./node_modules/@aspnet/signalr-protocol-msgpack/dist/esm/index.js");
+var OutOfProcessRenderBatch_1 = __webpack_require__(/*! ./Rendering/RenderBatch/OutOfProcessRenderBatch */ "./Rendering/RenderBatch/OutOfProcessRenderBatch.ts");
+var UriHelper_1 = __webpack_require__(/*! ./Services/UriHelper */ "./Services/UriHelper.ts");
+var Renderer_1 = __webpack_require__(/*! ./Rendering/Renderer */ "./Rendering/Renderer.ts");
+var BootCommon_1 = __webpack_require__(/*! ./BootCommon */ "./BootCommon.ts");
+var AutoReconnectCircuitHandler_1 = __webpack_require__(/*! ./Platform/Circuits/AutoReconnectCircuitHandler */ "./Platform/Circuits/AutoReconnectCircuitHandler.ts");
+function boot() {
+ return __awaiter(this, void 0, void 0, function () {
+ var circuitHandlers, embeddedResourcesPromise, initialConnection, circuitId;
+ var _this = this;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ circuitHandlers = [new AutoReconnectCircuitHandler_1.AutoReconnectCircuitHandler()];
+ window['Blazor'].circuitHandlers = circuitHandlers;
+ embeddedResourcesPromise = BootCommon_1.fetchBootConfigAsync().then(function (bootConfig) {
+ return BootCommon_1.loadEmbeddedResourcesAsync(bootConfig);
+ });
+ return [4 /*yield*/, initializeConnection(circuitHandlers)];
+ case 1:
+ initialConnection = _a.sent();
+ // Ensure any embedded resources have been loaded before starting the app
+ return [4 /*yield*/, embeddedResourcesPromise];
+ case 2:
+ // Ensure any embedded resources have been loaded before starting the app
+ _a.sent();
+ return [4 /*yield*/, initialConnection.invoke('StartCircuit', UriHelper_1.internalFunctions.getLocationHref(), UriHelper_1.internalFunctions.getBaseURI())];
+ case 3:
+ circuitId = _a.sent();
+ window['Blazor'].reconnect = function () { return __awaiter(_this, void 0, void 0, function () {
+ var reconnection;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [4 /*yield*/, initializeConnection(circuitHandlers)];
+ case 1:
+ reconnection = _a.sent();
+ return [4 /*yield*/, reconnection.invoke('ConnectCircuit', circuitId)];
+ case 2:
+ if (!(_a.sent())) {
+ return [2 /*return*/, false];
+ }
+ circuitHandlers.forEach(function (h) { return h.onConnectionUp && h.onConnectionUp(); });
+ return [2 /*return*/, true];
+ }
+ });
+ }); };
+ circuitHandlers.forEach(function (h) { return h.onConnectionUp && h.onConnectionUp(); });
+ return [2 /*return*/];
+ }
+ });
+ });
+}
+function initializeConnection(circuitHandlers) {
+ return __awaiter(this, void 0, void 0, function () {
+ var connection, ex_1;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ connection = new signalR.HubConnectionBuilder()
+ .withUrl('_blazor')
+ .withHubProtocol(new signalr_protocol_msgpack_1.MessagePackHubProtocol())
+ .configureLogging(signalR.LogLevel.Information)
+ .build();
+ connection.on('JS.BeginInvokeJS', DotNet.jsCallDispatcher.beginInvokeJSFromDotNet);
+ connection.on('JS.RenderBatch', function (browserRendererId, renderId, batchData) {
+ try {
+ Renderer_1.renderBatch(browserRendererId, new OutOfProcessRenderBatch_1.OutOfProcessRenderBatch(batchData));
+ connection.send('OnRenderCompleted', renderId, null);
+ }
+ catch (ex) {
+ // If there's a rendering exception, notify server *and* throw on client
+ connection.send('OnRenderCompleted', renderId, ex.toString());
+ throw ex;
+ }
+ });
+ connection.onclose(function (error) { return circuitHandlers.forEach(function (h) { return h.onConnectionDown && h.onConnectionDown(error); }); });
+ connection.on('JS.Error', function (error) { return unhandledError(connection, error); });
+ window['Blazor']._internal.forceCloseConnection = function () { return connection.stop(); };
+ _a.label = 1;
+ case 1:
+ _a.trys.push([1, 3, , 4]);
+ return [4 /*yield*/, connection.start()];
+ case 2:
+ _a.sent();
+ return [3 /*break*/, 4];
+ case 3:
+ ex_1 = _a.sent();
+ unhandledError(connection, ex_1);
+ return [3 /*break*/, 4];
+ case 4:
+ DotNet.attachDispatcher({
+ beginInvokeDotNetFromJS: function (callId, assemblyName, methodIdentifier, dotNetObjectId, argsJson) {
+ connection.send('BeginInvokeDotNetFromJS', callId ? callId.toString() : null, assemblyName, methodIdentifier, dotNetObjectId || 0, argsJson);
+ }
+ });
+ return [2 /*return*/, connection];
+ }
+ });
+ });
+}
+function unhandledError(connection, err) {
+ console.error(err);
+ // Disconnect on errors.
+ //
+ // Trying to call methods on the connection after its been closed will throw.
+ if (connection) {
+ connection.stop();
+ }
+}
+boot();
+
+
+/***/ }),
+
+/***/ "./BootCommon.ts":
+/*!***********************!*\
+ !*** ./BootCommon.ts ***!
+ \***********************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+var __generator = (this && this.__generator) || function (thisArg, body) {
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
+ function verb(n) { return function (v) { return step([n, v]); }; }
+ function step(op) {
+ if (f) throw new TypeError("Generator is already executing.");
+ while (_) try {
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
+ if (y = 0, t) op = [op[0] & 2, t.value];
+ switch (op[0]) {
+ case 0: case 1: t = op; break;
+ case 4: _.label++; return { value: op[1], done: false };
+ case 5: _.label++; y = op[1]; op = [0]; continue;
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
+ default:
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
+ if (t[2]) _.ops.pop();
+ _.trys.pop(); continue;
+ }
+ op = body.call(thisArg, _);
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
+ }
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+function fetchBootConfigAsync() {
+ return __awaiter(this, void 0, void 0, function () {
+ var bootConfigResponse;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [4 /*yield*/, fetch('_framework/blazor.boot.json', { method: 'Get', credentials: 'include' })];
+ case 1:
+ bootConfigResponse = _a.sent();
+ return [2 /*return*/, bootConfigResponse.json()];
+ }
+ });
+ });
+}
+exports.fetchBootConfigAsync = fetchBootConfigAsync;
+function loadEmbeddedResourcesAsync(bootConfig) {
+ var cssLoadingPromises = bootConfig.cssReferences.map(function (cssReference) {
+ var linkElement = document.createElement('link');
+ linkElement.rel = 'stylesheet';
+ linkElement.href = cssReference;
+ return loadResourceFromElement(linkElement);
+ });
+ var jsLoadingPromises = bootConfig.jsReferences.map(function (jsReference) {
+ var scriptElement = document.createElement('script');
+ scriptElement.src = jsReference;
+ return loadResourceFromElement(scriptElement);
+ });
+ return Promise.all(cssLoadingPromises.concat(jsLoadingPromises));
+}
+exports.loadEmbeddedResourcesAsync = loadEmbeddedResourcesAsync;
+function loadResourceFromElement(element) {
+ return new Promise(function (resolve, reject) {
+ element.onload = resolve;
+ element.onerror = reject;
+ document.head.appendChild(element);
+ });
+}
+
+
+/***/ }),
+
+/***/ "./Environment.ts":
+/*!************************!*\
+ !*** ./Environment.ts ***!
+ \************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+function setPlatform(platformInstance) {
+ exports.platform = platformInstance;
+ return exports.platform;
+}
+exports.setPlatform = setPlatform;
+
+
+/***/ }),
+
+/***/ "./GlobalExports.ts":
+/*!**************************!*\
+ !*** ./GlobalExports.ts ***!
+ \**************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var UriHelper_1 = __webpack_require__(/*! ./Services/UriHelper */ "./Services/UriHelper.ts");
+var Http_1 = __webpack_require__(/*! ./Services/Http */ "./Services/Http.ts");
+var Renderer_1 = __webpack_require__(/*! ./Rendering/Renderer */ "./Rendering/Renderer.ts");
+// Make the following APIs available in global scope for invocation from JS
+window['Blazor'] = {
+ navigateTo: UriHelper_1.navigateTo,
+ _internal: {
+ attachRootComponentToElement: Renderer_1.attachRootComponentToElement,
+ http: Http_1.internalFunctions,
+ uriHelper: UriHelper_1.internalFunctions
+ }
+};
+
+
+/***/ }),
+
+/***/ "./Platform/Circuits/AutoReconnectCircuitHandler.ts":
+/*!**********************************************************!*\
+ !*** ./Platform/Circuits/AutoReconnectCircuitHandler.ts ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+var __generator = (this && this.__generator) || function (thisArg, body) {
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
+ function verb(n) { return function (v) { return step([n, v]); }; }
+ function step(op) {
+ if (f) throw new TypeError("Generator is already executing.");
+ while (_) try {
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
+ if (y = 0, t) op = [op[0] & 2, t.value];
+ switch (op[0]) {
+ case 0: case 1: t = op; break;
+ case 4: _.label++; return { value: op[1], done: false };
+ case 5: _.label++; y = op[1]; op = [0]; continue;
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
+ default:
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
+ if (t[2]) _.ops.pop();
+ _.trys.pop(); continue;
+ }
+ op = body.call(thisArg, _);
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
+ }
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+var UserSpecifiedDisplay_1 = __webpack_require__(/*! ./UserSpecifiedDisplay */ "./Platform/Circuits/UserSpecifiedDisplay.ts");
+var DefaultReconnectDisplay_1 = __webpack_require__(/*! ./DefaultReconnectDisplay */ "./Platform/Circuits/DefaultReconnectDisplay.ts");
+var AutoReconnectCircuitHandler = /** @class */ (function () {
+ function AutoReconnectCircuitHandler() {
+ var _this = this;
+ this.reconnectDisplay = new DefaultReconnectDisplay_1.DefaultReconnectDisplay(document);
+ document.addEventListener('DOMContentLoaded', function () {
+ var modal = document.getElementById(AutoReconnectCircuitHandler.DialogId);
+ if (modal) {
+ _this.reconnectDisplay = new UserSpecifiedDisplay_1.UserSpecifiedDisplay(modal);
+ }
+ });
+ }
+ AutoReconnectCircuitHandler.prototype.onConnectionUp = function () {
+ this.reconnectDisplay.hide();
+ };
+ AutoReconnectCircuitHandler.prototype.delay = function () {
+ return new Promise(function (resolve) { return setTimeout(resolve, AutoReconnectCircuitHandler.RetryInterval); });
+ };
+ AutoReconnectCircuitHandler.prototype.onConnectionDown = function () {
+ return __awaiter(this, void 0, void 0, function () {
+ var i, result, err_1;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ this.reconnectDisplay.show();
+ i = 0;
+ _a.label = 1;
+ case 1:
+ if (!(i < AutoReconnectCircuitHandler.MaxRetries)) return [3 /*break*/, 7];
+ return [4 /*yield*/, this.delay()];
+ case 2:
+ _a.sent();
+ _a.label = 3;
+ case 3:
+ _a.trys.push([3, 5, , 6]);
+ return [4 /*yield*/, window['Blazor'].reconnect()];
+ case 4:
+ result = _a.sent();
+ if (!result) {
+ // If the server responded and refused to reconnect, stop auto-retrying.
+ return [3 /*break*/, 7];
+ }
+ return [2 /*return*/];
+ case 5:
+ err_1 = _a.sent();
+ console.error(err_1);
+ return [3 /*break*/, 6];
+ case 6:
+ i++;
+ return [3 /*break*/, 1];
+ case 7:
+ this.reconnectDisplay.failed();
+ return [2 /*return*/];
+ }
+ });
+ });
+ };
+ AutoReconnectCircuitHandler.MaxRetries = 5;
+ AutoReconnectCircuitHandler.RetryInterval = 3000;
+ AutoReconnectCircuitHandler.DialogId = 'components-reconnect-modal';
+ return AutoReconnectCircuitHandler;
+}());
+exports.AutoReconnectCircuitHandler = AutoReconnectCircuitHandler;
+
+
+/***/ }),
+
+/***/ "./Platform/Circuits/DefaultReconnectDisplay.ts":
+/*!******************************************************!*\
+ !*** ./Platform/Circuits/DefaultReconnectDisplay.ts ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var AutoReconnectCircuitHandler_1 = __webpack_require__(/*! ./AutoReconnectCircuitHandler */ "./Platform/Circuits/AutoReconnectCircuitHandler.ts");
+var DefaultReconnectDisplay = /** @class */ (function () {
+ function DefaultReconnectDisplay(document) {
+ this.document = document;
+ this.addedToDom = false;
+ this.modal = this.document.createElement('div');
+ this.modal.id = AutoReconnectCircuitHandler_1.AutoReconnectCircuitHandler.DialogId;
+ var modalStyles = [
+ "position: fixed",
+ "top: 0",
+ "right: 0",
+ "bottom: 0",
+ "left: 0",
+ "z-index: 1000",
+ "display: none",
+ "overflow: hidden",
+ "background-color: #fff",
+ "opacity: 0.8",
+ "text-align: center",
+ "font-weight: bold"
+ ];
+ this.modal.style.cssText = modalStyles.join(';');
+ this.modal.innerHTML = '<h5 style="margin-top: 20px"></h5><button style="margin:5px auto 5px">Retry?</button>';
+ this.message = this.modal.querySelector('h5');
+ this.button = this.modal.querySelector('button');
+ this.button.addEventListener('click', function () { return window['Blazor'].reconnect(); });
+ }
+ DefaultReconnectDisplay.prototype.show = function () {
+ if (!this.addedToDom) {
+ this.addedToDom = true;
+ this.document.body.appendChild(this.modal);
+ }
+ this.modal.style.display = 'block';
+ this.button.style.display = 'none';
+ this.message.textContent = 'Attempting to reconnect to the server...';
+ };
+ DefaultReconnectDisplay.prototype.hide = function () {
+ this.modal.style.display = 'none';
+ };
+ DefaultReconnectDisplay.prototype.failed = function () {
+ this.button.style.display = 'block';
+ this.message.textContent = 'Failed to reconnect to the server.';
+ };
+ return DefaultReconnectDisplay;
+}());
+exports.DefaultReconnectDisplay = DefaultReconnectDisplay;
+
+
+/***/ }),
+
+/***/ "./Platform/Circuits/UserSpecifiedDisplay.ts":
+/*!***************************************************!*\
+ !*** ./Platform/Circuits/UserSpecifiedDisplay.ts ***!
+ \***************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var UserSpecifiedDisplay = /** @class */ (function () {
+ function UserSpecifiedDisplay(dialog) {
+ this.dialog = dialog;
+ }
+ UserSpecifiedDisplay.prototype.show = function () {
+ this.removeClasses();
+ this.dialog.classList.add(UserSpecifiedDisplay.ShowClassName);
+ };
+ UserSpecifiedDisplay.prototype.hide = function () {
+ this.removeClasses();
+ this.dialog.classList.add(UserSpecifiedDisplay.HideClassName);
+ };
+ UserSpecifiedDisplay.prototype.failed = function () {
+ this.removeClasses();
+ this.dialog.classList.add(UserSpecifiedDisplay.FailedClassName);
+ };
+ UserSpecifiedDisplay.prototype.removeClasses = function () {
+ this.dialog.classList.remove(UserSpecifiedDisplay.ShowClassName, UserSpecifiedDisplay.HideClassName, UserSpecifiedDisplay.FailedClassName);
+ };
+ UserSpecifiedDisplay.ShowClassName = 'components-reconnect-show';
+ UserSpecifiedDisplay.HideClassName = 'components-reconnect-hide';
+ UserSpecifiedDisplay.FailedClassName = 'components-reconnect-failed';
+ return UserSpecifiedDisplay;
+}());
+exports.UserSpecifiedDisplay = UserSpecifiedDisplay;
+
+
+/***/ }),
+
+/***/ "./Rendering/BrowserRenderer.ts":
+/*!**************************************!*\
+ !*** ./Rendering/BrowserRenderer.ts ***!
+ \**************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var RenderBatch_1 = __webpack_require__(/*! ./RenderBatch/RenderBatch */ "./Rendering/RenderBatch/RenderBatch.ts");
+var EventDelegator_1 = __webpack_require__(/*! ./EventDelegator */ "./Rendering/EventDelegator.ts");
+var LogicalElements_1 = __webpack_require__(/*! ./LogicalElements */ "./Rendering/LogicalElements.ts");
+var ElementReferenceCapture_1 = __webpack_require__(/*! ./ElementReferenceCapture */ "./Rendering/ElementReferenceCapture.ts");
+var selectValuePropname = '_blazorSelectValue';
+var sharedTemplateElemForParsing = document.createElement('template');
+var sharedSvgElemForParsing = document.createElementNS('http://www.w3.org/2000/svg', 'g');
+var preventDefaultEvents = { submit: true };
+var rootComponentsPendingFirstRender = {};
+var BrowserRenderer = /** @class */ (function () {
+ function BrowserRenderer(browserRendererId) {
+ var _this = this;
+ this.browserRendererId = browserRendererId;
+ this.childComponentLocations = {};
+ this.eventDelegator = new EventDelegator_1.EventDelegator(function (event, eventHandlerId, eventArgs) {
+ raiseEvent(event, _this.browserRendererId, eventHandlerId, eventArgs);
+ });
+ }
+ BrowserRenderer.prototype.attachRootComponentToElement = function (componentId, element) {
+ // 'allowExistingContents' to keep any prerendered content until we do the first client-side render
+ this.attachComponentToElement(componentId, LogicalElements_1.toLogicalElement(element, /* allowExistingContents */ true));
+ rootComponentsPendingFirstRender[componentId] = element;
+ };
+ BrowserRenderer.prototype.updateComponent = function (batch, componentId, edits, referenceFrames) {
+ var element = this.childComponentLocations[componentId];
+ if (!element) {
+ throw new Error("No element is currently associated with component " + componentId);
+ }
+ // On the first render for each root component, clear any existing content (e.g., prerendered)
+ var rootElementToClear = rootComponentsPendingFirstRender[componentId];
+ if (rootElementToClear) {
+ delete rootComponentsPendingFirstRender[componentId];
+ clearElement(rootElementToClear);
+ }
+ this.applyEdits(batch, element, 0, edits, referenceFrames);
+ };
+ BrowserRenderer.prototype.disposeComponent = function (componentId) {
+ delete this.childComponentLocations[componentId];
+ };
+ BrowserRenderer.prototype.disposeEventHandler = function (eventHandlerId) {
+ this.eventDelegator.removeListener(eventHandlerId);
+ };
+ BrowserRenderer.prototype.attachComponentToElement = function (componentId, element) {
+ this.childComponentLocations[componentId] = element;
+ };
+ BrowserRenderer.prototype.applyEdits = function (batch, parent, childIndex, edits, referenceFrames) {
+ var currentDepth = 0;
+ var childIndexAtCurrentDepth = childIndex;
+ var arraySegmentReader = batch.arraySegmentReader;
+ var editReader = batch.editReader;
+ var frameReader = batch.frameReader;
+ var editsValues = arraySegmentReader.values(edits);
+ var editsOffset = arraySegmentReader.offset(edits);
+ var editsLength = arraySegmentReader.count(edits);
+ var maxEditIndexExcl = editsOffset + editsLength;
+ for (var editIndex = editsOffset; editIndex < maxEditIndexExcl; editIndex++) {
+ var edit = batch.diffReader.editsEntry(editsValues, editIndex);
+ var editType = editReader.editType(edit);
+ switch (editType) {
+ case RenderBatch_1.EditType.prependFrame: {
+ var frameIndex = editReader.newTreeIndex(edit);
+ var frame = batch.referenceFramesEntry(referenceFrames, frameIndex);
+ var siblingIndex = editReader.siblingIndex(edit);
+ this.insertFrame(batch, parent, childIndexAtCurrentDepth + siblingIndex, referenceFrames, frame, frameIndex);
+ break;
+ }
+ case RenderBatch_1.EditType.removeFrame: {
+ var siblingIndex = editReader.siblingIndex(edit);
+ LogicalElements_1.removeLogicalChild(parent, childIndexAtCurrentDepth + siblingIndex);
+ break;
+ }
+ case RenderBatch_1.EditType.setAttribute: {
+ var frameIndex = editReader.newTreeIndex(edit);
+ var frame = batch.referenceFramesEntry(referenceFrames, frameIndex);
+ var siblingIndex = editReader.siblingIndex(edit);
+ var element = LogicalElements_1.getLogicalChild(parent, childIndexAtCurrentDepth + siblingIndex);
+ if (element instanceof Element) {
+ this.applyAttribute(batch, element, frame);
+ }
+ else {
+ throw new Error("Cannot set attribute on non-element child");
+ }
+ break;
+ }
+ case RenderBatch_1.EditType.removeAttribute: {
+ // Note that we don't have to dispose the info we track about event handlers here, because the
+ // disposed event handler IDs are delivered separately (in the 'disposedEventHandlerIds' array)
+ var siblingIndex = editReader.siblingIndex(edit);
+ var element = LogicalElements_1.getLogicalChild(parent, childIndexAtCurrentDepth + siblingIndex);
+ if (element instanceof HTMLElement) {
+ var attributeName = editReader.removedAttributeName(edit);
+ // First try to remove any special property we use for this attribute
+ if (!this.tryApplySpecialProperty(batch, element, attributeName, null)) {
+ // If that's not applicable, it's a regular DOM attribute so remove that
+ element.removeAttribute(attributeName);
+ }
+ }
+ else {
+ throw new Error("Cannot remove attribute from non-element child");
+ }
+ break;
+ }
+ case RenderBatch_1.EditType.updateText: {
+ var frameIndex = editReader.newTreeIndex(edit);
+ var frame = batch.referenceFramesEntry(referenceFrames, frameIndex);
+ var siblingIndex = editReader.siblingIndex(edit);
+ var textNode = LogicalElements_1.getLogicalChild(parent, childIndexAtCurrentDepth + siblingIndex);
+ if (textNode instanceof Text) {
+ textNode.textContent = frameReader.textContent(frame);
+ }
+ else {
+ throw new Error("Cannot set text content on non-text child");
+ }
+ break;
+ }
+ case RenderBatch_1.EditType.updateMarkup: {
+ var frameIndex = editReader.newTreeIndex(edit);
+ var frame = batch.referenceFramesEntry(referenceFrames, frameIndex);
+ var siblingIndex = editReader.siblingIndex(edit);
+ LogicalElements_1.removeLogicalChild(parent, childIndexAtCurrentDepth + siblingIndex);
+ this.insertMarkup(batch, parent, childIndexAtCurrentDepth + siblingIndex, frame);
+ break;
+ }
+ case RenderBatch_1.EditType.stepIn: {
+ var siblingIndex = editReader.siblingIndex(edit);
+ parent = LogicalElements_1.getLogicalChild(parent, childIndexAtCurrentDepth + siblingIndex);
+ currentDepth++;
+ childIndexAtCurrentDepth = 0;
+ break;
+ }
+ case RenderBatch_1.EditType.stepOut: {
+ parent = LogicalElements_1.getLogicalParent(parent);
+ currentDepth--;
+ childIndexAtCurrentDepth = currentDepth === 0 ? childIndex : 0; // The childIndex is only ever nonzero at zero depth
+ break;
+ }
+ default: {
+ var unknownType = editType; // Compile-time verification that the switch was exhaustive
+ throw new Error("Unknown edit type: " + unknownType);
+ }
+ }
+ }
+ };
+ BrowserRenderer.prototype.insertFrame = function (batch, parent, childIndex, frames, frame, frameIndex) {
+ var frameReader = batch.frameReader;
+ var frameType = frameReader.frameType(frame);
+ switch (frameType) {
+ case RenderBatch_1.FrameType.element:
+ this.insertElement(batch, parent, childIndex, frames, frame, frameIndex);
+ return 1;
+ case RenderBatch_1.FrameType.text:
+ this.insertText(batch, parent, childIndex, frame);
+ return 1;
+ case RenderBatch_1.FrameType.attribute:
+ throw new Error('Attribute frames should only be present as leading children of element frames.');
+ case RenderBatch_1.FrameType.component:
+ this.insertComponent(batch, parent, childIndex, frame);
+ return 1;
+ case RenderBatch_1.FrameType.region:
+ return this.insertFrameRange(batch, parent, childIndex, frames, frameIndex + 1, frameIndex + frameReader.subtreeLength(frame));
+ case RenderBatch_1.FrameType.elementReferenceCapture:
+ if (parent instanceof Element) {
+ ElementReferenceCapture_1.applyCaptureIdToElement(parent, frameReader.elementReferenceCaptureId(frame));
+ return 0; // A "capture" is a child in the diff, but has no node in the DOM
+ }
+ else {
+ throw new Error('Reference capture frames can only be children of element frames.');
+ }
+ case RenderBatch_1.FrameType.markup:
+ this.insertMarkup(batch, parent, childIndex, frame);
+ return 1;
+ default:
+ var unknownType = frameType; // Compile-time verification that the switch was exhaustive
+ throw new Error("Unknown frame type: " + unknownType);
+ }
+ };
+ BrowserRenderer.prototype.insertElement = function (batch, parent, childIndex, frames, frame, frameIndex) {
+ var frameReader = batch.frameReader;
+ var tagName = frameReader.elementName(frame);
+ var newDomElementRaw = tagName === 'svg' || LogicalElements_1.isSvgElement(parent) ?
+ document.createElementNS('http://www.w3.org/2000/svg', tagName) :
+ document.createElement(tagName);
+ var newElement = LogicalElements_1.toLogicalElement(newDomElementRaw);
+ LogicalElements_1.insertLogicalChild(newDomElementRaw, parent, childIndex);
+ // Apply attributes
+ var descendantsEndIndexExcl = frameIndex + frameReader.subtreeLength(frame);
+ for (var descendantIndex = frameIndex + 1; descendantIndex < descendantsEndIndexExcl; descendantIndex++) {
+ var descendantFrame = batch.referenceFramesEntry(frames, descendantIndex);
+ if (frameReader.frameType(descendantFrame) === RenderBatch_1.FrameType.attribute) {
+ this.applyAttribute(batch, newDomElementRaw, descendantFrame);
+ }
+ else {
+ // As soon as we see a non-attribute child, all the subsequent child frames are
+ // not attributes, so bail out and insert the remnants recursively
+ this.insertFrameRange(batch, newElement, 0, frames, descendantIndex, descendantsEndIndexExcl);
+ break;
+ }
+ }
+ };
+ BrowserRenderer.prototype.insertComponent = function (batch, parent, childIndex, frame) {
+ var containerElement = LogicalElements_1.createAndInsertLogicalContainer(parent, childIndex);
+ // All we have to do is associate the child component ID with its location. We don't actually
+ // do any rendering here, because the diff for the child will appear later in the render batch.
+ var childComponentId = batch.frameReader.componentId(frame);
+ this.attachComponentToElement(childComponentId, containerElement);
+ };
+ BrowserRenderer.prototype.insertText = function (batch, parent, childIndex, textFrame) {
+ var textContent = batch.frameReader.textContent(textFrame);
+ var newTextNode = document.createTextNode(textContent);
+ LogicalElements_1.insertLogicalChild(newTextNode, parent, childIndex);
+ };
+ BrowserRenderer.prototype.insertMarkup = function (batch, parent, childIndex, markupFrame) {
+ var markupContainer = LogicalElements_1.createAndInsertLogicalContainer(parent, childIndex);
+ var markupContent = batch.frameReader.markupContent(markupFrame);
+ var parsedMarkup = parseMarkup(markupContent, LogicalElements_1.isSvgElement(parent));
+ var logicalSiblingIndex = 0;
+ while (parsedMarkup.firstChild) {
+ LogicalElements_1.insertLogicalChild(parsedMarkup.firstChild, markupContainer, logicalSiblingIndex++);
+ }
+ };
+ BrowserRenderer.prototype.applyAttribute = function (batch, toDomElement, attributeFrame) {
+ var frameReader = batch.frameReader;
+ var attributeName = frameReader.attributeName(attributeFrame);
+ var browserRendererId = this.browserRendererId;
+ var eventHandlerId = frameReader.attributeEventHandlerId(attributeFrame);
+ if (eventHandlerId) {
+ var firstTwoChars = attributeName.substring(0, 2);
+ var eventName = attributeName.substring(2);
+ if (firstTwoChars !== 'on' || !eventName) {
+ throw new Error("Attribute has nonzero event handler ID, but attribute name '" + attributeName + "' does not start with 'on'.");
+ }
+ this.eventDelegator.setListener(toDomElement, eventName, eventHandlerId);
+ return;
+ }
+ // First see if we have special handling for this attribute
+ if (!this.tryApplySpecialProperty(batch, toDomElement, attributeName, attributeFrame)) {
+ // If not, treat it as a regular string-valued attribute
+ toDomElement.setAttribute(attributeName, frameReader.attributeValue(attributeFrame));
+ }
+ };
+ BrowserRenderer.prototype.tryApplySpecialProperty = function (batch, element, attributeName, attributeFrame) {
+ switch (attributeName) {
+ case 'value':
+ return this.tryApplyValueProperty(batch, element, attributeFrame);
+ case 'checked':
+ return this.tryApplyCheckedProperty(batch, element, attributeFrame);
+ default:
+ return false;
+ }
+ };
+ BrowserRenderer.prototype.tryApplyValueProperty = function (batch, element, attributeFrame) {
+ // Certain elements have built-in behaviour for their 'value' property
+ var frameReader = batch.frameReader;
+ switch (element.tagName) {
+ case 'INPUT':
+ case 'SELECT':
+ case 'TEXTAREA': {
+ var value = attributeFrame ? frameReader.attributeValue(attributeFrame) : null;
+ element.value = value;
+ if (element.tagName === 'SELECT') {
+ // <select> is special, in that anything we write to .value will be lost if there
+ // isn't yet a matching <option>. To maintain the expected behavior no matter the
+ // element insertion/update order, preserve the desired value separately so
+ // we can recover it when inserting any matching <option>.
+ element[selectValuePropname] = value;
+ }
+ return true;
+ }
+ case 'OPTION': {
+ var value = attributeFrame ? frameReader.attributeValue(attributeFrame) : null;
+ if (value) {
+ element.setAttribute('value', value);
+ }
+ else {
+ element.removeAttribute('value');
+ }
+ // See above for why we have this special handling for <select>/<option>
+ var parentElement = element.parentElement;
+ if (parentElement && (selectValuePropname in parentElement) && parentElement[selectValuePropname] === value) {
+ this.tryApplyValueProperty(batch, parentElement, attributeFrame);
+ delete parentElement[selectValuePropname];
+ }
+ return true;
+ }
+ default:
+ return false;
+ }
+ };
+ BrowserRenderer.prototype.tryApplyCheckedProperty = function (batch, element, attributeFrame) {
+ // Certain elements have built-in behaviour for their 'checked' property
+ if (element.tagName === 'INPUT') {
+ var value = attributeFrame ? batch.frameReader.attributeValue(attributeFrame) : null;
+ element.checked = value !== null;
+ return true;
+ }
+ else {
+ return false;
+ }
+ };
+ BrowserRenderer.prototype.insertFrameRange = function (batch, parent, childIndex, frames, startIndex, endIndexExcl) {
+ var origChildIndex = childIndex;
+ for (var index = startIndex; index < endIndexExcl; index++) {
+ var frame = batch.referenceFramesEntry(frames, index);
+ var numChildrenInserted = this.insertFrame(batch, parent, childIndex, frames, frame, index);
+ childIndex += numChildrenInserted;
+ // Skip over any descendants, since they are already dealt with recursively
+ index += countDescendantFrames(batch, frame);
+ }
+ return (childIndex - origChildIndex); // Total number of children inserted
+ };
+ return BrowserRenderer;
+}());
+exports.BrowserRenderer = BrowserRenderer;
+function parseMarkup(markup, isSvg) {
+ if (isSvg) {
+ sharedSvgElemForParsing.innerHTML = markup || ' ';
+ return sharedSvgElemForParsing;
+ }
+ else {
+ sharedTemplateElemForParsing.innerHTML = markup || ' ';
+ return sharedTemplateElemForParsing.content;
+ }
+}
+function countDescendantFrames(batch, frame) {
+ var frameReader = batch.frameReader;
+ switch (frameReader.frameType(frame)) {
+ // The following frame types have a subtree length. Other frames may use that memory slot
+ // to mean something else, so we must not read it. We should consider having nominal subtypes
+ // of RenderTreeFramePointer that prevent access to non-applicable fields.
+ case RenderBatch_1.FrameType.component:
+ case RenderBatch_1.FrameType.element:
+ case RenderBatch_1.FrameType.region:
+ return frameReader.subtreeLength(frame) - 1;
+ default:
+ return 0;
+ }
+}
+function raiseEvent(event, browserRendererId, eventHandlerId, eventArgs) {
+ if (preventDefaultEvents[event.type]) {
+ event.preventDefault();
+ }
+ var eventDescriptor = {
+ browserRendererId: browserRendererId,
+ eventHandlerId: eventHandlerId,
+ eventArgsType: eventArgs.type
+ };
+ return DotNet.invokeMethodAsync('Microsoft.AspNetCore.Components.Browser', 'DispatchEvent', eventDescriptor, JSON.stringify(eventArgs.data));
+}
+function clearElement(element) {
+ var childNode;
+ while (childNode = element.firstChild) {
+ element.removeChild(childNode);
+ }
+}
+
+
+/***/ }),
+
+/***/ "./Rendering/ElementReferenceCapture.ts":
+/*!**********************************************!*\
+ !*** ./Rendering/ElementReferenceCapture.ts ***!
+ \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+function applyCaptureIdToElement(element, referenceCaptureId) {
+ element.setAttribute(getCaptureIdAttributeName(referenceCaptureId), '');
+}
+exports.applyCaptureIdToElement = applyCaptureIdToElement;
+function getElementByCaptureId(referenceCaptureId) {
+ var selector = "[" + getCaptureIdAttributeName(referenceCaptureId) + "]";
+ return document.querySelector(selector);
+}
+function getCaptureIdAttributeName(referenceCaptureId) {
+ return "_bl_" + referenceCaptureId;
+}
+// Support receiving ElementRef instances as args in interop calls
+var elementRefKey = '_blazorElementRef'; // Keep in sync with ElementRef.cs
+DotNet.attachReviver(function (key, value) {
+ if (value && typeof value === 'object' && value.hasOwnProperty(elementRefKey) && typeof value[elementRefKey] === 'string') {
+ return getElementByCaptureId(value[elementRefKey]);
+ }
+ else {
+ return value;
+ }
+});
+
+
+/***/ }),
+
+/***/ "./Rendering/EventDelegator.ts":
+/*!*************************************!*\
+ !*** ./Rendering/EventDelegator.ts ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var EventForDotNet_1 = __webpack_require__(/*! ./EventForDotNet */ "./Rendering/EventForDotNet.ts");
+var nonBubblingEvents = toLookup([
+ 'abort', 'blur', 'change', 'error', 'focus', 'load', 'loadend', 'loadstart', 'mouseenter', 'mouseleave',
+ 'progress', 'reset', 'scroll', 'submit', 'unload', 'DOMNodeInsertedIntoDocument', 'DOMNodeRemovedFromDocument'
+]);
+// Responsible for adding/removing the eventInfo on an expando property on DOM elements, and
+// calling an EventInfoStore that deals with registering/unregistering the underlying delegated
+// event listeners as required (and also maps actual events back to the given callback).
+var EventDelegator = /** @class */ (function () {
+ function EventDelegator(onEvent) {
+ this.onEvent = onEvent;
+ var eventDelegatorId = ++EventDelegator.nextEventDelegatorId;
+ this.eventsCollectionKey = "_blazorEvents_" + eventDelegatorId;
+ this.eventInfoStore = new EventInfoStore(this.onGlobalEvent.bind(this));
+ }
+ EventDelegator.prototype.setListener = function (element, eventName, eventHandlerId) {
+ // Ensure we have a place to store event info for this element
+ var infoForElement = element[this.eventsCollectionKey];
+ if (!infoForElement) {
+ infoForElement = element[this.eventsCollectionKey] = {};
+ }
+ if (infoForElement.hasOwnProperty(eventName)) {
+ // We can cheaply update the info on the existing object and don't need any other housekeeping
+ var oldInfo = infoForElement[eventName];
+ this.eventInfoStore.update(oldInfo.eventHandlerId, eventHandlerId);
+ }
+ else {
+ // Go through the whole flow which might involve registering a new global handler
+ var newInfo = { element: element, eventName: eventName, eventHandlerId: eventHandlerId };
+ this.eventInfoStore.add(newInfo);
+ infoForElement[eventName] = newInfo;
+ }
+ };
+ EventDelegator.prototype.removeListener = function (eventHandlerId) {
+ // This method gets called whenever the .NET-side code reports that a certain event handler
+ // has been disposed. However we will already have disposed the info about that handler if
+ // the eventHandlerId for the (element,eventName) pair was replaced during diff application.
+ var info = this.eventInfoStore.remove(eventHandlerId);
+ if (info) {
+ // Looks like this event handler wasn't already disposed
+ // Remove the associated data from the DOM element
+ var element = info.element;
+ if (element.hasOwnProperty(this.eventsCollectionKey)) {
+ var elementEventInfos = element[this.eventsCollectionKey];
+ delete elementEventInfos[info.eventName];
+ if (Object.getOwnPropertyNames(elementEventInfos).length === 0) {
+ delete element[this.eventsCollectionKey];
+ }
+ }
+ }
+ };
+ EventDelegator.prototype.onGlobalEvent = function (evt) {
+ if (!(evt.target instanceof Element)) {
+ return;
+ }
+ // Scan up the element hierarchy, looking for any matching registered event handlers
+ var candidateElement = evt.target;
+ var eventArgs = null; // Populate lazily
+ var eventIsNonBubbling = nonBubblingEvents.hasOwnProperty(evt.type);
+ while (candidateElement) {
+ if (candidateElement.hasOwnProperty(this.eventsCollectionKey)) {
+ var handlerInfos = candidateElement[this.eventsCollectionKey];
+ if (handlerInfos.hasOwnProperty(evt.type)) {
+ // We are going to raise an event for this element, so prepare info needed by the .NET code
+ if (!eventArgs) {
+ eventArgs = EventForDotNet_1.EventForDotNet.fromDOMEvent(evt);
+ }
+ var handlerInfo = handlerInfos[evt.type];
+ this.onEvent(evt, handlerInfo.eventHandlerId, eventArgs);
+ }
+ }
+ candidateElement = eventIsNonBubbling ? null : candidateElement.parentElement;
+ }
+ };
+ EventDelegator.nextEventDelegatorId = 0;
+ return EventDelegator;
+}());
+exports.EventDelegator = EventDelegator;
+// Responsible for adding and removing the global listener when the number of listeners
+// for a given event name changes between zero and nonzero
+var EventInfoStore = /** @class */ (function () {
+ function EventInfoStore(globalListener) {
+ this.globalListener = globalListener;
+ this.infosByEventHandlerId = {};
+ this.countByEventName = {};
+ }
+ EventInfoStore.prototype.add = function (info) {
+ if (this.infosByEventHandlerId[info.eventHandlerId]) {
+ // Should never happen, but we want to know if it does
+ throw new Error("Event " + info.eventHandlerId + " is already tracked");
+ }
+ this.infosByEventHandlerId[info.eventHandlerId] = info;
+ var eventName = info.eventName;
+ if (this.countByEventName.hasOwnProperty(eventName)) {
+ this.countByEventName[eventName]++;
+ }
+ else {
+ this.countByEventName[eventName] = 1;
+ // To make delegation work with non-bubbling events, register a 'capture' listener.
+ // We preserve the non-bubbling behavior by only dispatching such events to the targeted element.
+ var useCapture = nonBubblingEvents.hasOwnProperty(eventName);
+ document.addEventListener(eventName, this.globalListener, useCapture);
+ }
+ };
+ EventInfoStore.prototype.update = function (oldEventHandlerId, newEventHandlerId) {
+ if (this.infosByEventHandlerId.hasOwnProperty(newEventHandlerId)) {
+ // Should never happen, but we want to know if it does
+ throw new Error("Event " + newEventHandlerId + " is already tracked");
+ }
+ // Since we're just updating the event handler ID, there's no need to update the global counts
+ var info = this.infosByEventHandlerId[oldEventHandlerId];
+ delete this.infosByEventHandlerId[oldEventHandlerId];
+ info.eventHandlerId = newEventHandlerId;
+ this.infosByEventHandlerId[newEventHandlerId] = info;
+ };
+ EventInfoStore.prototype.remove = function (eventHandlerId) {
+ var info = this.infosByEventHandlerId[eventHandlerId];
+ if (info) {
+ delete this.infosByEventHandlerId[eventHandlerId];
+ var eventName = info.eventName;
+ if (--this.countByEventName[eventName] === 0) {
+ delete this.countByEventName[eventName];
+ document.removeEventListener(eventName, this.globalListener);
+ }
+ }
+ return info;
+ };
+ return EventInfoStore;
+}());
+function toLookup(items) {
+ var result = {};
+ items.forEach(function (value) { result[value] = true; });
+ return result;
+}
+
+
+/***/ }),
+
+/***/ "./Rendering/EventForDotNet.ts":
+/*!*************************************!*\
+ !*** ./Rendering/EventForDotNet.ts ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var __assign = (this && this.__assign) || Object.assign || function(t) {
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
+ s = arguments[i];
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
+ t[p] = s[p];
+ }
+ return t;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+var EventForDotNet = /** @class */ (function () {
+ function EventForDotNet(type, data) {
+ this.type = type;
+ this.data = data;
+ }
+ EventForDotNet.fromDOMEvent = function (event) {
+ var element = event.target;
+ switch (event.type) {
+ case 'input':
+ case 'change': {
+ var targetIsCheckbox = isCheckbox(element);
+ var newValue = targetIsCheckbox ? !!element['checked'] : element['value'];
+ return new EventForDotNet('change', { type: event.type, value: newValue });
+ }
+ case 'copy':
+ case 'cut':
+ case 'paste':
+ return new EventForDotNet('clipboard', { type: event.type });
+ case 'drag':
+ case 'dragend':
+ case 'dragenter':
+ case 'dragleave':
+ case 'dragover':
+ case 'dragstart':
+ case 'drop':
+ return new EventForDotNet('drag', parseDragEvent(event));
+ case 'focus':
+ case 'blur':
+ case 'focusin':
+ case 'focusout':
+ return new EventForDotNet('focus', { type: event.type });
+ case 'keydown':
+ case 'keyup':
+ case 'keypress':
+ return new EventForDotNet('keyboard', parseKeyboardEvent(event));
+ case 'contextmenu':
+ case 'click':
+ case 'mouseover':
+ case 'mouseout':
+ case 'mousemove':
+ case 'mousedown':
+ case 'mouseup':
+ case 'dblclick':
+ return new EventForDotNet('mouse', parseMouseEvent(event));
+ case 'error':
+ return new EventForDotNet('error', parseErrorEvent(event));
+ case 'loadstart':
+ case 'timeout':
+ case 'abort':
+ case 'load':
+ case 'loadend':
+ case 'progress':
+ return new EventForDotNet('progress', parseProgressEvent(event));
+ case 'touchcancel':
+ case 'touchend':
+ case 'touchmove':
+ case 'touchenter':
+ case 'touchleave':
+ case 'touchstart':
+ return new EventForDotNet('touch', parseTouchEvent(event));
+ case 'gotpointercapture':
+ case 'lostpointercapture':
+ case 'pointercancel':
+ case 'pointerdown':
+ case 'pointerenter':
+ case 'pointerleave':
+ case 'pointermove':
+ case 'pointerout':
+ case 'pointerover':
+ case 'pointerup':
+ return new EventForDotNet('pointer', parsePointerEvent(event));
+ case 'wheel':
+ case 'mousewheel':
+ return new EventForDotNet('wheel', parseWheelEvent(event));
+ default:
+ return new EventForDotNet('unknown', { type: event.type });
+ }
+ };
+ return EventForDotNet;
+}());
+exports.EventForDotNet = EventForDotNet;
+function parseDragEvent(event) {
+ return {
+ type: event.type,
+ detail: event.detail,
+ dataTransfer: event.dataTransfer,
+ screenX: event.screenX,
+ screenY: event.screenY,
+ clientX: event.clientX,
+ clientY: event.clientY,
+ button: event.button,
+ buttons: event.buttons,
+ ctrlKey: event.ctrlKey,
+ shiftKey: event.shiftKey,
+ altKey: event.altKey,
+ metaKey: event.metaKey
+ };
+}
+function parseWheelEvent(event) {
+ return __assign({}, parseMouseEvent(event), { deltaX: event.deltaX, deltaY: event.deltaY, deltaZ: event.deltaZ, deltaMode: event.deltaMode });
+}
+function parseErrorEvent(event) {
+ return {
+ type: event.type,
+ message: event.message,
+ filename: event.filename,
+ lineno: event.lineno,
+ colno: event.colno
+ };
+}
+function parseProgressEvent(event) {
+ return {
+ type: event.type,
+ lengthComputable: event.lengthComputable,
+ loaded: event.loaded,
+ total: event.total
+ };
+}
+function parseTouchEvent(event) {
+ function parseTouch(touchList) {
+ var touches = [];
+ for (var i = 0; i < touchList.length; i++) {
+ var touch = touchList[i];
+ touches.push({
+ identifier: touch.identifier,
+ clientX: touch.clientX,
+ clientY: touch.clientY,
+ screenX: touch.screenX,
+ screenY: touch.screenY,
+ pageX: touch.pageX,
+ pageY: touch.pageY
+ });
+ }
+ return touches;
+ }
+ return {
+ type: event.type,
+ detail: event.detail,
+ touches: parseTouch(event.touches),
+ targetTouches: parseTouch(event.targetTouches),
+ changedTouches: parseTouch(event.changedTouches),
+ ctrlKey: event.ctrlKey,
+ shiftKey: event.shiftKey,
+ altKey: event.altKey,
+ metaKey: event.metaKey
+ };
+}
+function parseKeyboardEvent(event) {
+ return {
+ type: event.type,
+ key: event.key,
+ code: event.code,
+ location: event.location,
+ repeat: event.repeat,
+ ctrlKey: event.ctrlKey,
+ shiftKey: event.shiftKey,
+ altKey: event.altKey,
+ metaKey: event.metaKey
+ };
+}
+function parsePointerEvent(event) {
+ return __assign({}, parseMouseEvent(event), { pointerId: event.pointerId, width: event.width, height: event.height, pressure: event.pressure, tiltX: event.tiltX, tiltY: event.tiltY, pointerType: event.pointerType, isPrimary: event.isPrimary });
+}
+function parseMouseEvent(event) {
+ return {
+ type: event.type,
+ detail: event.detail,
+ screenX: event.screenX,
+ screenY: event.screenY,
+ clientX: event.clientX,
+ clientY: event.clientY,
+ button: event.button,
+ buttons: event.buttons,
+ ctrlKey: event.ctrlKey,
+ shiftKey: event.shiftKey,
+ altKey: event.altKey,
+ metaKey: event.metaKey
+ };
+}
+function isCheckbox(element) {
+ return element && element.tagName === 'INPUT' && element.getAttribute('type') === 'checkbox';
+}
+
+
+/***/ }),
+
+/***/ "./Rendering/LogicalElements.ts":
+/*!**************************************!*\
+ !*** ./Rendering/LogicalElements.ts ***!
+ \**************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/*
+ A LogicalElement plays the same role as an Element instance from the point of view of the
+ API consumer. Inserting and removing logical elements updates the browser DOM just the same.
+
+ The difference is that, unlike regular DOM mutation APIs, the LogicalElement APIs don't use
+ the underlying DOM structure as the data storage for the element hierarchy. Instead, the
+ LogicalElement APIs take care of tracking hierarchical relationships separately. The point
+ of this is to permit a logical tree structure in which parent/child relationships don't
+ have to be materialized in terms of DOM element parent/child relationships. And the reason
+ why we want that is so that hierarchies of Blazor components can be tracked even when those
+ components' render output need not be a single literal DOM element.
+
+ Consumers of the API don't need to know about the implementation, but how it's done is:
+ - Each LogicalElement is materialized in the DOM as either:
+ - A Node instance, for actual Node instances inserted using 'insertLogicalChild' or
+ for Element instances promoted to LogicalElement via 'toLogicalElement'
+ - A Comment instance, for 'logical container' instances inserted using 'createAndInsertLogicalContainer'
+ - Then, on that instance (i.e., the Node or Comment), we store an array of 'logical children'
+ instances, e.g.,
+ [firstChild, secondChild, thirdChild, ...]
+ ... plus we store a reference to the 'logical parent' (if any)
+ - The 'logical children' array means we can look up in O(1):
+ - The number of logical children (not currently implemented because not required, but trivial)
+ - The logical child at any given index
+ - Whenever a logical child is added or removed, we update the parent's array of logical children
+*/
+Object.defineProperty(exports, "__esModule", { value: true });
+var logicalChildrenPropname = createSymbolOrFallback('_blazorLogicalChildren');
+var logicalParentPropname = createSymbolOrFallback('_blazorLogicalParent');
+function toLogicalElement(element, allowExistingContents) {
+ // Normally it's good to assert that the element has started empty, because that's the usual
+ // situation and we probably have a bug if it's not. But for the element that contain prerendered
+ // root components, we want to let them keep their content until we replace it.
+ if (element.childNodes.length > 0 && !allowExistingContents) {
+ throw new Error('New logical elements must start empty, or allowExistingContents must be true');
+ }
+ element[logicalChildrenPropname] = [];
+ return element;
+}
+exports.toLogicalElement = toLogicalElement;
+function createAndInsertLogicalContainer(parent, childIndex) {
+ var containerElement = document.createComment('!');
+ insertLogicalChild(containerElement, parent, childIndex);
+ return containerElement;
+}
+exports.createAndInsertLogicalContainer = createAndInsertLogicalContainer;
+function insertLogicalChild(child, parent, childIndex) {
+ var childAsLogicalElement = child;
+ if (child instanceof Comment) {
+ var existingGrandchildren = getLogicalChildrenArray(childAsLogicalElement);
+ if (existingGrandchildren && getLogicalChildrenArray(childAsLogicalElement).length > 0) {
+ // There's nothing to stop us implementing support for this scenario, and it's not difficult
+ // (after inserting 'child' itself, also iterate through its logical children and physically
+ // put them as following-siblings in the DOM). However there's no scenario that requires it
+ // presently, so if we did implement it there'd be no good way to have tests for it.
+ throw new Error('Not implemented: inserting non-empty logical container');
+ }
+ }
+ if (getLogicalParent(childAsLogicalElement)) {
+ // Likewise, we could easily support this scenario too (in this 'if' block, just splice
+ // out 'child' from the logical children array of its previous logical parent by using
+ // Array.prototype.indexOf to determine its previous sibling index).
+ // But again, since there's not currently any scenario that would use it, we would not
+ // have any test coverage for such an implementation.
+ throw new Error('Not implemented: moving existing logical children');
+ }
+ var newSiblings = getLogicalChildrenArray(parent);
+ if (childIndex < newSiblings.length) {
+ // Insert
+ var nextSibling = newSiblings[childIndex];
+ nextSibling.parentNode.insertBefore(child, nextSibling);
+ newSiblings.splice(childIndex, 0, childAsLogicalElement);
+ }
+ else {
+ // Append
+ appendDomNode(child, parent);
+ newSiblings.push(childAsLogicalElement);
+ }
+ childAsLogicalElement[logicalParentPropname] = parent;
+ if (!(logicalChildrenPropname in childAsLogicalElement)) {
+ childAsLogicalElement[logicalChildrenPropname] = [];
+ }
+}
+exports.insertLogicalChild = insertLogicalChild;
+function removeLogicalChild(parent, childIndex) {
+ var childrenArray = getLogicalChildrenArray(parent);
+ var childToRemove = childrenArray.splice(childIndex, 1)[0];
+ // If it's a logical container, also remove its descendants
+ if (childToRemove instanceof Comment) {
+ var grandchildrenArray = getLogicalChildrenArray(childToRemove);
+ while (grandchildrenArray.length > 0) {
+ removeLogicalChild(childToRemove, 0);
+ }
+ }
+ // Finally, remove the node itself
+ var domNodeToRemove = childToRemove;
+ domNodeToRemove.parentNode.removeChild(domNodeToRemove);
+}
+exports.removeLogicalChild = removeLogicalChild;
+function getLogicalParent(element) {
+ return element[logicalParentPropname] || null;
+}
+exports.getLogicalParent = getLogicalParent;
+function getLogicalChild(parent, childIndex) {
+ return getLogicalChildrenArray(parent)[childIndex];
+}
+exports.getLogicalChild = getLogicalChild;
+function isSvgElement(element) {
+ return getClosestDomElement(element).namespaceURI === 'http://www.w3.org/2000/svg';
+}
+exports.isSvgElement = isSvgElement;
+function getLogicalChildrenArray(element) {
+ return element[logicalChildrenPropname];
+}
+function getLogicalNextSibling(element) {
+ var siblings = getLogicalChildrenArray(getLogicalParent(element));
+ var siblingIndex = Array.prototype.indexOf.call(siblings, element);
+ return siblings[siblingIndex + 1] || null;
+}
+function getClosestDomElement(logicalElement) {
+ if (logicalElement instanceof Element) {
+ return logicalElement;
+ }
+ else if (logicalElement instanceof Comment) {
+ return logicalElement.parentNode;
+ }
+ else {
+ throw new Error('Not a valid logical element');
+ }
+}
+function appendDomNode(child, parent) {
+ // This function only puts 'child' into the DOM in the right place relative to 'parent'
+ // It does not update the logical children array of anything
+ if (parent instanceof Element) {
+ parent.appendChild(child);
+ }
+ else if (parent instanceof Comment) {
+ var parentLogicalNextSibling = getLogicalNextSibling(parent);
+ if (parentLogicalNextSibling) {
+ // Since the parent has a logical next-sibling, its appended child goes right before that
+ parentLogicalNextSibling.parentNode.insertBefore(child, parentLogicalNextSibling);
+ }
+ else {
+ // Since the parent has no logical next-sibling, keep recursing upwards until we find
+ // a logical ancestor that does have a next-sibling or is a physical element.
+ appendDomNode(child, getLogicalParent(parent));
+ }
+ }
+ else {
+ // Should never happen
+ throw new Error("Cannot append node because the parent is not a valid logical element. Parent: " + parent);
+ }
+}
+function createSymbolOrFallback(fallback) {
+ return typeof Symbol === 'function' ? Symbol() : fallback;
+}
+;
+
+
+/***/ }),
+
+/***/ "./Rendering/RenderBatch/OutOfProcessRenderBatch.ts":
+/*!**********************************************************!*\
+ !*** ./Rendering/RenderBatch/OutOfProcessRenderBatch.ts ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var Utf8Decoder_1 = __webpack_require__(/*! ./Utf8Decoder */ "./Rendering/RenderBatch/Utf8Decoder.ts");
+var updatedComponentsEntryLength = 4; // Each is a single int32 giving the location of the data
+var referenceFramesEntryLength = 16; // 1 byte for frame type, then 3 bytes for type-specific data
+var disposedComponentIdsEntryLength = 4; // Each is an int32 giving the ID
+var disposedEventHandlerIdsEntryLength = 4; // Each is an int32 giving the ID
+var editsEntryLength = 16; // 4 ints
+var stringTableEntryLength = 4; // Each is an int32 giving the string data location, or -1 for null
+var OutOfProcessRenderBatch = /** @class */ (function () {
+ function OutOfProcessRenderBatch(batchData) {
+ this.batchData = batchData;
+ var stringReader = new OutOfProcessStringReader(batchData);
+ this.arrayRangeReader = new OutOfProcessArrayRangeReader(batchData);
+ this.arraySegmentReader = new OutOfProcessArraySegmentReader(batchData);
+ this.diffReader = new OutOfProcessRenderTreeDiffReader(batchData);
+ this.editReader = new OutOfProcessRenderTreeEditReader(batchData, stringReader);
+ this.frameReader = new OutOfProcessRenderTreeFrameReader(batchData, stringReader);
+ }
+ OutOfProcessRenderBatch.prototype.updatedComponents = function () {
+ return readInt32LE(this.batchData, this.batchData.length - 20); // 5th-from-last int32
+ };
+ OutOfProcessRenderBatch.prototype.referenceFrames = function () {
+ return readInt32LE(this.batchData, this.batchData.length - 16); // 4th-from-last int32
+ };
+ OutOfProcessRenderBatch.prototype.disposedComponentIds = function () {
+ return readInt32LE(this.batchData, this.batchData.length - 12); // 3rd-from-last int32
+ };
+ OutOfProcessRenderBatch.prototype.disposedEventHandlerIds = function () {
+ return readInt32LE(this.batchData, this.batchData.length - 8); // 2th-from-last int32
+ };
+ OutOfProcessRenderBatch.prototype.updatedComponentsEntry = function (values, index) {
+ var tableEntryPos = values + index * updatedComponentsEntryLength;
+ return readInt32LE(this.batchData, tableEntryPos);
+ };
+ OutOfProcessRenderBatch.prototype.referenceFramesEntry = function (values, index) {
+ return values + index * referenceFramesEntryLength;
+ };
+ OutOfProcessRenderBatch.prototype.disposedComponentIdsEntry = function (values, index) {
+ var entryPos = values + index * disposedComponentIdsEntryLength;
+ return readInt32LE(this.batchData, entryPos);
+ };
+ OutOfProcessRenderBatch.prototype.disposedEventHandlerIdsEntry = function (values, index) {
+ var entryPos = values + index * disposedEventHandlerIdsEntryLength;
+ return readInt32LE(this.batchData, entryPos);
+ };
+ return OutOfProcessRenderBatch;
+}());
+exports.OutOfProcessRenderBatch = OutOfProcessRenderBatch;
+var OutOfProcessRenderTreeDiffReader = /** @class */ (function () {
+ function OutOfProcessRenderTreeDiffReader(batchDataUint8) {
+ this.batchDataUint8 = batchDataUint8;
+ }
+ OutOfProcessRenderTreeDiffReader.prototype.componentId = function (diff) {
+ // First int32 is componentId
+ return readInt32LE(this.batchDataUint8, diff);
+ };
+ OutOfProcessRenderTreeDiffReader.prototype.edits = function (diff) {
+ // Entries data starts after the componentId (which is a 4-byte int)
+ return (diff + 4);
+ };
+ OutOfProcessRenderTreeDiffReader.prototype.editsEntry = function (values, index) {
+ return values + index * editsEntryLength;
+ };
+ return OutOfProcessRenderTreeDiffReader;
+}());
+var OutOfProcessRenderTreeEditReader = /** @class */ (function () {
+ function OutOfProcessRenderTreeEditReader(batchDataUint8, stringReader) {
+ this.batchDataUint8 = batchDataUint8;
+ this.stringReader = stringReader;
+ }
+ OutOfProcessRenderTreeEditReader.prototype.editType = function (edit) {
+ return readInt32LE(this.batchDataUint8, edit); // 1st int
+ };
+ OutOfProcessRenderTreeEditReader.prototype.siblingIndex = function (edit) {
+ return readInt32LE(this.batchDataUint8, edit + 4); // 2nd int
+ };
+ OutOfProcessRenderTreeEditReader.prototype.newTreeIndex = function (edit) {
+ return readInt32LE(this.batchDataUint8, edit + 8); // 3rd int
+ };
+ OutOfProcessRenderTreeEditReader.prototype.removedAttributeName = function (edit) {
+ var stringIndex = readInt32LE(this.batchDataUint8, edit + 12); // 4th int
+ return this.stringReader.readString(stringIndex);
+ };
+ return OutOfProcessRenderTreeEditReader;
+}());
+var OutOfProcessRenderTreeFrameReader = /** @class */ (function () {
+ function OutOfProcessRenderTreeFrameReader(batchDataUint8, stringReader) {
+ this.batchDataUint8 = batchDataUint8;
+ this.stringReader = stringReader;
+ }
+ // For render frames, the 2nd-4th ints have different meanings depending on frameType.
+ // It's the caller's responsibility not to evaluate properties that aren't applicable to the frameType.
+ OutOfProcessRenderTreeFrameReader.prototype.frameType = function (frame) {
+ return readInt32LE(this.batchDataUint8, frame); // 1st int
+ };
+ OutOfProcessRenderTreeFrameReader.prototype.subtreeLength = function (frame) {
+ return readInt32LE(this.batchDataUint8, frame + 4); // 2nd int
+ };
+ OutOfProcessRenderTreeFrameReader.prototype.elementReferenceCaptureId = function (frame) {
+ var stringIndex = readInt32LE(this.batchDataUint8, frame + 4); // 2nd int
+ return this.stringReader.readString(stringIndex);
+ };
+ OutOfProcessRenderTreeFrameReader.prototype.componentId = function (frame) {
+ return readInt32LE(this.batchDataUint8, frame + 8); // 3rd int
+ };
+ OutOfProcessRenderTreeFrameReader.prototype.elementName = function (frame) {
+ var stringIndex = readInt32LE(this.batchDataUint8, frame + 8); // 3rd int
+ return this.stringReader.readString(stringIndex);
+ };
+ OutOfProcessRenderTreeFrameReader.prototype.textContent = function (frame) {
+ var stringIndex = readInt32LE(this.batchDataUint8, frame + 4); // 2nd int
+ return this.stringReader.readString(stringIndex);
+ };
+ OutOfProcessRenderTreeFrameReader.prototype.markupContent = function (frame) {
+ var stringIndex = readInt32LE(this.batchDataUint8, frame + 4); // 2nd int
+ return this.stringReader.readString(stringIndex);
+ };
+ OutOfProcessRenderTreeFrameReader.prototype.attributeName = function (frame) {
+ var stringIndex = readInt32LE(this.batchDataUint8, frame + 4); // 2nd int
+ return this.stringReader.readString(stringIndex);
+ };
+ OutOfProcessRenderTreeFrameReader.prototype.attributeValue = function (frame) {
+ var stringIndex = readInt32LE(this.batchDataUint8, frame + 8); // 3rd int
+ return this.stringReader.readString(stringIndex);
+ };
+ OutOfProcessRenderTreeFrameReader.prototype.attributeEventHandlerId = function (frame) {
+ return readInt32LE(this.batchDataUint8, frame + 12); // 4th int
+ };
+ return OutOfProcessRenderTreeFrameReader;
+}());
+var OutOfProcessStringReader = /** @class */ (function () {
+ function OutOfProcessStringReader(batchDataUint8) {
+ this.batchDataUint8 = batchDataUint8;
+ // Final int gives start position of the string table
+ this.stringTableStartIndex = readInt32LE(batchDataUint8, batchDataUint8.length - 4);
+ }
+ OutOfProcessStringReader.prototype.readString = function (index) {
+ if (index === -1) { // Special value encodes 'null'
+ return null;
+ }
+ else {
+ var stringTableEntryPos = readInt32LE(this.batchDataUint8, this.stringTableStartIndex + index * stringTableEntryLength);
+ // By default, .NET's BinaryWriter gives LEB128-length-prefixed UTF-8 data.
+ // This is convenient enough to decode in JavaScript.
+ var numUtf8Bytes = readLEB128(this.batchDataUint8, stringTableEntryPos);
+ var charsStart = stringTableEntryPos + numLEB128Bytes(numUtf8Bytes);
+ var utf8Data = new Uint8Array(this.batchDataUint8.buffer, this.batchDataUint8.byteOffset + charsStart, numUtf8Bytes);
+ return Utf8Decoder_1.decodeUtf8(utf8Data);
+ }
+ };
+ return OutOfProcessStringReader;
+}());
+var OutOfProcessArrayRangeReader = /** @class */ (function () {
+ function OutOfProcessArrayRangeReader(batchDataUint8) {
+ this.batchDataUint8 = batchDataUint8;
+ }
+ OutOfProcessArrayRangeReader.prototype.count = function (arrayRange) {
+ // First int is count
+ return readInt32LE(this.batchDataUint8, arrayRange);
+ };
+ OutOfProcessArrayRangeReader.prototype.values = function (arrayRange) {
+ // Entries data starts after the 'count' int (i.e., after 4 bytes)
+ return arrayRange + 4;
+ };
+ return OutOfProcessArrayRangeReader;
+}());
+var OutOfProcessArraySegmentReader = /** @class */ (function () {
+ function OutOfProcessArraySegmentReader(batchDataUint8) {
+ this.batchDataUint8 = batchDataUint8;
+ }
+ OutOfProcessArraySegmentReader.prototype.offset = function (arraySegment) {
+ // Not used by the out-of-process representation of RenderBatch data.
+ // This only exists on the ArraySegmentReader for the shared-memory representation.
+ return 0;
+ };
+ OutOfProcessArraySegmentReader.prototype.count = function (arraySegment) {
+ // First int is count
+ return readInt32LE(this.batchDataUint8, arraySegment);
+ };
+ OutOfProcessArraySegmentReader.prototype.values = function (arraySegment) {
+ // Entries data starts after the 'count' int (i.e., after 4 bytes)
+ return arraySegment + 4;
+ };
+ return OutOfProcessArraySegmentReader;
+}());
+function readInt32LE(buffer, position) {
+ return (buffer[position])
+ | (buffer[position + 1] << 8)
+ | (buffer[position + 2] << 16)
+ | (buffer[position + 3] << 24);
+}
+function readLEB128(buffer, position) {
+ var result = 0;
+ var shift = 0;
+ for (var index = 0; index < 4; index++) {
+ var byte = buffer[position + index];
+ result |= (byte & 127) << shift;
+ if (byte < 128) {
+ break;
+ }
+ shift += 7;
+ }
+ return result;
+}
+function numLEB128Bytes(value) {
+ return value < 128 ? 1
+ : value < 16384 ? 2
+ : value < 2097152 ? 3 : 4;
+}
+
+
+/***/ }),
+
+/***/ "./Rendering/RenderBatch/RenderBatch.ts":
+/*!**********************************************!*\
+ !*** ./Rendering/RenderBatch/RenderBatch.ts ***!
+ \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var EditType;
+(function (EditType) {
+ // The values must be kept in sync with the .NET equivalent in RenderTreeEditType.cs
+ EditType[EditType["prependFrame"] = 1] = "prependFrame";
+ EditType[EditType["removeFrame"] = 2] = "removeFrame";
+ EditType[EditType["setAttribute"] = 3] = "setAttribute";
+ EditType[EditType["removeAttribute"] = 4] = "removeAttribute";
+ EditType[EditType["updateText"] = 5] = "updateText";
+ EditType[EditType["stepIn"] = 6] = "stepIn";
+ EditType[EditType["stepOut"] = 7] = "stepOut";
+ EditType[EditType["updateMarkup"] = 8] = "updateMarkup";
+})(EditType = exports.EditType || (exports.EditType = {}));
+var FrameType;
+(function (FrameType) {
+ // The values must be kept in sync with the .NET equivalent in RenderTreeFrameType.cs
+ FrameType[FrameType["element"] = 1] = "element";
+ FrameType[FrameType["text"] = 2] = "text";
+ FrameType[FrameType["attribute"] = 3] = "attribute";
+ FrameType[FrameType["component"] = 4] = "component";
+ FrameType[FrameType["region"] = 5] = "region";
+ FrameType[FrameType["elementReferenceCapture"] = 6] = "elementReferenceCapture";
+ FrameType[FrameType["markup"] = 8] = "markup";
+})(FrameType = exports.FrameType || (exports.FrameType = {}));
+
+
+/***/ }),
+
+/***/ "./Rendering/RenderBatch/Utf8Decoder.ts":
+/*!**********************************************!*\
+ !*** ./Rendering/RenderBatch/Utf8Decoder.ts ***!
+ \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var nativeDecoder = typeof TextDecoder === 'function'
+ ? new TextDecoder('utf-8')
+ : null;
+exports.decodeUtf8 = nativeDecoder ? nativeDecoder.decode.bind(nativeDecoder) : decodeImpl;
+/*!
+Logic in decodeImpl is derived from fast-text-encoding
+https://github.com/samthor/fast-text-encoding
+
+License for fast-text-encoding: Apache 2.0
+https://github.com/samthor/fast-text-encoding/blob/master/LICENSE
+*/
+function decodeImpl(bytes) {
+ var pos = 0;
+ var len = bytes.length;
+ var out = [];
+ var substrings = [];
+ while (pos < len) {
+ var byte1 = bytes[pos++];
+ if (byte1 === 0) {
+ break; // NULL
+ }
+ if ((byte1 & 0x80) === 0) { // 1-byte
+ out.push(byte1);
+ }
+ else if ((byte1 & 0xe0) === 0xc0) { // 2-byte
+ var byte2 = bytes[pos++] & 0x3f;
+ out.push(((byte1 & 0x1f) << 6) | byte2);
+ }
+ else if ((byte1 & 0xf0) === 0xe0) {
+ var byte2 = bytes[pos++] & 0x3f;
+ var byte3 = bytes[pos++] & 0x3f;
+ out.push(((byte1 & 0x1f) << 12) | (byte2 << 6) | byte3);
+ }
+ else if ((byte1 & 0xf8) === 0xf0) {
+ var byte2 = bytes[pos++] & 0x3f;
+ var byte3 = bytes[pos++] & 0x3f;
+ var byte4 = bytes[pos++] & 0x3f;
+ // this can be > 0xffff, so possibly generate surrogates
+ var codepoint = ((byte1 & 0x07) << 0x12) | (byte2 << 0x0c) | (byte3 << 0x06) | byte4;
+ if (codepoint > 0xffff) {
+ // codepoint &= ~0x10000;
+ codepoint -= 0x10000;
+ out.push((codepoint >>> 10) & 0x3ff | 0xd800);
+ codepoint = 0xdc00 | codepoint & 0x3ff;
+ }
+ out.push(codepoint);
+ }
+ else {
+ // FIXME: we're ignoring this
+ }
+ // As a workaround for https://github.com/samthor/fast-text-encoding/issues/1,
+ // make sure the 'out' array never gets too long. When it reaches a limit, we
+ // stringify what we have so far and append to a list of outputs.
+ if (out.length > 1024) {
+ substrings.push(String.fromCharCode.apply(null, out));
+ out.length = 0;
+ }
+ }
+ substrings.push(String.fromCharCode.apply(null, out));
+ return substrings.join('');
+}
+
+
+/***/ }),
+
+/***/ "./Rendering/Renderer.ts":
+/*!*******************************!*\
+ !*** ./Rendering/Renderer.ts ***!
+ \*******************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var BrowserRenderer_1 = __webpack_require__(/*! ./BrowserRenderer */ "./Rendering/BrowserRenderer.ts");
+var browserRenderers = {};
+function attachRootComponentToElement(browserRendererId, elementSelector, componentId) {
+ var element = document.querySelector(elementSelector);
+ if (!element) {
+ throw new Error("Could not find any element matching selector '" + elementSelector + "'.");
+ }
+ var browserRenderer = browserRenderers[browserRendererId];
+ if (!browserRenderer) {
+ browserRenderer = browserRenderers[browserRendererId] = new BrowserRenderer_1.BrowserRenderer(browserRendererId);
+ }
+ browserRenderer.attachRootComponentToElement(componentId, element);
+}
+exports.attachRootComponentToElement = attachRootComponentToElement;
+function renderBatch(browserRendererId, batch) {
+ var browserRenderer = browserRenderers[browserRendererId];
+ if (!browserRenderer) {
+ throw new Error("There is no browser renderer with ID " + browserRendererId + ".");
+ }
+ var arrayRangeReader = batch.arrayRangeReader;
+ var updatedComponentsRange = batch.updatedComponents();
+ var updatedComponentsValues = arrayRangeReader.values(updatedComponentsRange);
+ var updatedComponentsLength = arrayRangeReader.count(updatedComponentsRange);
+ var referenceFrames = batch.referenceFrames();
+ var referenceFramesValues = arrayRangeReader.values(referenceFrames);
+ var diffReader = batch.diffReader;
+ for (var i = 0; i < updatedComponentsLength; i++) {
+ var diff = batch.updatedComponentsEntry(updatedComponentsValues, i);
+ var componentId = diffReader.componentId(diff);
+ var edits = diffReader.edits(diff);
+ browserRenderer.updateComponent(batch, componentId, edits, referenceFramesValues);
+ }
+ var disposedComponentIdsRange = batch.disposedComponentIds();
+ var disposedComponentIdsValues = arrayRangeReader.values(disposedComponentIdsRange);
+ var disposedComponentIdsLength = arrayRangeReader.count(disposedComponentIdsRange);
+ for (var i = 0; i < disposedComponentIdsLength; i++) {
+ var componentId = batch.disposedComponentIdsEntry(disposedComponentIdsValues, i);
+ browserRenderer.disposeComponent(componentId);
+ }
+ var disposedEventHandlerIdsRange = batch.disposedEventHandlerIds();
+ var disposedEventHandlerIdsValues = arrayRangeReader.values(disposedEventHandlerIdsRange);
+ var disposedEventHandlerIdsLength = arrayRangeReader.count(disposedEventHandlerIdsRange);
+ for (var i = 0; i < disposedEventHandlerIdsLength; i++) {
+ var eventHandlerId = batch.disposedEventHandlerIdsEntry(disposedEventHandlerIdsValues, i);
+ browserRenderer.disposeEventHandler(eventHandlerId);
+ }
+}
+exports.renderBatch = renderBatch;
+
+
+/***/ }),
+
+/***/ "./Services/Http.ts":
+/*!**************************!*\
+ !*** ./Services/Http.ts ***!
+ \**************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+var __generator = (this && this.__generator) || function (thisArg, body) {
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
+ function verb(n) { return function (v) { return step([n, v]); }; }
+ function step(op) {
+ if (f) throw new TypeError("Generator is already executing.");
+ while (_) try {
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
+ if (y = 0, t) op = [op[0] & 2, t.value];
+ switch (op[0]) {
+ case 0: case 1: t = op; break;
+ case 4: _.label++; return { value: op[1], done: false };
+ case 5: _.label++; y = op[1]; op = [0]; continue;
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
+ default:
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
+ if (t[2]) _.ops.pop();
+ _.trys.pop(); continue;
+ }
+ op = body.call(thisArg, _);
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
+ }
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+var Environment_1 = __webpack_require__(/*! ../Environment */ "./Environment.ts");
+var httpClientAssembly = 'Microsoft.AspNetCore.Blazor';
+var httpClientNamespace = httpClientAssembly + ".Http";
+var httpClientTypeName = 'WebAssemblyHttpMessageHandler';
+var receiveResponseMethod;
+var allocateArrayMethod;
+// These are the functions we're making available for invocation from .NET
+exports.internalFunctions = {
+ sendAsync: sendAsync
+};
+function sendAsync(id, body, jsonFetchArgs) {
+ return __awaiter(this, void 0, void 0, function () {
+ var response, responseData, fetchOptions, requestInit, ex_1;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ fetchOptions = JSON.parse(Environment_1.platform.toJavaScriptString(jsonFetchArgs));
+ requestInit = Object.assign(fetchOptions.requestInit, fetchOptions.requestInitOverrides);
+ if (body) {
+ requestInit.body = Environment_1.platform.toUint8Array(body);
+ }
+ _a.label = 1;
+ case 1:
+ _a.trys.push([1, 4, , 5]);
+ return [4 /*yield*/, fetch(fetchOptions.requestUri, requestInit)];
+ case 2:
+ response = _a.sent();
+ return [4 /*yield*/, response.arrayBuffer()];
+ case 3:
+ responseData = _a.sent();
+ return [3 /*break*/, 5];
+ case 4:
+ ex_1 = _a.sent();
+ dispatchErrorResponse(id, ex_1.toString());
+ return [2 /*return*/];
+ case 5:
+ dispatchSuccessResponse(id, response, responseData);
+ return [2 /*return*/];
+ }
+ });
+ });
+}
+function dispatchSuccessResponse(id, response, responseData) {
+ var responseDescriptor = {
+ statusCode: response.status,
+ statusText: response.statusText,
+ headers: []
+ };
+ response.headers.forEach(function (value, name) {
+ responseDescriptor.headers.push([name, value]);
+ });
+ if (!allocateArrayMethod) {
+ allocateArrayMethod = Environment_1.platform.findMethod(httpClientAssembly, httpClientNamespace, httpClientTypeName, 'AllocateArray');
+ }
+ // allocate a managed byte[] of the right size
+ var dotNetArray = Environment_1.platform.callMethod(allocateArrayMethod, null, [Environment_1.platform.toDotNetString(responseData.byteLength.toString())]);
+ // get an Uint8Array view of it
+ var array = Environment_1.platform.toUint8Array(dotNetArray);
+ // copy the responseData to our managed byte[]
+ array.set(new Uint8Array(responseData));
+ dispatchResponse(id, Environment_1.platform.toDotNetString(JSON.stringify(responseDescriptor)), dotNetArray,
+ /* errorMessage */ null);
+}
+function dispatchErrorResponse(id, errorMessage) {
+ dispatchResponse(id,
+ /* responseDescriptor */ null,
+ /* responseText */ null, Environment_1.platform.toDotNetString(errorMessage));
+}
+function dispatchResponse(id, responseDescriptor, responseData, errorMessage) {
+ if (!receiveResponseMethod) {
+ receiveResponseMethod = Environment_1.platform.findMethod(httpClientAssembly, httpClientNamespace, httpClientTypeName, 'ReceiveResponse');
+ }
+ Environment_1.platform.callMethod(receiveResponseMethod, null, [
+ Environment_1.platform.toDotNetString(id.toString()),
+ responseDescriptor,
+ responseData,
+ errorMessage,
+ ]);
+}
+
+
+/***/ }),
+
+/***/ "./Services/UriHelper.ts":
+/*!*******************************!*\
+ !*** ./Services/UriHelper.ts ***!
+ \*******************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+var __generator = (this && this.__generator) || function (thisArg, body) {
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
+ function verb(n) { return function (v) { return step([n, v]); }; }
+ function step(op) {
+ if (f) throw new TypeError("Generator is already executing.");
+ while (_) try {
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
+ if (y = 0, t) op = [op[0] & 2, t.value];
+ switch (op[0]) {
+ case 0: case 1: t = op; break;
+ case 4: _.label++; return { value: op[1], done: false };
+ case 5: _.label++; y = op[1]; op = [0]; continue;
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
+ default:
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
+ if (t[2]) _.ops.pop();
+ _.trys.pop(); continue;
+ }
+ op = body.call(thisArg, _);
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
+ }
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+__webpack_require__(/*! @dotnet/jsinterop */ "./node_modules/@dotnet/jsinterop/dist/Microsoft.JSInterop.js");
+var hasRegisteredEventListeners = false;
+// Will be initialized once someone registers
+var notifyLocationChangedCallback = null;
+// These are the functions we're making available for invocation from .NET
+exports.internalFunctions = {
+ enableNavigationInterception: enableNavigationInterception,
+ navigateTo: navigateTo,
+ getBaseURI: function () { return document.baseURI; },
+ getLocationHref: function () { return location.href; },
+};
+function enableNavigationInterception(assemblyName, functionName) {
+ if (hasRegisteredEventListeners || assemblyName === undefined || functionName === undefined) {
+ return;
+ }
+ notifyLocationChangedCallback = { assemblyName: assemblyName, functionName: functionName };
+ hasRegisteredEventListeners = true;
+ document.addEventListener('click', function (event) {
+ // Intercept clicks on all <a> elements where the href is within the <base href> URI space
+ // We must explicitly check if it has an 'href' attribute, because if it doesn't, the result might be null or an empty string depending on the browser
+ var anchorTarget = findClosestAncestor(event.target, 'A');
+ var hrefAttributeName = 'href';
+ if (anchorTarget && anchorTarget.hasAttribute(hrefAttributeName) && event.button === 0) {
+ var href = anchorTarget.getAttribute(hrefAttributeName);
+ var absoluteHref = toAbsoluteUri(href);
+ var targetAttributeValue = anchorTarget.getAttribute('target');
+ var opensInSameFrame = !targetAttributeValue || targetAttributeValue === '_self';
+ // Don't stop ctrl/meta-click (etc) from opening links in new tabs/windows
+ if (isWithinBaseUriSpace(absoluteHref) && !eventHasSpecialKey(event) && opensInSameFrame) {
+ event.preventDefault();
+ performInternalNavigation(absoluteHref);
+ }
+ }
+ });
+ window.addEventListener('popstate', handleInternalNavigation);
+}
+function navigateTo(uri, forceLoad) {
+ var absoluteUri = toAbsoluteUri(uri);
+ if (!forceLoad && isWithinBaseUriSpace(absoluteUri)) {
+ performInternalNavigation(absoluteUri);
+ }
+ else {
+ location.href = uri;
+ }
+}
+exports.navigateTo = navigateTo;
+function performInternalNavigation(absoluteInternalHref) {
+ history.pushState(null, /* ignored title */ '', absoluteInternalHref);
+ handleInternalNavigation();
+}
+function handleInternalNavigation() {
+ return __awaiter(this, void 0, void 0, function () {
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ if (!notifyLocationChangedCallback) return [3 /*break*/, 2];
+ return [4 /*yield*/, DotNet.invokeMethodAsync(notifyLocationChangedCallback.assemblyName, notifyLocationChangedCallback.functionName, location.href)];
+ case 1:
+ _a.sent();
+ _a.label = 2;
+ case 2: return [2 /*return*/];
+ }
+ });
+ });
+}
+var testAnchor;
+function toAbsoluteUri(relativeUri) {
+ testAnchor = testAnchor || document.createElement('a');
+ testAnchor.href = relativeUri;
+ return testAnchor.href;
+}
+function findClosestAncestor(element, tagName) {
+ return !element
+ ? null
+ : element.tagName === tagName
+ ? element
+ : findClosestAncestor(element.parentElement, tagName);
+}
+function isWithinBaseUriSpace(href) {
+ var baseUriWithTrailingSlash = toBaseUriWithTrailingSlash(document.baseURI); // TODO: Might baseURI really be null?
+ return href.startsWith(baseUriWithTrailingSlash);
+}
+function toBaseUriWithTrailingSlash(baseUri) {
+ return baseUri.substr(0, baseUri.lastIndexOf('/') + 1);
+}
+function eventHasSpecialKey(event) {
+ return event.ctrlKey || event.shiftKey || event.altKey || event.metaKey;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/@aspnet/signalr-protocol-msgpack/dist/esm/BinaryMessageFormat.js":
+/*!***************************************************************************************!*\
+ !*** ./node_modules/@aspnet/signalr-protocol-msgpack/dist/esm/BinaryMessageFormat.js ***!
+ \***************************************************************************************/
+/*! exports provided: BinaryMessageFormat */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BinaryMessageFormat", function() { return BinaryMessageFormat; });
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+// Not exported from index.
+var BinaryMessageFormat = /** @class */ (function () {
+ function BinaryMessageFormat() {
+ }
+ // The length prefix of binary messages is encoded as VarInt. Read the comment in
+ // the BinaryMessageParser.TryParseMessage for details.
+ BinaryMessageFormat.write = function (output) {
+ // msgpack5 uses returns Buffer instead of Uint8Array on IE10 and some other browser
+ // in which case .byteLength does will be undefined
+ var size = output.byteLength || output.length;
+ var lenBuffer = [];
+ do {
+ var sizePart = size & 0x7f;
+ size = size >> 7;
+ if (size > 0) {
+ sizePart |= 0x80;
+ }
+ lenBuffer.push(sizePart);
+ } while (size > 0);
+ // msgpack5 uses returns Buffer instead of Uint8Array on IE10 and some other browser
+ // in which case .byteLength does will be undefined
+ size = output.byteLength || output.length;
+ var buffer = new Uint8Array(lenBuffer.length + size);
+ buffer.set(lenBuffer, 0);
+ buffer.set(output, lenBuffer.length);
+ return buffer.buffer;
+ };
+ BinaryMessageFormat.parse = function (input) {
+ var result = [];
+ var uint8Array = new Uint8Array(input);
+ var maxLengthPrefixSize = 5;
+ var numBitsToShift = [0, 7, 14, 21, 28];
+ for (var offset = 0; offset < input.byteLength;) {
+ var numBytes = 0;
+ var size = 0;
+ var byteRead = void 0;
+ do {
+ byteRead = uint8Array[offset + numBytes];
+ size = size | ((byteRead & 0x7f) << (numBitsToShift[numBytes]));
+ numBytes++;
+ } while (numBytes < Math.min(maxLengthPrefixSize, input.byteLength - offset) && (byteRead & 0x80) !== 0);
+ if ((byteRead & 0x80) !== 0 && numBytes < maxLengthPrefixSize) {
+ throw new Error("Cannot read message size.");
+ }
+ if (numBytes === maxLengthPrefixSize && byteRead > 7) {
+ throw new Error("Messages bigger than 2GB are not supported.");
+ }
+ if (uint8Array.byteLength >= (offset + numBytes + size)) {
+ // IE does not support .slice() so use subarray
+ result.push(uint8Array.slice
+ ? uint8Array.slice(offset + numBytes, offset + numBytes + size)
+ : uint8Array.subarray(offset + numBytes, offset + numBytes + size));
+ }
+ else {
+ throw new Error("Incomplete message.");
+ }
+ offset = offset + numBytes + size;
+ }
+ return result;
+ };
+ return BinaryMessageFormat;
+}());
+
+//# sourceMappingURL=BinaryMessageFormat.js.map
+
+/***/ }),
+
+/***/ "./node_modules/@aspnet/signalr-protocol-msgpack/dist/esm/MessagePackHubProtocol.js":
+/*!******************************************************************************************!*\
+ !*** ./node_modules/@aspnet/signalr-protocol-msgpack/dist/esm/MessagePackHubProtocol.js ***!
+ \******************************************************************************************/
+/*! exports provided: MessagePackHubProtocol */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MessagePackHubProtocol", function() { return MessagePackHubProtocol; });
+/* harmony import */ var buffer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! buffer */ "./node_modules/buffer/index.js");
+/* harmony import */ var buffer__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(buffer__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var msgpack5__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! msgpack5 */ "./node_modules/msgpack5/index.js");
+/* harmony import */ var msgpack5__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(msgpack5__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _aspnet_signalr__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @aspnet/signalr */ "./node_modules/@aspnet/signalr/dist/esm/index.js");
+/* harmony import */ var _BinaryMessageFormat__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./BinaryMessageFormat */ "./node_modules/@aspnet/signalr-protocol-msgpack/dist/esm/BinaryMessageFormat.js");
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+
+
+
+// TypeDoc's @inheritDoc and @link don't work across modules :(
+/** Implements the MessagePack Hub Protocol */
+var MessagePackHubProtocol = /** @class */ (function () {
+ function MessagePackHubProtocol() {
+ /** The name of the protocol. This is used by SignalR to resolve the protocol between the client and server. */
+ this.name = "messagepack";
+ /** The version of the protocol. */
+ this.version = 1;
+ /** The TransferFormat of the protocol. */
+ this.transferFormat = _aspnet_signalr__WEBPACK_IMPORTED_MODULE_2__["TransferFormat"].Binary;
+ }
+ /** Creates an array of HubMessage objects from the specified serialized representation.
+ *
+ * @param {ArrayBuffer} input An ArrayBuffer containing the serialized representation.
+ * @param {ILogger} logger A logger that will be used to log messages that occur during parsing.
+ */
+ MessagePackHubProtocol.prototype.parseMessages = function (input, logger) {
+ var _this = this;
+ // The interface does allow "string" to be passed in, but this implementation does not. So let's throw a useful error.
+ if (!(input instanceof ArrayBuffer)) {
+ throw new Error("Invalid input for MessagePack hub protocol. Expected an ArrayBuffer.");
+ }
+ if (logger === null) {
+ logger = _aspnet_signalr__WEBPACK_IMPORTED_MODULE_2__["NullLogger"].instance;
+ }
+ return _BinaryMessageFormat__WEBPACK_IMPORTED_MODULE_3__["BinaryMessageFormat"].parse(input).map(function (m) { return _this.parseMessage(m, logger); });
+ };
+ /** Writes the specified HubMessage to an ArrayBuffer and returns it.
+ *
+ * @param {HubMessage} message The message to write.
+ * @returns {ArrayBuffer} An ArrayBuffer containing the serialized representation of the message.
+ */
+ MessagePackHubProtocol.prototype.writeMessage = function (message) {
+ switch (message.type) {
+ case _aspnet_signalr__WEBPACK_IMPORTED_MODULE_2__["MessageType"].Invocation:
+ return this.writeInvocation(message);
+ case _aspnet_signalr__WEBPACK_IMPORTED_MODULE_2__["MessageType"].StreamInvocation:
+ return this.writeStreamInvocation(message);
+ case _aspnet_signalr__WEBPACK_IMPORTED_MODULE_2__["MessageType"].StreamItem:
+ case _aspnet_signalr__WEBPACK_IMPORTED_MODULE_2__["MessageType"].Completion:
+ throw new Error("Writing messages of type '" + message.type + "' is not supported.");
+ default:
+ throw new Error("Invalid message type.");
+ }
+ };
+ MessagePackHubProtocol.prototype.parseMessage = function (input, logger) {
+ if (input.length === 0) {
+ throw new Error("Invalid payload.");
+ }
+ var msgpack = msgpack5__WEBPACK_IMPORTED_MODULE_1__();
+ var properties = msgpack.decode(new buffer__WEBPACK_IMPORTED_MODULE_0__["Buffer"](input));
+ if (properties.length === 0 || !(properties instanceof Array)) {
+ throw new Error("Invalid payload.");
+ }
+ var messageType = properties[0];
+ switch (messageType) {
+ case _aspnet_signalr__WEBPACK_IMPORTED_MODULE_2__["MessageType"].Invocation:
+ return this.createInvocationMessage(this.readHeaders(properties), properties);
+ case _aspnet_signalr__WEBPACK_IMPORTED_MODULE_2__["MessageType"].StreamItem:
+ return this.createStreamItemMessage(this.readHeaders(properties), properties);
+ case _aspnet_signalr__WEBPACK_IMPORTED_MODULE_2__["MessageType"].Completion:
+ return this.createCompletionMessage(this.readHeaders(properties), properties);
+ case _aspnet_signalr__WEBPACK_IMPORTED_MODULE_2__["MessageType"].Ping:
+ return this.createPingMessage(properties);
+ case _aspnet_signalr__WEBPACK_IMPORTED_MODULE_2__["MessageType"].Close:
+ return this.createCloseMessage(properties);
+ default:
+ // Future protocol changes can add message types, old clients can ignore them
+ logger.log(_aspnet_signalr__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Information, "Unknown message type '" + messageType + "' ignored.");
+ return null;
+ }
+ };
+ MessagePackHubProtocol.prototype.createCloseMessage = function (properties) {
+ // check minimum length to allow protocol to add items to the end of objects in future releases
+ if (properties.length < 2) {
+ throw new Error("Invalid payload for Close message.");
+ }
+ return {
+ // Close messages have no headers.
+ error: properties[1],
+ type: _aspnet_signalr__WEBPACK_IMPORTED_MODULE_2__["MessageType"].Close,
+ };
+ };
+ MessagePackHubProtocol.prototype.createPingMessage = function (properties) {
+ // check minimum length to allow protocol to add items to the end of objects in future releases
+ if (properties.length < 1) {
+ throw new Error("Invalid payload for Ping message.");
+ }
+ return {
+ // Ping messages have no headers.
+ type: _aspnet_signalr__WEBPACK_IMPORTED_MODULE_2__["MessageType"].Ping,
+ };
+ };
+ MessagePackHubProtocol.prototype.createInvocationMessage = function (headers, properties) {
+ // check minimum length to allow protocol to add items to the end of objects in future releases
+ if (properties.length < 5) {
+ throw new Error("Invalid payload for Invocation message.");
+ }
+ var invocationId = properties[2];
+ if (invocationId) {
+ return {
+ arguments: properties[4],
+ headers: headers,
+ invocationId: invocationId,
+ target: properties[3],
+ type: _aspnet_signalr__WEBPACK_IMPORTED_MODULE_2__["MessageType"].Invocation,
+ };
+ }
+ else {
+ return {
+ arguments: properties[4],
+ headers: headers,
+ target: properties[3],
+ type: _aspnet_signalr__WEBPACK_IMPORTED_MODULE_2__["MessageType"].Invocation,
+ };
+ }
+ };
+ MessagePackHubProtocol.prototype.createStreamItemMessage = function (headers, properties) {
+ // check minimum length to allow protocol to add items to the end of objects in future releases
+ if (properties.length < 4) {
+ throw new Error("Invalid payload for StreamItem message.");
+ }
+ return {
+ headers: headers,
+ invocationId: properties[2],
+ item: properties[3],
+ type: _aspnet_signalr__WEBPACK_IMPORTED_MODULE_2__["MessageType"].StreamItem,
+ };
+ };
+ MessagePackHubProtocol.prototype.createCompletionMessage = function (headers, properties) {
+ // check minimum length to allow protocol to add items to the end of objects in future releases
+ if (properties.length < 4) {
+ throw new Error("Invalid payload for Completion message.");
+ }
+ var errorResult = 1;
+ var voidResult = 2;
+ var nonVoidResult = 3;
+ var resultKind = properties[3];
+ if (resultKind !== voidResult && properties.length < 5) {
+ throw new Error("Invalid payload for Completion message.");
+ }
+ var completionMessage = {
+ error: null,
+ headers: headers,
+ invocationId: properties[2],
+ result: null,
+ type: _aspnet_signalr__WEBPACK_IMPORTED_MODULE_2__["MessageType"].Completion,
+ };
+ switch (resultKind) {
+ case errorResult:
+ completionMessage.error = properties[4];
+ break;
+ case nonVoidResult:
+ completionMessage.result = properties[4];
+ break;
+ }
+ return completionMessage;
+ };
+ MessagePackHubProtocol.prototype.writeInvocation = function (invocationMessage) {
+ var msgpack = msgpack5__WEBPACK_IMPORTED_MODULE_1__();
+ var payload = msgpack.encode([_aspnet_signalr__WEBPACK_IMPORTED_MODULE_2__["MessageType"].Invocation, invocationMessage.headers || {}, invocationMessage.invocationId || null,
+ invocationMessage.target, invocationMessage.arguments]);
+ return _BinaryMessageFormat__WEBPACK_IMPORTED_MODULE_3__["BinaryMessageFormat"].write(payload.slice());
+ };
+ MessagePackHubProtocol.prototype.writeStreamInvocation = function (streamInvocationMessage) {
+ var msgpack = msgpack5__WEBPACK_IMPORTED_MODULE_1__();
+ var payload = msgpack.encode([_aspnet_signalr__WEBPACK_IMPORTED_MODULE_2__["MessageType"].StreamInvocation, streamInvocationMessage.headers || {}, streamInvocationMessage.invocationId,
+ streamInvocationMessage.target, streamInvocationMessage.arguments]);
+ return _BinaryMessageFormat__WEBPACK_IMPORTED_MODULE_3__["BinaryMessageFormat"].write(payload.slice());
+ };
+ MessagePackHubProtocol.prototype.readHeaders = function (properties) {
+ var headers = properties[1];
+ if (typeof headers !== "object") {
+ throw new Error("Invalid headers.");
+ }
+ return headers;
+ };
+ return MessagePackHubProtocol;
+}());
+
+//# sourceMappingURL=MessagePackHubProtocol.js.map
+
+/***/ }),
+
+/***/ "./node_modules/@aspnet/signalr-protocol-msgpack/dist/esm/index.js":
+/*!*************************************************************************!*\
+ !*** ./node_modules/@aspnet/signalr-protocol-msgpack/dist/esm/index.js ***!
+ \*************************************************************************/
+/*! exports provided: VERSION, MessagePackHubProtocol */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VERSION", function() { return VERSION; });
+/* harmony import */ var _MessagePackHubProtocol__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./MessagePackHubProtocol */ "./node_modules/@aspnet/signalr-protocol-msgpack/dist/esm/MessagePackHubProtocol.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "MessagePackHubProtocol", function() { return _MessagePackHubProtocol__WEBPACK_IMPORTED_MODULE_0__["MessagePackHubProtocol"]; });
+
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+// Version token that will be replaced by the prepack command
+/** The version of the SignalR Message Pack protocol library. */
+var VERSION = "1.0.2";
+
+//# sourceMappingURL=index.js.map
+
+/***/ }),
+
+/***/ "./node_modules/@aspnet/signalr/dist/esm/AbortController.js":
+/*!******************************************************************!*\
+ !*** ./node_modules/@aspnet/signalr/dist/esm/AbortController.js ***!
+ \******************************************************************/
+/*! exports provided: AbortController */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AbortController", function() { return AbortController; });
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+// Rough polyfill of https://developer.mozilla.org/en-US/docs/Web/API/AbortController
+// We don't actually ever use the API being polyfilled, we always use the polyfill because
+// it's a very new API right now.
+// Not exported from index.
+var AbortController = /** @class */ (function () {
+ function AbortController() {
+ this.isAborted = false;
+ }
+ AbortController.prototype.abort = function () {
+ if (!this.isAborted) {
+ this.isAborted = true;
+ if (this.onabort) {
+ this.onabort();
+ }
+ }
+ };
+ Object.defineProperty(AbortController.prototype, "signal", {
+ get: function () {
+ return this;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(AbortController.prototype, "aborted", {
+ get: function () {
+ return this.isAborted;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ return AbortController;
+}());
+
+//# sourceMappingURL=AbortController.js.map
+
+/***/ }),
+
+/***/ "./node_modules/@aspnet/signalr/dist/esm/Errors.js":
+/*!*********************************************************!*\
+ !*** ./node_modules/@aspnet/signalr/dist/esm/Errors.js ***!
+ \*********************************************************/
+/*! exports provided: HttpError, TimeoutError */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "HttpError", function() { return HttpError; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TimeoutError", function() { return TimeoutError; });
+/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+/** Error thrown when an HTTP request fails. */
+var HttpError = /** @class */ (function (_super) {
+ tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](HttpError, _super);
+ /** Constructs a new instance of {@link HttpError}.
+ *
+ * @param {string} errorMessage A descriptive error message.
+ * @param {number} statusCode The HTTP status code represented by this error.
+ */
+ function HttpError(errorMessage, statusCode) {
+ var _newTarget = this.constructor;
+ var _this = this;
+ var trueProto = _newTarget.prototype;
+ _this = _super.call(this, errorMessage) || this;
+ _this.statusCode = statusCode;
+ // Workaround issue in Typescript compiler
+ // https://github.com/Microsoft/TypeScript/issues/13965#issuecomment-278570200
+ _this.__proto__ = trueProto;
+ return _this;
+ }
+ return HttpError;
+}(Error));
+
+/** Error thrown when a timeout elapses. */
+var TimeoutError = /** @class */ (function (_super) {
+ tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](TimeoutError, _super);
+ /** Constructs a new instance of {@link TimeoutError}.
+ *
+ * @param {string} errorMessage A descriptive error message.
+ */
+ function TimeoutError(errorMessage) {
+ var _newTarget = this.constructor;
+ if (errorMessage === void 0) { errorMessage = "A timeout occurred."; }
+ var _this = this;
+ var trueProto = _newTarget.prototype;
+ _this = _super.call(this, errorMessage) || this;
+ // Workaround issue in Typescript compiler
+ // https://github.com/Microsoft/TypeScript/issues/13965#issuecomment-278570200
+ _this.__proto__ = trueProto;
+ return _this;
+ }
+ return TimeoutError;
+}(Error));
+
+//# sourceMappingURL=Errors.js.map
+
+/***/ }),
+
+/***/ "./node_modules/@aspnet/signalr/dist/esm/HandshakeProtocol.js":
+/*!********************************************************************!*\
+ !*** ./node_modules/@aspnet/signalr/dist/esm/HandshakeProtocol.js ***!
+ \********************************************************************/
+/*! exports provided: HandshakeProtocol */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "HandshakeProtocol", function() { return HandshakeProtocol; });
+/* harmony import */ var _TextMessageFormat__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./TextMessageFormat */ "./node_modules/@aspnet/signalr/dist/esm/TextMessageFormat.js");
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+var HandshakeProtocol = /** @class */ (function () {
+ function HandshakeProtocol() {
+ }
+ // Handshake request is always JSON
+ HandshakeProtocol.prototype.writeHandshakeRequest = function (handshakeRequest) {
+ return _TextMessageFormat__WEBPACK_IMPORTED_MODULE_0__["TextMessageFormat"].write(JSON.stringify(handshakeRequest));
+ };
+ HandshakeProtocol.prototype.parseHandshakeResponse = function (data) {
+ var responseMessage;
+ var messageData;
+ var remainingData;
+ if (data instanceof ArrayBuffer) {
+ // Format is binary but still need to read JSON text from handshake response
+ var binaryData = new Uint8Array(data);
+ var separatorIndex = binaryData.indexOf(_TextMessageFormat__WEBPACK_IMPORTED_MODULE_0__["TextMessageFormat"].RecordSeparatorCode);
+ if (separatorIndex === -1) {
+ throw new Error("Message is incomplete.");
+ }
+ // content before separator is handshake response
+ // optional content after is additional messages
+ var responseLength = separatorIndex + 1;
+ messageData = String.fromCharCode.apply(null, binaryData.slice(0, responseLength));
+ remainingData = (binaryData.byteLength > responseLength) ? binaryData.slice(responseLength).buffer : null;
+ }
+ else {
+ var textData = data;
+ var separatorIndex = textData.indexOf(_TextMessageFormat__WEBPACK_IMPORTED_MODULE_0__["TextMessageFormat"].RecordSeparator);
+ if (separatorIndex === -1) {
+ throw new Error("Message is incomplete.");
+ }
+ // content before separator is handshake response
+ // optional content after is additional messages
+ var responseLength = separatorIndex + 1;
+ messageData = textData.substring(0, responseLength);
+ remainingData = (textData.length > responseLength) ? textData.substring(responseLength) : null;
+ }
+ // At this point we should have just the single handshake message
+ var messages = _TextMessageFormat__WEBPACK_IMPORTED_MODULE_0__["TextMessageFormat"].parse(messageData);
+ responseMessage = JSON.parse(messages[0]);
+ // multiple messages could have arrived with handshake
+ // return additional data to be parsed as usual, or null if all parsed
+ return [remainingData, responseMessage];
+ };
+ return HandshakeProtocol;
+}());
+
+//# sourceMappingURL=HandshakeProtocol.js.map
+
+/***/ }),
+
+/***/ "./node_modules/@aspnet/signalr/dist/esm/HttpClient.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/@aspnet/signalr/dist/esm/HttpClient.js ***!
+ \*************************************************************/
+/*! exports provided: HttpResponse, HttpClient, DefaultHttpClient */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "HttpResponse", function() { return HttpResponse; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "HttpClient", function() { return HttpClient; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DefaultHttpClient", function() { return DefaultHttpClient; });
+/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
+/* harmony import */ var _Errors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Errors */ "./node_modules/@aspnet/signalr/dist/esm/Errors.js");
+/* harmony import */ var _ILogger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ILogger */ "./node_modules/@aspnet/signalr/dist/esm/ILogger.js");
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+
+
+/** Represents an HTTP response. */
+var HttpResponse = /** @class */ (function () {
+ function HttpResponse(statusCode, statusText, content) {
+ this.statusCode = statusCode;
+ this.statusText = statusText;
+ this.content = content;
+ }
+ return HttpResponse;
+}());
+
+/** Abstraction over an HTTP client.
+ *
+ * This class provides an abstraction over an HTTP client so that a different implementation can be provided on different platforms.
+ */
+var HttpClient = /** @class */ (function () {
+ function HttpClient() {
+ }
+ HttpClient.prototype.get = function (url, options) {
+ return this.send(tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, options, { method: "GET", url: url }));
+ };
+ HttpClient.prototype.post = function (url, options) {
+ return this.send(tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, options, { method: "POST", url: url }));
+ };
+ HttpClient.prototype.delete = function (url, options) {
+ return this.send(tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, options, { method: "DELETE", url: url }));
+ };
+ return HttpClient;
+}());
+
+/** Default implementation of {@link HttpClient}. */
+var DefaultHttpClient = /** @class */ (function (_super) {
+ tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DefaultHttpClient, _super);
+ /** Creates a new instance of the {@link DefaultHttpClient}, using the provided {@link ILogger} to log messages. */
+ function DefaultHttpClient(logger) {
+ var _this = _super.call(this) || this;
+ _this.logger = logger;
+ return _this;
+ }
+ /** @inheritDoc */
+ DefaultHttpClient.prototype.send = function (request) {
+ var _this = this;
+ return new Promise(function (resolve, reject) {
+ var xhr = new XMLHttpRequest();
+ xhr.open(request.method, request.url, true);
+ xhr.withCredentials = true;
+ xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
+ if (request.headers) {
+ Object.keys(request.headers)
+ .forEach(function (header) { return xhr.setRequestHeader(header, request.headers[header]); });
+ }
+ if (request.responseType) {
+ xhr.responseType = request.responseType;
+ }
+ if (request.abortSignal) {
+ request.abortSignal.onabort = function () {
+ xhr.abort();
+ };
+ }
+ if (request.timeout) {
+ xhr.timeout = request.timeout;
+ }
+ xhr.onload = function () {
+ if (request.abortSignal) {
+ request.abortSignal.onabort = null;
+ }
+ if (xhr.status >= 200 && xhr.status < 300) {
+ resolve(new HttpResponse(xhr.status, xhr.statusText, xhr.response || xhr.responseText));
+ }
+ else {
+ reject(new _Errors__WEBPACK_IMPORTED_MODULE_1__["HttpError"](xhr.statusText, xhr.status));
+ }
+ };
+ xhr.onerror = function () {
+ _this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Warning, "Error from HTTP request. " + xhr.status + ": " + xhr.statusText);
+ reject(new _Errors__WEBPACK_IMPORTED_MODULE_1__["HttpError"](xhr.statusText, xhr.status));
+ };
+ xhr.ontimeout = function () {
+ _this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Warning, "Timeout from HTTP request.");
+ reject(new _Errors__WEBPACK_IMPORTED_MODULE_1__["TimeoutError"]());
+ };
+ xhr.send(request.content || "");
+ });
+ };
+ return DefaultHttpClient;
+}(HttpClient));
+
+//# sourceMappingURL=HttpClient.js.map
+
+/***/ }),
+
+/***/ "./node_modules/@aspnet/signalr/dist/esm/HttpConnection.js":
+/*!*****************************************************************!*\
+ !*** ./node_modules/@aspnet/signalr/dist/esm/HttpConnection.js ***!
+ \*****************************************************************/
+/*! exports provided: HttpConnection */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "HttpConnection", function() { return HttpConnection; });
+/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
+/* harmony import */ var _HttpClient__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./HttpClient */ "./node_modules/@aspnet/signalr/dist/esm/HttpClient.js");
+/* harmony import */ var _ILogger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ILogger */ "./node_modules/@aspnet/signalr/dist/esm/ILogger.js");
+/* harmony import */ var _ITransport__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./ITransport */ "./node_modules/@aspnet/signalr/dist/esm/ITransport.js");
+/* harmony import */ var _LongPollingTransport__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./LongPollingTransport */ "./node_modules/@aspnet/signalr/dist/esm/LongPollingTransport.js");
+/* harmony import */ var _ServerSentEventsTransport__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ServerSentEventsTransport */ "./node_modules/@aspnet/signalr/dist/esm/ServerSentEventsTransport.js");
+/* harmony import */ var _Utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Utils */ "./node_modules/@aspnet/signalr/dist/esm/Utils.js");
+/* harmony import */ var _WebSocketTransport__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./WebSocketTransport */ "./node_modules/@aspnet/signalr/dist/esm/WebSocketTransport.js");
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+
+
+
+
+
+
+
+var MAX_REDIRECTS = 100;
+var HttpConnection = /** @class */ (function () {
+ function HttpConnection(url, options) {
+ if (options === void 0) { options = {}; }
+ this.features = {};
+ _Utils__WEBPACK_IMPORTED_MODULE_6__["Arg"].isRequired(url, "url");
+ this.logger = Object(_Utils__WEBPACK_IMPORTED_MODULE_6__["createLogger"])(options.logger);
+ this.baseUrl = this.resolveUrl(url);
+ options = options || {};
+ options.accessTokenFactory = options.accessTokenFactory || (function () { return null; });
+ options.logMessageContent = options.logMessageContent || false;
+ this.httpClient = options.httpClient || new _HttpClient__WEBPACK_IMPORTED_MODULE_1__["DefaultHttpClient"](this.logger);
+ this.connectionState = 2 /* Disconnected */;
+ this.options = options;
+ }
+ HttpConnection.prototype.start = function (transferFormat) {
+ transferFormat = transferFormat || _ITransport__WEBPACK_IMPORTED_MODULE_3__["TransferFormat"].Binary;
+ _Utils__WEBPACK_IMPORTED_MODULE_6__["Arg"].isIn(transferFormat, _ITransport__WEBPACK_IMPORTED_MODULE_3__["TransferFormat"], "transferFormat");
+ this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Debug, "Starting connection with transfer format '" + _ITransport__WEBPACK_IMPORTED_MODULE_3__["TransferFormat"][transferFormat] + "'.");
+ if (this.connectionState !== 2 /* Disconnected */) {
+ return Promise.reject(new Error("Cannot start a connection that is not in the 'Disconnected' state."));
+ }
+ this.connectionState = 0 /* Connecting */;
+ this.startPromise = this.startInternal(transferFormat);
+ return this.startPromise;
+ };
+ HttpConnection.prototype.send = function (data) {
+ if (this.connectionState !== 1 /* Connected */) {
+ throw new Error("Cannot send data if the connection is not in the 'Connected' State.");
+ }
+ return this.transport.send(data);
+ };
+ HttpConnection.prototype.stop = function (error) {
+ return tslib__WEBPACK_IMPORTED_MODULE_0__["__awaiter"](this, void 0, void 0, function () {
+ var e_1;
+ return tslib__WEBPACK_IMPORTED_MODULE_0__["__generator"](this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ this.connectionState = 2 /* Disconnected */;
+ _a.label = 1;
+ case 1:
+ _a.trys.push([1, 3, , 4]);
+ return [4 /*yield*/, this.startPromise];
+ case 2:
+ _a.sent();
+ return [3 /*break*/, 4];
+ case 3:
+ e_1 = _a.sent();
+ return [3 /*break*/, 4];
+ case 4:
+ if (!this.transport) return [3 /*break*/, 6];
+ this.stopError = error;
+ return [4 /*yield*/, this.transport.stop()];
+ case 5:
+ _a.sent();
+ this.transport = null;
+ _a.label = 6;
+ case 6: return [2 /*return*/];
+ }
+ });
+ });
+ };
+ HttpConnection.prototype.startInternal = function (transferFormat) {
+ return tslib__WEBPACK_IMPORTED_MODULE_0__["__awaiter"](this, void 0, void 0, function () {
+ var _this = this;
+ var url, negotiateResponse, redirects, _loop_1, this_1, state_1, e_2;
+ return tslib__WEBPACK_IMPORTED_MODULE_0__["__generator"](this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ url = this.baseUrl;
+ this.accessTokenFactory = this.options.accessTokenFactory;
+ _a.label = 1;
+ case 1:
+ _a.trys.push([1, 12, , 13]);
+ if (!this.options.skipNegotiation) return [3 /*break*/, 5];
+ if (!(this.options.transport === _ITransport__WEBPACK_IMPORTED_MODULE_3__["HttpTransportType"].WebSockets)) return [3 /*break*/, 3];
+ // No need to add a connection ID in this case
+ this.transport = this.constructTransport(_ITransport__WEBPACK_IMPORTED_MODULE_3__["HttpTransportType"].WebSockets);
+ // We should just call connect directly in this case.
+ // No fallback or negotiate in this case.
+ return [4 /*yield*/, this.transport.connect(url, transferFormat)];
+ case 2:
+ // We should just call connect directly in this case.
+ // No fallback or negotiate in this case.
+ _a.sent();
+ return [3 /*break*/, 4];
+ case 3: throw Error("Negotiation can only be skipped when using the WebSocket transport directly.");
+ case 4: return [3 /*break*/, 11];
+ case 5:
+ negotiateResponse = null;
+ redirects = 0;
+ _loop_1 = function () {
+ var accessToken_1;
+ return tslib__WEBPACK_IMPORTED_MODULE_0__["__generator"](this, function (_a) {
+ switch (_a.label) {
+ case 0: return [4 /*yield*/, this_1.getNegotiationResponse(url)];
+ case 1:
+ negotiateResponse = _a.sent();
+ // the user tries to stop the connection when it is being started
+ if (this_1.connectionState === 2 /* Disconnected */) {
+ return [2 /*return*/, { value: void 0 }];
+ }
+ if (negotiateResponse.url) {
+ url = negotiateResponse.url;
+ }
+ if (negotiateResponse.accessToken) {
+ accessToken_1 = negotiateResponse.accessToken;
+ this_1.accessTokenFactory = function () { return accessToken_1; };
+ }
+ redirects++;
+ return [2 /*return*/];
+ }
+ });
+ };
+ this_1 = this;
+ _a.label = 6;
+ case 6: return [5 /*yield**/, _loop_1()];
+ case 7:
+ state_1 = _a.sent();
+ if (typeof state_1 === "object")
+ return [2 /*return*/, state_1.value];
+ _a.label = 8;
+ case 8:
+ if (negotiateResponse.url && redirects < MAX_REDIRECTS) return [3 /*break*/, 6];
+ _a.label = 9;
+ case 9:
+ if (redirects === MAX_REDIRECTS && negotiateResponse.url) {
+ throw Error("Negotiate redirection limit exceeded.");
+ }
+ return [4 /*yield*/, this.createTransport(url, this.options.transport, negotiateResponse, transferFormat)];
+ case 10:
+ _a.sent();
+ _a.label = 11;
+ case 11:
+ if (this.transport instanceof _LongPollingTransport__WEBPACK_IMPORTED_MODULE_4__["LongPollingTransport"]) {
+ this.features.inherentKeepAlive = true;
+ }
+ this.transport.onreceive = this.onreceive;
+ this.transport.onclose = function (e) { return _this.stopConnection(e); };
+ // only change the state if we were connecting to not overwrite
+ // the state if the connection is already marked as Disconnected
+ this.changeState(0 /* Connecting */, 1 /* Connected */);
+ return [3 /*break*/, 13];
+ case 12:
+ e_2 = _a.sent();
+ this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Error, "Failed to start the connection: " + e_2);
+ this.connectionState = 2 /* Disconnected */;
+ this.transport = null;
+ throw e_2;
+ case 13: return [2 /*return*/];
+ }
+ });
+ });
+ };
+ HttpConnection.prototype.getNegotiationResponse = function (url) {
+ return tslib__WEBPACK_IMPORTED_MODULE_0__["__awaiter"](this, void 0, void 0, function () {
+ var token, headers, negotiateUrl, response, e_3, _a;
+ return tslib__WEBPACK_IMPORTED_MODULE_0__["__generator"](this, function (_b) {
+ switch (_b.label) {
+ case 0: return [4 /*yield*/, this.accessTokenFactory()];
+ case 1:
+ token = _b.sent();
+ if (token) {
+ headers = (_a = {},
+ _a["Authorization"] = "Bearer " + token,
+ _a);
+ }
+ negotiateUrl = this.resolveNegotiateUrl(url);
+ this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Debug, "Sending negotiation request: " + negotiateUrl);
+ _b.label = 2;
+ case 2:
+ _b.trys.push([2, 4, , 5]);
+ return [4 /*yield*/, this.httpClient.post(negotiateUrl, {
+ content: "",
+ headers: headers,
+ })];
+ case 3:
+ response = _b.sent();
+ if (response.statusCode !== 200) {
+ throw Error("Unexpected status code returned from negotiate " + response.statusCode);
+ }
+ return [2 /*return*/, JSON.parse(response.content)];
+ case 4:
+ e_3 = _b.sent();
+ this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Error, "Failed to complete negotiation with the server: " + e_3);
+ throw e_3;
+ case 5: return [2 /*return*/];
+ }
+ });
+ });
+ };
+ HttpConnection.prototype.createConnectUrl = function (url, connectionId) {
+ return url + (url.indexOf("?") === -1 ? "?" : "&") + ("id=" + connectionId);
+ };
+ HttpConnection.prototype.createTransport = function (url, requestedTransport, negotiateResponse, requestedTransferFormat) {
+ return tslib__WEBPACK_IMPORTED_MODULE_0__["__awaiter"](this, void 0, void 0, function () {
+ var connectUrl, transports, _i, transports_1, endpoint, transport, ex_1;
+ return tslib__WEBPACK_IMPORTED_MODULE_0__["__generator"](this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ connectUrl = this.createConnectUrl(url, negotiateResponse.connectionId);
+ if (!this.isITransport(requestedTransport)) return [3 /*break*/, 2];
+ this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Debug, "Connection was provided an instance of ITransport, using that directly.");
+ this.transport = requestedTransport;
+ return [4 /*yield*/, this.transport.connect(connectUrl, requestedTransferFormat)];
+ case 1:
+ _a.sent();
+ // only change the state if we were connecting to not overwrite
+ // the state if the connection is already marked as Disconnected
+ this.changeState(0 /* Connecting */, 1 /* Connected */);
+ return [2 /*return*/];
+ case 2:
+ transports = negotiateResponse.availableTransports;
+ _i = 0, transports_1 = transports;
+ _a.label = 3;
+ case 3:
+ if (!(_i < transports_1.length)) return [3 /*break*/, 9];
+ endpoint = transports_1[_i];
+ this.connectionState = 0 /* Connecting */;
+ transport = this.resolveTransport(endpoint, requestedTransport, requestedTransferFormat);
+ if (!(typeof transport === "number")) return [3 /*break*/, 8];
+ this.transport = this.constructTransport(transport);
+ if (!(negotiateResponse.connectionId === null)) return [3 /*break*/, 5];
+ return [4 /*yield*/, this.getNegotiationResponse(url)];
+ case 4:
+ negotiateResponse = _a.sent();
+ connectUrl = this.createConnectUrl(url, negotiateResponse.connectionId);
+ _a.label = 5;
+ case 5:
+ _a.trys.push([5, 7, , 8]);
+ return [4 /*yield*/, this.transport.connect(connectUrl, requestedTransferFormat)];
+ case 6:
+ _a.sent();
+ this.changeState(0 /* Connecting */, 1 /* Connected */);
+ return [2 /*return*/];
+ case 7:
+ ex_1 = _a.sent();
+ this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Error, "Failed to start the transport '" + _ITransport__WEBPACK_IMPORTED_MODULE_3__["HttpTransportType"][transport] + "': " + ex_1);
+ this.connectionState = 2 /* Disconnected */;
+ negotiateResponse.connectionId = null;
+ return [3 /*break*/, 8];
+ case 8:
+ _i++;
+ return [3 /*break*/, 3];
+ case 9: throw new Error("Unable to initialize any of the available transports.");
+ }
+ });
+ });
+ };
+ HttpConnection.prototype.constructTransport = function (transport) {
+ switch (transport) {
+ case _ITransport__WEBPACK_IMPORTED_MODULE_3__["HttpTransportType"].WebSockets:
+ return new _WebSocketTransport__WEBPACK_IMPORTED_MODULE_7__["WebSocketTransport"](this.accessTokenFactory, this.logger, this.options.logMessageContent);
+ case _ITransport__WEBPACK_IMPORTED_MODULE_3__["HttpTransportType"].ServerSentEvents:
+ return new _ServerSentEventsTransport__WEBPACK_IMPORTED_MODULE_5__["ServerSentEventsTransport"](this.httpClient, this.accessTokenFactory, this.logger, this.options.logMessageContent);
+ case _ITransport__WEBPACK_IMPORTED_MODULE_3__["HttpTransportType"].LongPolling:
+ return new _LongPollingTransport__WEBPACK_IMPORTED_MODULE_4__["LongPollingTransport"](this.httpClient, this.accessTokenFactory, this.logger, this.options.logMessageContent);
+ default:
+ throw new Error("Unknown transport: " + transport + ".");
+ }
+ };
+ HttpConnection.prototype.resolveTransport = function (endpoint, requestedTransport, requestedTransferFormat) {
+ var transport = _ITransport__WEBPACK_IMPORTED_MODULE_3__["HttpTransportType"][endpoint.transport];
+ if (transport === null || transport === undefined) {
+ this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Debug, "Skipping transport '" + endpoint.transport + "' because it is not supported by this client.");
+ }
+ else {
+ var transferFormats = endpoint.transferFormats.map(function (s) { return _ITransport__WEBPACK_IMPORTED_MODULE_3__["TransferFormat"][s]; });
+ if (transportMatches(requestedTransport, transport)) {
+ if (transferFormats.indexOf(requestedTransferFormat) >= 0) {
+ if ((transport === _ITransport__WEBPACK_IMPORTED_MODULE_3__["HttpTransportType"].WebSockets && typeof WebSocket === "undefined") ||
+ (transport === _ITransport__WEBPACK_IMPORTED_MODULE_3__["HttpTransportType"].ServerSentEvents && typeof EventSource === "undefined")) {
+ this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Debug, "Skipping transport '" + _ITransport__WEBPACK_IMPORTED_MODULE_3__["HttpTransportType"][transport] + "' because it is not supported in your environment.'");
+ }
+ else {
+ this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Debug, "Selecting transport '" + _ITransport__WEBPACK_IMPORTED_MODULE_3__["HttpTransportType"][transport] + "'");
+ return transport;
+ }
+ }
+ else {
+ this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Debug, "Skipping transport '" + _ITransport__WEBPACK_IMPORTED_MODULE_3__["HttpTransportType"][transport] + "' because it does not support the requested transfer format '" + _ITransport__WEBPACK_IMPORTED_MODULE_3__["TransferFormat"][requestedTransferFormat] + "'.");
+ }
+ }
+ else {
+ this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Debug, "Skipping transport '" + _ITransport__WEBPACK_IMPORTED_MODULE_3__["HttpTransportType"][transport] + "' because it was disabled by the client.");
+ }
+ }
+ return null;
+ };
+ HttpConnection.prototype.isITransport = function (transport) {
+ return transport && typeof (transport) === "object" && "connect" in transport;
+ };
+ HttpConnection.prototype.changeState = function (from, to) {
+ if (this.connectionState === from) {
+ this.connectionState = to;
+ return true;
+ }
+ return false;
+ };
+ HttpConnection.prototype.stopConnection = function (error) {
+ return tslib__WEBPACK_IMPORTED_MODULE_0__["__awaiter"](this, void 0, void 0, function () {
+ return tslib__WEBPACK_IMPORTED_MODULE_0__["__generator"](this, function (_a) {
+ this.transport = null;
+ // If we have a stopError, it takes precedence over the error from the transport
+ error = this.stopError || error;
+ if (error) {
+ this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Error, "Connection disconnected with error '" + error + "'.");
+ }
+ else {
+ this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Information, "Connection disconnected.");
+ }
+ this.connectionState = 2 /* Disconnected */;
+ if (this.onclose) {
+ this.onclose(error);
+ }
+ return [2 /*return*/];
+ });
+ });
+ };
+ HttpConnection.prototype.resolveUrl = function (url) {
+ // startsWith is not supported in IE
+ if (url.lastIndexOf("https://", 0) === 0 || url.lastIndexOf("http://", 0) === 0) {
+ return url;
+ }
+ if (typeof window === "undefined" || !window || !window.document) {
+ throw new Error("Cannot resolve '" + url + "'.");
+ }
+ // Setting the url to the href propery of an anchor tag handles normalization
+ // for us. There are 3 main cases.
+ // 1. Relative path normalization e.g "b" -> "http://localhost:5000/a/b"
+ // 2. Absolute path normalization e.g "/a/b" -> "http://localhost:5000/a/b"
+ // 3. Networkpath reference normalization e.g "//localhost:5000/a/b" -> "http://localhost:5000/a/b"
+ var aTag = window.document.createElement("a");
+ aTag.href = url;
+ this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Information, "Normalizing '" + url + "' to '" + aTag.href + "'.");
+ return aTag.href;
+ };
+ HttpConnection.prototype.resolveNegotiateUrl = function (url) {
+ var index = url.indexOf("?");
+ var negotiateUrl = url.substring(0, index === -1 ? url.length : index);
+ if (negotiateUrl[negotiateUrl.length - 1] !== "/") {
+ negotiateUrl += "/";
+ }
+ negotiateUrl += "negotiate";
+ negotiateUrl += index === -1 ? "" : url.substring(index);
+ return negotiateUrl;
+ };
+ return HttpConnection;
+}());
+
+function transportMatches(requestedTransport, actualTransport) {
+ return !requestedTransport || ((actualTransport & requestedTransport) !== 0);
+}
+//# sourceMappingURL=HttpConnection.js.map
+
+/***/ }),
+
+/***/ "./node_modules/@aspnet/signalr/dist/esm/HubConnection.js":
+/*!****************************************************************!*\
+ !*** ./node_modules/@aspnet/signalr/dist/esm/HubConnection.js ***!
+ \****************************************************************/
+/*! exports provided: HubConnection */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "HubConnection", function() { return HubConnection; });
+/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
+/* harmony import */ var _HandshakeProtocol__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./HandshakeProtocol */ "./node_modules/@aspnet/signalr/dist/esm/HandshakeProtocol.js");
+/* harmony import */ var _IHubProtocol__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./IHubProtocol */ "./node_modules/@aspnet/signalr/dist/esm/IHubProtocol.js");
+/* harmony import */ var _ILogger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./ILogger */ "./node_modules/@aspnet/signalr/dist/esm/ILogger.js");
+/* harmony import */ var _Utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Utils */ "./node_modules/@aspnet/signalr/dist/esm/Utils.js");
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+
+
+
+
+var DEFAULT_TIMEOUT_IN_MS = 30 * 1000;
+/** Represents a connection to a SignalR Hub. */
+var HubConnection = /** @class */ (function () {
+ function HubConnection(connection, logger, protocol) {
+ var _this = this;
+ _Utils__WEBPACK_IMPORTED_MODULE_4__["Arg"].isRequired(connection, "connection");
+ _Utils__WEBPACK_IMPORTED_MODULE_4__["Arg"].isRequired(logger, "logger");
+ _Utils__WEBPACK_IMPORTED_MODULE_4__["Arg"].isRequired(protocol, "protocol");
+ this.serverTimeoutInMilliseconds = DEFAULT_TIMEOUT_IN_MS;
+ this.logger = logger;
+ this.protocol = protocol;
+ this.connection = connection;
+ this.handshakeProtocol = new _HandshakeProtocol__WEBPACK_IMPORTED_MODULE_1__["HandshakeProtocol"]();
+ this.connection.onreceive = function (data) { return _this.processIncomingData(data); };
+ this.connection.onclose = function (error) { return _this.connectionClosed(error); };
+ this.callbacks = {};
+ this.methods = {};
+ this.closedCallbacks = [];
+ this.id = 0;
+ }
+ /** @internal */
+ // Using a public static factory method means we can have a private constructor and an _internal_
+ // create method that can be used by HubConnectionBuilder. An "internal" constructor would just
+ // be stripped away and the '.d.ts' file would have no constructor, which is interpreted as a
+ // public parameter-less constructor.
+ HubConnection.create = function (connection, logger, protocol) {
+ return new HubConnection(connection, logger, protocol);
+ };
+ /** Starts the connection.
+ *
+ * @returns {Promise<void>} A Promise that resolves when the connection has been successfully established, or rejects with an error.
+ */
+ HubConnection.prototype.start = function () {
+ return tslib__WEBPACK_IMPORTED_MODULE_0__["__awaiter"](this, void 0, void 0, function () {
+ var handshakeRequest;
+ return tslib__WEBPACK_IMPORTED_MODULE_0__["__generator"](this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ handshakeRequest = {
+ protocol: this.protocol.name,
+ version: this.protocol.version,
+ };
+ this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_3__["LogLevel"].Debug, "Starting HubConnection.");
+ this.receivedHandshakeResponse = false;
+ return [4 /*yield*/, this.connection.start(this.protocol.transferFormat)];
+ case 1:
+ _a.sent();
+ this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_3__["LogLevel"].Debug, "Sending handshake request.");
+ return [4 /*yield*/, this.connection.send(this.handshakeProtocol.writeHandshakeRequest(handshakeRequest))];
+ case 2:
+ _a.sent();
+ this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_3__["LogLevel"].Information, "Using HubProtocol '" + this.protocol.name + "'.");
+ // defensively cleanup timeout in case we receive a message from the server before we finish start
+ this.cleanupTimeout();
+ this.configureTimeout();
+ return [2 /*return*/];
+ }
+ });
+ });
+ };
+ /** Stops the connection.
+ *
+ * @returns {Promise<void>} A Promise that resolves when the connection has been successfully terminated, or rejects with an error.
+ */
+ HubConnection.prototype.stop = function () {
+ this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_3__["LogLevel"].Debug, "Stopping HubConnection.");
+ this.cleanupTimeout();
+ return this.connection.stop();
+ };
+ /** Invokes a streaming hub method on the server using the specified name and arguments.
+ *
+ * @typeparam T The type of the items returned by the server.
+ * @param {string} methodName The name of the server method to invoke.
+ * @param {any[]} args The arguments used to invoke the server method.
+ * @returns {IStreamResult<T>} An object that yields results from the server as they are received.
+ */
+ HubConnection.prototype.stream = function (methodName) {
+ var _this = this;
+ var args = [];
+ for (var _i = 1; _i < arguments.length; _i++) {
+ args[_i - 1] = arguments[_i];
+ }
+ var invocationDescriptor = this.createStreamInvocation(methodName, args);
+ var subject = new _Utils__WEBPACK_IMPORTED_MODULE_4__["Subject"](function () {
+ var cancelInvocation = _this.createCancelInvocation(invocationDescriptor.invocationId);
+ var cancelMessage = _this.protocol.writeMessage(cancelInvocation);
+ delete _this.callbacks[invocationDescriptor.invocationId];
+ return _this.connection.send(cancelMessage);
+ });
+ this.callbacks[invocationDescriptor.invocationId] = function (invocationEvent, error) {
+ if (error) {
+ subject.error(error);
+ return;
+ }
+ if (invocationEvent.type === _IHubProtocol__WEBPACK_IMPORTED_MODULE_2__["MessageType"].Completion) {
+ if (invocationEvent.error) {
+ subject.error(new Error(invocationEvent.error));
+ }
+ else {
+ subject.complete();
+ }
+ }
+ else {
+ subject.next((invocationEvent.item));
+ }
+ };
+ var message = this.protocol.writeMessage(invocationDescriptor);
+ this.connection.send(message)
+ .catch(function (e) {
+ subject.error(e);
+ delete _this.callbacks[invocationDescriptor.invocationId];
+ });
+ return subject;
+ };
+ /** Invokes a hub method on the server using the specified name and arguments. Does not wait for a response from the receiver.
+ *
+ * The Promise returned by this method resolves when the client has sent the invocation to the server. The server may still
+ * be processing the invocation.
+ *
+ * @param {string} methodName The name of the server method to invoke.
+ * @param {any[]} args The arguments used to invoke the server method.
+ * @returns {Promise<void>} A Promise that resolves when the invocation has been successfully sent, or rejects with an error.
+ */
+ HubConnection.prototype.send = function (methodName) {
+ var args = [];
+ for (var _i = 1; _i < arguments.length; _i++) {
+ args[_i - 1] = arguments[_i];
+ }
+ var invocationDescriptor = this.createInvocation(methodName, args, true);
+ var message = this.protocol.writeMessage(invocationDescriptor);
+ return this.connection.send(message);
+ };
+ /** Invokes a hub method on the server using the specified name and arguments.
+ *
+ * The Promise returned by this method resolves when the server indicates it has finished invoking the method. When the promise
+ * resolves, the server has finished invoking the method. If the server method returns a result, it is produced as the result of
+ * resolving the Promise.
+ *
+ * @typeparam T The expected return type.
+ * @param {string} methodName The name of the server method to invoke.
+ * @param {any[]} args The arguments used to invoke the server method.
+ * @returns {Promise<T>} A Promise that resolves with the result of the server method (if any), or rejects with an error.
+ */
+ HubConnection.prototype.invoke = function (methodName) {
+ var _this = this;
+ var args = [];
+ for (var _i = 1; _i < arguments.length; _i++) {
+ args[_i - 1] = arguments[_i];
+ }
+ var invocationDescriptor = this.createInvocation(methodName, args, false);
+ var p = new Promise(function (resolve, reject) {
+ _this.callbacks[invocationDescriptor.invocationId] = function (invocationEvent, error) {
+ if (error) {
+ reject(error);
+ return;
+ }
+ if (invocationEvent.type === _IHubProtocol__WEBPACK_IMPORTED_MODULE_2__["MessageType"].Completion) {
+ var completionMessage = invocationEvent;
+ if (completionMessage.error) {
+ reject(new Error(completionMessage.error));
+ }
+ else {
+ resolve(completionMessage.result);
+ }
+ }
+ else {
+ reject(new Error("Unexpected message type: " + invocationEvent.type));
+ }
+ };
+ var message = _this.protocol.writeMessage(invocationDescriptor);
+ _this.connection.send(message)
+ .catch(function (e) {
+ reject(e);
+ delete _this.callbacks[invocationDescriptor.invocationId];
+ });
+ });
+ return p;
+ };
+ /** Registers a handler that will be invoked when the hub method with the specified method name is invoked.
+ *
+ * @param {string} methodName The name of the hub method to define.
+ * @param {Function} newMethod The handler that will be raised when the hub method is invoked.
+ */
+ HubConnection.prototype.on = function (methodName, newMethod) {
+ if (!methodName || !newMethod) {
+ return;
+ }
+ methodName = methodName.toLowerCase();
+ if (!this.methods[methodName]) {
+ this.methods[methodName] = [];
+ }
+ // Preventing adding the same handler multiple times.
+ if (this.methods[methodName].indexOf(newMethod) !== -1) {
+ return;
+ }
+ this.methods[methodName].push(newMethod);
+ };
+ HubConnection.prototype.off = function (methodName, method) {
+ if (!methodName) {
+ return;
+ }
+ methodName = methodName.toLowerCase();
+ var handlers = this.methods[methodName];
+ if (!handlers) {
+ return;
+ }
+ if (method) {
+ var removeIdx = handlers.indexOf(method);
+ if (removeIdx !== -1) {
+ handlers.splice(removeIdx, 1);
+ if (handlers.length === 0) {
+ delete this.methods[methodName];
+ }
+ }
+ }
+ else {
+ delete this.methods[methodName];
+ }
+ };
+ /** Registers a handler that will be invoked when the connection is closed.
+ *
+ * @param {Function} callback The handler that will be invoked when the connection is closed. Optionally receives a single argument containing the error that caused the connection to close (if any).
+ */
+ HubConnection.prototype.onclose = function (callback) {
+ if (callback) {
+ this.closedCallbacks.push(callback);
+ }
+ };
+ HubConnection.prototype.processIncomingData = function (data) {
+ this.cleanupTimeout();
+ if (!this.receivedHandshakeResponse) {
+ data = this.processHandshakeResponse(data);
+ this.receivedHandshakeResponse = true;
+ }
+ // Data may have all been read when processing handshake response
+ if (data) {
+ // Parse the messages
+ var messages = this.protocol.parseMessages(data, this.logger);
+ for (var _i = 0, messages_1 = messages; _i < messages_1.length; _i++) {
+ var message = messages_1[_i];
+ switch (message.type) {
+ case _IHubProtocol__WEBPACK_IMPORTED_MODULE_2__["MessageType"].Invocation:
+ this.invokeClientMethod(message);
+ break;
+ case _IHubProtocol__WEBPACK_IMPORTED_MODULE_2__["MessageType"].StreamItem:
+ case _IHubProtocol__WEBPACK_IMPORTED_MODULE_2__["MessageType"].Completion:
+ var callback = this.callbacks[message.invocationId];
+ if (callback != null) {
+ if (message.type === _IHubProtocol__WEBPACK_IMPORTED_MODULE_2__["MessageType"].Completion) {
+ delete this.callbacks[message.invocationId];
+ }
+ callback(message);
+ }
+ break;
+ case _IHubProtocol__WEBPACK_IMPORTED_MODULE_2__["MessageType"].Ping:
+ // Don't care about pings
+ break;
+ case _IHubProtocol__WEBPACK_IMPORTED_MODULE_2__["MessageType"].Close:
+ this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_3__["LogLevel"].Information, "Close message received from server.");
+ this.connection.stop(message.error ? new Error("Server returned an error on close: " + message.error) : null);
+ break;
+ default:
+ this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_3__["LogLevel"].Warning, "Invalid message type: " + message.type);
+ break;
+ }
+ }
+ }
+ this.configureTimeout();
+ };
+ HubConnection.prototype.processHandshakeResponse = function (data) {
+ var responseMessage;
+ var remainingData;
+ try {
+ _a = this.handshakeProtocol.parseHandshakeResponse(data), remainingData = _a[0], responseMessage = _a[1];
+ }
+ catch (e) {
+ var message = "Error parsing handshake response: " + e;
+ this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_3__["LogLevel"].Error, message);
+ var error = new Error(message);
+ this.connection.stop(error);
+ throw error;
+ }
+ if (responseMessage.error) {
+ var message = "Server returned handshake error: " + responseMessage.error;
+ this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_3__["LogLevel"].Error, message);
+ this.connection.stop(new Error(message));
+ }
+ else {
+ this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_3__["LogLevel"].Debug, "Server handshake complete.");
+ }
+ return remainingData;
+ var _a;
+ };
+ HubConnection.prototype.configureTimeout = function () {
+ var _this = this;
+ if (!this.connection.features || !this.connection.features.inherentKeepAlive) {
+ // Set the timeout timer
+ this.timeoutHandle = setTimeout(function () { return _this.serverTimeout(); }, this.serverTimeoutInMilliseconds);
+ }
+ };
+ HubConnection.prototype.serverTimeout = function () {
+ // The server hasn't talked to us in a while. It doesn't like us anymore ... :(
+ // Terminate the connection
+ this.connection.stop(new Error("Server timeout elapsed without receiving a message from the server."));
+ };
+ HubConnection.prototype.invokeClientMethod = function (invocationMessage) {
+ var _this = this;
+ var methods = this.methods[invocationMessage.target.toLowerCase()];
+ if (methods) {
+ methods.forEach(function (m) { return m.apply(_this, invocationMessage.arguments); });
+ if (invocationMessage.invocationId) {
+ // This is not supported in v1. So we return an error to avoid blocking the server waiting for the response.
+ var message = "Server requested a response, which is not supported in this version of the client.";
+ this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_3__["LogLevel"].Error, message);
+ this.connection.stop(new Error(message));
+ }
+ }
+ else {
+ this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_3__["LogLevel"].Warning, "No client method with the name '" + invocationMessage.target + "' found.");
+ }
+ };
+ HubConnection.prototype.connectionClosed = function (error) {
+ var _this = this;
+ var callbacks = this.callbacks;
+ this.callbacks = {};
+ Object.keys(callbacks)
+ .forEach(function (key) {
+ var callback = callbacks[key];
+ callback(undefined, error ? error : new Error("Invocation canceled due to connection being closed."));
+ });
+ this.cleanupTimeout();
+ this.closedCallbacks.forEach(function (c) { return c.apply(_this, [error]); });
+ };
+ HubConnection.prototype.cleanupTimeout = function () {
+ if (this.timeoutHandle) {
+ clearTimeout(this.timeoutHandle);
+ }
+ };
+ HubConnection.prototype.createInvocation = function (methodName, args, nonblocking) {
+ if (nonblocking) {
+ return {
+ arguments: args,
+ target: methodName,
+ type: _IHubProtocol__WEBPACK_IMPORTED_MODULE_2__["MessageType"].Invocation,
+ };
+ }
+ else {
+ var id = this.id;
+ this.id++;
+ return {
+ arguments: args,
+ invocationId: id.toString(),
+ target: methodName,
+ type: _IHubProtocol__WEBPACK_IMPORTED_MODULE_2__["MessageType"].Invocation,
+ };
+ }
+ };
+ HubConnection.prototype.createStreamInvocation = function (methodName, args) {
+ var id = this.id;
+ this.id++;
+ return {
+ arguments: args,
+ invocationId: id.toString(),
+ target: methodName,
+ type: _IHubProtocol__WEBPACK_IMPORTED_MODULE_2__["MessageType"].StreamInvocation,
+ };
+ };
+ HubConnection.prototype.createCancelInvocation = function (id) {
+ return {
+ invocationId: id,
+ type: _IHubProtocol__WEBPACK_IMPORTED_MODULE_2__["MessageType"].CancelInvocation,
+ };
+ };
+ return HubConnection;
+}());
+
+//# sourceMappingURL=HubConnection.js.map
+
+/***/ }),
+
+/***/ "./node_modules/@aspnet/signalr/dist/esm/HubConnectionBuilder.js":
+/*!***********************************************************************!*\
+ !*** ./node_modules/@aspnet/signalr/dist/esm/HubConnectionBuilder.js ***!
+ \***********************************************************************/
+/*! exports provided: HubConnectionBuilder */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "HubConnectionBuilder", function() { return HubConnectionBuilder; });
+/* harmony import */ var _HttpConnection__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./HttpConnection */ "./node_modules/@aspnet/signalr/dist/esm/HttpConnection.js");
+/* harmony import */ var _HubConnection__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./HubConnection */ "./node_modules/@aspnet/signalr/dist/esm/HubConnection.js");
+/* harmony import */ var _JsonHubProtocol__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./JsonHubProtocol */ "./node_modules/@aspnet/signalr/dist/esm/JsonHubProtocol.js");
+/* harmony import */ var _Loggers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Loggers */ "./node_modules/@aspnet/signalr/dist/esm/Loggers.js");
+/* harmony import */ var _Utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Utils */ "./node_modules/@aspnet/signalr/dist/esm/Utils.js");
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+
+
+
+
+/** A builder for configuring {@link HubConnection} instances. */
+var HubConnectionBuilder = /** @class */ (function () {
+ function HubConnectionBuilder() {
+ }
+ HubConnectionBuilder.prototype.configureLogging = function (logging) {
+ _Utils__WEBPACK_IMPORTED_MODULE_4__["Arg"].isRequired(logging, "logging");
+ if (isLogger(logging)) {
+ this.logger = logging;
+ }
+ else {
+ this.logger = new _Utils__WEBPACK_IMPORTED_MODULE_4__["ConsoleLogger"](logging);
+ }
+ return this;
+ };
+ HubConnectionBuilder.prototype.withUrl = function (url, transportTypeOrOptions) {
+ _Utils__WEBPACK_IMPORTED_MODULE_4__["Arg"].isRequired(url, "url");
+ this.url = url;
+ // Flow-typing knows where it's at. Since HttpTransportType is a number and IHttpConnectionOptions is guaranteed
+ // to be an object, we know (as does TypeScript) this comparison is all we need to figure out which overload was called.
+ if (typeof transportTypeOrOptions === "object") {
+ this.httpConnectionOptions = transportTypeOrOptions;
+ }
+ else {
+ this.httpConnectionOptions = {
+ transport: transportTypeOrOptions,
+ };
+ }
+ return this;
+ };
+ /** Configures the {@link HubConnection} to use the specified Hub Protocol.
+ *
+ * @param {IHubProtocol} protocol The {@link IHubProtocol} implementation to use.
+ */
+ HubConnectionBuilder.prototype.withHubProtocol = function (protocol) {
+ _Utils__WEBPACK_IMPORTED_MODULE_4__["Arg"].isRequired(protocol, "protocol");
+ this.protocol = protocol;
+ return this;
+ };
+ /** Creates a {@link HubConnection} from the configuration options specified in this builder.
+ *
+ * @returns {HubConnection} The configured {@link HubConnection}.
+ */
+ HubConnectionBuilder.prototype.build = function () {
+ // If httpConnectionOptions has a logger, use it. Otherwise, override it with the one
+ // provided to configureLogger
+ var httpConnectionOptions = this.httpConnectionOptions || {};
+ // If it's 'null', the user **explicitly** asked for null, don't mess with it.
+ if (httpConnectionOptions.logger === undefined) {
+ // If our logger is undefined or null, that's OK, the HttpConnection constructor will handle it.
+ httpConnectionOptions.logger = this.logger;
+ }
+ // Now create the connection
+ if (!this.url) {
+ throw new Error("The 'HubConnectionBuilder.withUrl' method must be called before building the connection.");
+ }
+ var connection = new _HttpConnection__WEBPACK_IMPORTED_MODULE_0__["HttpConnection"](this.url, httpConnectionOptions);
+ return _HubConnection__WEBPACK_IMPORTED_MODULE_1__["HubConnection"].create(connection, this.logger || _Loggers__WEBPACK_IMPORTED_MODULE_3__["NullLogger"].instance, this.protocol || new _JsonHubProtocol__WEBPACK_IMPORTED_MODULE_2__["JsonHubProtocol"]());
+ };
+ return HubConnectionBuilder;
+}());
+
+function isLogger(logger) {
+ return logger.log !== undefined;
+}
+//# sourceMappingURL=HubConnectionBuilder.js.map
+
+/***/ }),
+
+/***/ "./node_modules/@aspnet/signalr/dist/esm/IHubProtocol.js":
+/*!***************************************************************!*\
+ !*** ./node_modules/@aspnet/signalr/dist/esm/IHubProtocol.js ***!
+ \***************************************************************/
+/*! exports provided: MessageType */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MessageType", function() { return MessageType; });
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+/** Defines the type of a Hub Message. */
+var MessageType;
+(function (MessageType) {
+ /** Indicates the message is an Invocation message and implements the {@link InvocationMessage} interface. */
+ MessageType[MessageType["Invocation"] = 1] = "Invocation";
+ /** Indicates the message is a StreamItem message and implements the {@link StreamItemMessage} interface. */
+ MessageType[MessageType["StreamItem"] = 2] = "StreamItem";
+ /** Indicates the message is a Completion message and implements the {@link CompletionMessage} interface. */
+ MessageType[MessageType["Completion"] = 3] = "Completion";
+ /** Indicates the message is a Stream Invocation message and implements the {@link StreamInvocationMessage} interface. */
+ MessageType[MessageType["StreamInvocation"] = 4] = "StreamInvocation";
+ /** Indicates the message is a Cancel Invocation message and implements the {@link CancelInvocationMessage} interface. */
+ MessageType[MessageType["CancelInvocation"] = 5] = "CancelInvocation";
+ /** Indicates the message is a Ping message and implements the {@link PingMessage} interface. */
+ MessageType[MessageType["Ping"] = 6] = "Ping";
+ /** Indicates the message is a Close message and implements the {@link CloseMessage} interface. */
+ MessageType[MessageType["Close"] = 7] = "Close";
+})(MessageType || (MessageType = {}));
+//# sourceMappingURL=IHubProtocol.js.map
+
+/***/ }),
+
+/***/ "./node_modules/@aspnet/signalr/dist/esm/ILogger.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/@aspnet/signalr/dist/esm/ILogger.js ***!
+ \**********************************************************/
+/*! exports provided: LogLevel */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LogLevel", function() { return LogLevel; });
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+// These values are designed to match the ASP.NET Log Levels since that's the pattern we're emulating here.
+/** Indicates the severity of a log message.
+ *
+ * Log Levels are ordered in increasing severity. So `Debug` is more severe than `Trace`, etc.
+ */
+var LogLevel;
+(function (LogLevel) {
+ /** Log level for very low severity diagnostic messages. */
+ LogLevel[LogLevel["Trace"] = 0] = "Trace";
+ /** Log level for low severity diagnostic messages. */
+ LogLevel[LogLevel["Debug"] = 1] = "Debug";
+ /** Log level for informational diagnostic messages. */
+ LogLevel[LogLevel["Information"] = 2] = "Information";
+ /** Log level for diagnostic messages that indicate a non-fatal problem. */
+ LogLevel[LogLevel["Warning"] = 3] = "Warning";
+ /** Log level for diagnostic messages that indicate a failure in the current operation. */
+ LogLevel[LogLevel["Error"] = 4] = "Error";
+ /** Log level for diagnostic messages that indicate a failure that will terminate the entire application. */
+ LogLevel[LogLevel["Critical"] = 5] = "Critical";
+ /** The highest possible log level. Used when configuring logging to indicate that no log messages should be emitted. */
+ LogLevel[LogLevel["None"] = 6] = "None";
+})(LogLevel || (LogLevel = {}));
+//# sourceMappingURL=ILogger.js.map
+
+/***/ }),
+
+/***/ "./node_modules/@aspnet/signalr/dist/esm/ITransport.js":
+/*!*************************************************************!*\
+ !*** ./node_modules/@aspnet/signalr/dist/esm/ITransport.js ***!
+ \*************************************************************/
+/*! exports provided: HttpTransportType, TransferFormat */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "HttpTransportType", function() { return HttpTransportType; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TransferFormat", function() { return TransferFormat; });
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+// This will be treated as a bit flag in the future, so we keep it using power-of-two values.
+/** Specifies a specific HTTP transport type. */
+var HttpTransportType;
+(function (HttpTransportType) {
+ /** Specifies no transport preference. */
+ HttpTransportType[HttpTransportType["None"] = 0] = "None";
+ /** Specifies the WebSockets transport. */
+ HttpTransportType[HttpTransportType["WebSockets"] = 1] = "WebSockets";
+ /** Specifies the Server-Sent Events transport. */
+ HttpTransportType[HttpTransportType["ServerSentEvents"] = 2] = "ServerSentEvents";
+ /** Specifies the Long Polling transport. */
+ HttpTransportType[HttpTransportType["LongPolling"] = 4] = "LongPolling";
+})(HttpTransportType || (HttpTransportType = {}));
+/** Specifies the transfer format for a connection. */
+var TransferFormat;
+(function (TransferFormat) {
+ /** Specifies that only text data will be transmitted over the connection. */
+ TransferFormat[TransferFormat["Text"] = 1] = "Text";
+ /** Specifies that binary data will be transmitted over the connection. */
+ TransferFormat[TransferFormat["Binary"] = 2] = "Binary";
+})(TransferFormat || (TransferFormat = {}));
+//# sourceMappingURL=ITransport.js.map
+
+/***/ }),
+
+/***/ "./node_modules/@aspnet/signalr/dist/esm/JsonHubProtocol.js":
+/*!******************************************************************!*\
+ !*** ./node_modules/@aspnet/signalr/dist/esm/JsonHubProtocol.js ***!
+ \******************************************************************/
+/*! exports provided: JsonHubProtocol */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "JsonHubProtocol", function() { return JsonHubProtocol; });
+/* harmony import */ var _IHubProtocol__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./IHubProtocol */ "./node_modules/@aspnet/signalr/dist/esm/IHubProtocol.js");
+/* harmony import */ var _ILogger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ILogger */ "./node_modules/@aspnet/signalr/dist/esm/ILogger.js");
+/* harmony import */ var _ITransport__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ITransport */ "./node_modules/@aspnet/signalr/dist/esm/ITransport.js");
+/* harmony import */ var _Loggers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Loggers */ "./node_modules/@aspnet/signalr/dist/esm/Loggers.js");
+/* harmony import */ var _TextMessageFormat__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./TextMessageFormat */ "./node_modules/@aspnet/signalr/dist/esm/TextMessageFormat.js");
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+
+
+
+
+var JSON_HUB_PROTOCOL_NAME = "json";
+/** Implements the JSON Hub Protocol. */
+var JsonHubProtocol = /** @class */ (function () {
+ function JsonHubProtocol() {
+ /** @inheritDoc */
+ this.name = JSON_HUB_PROTOCOL_NAME;
+ /** @inheritDoc */
+ this.version = 1;
+ /** @inheritDoc */
+ this.transferFormat = _ITransport__WEBPACK_IMPORTED_MODULE_2__["TransferFormat"].Text;
+ }
+ /** Creates an array of {@link HubMessage} objects from the specified serialized representation.
+ *
+ * @param {string} input A string containing the serialized representation.
+ * @param {ILogger} logger A logger that will be used to log messages that occur during parsing.
+ */
+ JsonHubProtocol.prototype.parseMessages = function (input, logger) {
+ // The interface does allow "ArrayBuffer" to be passed in, but this implementation does not. So let's throw a useful error.
+ if (typeof input !== "string") {
+ throw new Error("Invalid input for JSON hub protocol. Expected a string.");
+ }
+ if (!input) {
+ return [];
+ }
+ if (logger === null) {
+ logger = _Loggers__WEBPACK_IMPORTED_MODULE_3__["NullLogger"].instance;
+ }
+ // Parse the messages
+ var messages = _TextMessageFormat__WEBPACK_IMPORTED_MODULE_4__["TextMessageFormat"].parse(input);
+ var hubMessages = [];
+ for (var _i = 0, messages_1 = messages; _i < messages_1.length; _i++) {
+ var message = messages_1[_i];
+ var parsedMessage = JSON.parse(message);
+ if (typeof parsedMessage.type !== "number") {
+ throw new Error("Invalid payload.");
+ }
+ switch (parsedMessage.type) {
+ case _IHubProtocol__WEBPACK_IMPORTED_MODULE_0__["MessageType"].Invocation:
+ this.isInvocationMessage(parsedMessage);
+ break;
+ case _IHubProtocol__WEBPACK_IMPORTED_MODULE_0__["MessageType"].StreamItem:
+ this.isStreamItemMessage(parsedMessage);
+ break;
+ case _IHubProtocol__WEBPACK_IMPORTED_MODULE_0__["MessageType"].Completion:
+ this.isCompletionMessage(parsedMessage);
+ break;
+ case _IHubProtocol__WEBPACK_IMPORTED_MODULE_0__["MessageType"].Ping:
+ // Single value, no need to validate
+ break;
+ case _IHubProtocol__WEBPACK_IMPORTED_MODULE_0__["MessageType"].Close:
+ // All optional values, no need to validate
+ break;
+ default:
+ // Future protocol changes can add message types, old clients can ignore them
+ logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Information, "Unknown message type '" + parsedMessage.type + "' ignored.");
+ continue;
+ }
+ hubMessages.push(parsedMessage);
+ }
+ return hubMessages;
+ };
+ /** Writes the specified {@link HubMessage} to a string and returns it.
+ *
+ * @param {HubMessage} message The message to write.
+ * @returns {string} A string containing the serialized representation of the message.
+ */
+ JsonHubProtocol.prototype.writeMessage = function (message) {
+ return _TextMessageFormat__WEBPACK_IMPORTED_MODULE_4__["TextMessageFormat"].write(JSON.stringify(message));
+ };
+ JsonHubProtocol.prototype.isInvocationMessage = function (message) {
+ this.assertNotEmptyString(message.target, "Invalid payload for Invocation message.");
+ if (message.invocationId !== undefined) {
+ this.assertNotEmptyString(message.invocationId, "Invalid payload for Invocation message.");
+ }
+ };
+ JsonHubProtocol.prototype.isStreamItemMessage = function (message) {
+ this.assertNotEmptyString(message.invocationId, "Invalid payload for StreamItem message.");
+ if (message.item === undefined) {
+ throw new Error("Invalid payload for StreamItem message.");
+ }
+ };
+ JsonHubProtocol.prototype.isCompletionMessage = function (message) {
+ if (message.result && message.error) {
+ throw new Error("Invalid payload for Completion message.");
+ }
+ if (!message.result && message.error) {
+ this.assertNotEmptyString(message.error, "Invalid payload for Completion message.");
+ }
+ this.assertNotEmptyString(message.invocationId, "Invalid payload for Completion message.");
+ };
+ JsonHubProtocol.prototype.assertNotEmptyString = function (value, errorMessage) {
+ if (typeof value !== "string" || value === "") {
+ throw new Error(errorMessage);
+ }
+ };
+ return JsonHubProtocol;
+}());
+
+//# sourceMappingURL=JsonHubProtocol.js.map
+
+/***/ }),
+
+/***/ "./node_modules/@aspnet/signalr/dist/esm/Loggers.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/@aspnet/signalr/dist/esm/Loggers.js ***!
+ \**********************************************************/
+/*! exports provided: NullLogger */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NullLogger", function() { return NullLogger; });
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+/** A logger that does nothing when log messages are sent to it. */
+var NullLogger = /** @class */ (function () {
+ function NullLogger() {
+ }
+ /** @inheritDoc */
+ NullLogger.prototype.log = function (logLevel, message) {
+ };
+ /** The singleton instance of the {@link NullLogger}. */
+ NullLogger.instance = new NullLogger();
+ return NullLogger;
+}());
+
+//# sourceMappingURL=Loggers.js.map
+
+/***/ }),
+
+/***/ "./node_modules/@aspnet/signalr/dist/esm/LongPollingTransport.js":
+/*!***********************************************************************!*\
+ !*** ./node_modules/@aspnet/signalr/dist/esm/LongPollingTransport.js ***!
+ \***********************************************************************/
+/*! exports provided: LongPollingTransport */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LongPollingTransport", function() { return LongPollingTransport; });
+/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
+/* harmony import */ var _AbortController__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AbortController */ "./node_modules/@aspnet/signalr/dist/esm/AbortController.js");
+/* harmony import */ var _Errors__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Errors */ "./node_modules/@aspnet/signalr/dist/esm/Errors.js");
+/* harmony import */ var _ILogger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./ILogger */ "./node_modules/@aspnet/signalr/dist/esm/ILogger.js");
+/* harmony import */ var _ITransport__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./ITransport */ "./node_modules/@aspnet/signalr/dist/esm/ITransport.js");
+/* harmony import */ var _Utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Utils */ "./node_modules/@aspnet/signalr/dist/esm/Utils.js");
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+
+
+
+
+
+var SHUTDOWN_TIMEOUT = 5 * 1000;
+// Not exported from 'index', this type is internal.
+var LongPollingTransport = /** @class */ (function () {
+ function LongPollingTransport(httpClient, accessTokenFactory, logger, logMessageContent, shutdownTimeout) {
+ this.httpClient = httpClient;
+ this.accessTokenFactory = accessTokenFactory || (function () { return null; });
+ this.logger = logger;
+ this.pollAbort = new _AbortController__WEBPACK_IMPORTED_MODULE_1__["AbortController"]();
+ this.logMessageContent = logMessageContent;
+ this.shutdownTimeout = shutdownTimeout || SHUTDOWN_TIMEOUT;
+ }
+ Object.defineProperty(LongPollingTransport.prototype, "pollAborted", {
+ // This is an internal type, not exported from 'index' so this is really just internal.
+ get: function () {
+ return this.pollAbort.aborted;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ LongPollingTransport.prototype.connect = function (url, transferFormat) {
+ return tslib__WEBPACK_IMPORTED_MODULE_0__["__awaiter"](this, void 0, void 0, function () {
+ var pollOptions, token, closeError, pollUrl, response;
+ return tslib__WEBPACK_IMPORTED_MODULE_0__["__generator"](this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ _Utils__WEBPACK_IMPORTED_MODULE_5__["Arg"].isRequired(url, "url");
+ _Utils__WEBPACK_IMPORTED_MODULE_5__["Arg"].isRequired(transferFormat, "transferFormat");
+ _Utils__WEBPACK_IMPORTED_MODULE_5__["Arg"].isIn(transferFormat, _ITransport__WEBPACK_IMPORTED_MODULE_4__["TransferFormat"], "transferFormat");
+ this.url = url;
+ this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_3__["LogLevel"].Trace, "(LongPolling transport) Connecting");
+ if (transferFormat === _ITransport__WEBPACK_IMPORTED_MODULE_4__["TransferFormat"].Binary && (typeof new XMLHttpRequest().responseType !== "string")) {
+ // This will work if we fix: https://github.com/aspnet/SignalR/issues/742
+ throw new Error("Binary protocols over XmlHttpRequest not implementing advanced features are not supported.");
+ }
+ pollOptions = {
+ abortSignal: this.pollAbort.signal,
+ headers: {},
+ timeout: 90000,
+ };
+ if (transferFormat === _ITransport__WEBPACK_IMPORTED_MODULE_4__["TransferFormat"].Binary) {
+ pollOptions.responseType = "arraybuffer";
+ }
+ return [4 /*yield*/, this.accessTokenFactory()];
+ case 1:
+ token = _a.sent();
+ this.updateHeaderToken(pollOptions, token);
+ pollUrl = url + "&_=" + Date.now();
+ this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_3__["LogLevel"].Trace, "(LongPolling transport) polling: " + pollUrl);
+ return [4 /*yield*/, this.httpClient.get(pollUrl, pollOptions)];
+ case 2:
+ response = _a.sent();
+ if (response.statusCode !== 200) {
+ this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_3__["LogLevel"].Error, "(LongPolling transport) Unexpected response code: " + response.statusCode);
+ // Mark running as false so that the poll immediately ends and runs the close logic
+ closeError = new _Errors__WEBPACK_IMPORTED_MODULE_2__["HttpError"](response.statusText, response.statusCode);
+ this.running = false;
+ }
+ else {
+ this.running = true;
+ }
+ this.poll(this.url, pollOptions, closeError);
+ return [2 /*return*/, Promise.resolve()];
+ }
+ });
+ });
+ };
+ LongPollingTransport.prototype.updateHeaderToken = function (request, token) {
+ if (token) {
+ // tslint:disable-next-line:no-string-literal
+ request.headers["Authorization"] = "Bearer " + token;
+ return;
+ }
+ // tslint:disable-next-line:no-string-literal
+ if (request.headers["Authorization"]) {
+ // tslint:disable-next-line:no-string-literal
+ delete request.headers["Authorization"];
+ }
+ };
+ LongPollingTransport.prototype.poll = function (url, pollOptions, closeError) {
+ return tslib__WEBPACK_IMPORTED_MODULE_0__["__awaiter"](this, void 0, void 0, function () {
+ var token, pollUrl, response, e_1;
+ return tslib__WEBPACK_IMPORTED_MODULE_0__["__generator"](this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ _a.trys.push([0, , 8, 9]);
+ _a.label = 1;
+ case 1:
+ if (!this.running) return [3 /*break*/, 7];
+ return [4 /*yield*/, this.accessTokenFactory()];
+ case 2:
+ token = _a.sent();
+ this.updateHeaderToken(pollOptions, token);
+ _a.label = 3;
+ case 3:
+ _a.trys.push([3, 5, , 6]);
+ pollUrl = url + "&_=" + Date.now();
+ this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_3__["LogLevel"].Trace, "(LongPolling transport) polling: " + pollUrl);
+ return [4 /*yield*/, this.httpClient.get(pollUrl, pollOptions)];
+ case 4:
+ response = _a.sent();
+ if (response.statusCode === 204) {
+ this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_3__["LogLevel"].Information, "(LongPolling transport) Poll terminated by server");
+ this.running = false;
+ }
+ else if (response.statusCode !== 200) {
+ this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_3__["LogLevel"].Error, "(LongPolling transport) Unexpected response code: " + response.statusCode);
+ // Unexpected status code
+ closeError = new _Errors__WEBPACK_IMPORTED_MODULE_2__["HttpError"](response.statusText, response.statusCode);
+ this.running = false;
+ }
+ else {
+ // Process the response
+ if (response.content) {
+ this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_3__["LogLevel"].Trace, "(LongPolling transport) data received. " + Object(_Utils__WEBPACK_IMPORTED_MODULE_5__["getDataDetail"])(response.content, this.logMessageContent));
+ if (this.onreceive) {
+ this.onreceive(response.content);
+ }
+ }
+ else {
+ // This is another way timeout manifest.
+ this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_3__["LogLevel"].Trace, "(LongPolling transport) Poll timed out, reissuing.");
+ }
+ }
+ return [3 /*break*/, 6];
+ case 5:
+ e_1 = _a.sent();
+ if (!this.running) {
+ // Log but disregard errors that occur after we were stopped by DELETE
+ this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_3__["LogLevel"].Trace, "(LongPolling transport) Poll errored after shutdown: " + e_1.message);
+ }
+ else {
+ if (e_1 instanceof _Errors__WEBPACK_IMPORTED_MODULE_2__["TimeoutError"]) {
+ // Ignore timeouts and reissue the poll.
+ this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_3__["LogLevel"].Trace, "(LongPolling transport) Poll timed out, reissuing.");
+ }
+ else {
+ // Close the connection with the error as the result.
+ closeError = e_1;
+ this.running = false;
+ }
+ }
+ return [3 /*break*/, 6];
+ case 6: return [3 /*break*/, 1];
+ case 7: return [3 /*break*/, 9];
+ case 8:
+ // Indicate that we've stopped so the shutdown timer doesn't get registered.
+ this.stopped = true;
+ // Clean up the shutdown timer if it was registered
+ if (this.shutdownTimer) {
+ clearTimeout(this.shutdownTimer);
+ }
+ // Fire our onclosed event
+ if (this.onclose) {
+ this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_3__["LogLevel"].Trace, "(LongPolling transport) Firing onclose event. Error: " + (closeError || "<undefined>"));
+ this.onclose(closeError);
+ }
+ this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_3__["LogLevel"].Trace, "(LongPolling transport) Transport finished.");
+ return [7 /*endfinally*/];
+ case 9: return [2 /*return*/];
+ }
+ });
+ });
+ };
+ LongPollingTransport.prototype.send = function (data) {
+ return tslib__WEBPACK_IMPORTED_MODULE_0__["__awaiter"](this, void 0, void 0, function () {
+ return tslib__WEBPACK_IMPORTED_MODULE_0__["__generator"](this, function (_a) {
+ if (!this.running) {
+ return [2 /*return*/, Promise.reject(new Error("Cannot send until the transport is connected"))];
+ }
+ return [2 /*return*/, Object(_Utils__WEBPACK_IMPORTED_MODULE_5__["sendMessage"])(this.logger, "LongPolling", this.httpClient, this.url, this.accessTokenFactory, data, this.logMessageContent)];
+ });
+ });
+ };
+ LongPollingTransport.prototype.stop = function () {
+ return tslib__WEBPACK_IMPORTED_MODULE_0__["__awaiter"](this, void 0, void 0, function () {
+ var _this = this;
+ var deleteOptions, token, response;
+ return tslib__WEBPACK_IMPORTED_MODULE_0__["__generator"](this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ _a.trys.push([0, , 3, 4]);
+ this.running = false;
+ this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_3__["LogLevel"].Trace, "(LongPolling transport) sending DELETE request to " + this.url + ".");
+ deleteOptions = {
+ headers: {},
+ };
+ return [4 /*yield*/, this.accessTokenFactory()];
+ case 1:
+ token = _a.sent();
+ this.updateHeaderToken(deleteOptions, token);
+ return [4 /*yield*/, this.httpClient.delete(this.url, deleteOptions)];
+ case 2:
+ response = _a.sent();
+ this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_3__["LogLevel"].Trace, "(LongPolling transport) DELETE request accepted.");
+ return [3 /*break*/, 4];
+ case 3:
+ // Abort the poll after the shutdown timeout if the server doesn't stop the poll.
+ if (!this.stopped) {
+ this.shutdownTimer = setTimeout(function () {
+ _this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_3__["LogLevel"].Warning, "(LongPolling transport) server did not terminate after DELETE request, canceling poll.");
+ // Abort any outstanding poll
+ _this.pollAbort.abort();
+ }, this.shutdownTimeout);
+ }
+ return [7 /*endfinally*/];
+ case 4: return [2 /*return*/];
+ }
+ });
+ });
+ };
+ return LongPollingTransport;
+}());
+
+//# sourceMappingURL=LongPollingTransport.js.map
+
+/***/ }),
+
+/***/ "./node_modules/@aspnet/signalr/dist/esm/ServerSentEventsTransport.js":
+/*!****************************************************************************!*\
+ !*** ./node_modules/@aspnet/signalr/dist/esm/ServerSentEventsTransport.js ***!
+ \****************************************************************************/
+/*! exports provided: ServerSentEventsTransport */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ServerSentEventsTransport", function() { return ServerSentEventsTransport; });
+/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
+/* harmony import */ var _ILogger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ILogger */ "./node_modules/@aspnet/signalr/dist/esm/ILogger.js");
+/* harmony import */ var _ITransport__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ITransport */ "./node_modules/@aspnet/signalr/dist/esm/ITransport.js");
+/* harmony import */ var _Utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Utils */ "./node_modules/@aspnet/signalr/dist/esm/Utils.js");
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+
+
+
+var ServerSentEventsTransport = /** @class */ (function () {
+ function ServerSentEventsTransport(httpClient, accessTokenFactory, logger, logMessageContent) {
+ this.httpClient = httpClient;
+ this.accessTokenFactory = accessTokenFactory || (function () { return null; });
+ this.logger = logger;
+ this.logMessageContent = logMessageContent;
+ }
+ ServerSentEventsTransport.prototype.connect = function (url, transferFormat) {
+ return tslib__WEBPACK_IMPORTED_MODULE_0__["__awaiter"](this, void 0, void 0, function () {
+ var _this = this;
+ var token;
+ return tslib__WEBPACK_IMPORTED_MODULE_0__["__generator"](this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ _Utils__WEBPACK_IMPORTED_MODULE_3__["Arg"].isRequired(url, "url");
+ _Utils__WEBPACK_IMPORTED_MODULE_3__["Arg"].isRequired(transferFormat, "transferFormat");
+ _Utils__WEBPACK_IMPORTED_MODULE_3__["Arg"].isIn(transferFormat, _ITransport__WEBPACK_IMPORTED_MODULE_2__["TransferFormat"], "transferFormat");
+ if (typeof (EventSource) === "undefined") {
+ throw new Error("'EventSource' is not supported in your environment.");
+ }
+ this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Trace, "(SSE transport) Connecting");
+ return [4 /*yield*/, this.accessTokenFactory()];
+ case 1:
+ token = _a.sent();
+ if (token) {
+ url += (url.indexOf("?") < 0 ? "?" : "&") + ("access_token=" + encodeURIComponent(token));
+ }
+ this.url = url;
+ return [2 /*return*/, new Promise(function (resolve, reject) {
+ var opened = false;
+ if (transferFormat !== _ITransport__WEBPACK_IMPORTED_MODULE_2__["TransferFormat"].Text) {
+ reject(new Error("The Server-Sent Events transport only supports the 'Text' transfer format"));
+ }
+ var eventSource = new EventSource(url, { withCredentials: true });
+ try {
+ eventSource.onmessage = function (e) {
+ if (_this.onreceive) {
+ try {
+ _this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Trace, "(SSE transport) data received. " + Object(_Utils__WEBPACK_IMPORTED_MODULE_3__["getDataDetail"])(e.data, _this.logMessageContent) + ".");
+ _this.onreceive(e.data);
+ }
+ catch (error) {
+ if (_this.onclose) {
+ _this.onclose(error);
+ }
+ return;
+ }
+ }
+ };
+ eventSource.onerror = function (e) {
+ var error = new Error(e.message || "Error occurred");
+ if (opened) {
+ _this.close(error);
+ }
+ else {
+ reject(error);
+ }
+ };
+ eventSource.onopen = function () {
+ _this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Information, "SSE connected to " + _this.url);
+ _this.eventSource = eventSource;
+ opened = true;
+ resolve();
+ };
+ }
+ catch (e) {
+ return Promise.reject(e);
+ }
+ })];
+ }
+ });
+ });
+ };
+ ServerSentEventsTransport.prototype.send = function (data) {
+ return tslib__WEBPACK_IMPORTED_MODULE_0__["__awaiter"](this, void 0, void 0, function () {
+ return tslib__WEBPACK_IMPORTED_MODULE_0__["__generator"](this, function (_a) {
+ if (!this.eventSource) {
+ return [2 /*return*/, Promise.reject(new Error("Cannot send until the transport is connected"))];
+ }
+ return [2 /*return*/, Object(_Utils__WEBPACK_IMPORTED_MODULE_3__["sendMessage"])(this.logger, "SSE", this.httpClient, this.url, this.accessTokenFactory, data, this.logMessageContent)];
+ });
+ });
+ };
+ ServerSentEventsTransport.prototype.stop = function () {
+ this.close();
+ return Promise.resolve();
+ };
+ ServerSentEventsTransport.prototype.close = function (e) {
+ if (this.eventSource) {
+ this.eventSource.close();
+ this.eventSource = null;
+ if (this.onclose) {
+ this.onclose(e);
+ }
+ }
+ };
+ return ServerSentEventsTransport;
+}());
+
+//# sourceMappingURL=ServerSentEventsTransport.js.map
+
+/***/ }),
+
+/***/ "./node_modules/@aspnet/signalr/dist/esm/TextMessageFormat.js":
+/*!********************************************************************!*\
+ !*** ./node_modules/@aspnet/signalr/dist/esm/TextMessageFormat.js ***!
+ \********************************************************************/
+/*! exports provided: TextMessageFormat */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TextMessageFormat", function() { return TextMessageFormat; });
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+// Not exported from index
+var TextMessageFormat = /** @class */ (function () {
+ function TextMessageFormat() {
+ }
+ TextMessageFormat.write = function (output) {
+ return "" + output + TextMessageFormat.RecordSeparator;
+ };
+ TextMessageFormat.parse = function (input) {
+ if (input[input.length - 1] !== TextMessageFormat.RecordSeparator) {
+ throw new Error("Message is incomplete.");
+ }
+ var messages = input.split(TextMessageFormat.RecordSeparator);
+ messages.pop();
+ return messages;
+ };
+ TextMessageFormat.RecordSeparatorCode = 0x1e;
+ TextMessageFormat.RecordSeparator = String.fromCharCode(TextMessageFormat.RecordSeparatorCode);
+ return TextMessageFormat;
+}());
+
+//# sourceMappingURL=TextMessageFormat.js.map
+
+/***/ }),
+
+/***/ "./node_modules/@aspnet/signalr/dist/esm/Utils.js":
+/*!********************************************************!*\
+ !*** ./node_modules/@aspnet/signalr/dist/esm/Utils.js ***!
+ \********************************************************/
+/*! exports provided: Arg, getDataDetail, formatArrayBuffer, sendMessage, createLogger, Subject, SubjectSubscription, ConsoleLogger */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Arg", function() { return Arg; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getDataDetail", function() { return getDataDetail; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "formatArrayBuffer", function() { return formatArrayBuffer; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sendMessage", function() { return sendMessage; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createLogger", function() { return createLogger; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Subject", function() { return Subject; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SubjectSubscription", function() { return SubjectSubscription; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ConsoleLogger", function() { return ConsoleLogger; });
+/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
+/* harmony import */ var _ILogger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ILogger */ "./node_modules/@aspnet/signalr/dist/esm/ILogger.js");
+/* harmony import */ var _Loggers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Loggers */ "./node_modules/@aspnet/signalr/dist/esm/Loggers.js");
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+
+
+var Arg = /** @class */ (function () {
+ function Arg() {
+ }
+ Arg.isRequired = function (val, name) {
+ if (val === null || val === undefined) {
+ throw new Error("The '" + name + "' argument is required.");
+ }
+ };
+ Arg.isIn = function (val, values, name) {
+ // TypeScript enums have keys for **both** the name and the value of each enum member on the type itself.
+ if (!(val in values)) {
+ throw new Error("Unknown " + name + " value: " + val + ".");
+ }
+ };
+ return Arg;
+}());
+
+function getDataDetail(data, includeContent) {
+ var length = null;
+ if (data instanceof ArrayBuffer) {
+ length = "Binary data of length " + data.byteLength;
+ if (includeContent) {
+ length += ". Content: '" + formatArrayBuffer(data) + "'";
+ }
+ }
+ else if (typeof data === "string") {
+ length = "String data of length " + data.length;
+ if (includeContent) {
+ length += ". Content: '" + data + "'.";
+ }
+ }
+ return length;
+}
+function formatArrayBuffer(data) {
+ var view = new Uint8Array(data);
+ // Uint8Array.map only supports returning another Uint8Array?
+ var str = "";
+ view.forEach(function (num) {
+ var pad = num < 16 ? "0" : "";
+ str += "0x" + pad + num.toString(16) + " ";
+ });
+ // Trim of trailing space.
+ return str.substr(0, str.length - 1);
+}
+function sendMessage(logger, transportName, httpClient, url, accessTokenFactory, content, logMessageContent) {
+ return tslib__WEBPACK_IMPORTED_MODULE_0__["__awaiter"](this, void 0, void 0, function () {
+ var headers, token, response, _a;
+ return tslib__WEBPACK_IMPORTED_MODULE_0__["__generator"](this, function (_b) {
+ switch (_b.label) {
+ case 0: return [4 /*yield*/, accessTokenFactory()];
+ case 1:
+ token = _b.sent();
+ if (token) {
+ headers = (_a = {},
+ _a["Authorization"] = "Bearer " + token,
+ _a);
+ }
+ logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Trace, "(" + transportName + " transport) sending data. " + getDataDetail(content, logMessageContent) + ".");
+ return [4 /*yield*/, httpClient.post(url, {
+ content: content,
+ headers: headers,
+ })];
+ case 2:
+ response = _b.sent();
+ logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Trace, "(" + transportName + " transport) request complete. Response status: " + response.statusCode + ".");
+ return [2 /*return*/];
+ }
+ });
+ });
+}
+function createLogger(logger) {
+ if (logger === undefined) {
+ return new ConsoleLogger(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Information);
+ }
+ if (logger === null) {
+ return _Loggers__WEBPACK_IMPORTED_MODULE_2__["NullLogger"].instance;
+ }
+ if (logger.log) {
+ return logger;
+ }
+ return new ConsoleLogger(logger);
+}
+var Subject = /** @class */ (function () {
+ function Subject(cancelCallback) {
+ this.observers = [];
+ this.cancelCallback = cancelCallback;
+ }
+ Subject.prototype.next = function (item) {
+ for (var _i = 0, _a = this.observers; _i < _a.length; _i++) {
+ var observer = _a[_i];
+ observer.next(item);
+ }
+ };
+ Subject.prototype.error = function (err) {
+ for (var _i = 0, _a = this.observers; _i < _a.length; _i++) {
+ var observer = _a[_i];
+ if (observer.error) {
+ observer.error(err);
+ }
+ }
+ };
+ Subject.prototype.complete = function () {
+ for (var _i = 0, _a = this.observers; _i < _a.length; _i++) {
+ var observer = _a[_i];
+ if (observer.complete) {
+ observer.complete();
+ }
+ }
+ };
+ Subject.prototype.subscribe = function (observer) {
+ this.observers.push(observer);
+ return new SubjectSubscription(this, observer);
+ };
+ return Subject;
+}());
+
+var SubjectSubscription = /** @class */ (function () {
+ function SubjectSubscription(subject, observer) {
+ this.subject = subject;
+ this.observer = observer;
+ }
+ SubjectSubscription.prototype.dispose = function () {
+ var index = this.subject.observers.indexOf(this.observer);
+ if (index > -1) {
+ this.subject.observers.splice(index, 1);
+ }
+ if (this.subject.observers.length === 0) {
+ this.subject.cancelCallback().catch(function (_) { });
+ }
+ };
+ return SubjectSubscription;
+}());
+
+var ConsoleLogger = /** @class */ (function () {
+ function ConsoleLogger(minimumLogLevel) {
+ this.minimumLogLevel = minimumLogLevel;
+ }
+ ConsoleLogger.prototype.log = function (logLevel, message) {
+ if (logLevel >= this.minimumLogLevel) {
+ switch (logLevel) {
+ case _ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Critical:
+ case _ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Error:
+ console.error(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"][logLevel] + ": " + message);
+ break;
+ case _ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Warning:
+ console.warn(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"][logLevel] + ": " + message);
+ break;
+ case _ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Information:
+ console.info(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"][logLevel] + ": " + message);
+ break;
+ default:
+ // console.debug only goes to attached debuggers in Node, so we use console.log for Trace and Debug
+ console.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"][logLevel] + ": " + message);
+ break;
+ }
+ }
+ };
+ return ConsoleLogger;
+}());
+
+//# sourceMappingURL=Utils.js.map
+
+/***/ }),
+
+/***/ "./node_modules/@aspnet/signalr/dist/esm/WebSocketTransport.js":
+/*!*********************************************************************!*\
+ !*** ./node_modules/@aspnet/signalr/dist/esm/WebSocketTransport.js ***!
+ \*********************************************************************/
+/*! exports provided: WebSocketTransport */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "WebSocketTransport", function() { return WebSocketTransport; });
+/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
+/* harmony import */ var _ILogger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ILogger */ "./node_modules/@aspnet/signalr/dist/esm/ILogger.js");
+/* harmony import */ var _ITransport__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ITransport */ "./node_modules/@aspnet/signalr/dist/esm/ITransport.js");
+/* harmony import */ var _Utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Utils */ "./node_modules/@aspnet/signalr/dist/esm/Utils.js");
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+
+
+
+var WebSocketTransport = /** @class */ (function () {
+ function WebSocketTransport(accessTokenFactory, logger, logMessageContent) {
+ this.logger = logger;
+ this.accessTokenFactory = accessTokenFactory || (function () { return null; });
+ this.logMessageContent = logMessageContent;
+ }
+ WebSocketTransport.prototype.connect = function (url, transferFormat) {
+ return tslib__WEBPACK_IMPORTED_MODULE_0__["__awaiter"](this, void 0, void 0, function () {
+ var _this = this;
+ var token;
+ return tslib__WEBPACK_IMPORTED_MODULE_0__["__generator"](this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ _Utils__WEBPACK_IMPORTED_MODULE_3__["Arg"].isRequired(url, "url");
+ _Utils__WEBPACK_IMPORTED_MODULE_3__["Arg"].isRequired(transferFormat, "transferFormat");
+ _Utils__WEBPACK_IMPORTED_MODULE_3__["Arg"].isIn(transferFormat, _ITransport__WEBPACK_IMPORTED_MODULE_2__["TransferFormat"], "transferFormat");
+ if (typeof (WebSocket) === "undefined") {
+ throw new Error("'WebSocket' is not supported in your environment.");
+ }
+ this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Trace, "(WebSockets transport) Connecting");
+ return [4 /*yield*/, this.accessTokenFactory()];
+ case 1:
+ token = _a.sent();
+ if (token) {
+ url += (url.indexOf("?") < 0 ? "?" : "&") + ("access_token=" + encodeURIComponent(token));
+ }
+ return [2 /*return*/, new Promise(function (resolve, reject) {
+ url = url.replace(/^http/, "ws");
+ var webSocket = new WebSocket(url);
+ if (transferFormat === _ITransport__WEBPACK_IMPORTED_MODULE_2__["TransferFormat"].Binary) {
+ webSocket.binaryType = "arraybuffer";
+ }
+ webSocket.onopen = function (event) {
+ _this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Information, "WebSocket connected to " + url);
+ _this.webSocket = webSocket;
+ resolve();
+ };
+ webSocket.onerror = function (event) {
+ reject(event.error);
+ };
+ webSocket.onmessage = function (message) {
+ _this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Trace, "(WebSockets transport) data received. " + Object(_Utils__WEBPACK_IMPORTED_MODULE_3__["getDataDetail"])(message.data, _this.logMessageContent) + ".");
+ if (_this.onreceive) {
+ _this.onreceive(message.data);
+ }
+ };
+ webSocket.onclose = function (event) {
+ // webSocket will be null if the transport did not start successfully
+ _this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Trace, "(WebSockets transport) socket closed.");
+ if (_this.onclose) {
+ if (event.wasClean === false || event.code !== 1000) {
+ _this.onclose(new Error("Websocket closed with status code: " + event.code + " (" + event.reason + ")"));
+ }
+ else {
+ _this.onclose();
+ }
+ }
+ };
+ })];
+ }
+ });
+ });
+ };
+ WebSocketTransport.prototype.send = function (data) {
+ if (this.webSocket && this.webSocket.readyState === WebSocket.OPEN) {
+ this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_1__["LogLevel"].Trace, "(WebSockets transport) sending data. " + Object(_Utils__WEBPACK_IMPORTED_MODULE_3__["getDataDetail"])(data, this.logMessageContent) + ".");
+ this.webSocket.send(data);
+ return Promise.resolve();
+ }
+ return Promise.reject("WebSocket is not in the OPEN state");
+ };
+ WebSocketTransport.prototype.stop = function () {
+ if (this.webSocket) {
+ this.webSocket.close();
+ this.webSocket = null;
+ }
+ return Promise.resolve();
+ };
+ return WebSocketTransport;
+}());
+
+//# sourceMappingURL=WebSocketTransport.js.map
+
+/***/ }),
+
+/***/ "./node_modules/@aspnet/signalr/dist/esm/index.js":
+/*!********************************************************!*\
+ !*** ./node_modules/@aspnet/signalr/dist/esm/index.js ***!
+ \********************************************************/
+/*! exports provided: VERSION, HttpError, TimeoutError, DefaultHttpClient, HttpClient, HttpResponse, HubConnection, HubConnectionBuilder, MessageType, LogLevel, HttpTransportType, TransferFormat, NullLogger, JsonHubProtocol */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VERSION", function() { return VERSION; });
+/* harmony import */ var _Errors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Errors */ "./node_modules/@aspnet/signalr/dist/esm/Errors.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "HttpError", function() { return _Errors__WEBPACK_IMPORTED_MODULE_0__["HttpError"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TimeoutError", function() { return _Errors__WEBPACK_IMPORTED_MODULE_0__["TimeoutError"]; });
+
+/* harmony import */ var _HttpClient__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./HttpClient */ "./node_modules/@aspnet/signalr/dist/esm/HttpClient.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DefaultHttpClient", function() { return _HttpClient__WEBPACK_IMPORTED_MODULE_1__["DefaultHttpClient"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "HttpClient", function() { return _HttpClient__WEBPACK_IMPORTED_MODULE_1__["HttpClient"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "HttpResponse", function() { return _HttpClient__WEBPACK_IMPORTED_MODULE_1__["HttpResponse"]; });
+
+/* harmony import */ var _HubConnection__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./HubConnection */ "./node_modules/@aspnet/signalr/dist/esm/HubConnection.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "HubConnection", function() { return _HubConnection__WEBPACK_IMPORTED_MODULE_2__["HubConnection"]; });
+
+/* harmony import */ var _HubConnectionBuilder__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./HubConnectionBuilder */ "./node_modules/@aspnet/signalr/dist/esm/HubConnectionBuilder.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "HubConnectionBuilder", function() { return _HubConnectionBuilder__WEBPACK_IMPORTED_MODULE_3__["HubConnectionBuilder"]; });
+
+/* harmony import */ var _IHubProtocol__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./IHubProtocol */ "./node_modules/@aspnet/signalr/dist/esm/IHubProtocol.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "MessageType", function() { return _IHubProtocol__WEBPACK_IMPORTED_MODULE_4__["MessageType"]; });
+
+/* harmony import */ var _ILogger__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ILogger */ "./node_modules/@aspnet/signalr/dist/esm/ILogger.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "LogLevel", function() { return _ILogger__WEBPACK_IMPORTED_MODULE_5__["LogLevel"]; });
+
+/* harmony import */ var _ITransport__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./ITransport */ "./node_modules/@aspnet/signalr/dist/esm/ITransport.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "HttpTransportType", function() { return _ITransport__WEBPACK_IMPORTED_MODULE_6__["HttpTransportType"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TransferFormat", function() { return _ITransport__WEBPACK_IMPORTED_MODULE_6__["TransferFormat"]; });
+
+/* harmony import */ var _Loggers__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Loggers */ "./node_modules/@aspnet/signalr/dist/esm/Loggers.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "NullLogger", function() { return _Loggers__WEBPACK_IMPORTED_MODULE_7__["NullLogger"]; });
+
+/* harmony import */ var _JsonHubProtocol__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./JsonHubProtocol */ "./node_modules/@aspnet/signalr/dist/esm/JsonHubProtocol.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "JsonHubProtocol", function() { return _JsonHubProtocol__WEBPACK_IMPORTED_MODULE_8__["JsonHubProtocol"]; });
+
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+// Version token that will be replaced by the prepack command
+/** The version of the SignalR client. */
+var VERSION = "1.0.0";
+
+
+
+
+
+
+
+
+
+//# sourceMappingURL=index.js.map
+
+/***/ }),
+
+/***/ "./node_modules/@dotnet/jsinterop/dist/Microsoft.JSInterop.js":
+/*!********************************************************************!*\
+ !*** ./node_modules/@dotnet/jsinterop/dist/Microsoft.JSInterop.js ***!
+ \********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// This is a single-file self-contained module to avoid the need for a Webpack build
+var DotNet;
+(function (DotNet) {
+ window.DotNet = DotNet; // Ensure reachable from anywhere
+ var jsonRevivers = [];
+ var pendingAsyncCalls = {};
+ var cachedJSFunctions = {};
+ var nextAsyncCallId = 1; // Start at 1 because zero signals "no response needed"
+ var dotNetDispatcher = null;
+ /**
+ * Sets the specified .NET call dispatcher as the current instance so that it will be used
+ * for future invocations.
+ *
+ * @param dispatcher An object that can dispatch calls from JavaScript to a .NET runtime.
+ */
+ function attachDispatcher(dispatcher) {
+ dotNetDispatcher = dispatcher;
+ }
+ DotNet.attachDispatcher = attachDispatcher;
+ /**
+ * Adds a JSON reviver callback that will be used when parsing arguments received from .NET.
+ * @param reviver The reviver to add.
+ */
+ function attachReviver(reviver) {
+ jsonRevivers.push(reviver);
+ }
+ DotNet.attachReviver = attachReviver;
+ /**
+ * Invokes the specified .NET public method synchronously. Not all hosting scenarios support
+ * synchronous invocation, so if possible use invokeMethodAsync instead.
+ *
+ * @param assemblyName The short name (without key/version or .dll extension) of the .NET assembly containing the method.
+ * @param methodIdentifier The identifier of the method to invoke. The method must have a [JSInvokable] attribute specifying this identifier.
+ * @param args Arguments to pass to the method, each of which must be JSON-serializable.
+ * @returns The result of the operation.
+ */
+ function invokeMethod(assemblyName, methodIdentifier) {
+ var args = [];
+ for (var _i = 2; _i < arguments.length; _i++) {
+ args[_i - 2] = arguments[_i];
+ }
+ return invokePossibleInstanceMethod(assemblyName, methodIdentifier, null, args);
+ }
+ DotNet.invokeMethod = invokeMethod;
+ /**
+ * Invokes the specified .NET public method asynchronously.
+ *
+ * @param assemblyName The short name (without key/version or .dll extension) of the .NET assembly containing the method.
+ * @param methodIdentifier The identifier of the method to invoke. The method must have a [JSInvokable] attribute specifying this identifier.
+ * @param args Arguments to pass to the method, each of which must be JSON-serializable.
+ * @returns A promise representing the result of the operation.
+ */
+ function invokeMethodAsync(assemblyName, methodIdentifier) {
+ var args = [];
+ for (var _i = 2; _i < arguments.length; _i++) {
+ args[_i - 2] = arguments[_i];
+ }
+ return invokePossibleInstanceMethodAsync(assemblyName, methodIdentifier, null, args);
+ }
+ DotNet.invokeMethodAsync = invokeMethodAsync;
+ function invokePossibleInstanceMethod(assemblyName, methodIdentifier, dotNetObjectId, args) {
+ var dispatcher = getRequiredDispatcher();
+ if (dispatcher.invokeDotNetFromJS) {
+ var argsJson = JSON.stringify(args, argReplacer);
+ var resultJson = dispatcher.invokeDotNetFromJS(assemblyName, methodIdentifier, dotNetObjectId, argsJson);
+ return resultJson ? parseJsonWithRevivers(resultJson) : null;
+ }
+ else {
+ throw new Error('The current dispatcher does not support synchronous calls from JS to .NET. Use invokeMethodAsync instead.');
+ }
+ }
+ function invokePossibleInstanceMethodAsync(assemblyName, methodIdentifier, dotNetObjectId, args) {
+ var asyncCallId = nextAsyncCallId++;
+ var resultPromise = new Promise(function (resolve, reject) {
+ pendingAsyncCalls[asyncCallId] = { resolve: resolve, reject: reject };
+ });
+ try {
+ var argsJson = JSON.stringify(args, argReplacer);
+ getRequiredDispatcher().beginInvokeDotNetFromJS(asyncCallId, assemblyName, methodIdentifier, dotNetObjectId, argsJson);
+ }
+ catch (ex) {
+ // Synchronous failure
+ completePendingCall(asyncCallId, false, ex);
+ }
+ return resultPromise;
+ }
+ function getRequiredDispatcher() {
+ if (dotNetDispatcher !== null) {
+ return dotNetDispatcher;
+ }
+ throw new Error('No .NET call dispatcher has been set.');
+ }
+ function completePendingCall(asyncCallId, success, resultOrError) {
+ if (!pendingAsyncCalls.hasOwnProperty(asyncCallId)) {
+ throw new Error("There is no pending async call with ID " + asyncCallId + ".");
+ }
+ var asyncCall = pendingAsyncCalls[asyncCallId];
+ delete pendingAsyncCalls[asyncCallId];
+ if (success) {
+ asyncCall.resolve(resultOrError);
+ }
+ else {
+ asyncCall.reject(resultOrError);
+ }
+ }
+ /**
+ * Receives incoming calls from .NET and dispatches them to JavaScript.
+ */
+ DotNet.jsCallDispatcher = {
+ /**
+ * Finds the JavaScript function matching the specified identifier.
+ *
+ * @param identifier Identifies the globally-reachable function to be returned.
+ * @returns A Function instance.
+ */
+ findJSFunction: findJSFunction,
+ /**
+ * Invokes the specified synchronous JavaScript function.
+ *
+ * @param identifier Identifies the globally-reachable function to invoke.
+ * @param argsJson JSON representation of arguments to be passed to the function.
+ * @returns JSON representation of the invocation result.
+ */
+ invokeJSFromDotNet: function (identifier, argsJson) {
+ var result = findJSFunction(identifier).apply(null, parseJsonWithRevivers(argsJson));
+ return result === null || result === undefined
+ ? null
+ : JSON.stringify(result, argReplacer);
+ },
+ /**
+ * Invokes the specified synchronous or asynchronous JavaScript function.
+ *
+ * @param asyncHandle A value identifying the asynchronous operation. This value will be passed back in a later call to endInvokeJSFromDotNet.
+ * @param identifier Identifies the globally-reachable function to invoke.
+ * @param argsJson JSON representation of arguments to be passed to the function.
+ */
+ beginInvokeJSFromDotNet: function (asyncHandle, identifier, argsJson) {
+ // Coerce synchronous functions into async ones, plus treat
+ // synchronous exceptions the same as async ones
+ var promise = new Promise(function (resolve) {
+ var synchronousResultOrPromise = findJSFunction(identifier).apply(null, parseJsonWithRevivers(argsJson));
+ resolve(synchronousResultOrPromise);
+ });
+ // We only listen for a result if the caller wants to be notified about it
+ if (asyncHandle) {
+ // On completion, dispatch result back to .NET
+ // Not using "await" because it codegens a lot of boilerplate
+ promise.then(function (result) { return getRequiredDispatcher().beginInvokeDotNetFromJS(0, 'Microsoft.JSInterop', 'DotNetDispatcher.EndInvoke', null, JSON.stringify([asyncHandle, true, result], argReplacer)); }, function (error) { return getRequiredDispatcher().beginInvokeDotNetFromJS(0, 'Microsoft.JSInterop', 'DotNetDispatcher.EndInvoke', null, JSON.stringify([asyncHandle, false, formatError(error)])); });
+ }
+ },
+ /**
+ * Receives notification that an async call from JS to .NET has completed.
+ * @param asyncCallId The identifier supplied in an earlier call to beginInvokeDotNetFromJS.
+ * @param success A flag to indicate whether the operation completed successfully.
+ * @param resultOrExceptionMessage Either the operation result or an error message.
+ */
+ endInvokeDotNetFromJS: function (asyncCallId, success, resultOrExceptionMessage) {
+ var resultOrError = success ? resultOrExceptionMessage : new Error(resultOrExceptionMessage);
+ completePendingCall(parseInt(asyncCallId), success, resultOrError);
+ }
+ };
+ function parseJsonWithRevivers(json) {
+ return json ? JSON.parse(json, function (key, initialValue) {
+ // Invoke each reviver in order, passing the output from the previous reviver,
+ // so that each one gets a chance to transform the value
+ return jsonRevivers.reduce(function (latestValue, reviver) { return reviver(key, latestValue); }, initialValue);
+ }) : null;
+ }
+ function formatError(error) {
+ if (error instanceof Error) {
+ return error.message + "\n" + error.stack;
+ }
+ else {
+ return error ? error.toString() : 'null';
+ }
+ }
+ function findJSFunction(identifier) {
+ if (cachedJSFunctions.hasOwnProperty(identifier)) {
+ return cachedJSFunctions[identifier];
+ }
+ var result = window;
+ var resultIdentifier = 'window';
+ identifier.split('.').forEach(function (segment) {
+ if (segment in result) {
+ result = result[segment];
+ resultIdentifier += '.' + segment;
+ }
+ else {
+ throw new Error("Could not find '" + segment + "' in '" + resultIdentifier + "'.");
+ }
+ });
+ if (result instanceof Function) {
+ return result;
+ }
+ else {
+ throw new Error("The value '" + resultIdentifier + "' is not a function.");
+ }
+ }
+ var DotNetObject = /** @class */ (function () {
+ function DotNetObject(_id) {
+ this._id = _id;
+ }
+ DotNetObject.prototype.invokeMethod = function (methodIdentifier) {
+ var args = [];
+ for (var _i = 1; _i < arguments.length; _i++) {
+ args[_i - 1] = arguments[_i];
+ }
+ return invokePossibleInstanceMethod(null, methodIdentifier, this._id, args);
+ };
+ DotNetObject.prototype.invokeMethodAsync = function (methodIdentifier) {
+ var args = [];
+ for (var _i = 1; _i < arguments.length; _i++) {
+ args[_i - 1] = arguments[_i];
+ }
+ return invokePossibleInstanceMethodAsync(null, methodIdentifier, this._id, args);
+ };
+ DotNetObject.prototype.dispose = function () {
+ var promise = invokeMethodAsync('Microsoft.JSInterop', 'DotNetDispatcher.ReleaseDotNetObject', this._id);
+ promise.catch(function (error) { return console.error(error); });
+ };
+ DotNetObject.prototype.serializeAsArg = function () {
+ return "__dotNetObject:" + this._id;
+ };
+ return DotNetObject;
+ }());
+ var dotNetObjectValueFormat = /^__dotNetObject\:(\d+)$/;
+ attachReviver(function reviveDotNetObject(key, value) {
+ if (typeof value === 'string') {
+ var match = value.match(dotNetObjectValueFormat);
+ if (match) {
+ return new DotNetObject(parseInt(match[1]));
+ }
+ }
+ // Unrecognized - let another reviver handle it
+ return value;
+ });
+ function argReplacer(key, value) {
+ return value instanceof DotNetObject ? value.serializeAsArg() : value;
+ }
+})(DotNet || (DotNet = {}));
+//# sourceMappingURL=Microsoft.JSInterop.js.map
+
+/***/ }),
+
+/***/ "./node_modules/assert/assert.js":
+/*!***************************************!*\
+ !*** ./node_modules/assert/assert.js ***!
+ \***************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+/* WEBPACK VAR INJECTION */(function(global) {
+
+// compare and isBuffer taken from https://github.com/feross/buffer/blob/680e9e5e488f22aac27599a57dc844a6315928dd/index.js
+// original notice:
+
+/*!
+ * The buffer module from node.js, for the browser.
+ *
+ * @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
+ * @license MIT
+ */
+function compare(a, b) {
+ if (a === b) {
+ return 0;
+ }
+
+ var x = a.length;
+ var y = b.length;
+
+ for (var i = 0, len = Math.min(x, y); i < len; ++i) {
+ if (a[i] !== b[i]) {
+ x = a[i];
+ y = b[i];
+ break;
+ }
+ }
+
+ if (x < y) {
+ return -1;
+ }
+ if (y < x) {
+ return 1;
+ }
+ return 0;
+}
+function isBuffer(b) {
+ if (global.Buffer && typeof global.Buffer.isBuffer === 'function') {
+ return global.Buffer.isBuffer(b);
+ }
+ return !!(b != null && b._isBuffer);
+}
+
+// based on node assert, original notice:
+
+// http://wiki.commonjs.org/wiki/Unit_Testing/1.0
+//
+// THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8!
+//
+// Originally from narwhal.js (http://narwhaljs.org)
+// Copyright (c) 2009 Thomas Robinson <280north.com>
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the 'Software'), to
+// deal in the Software without restriction, including without limitation the
+// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+// sell copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+var util = __webpack_require__(/*! util/ */ "./node_modules/util/util.js");
+var hasOwn = Object.prototype.hasOwnProperty;
+var pSlice = Array.prototype.slice;
+var functionsHaveNames = (function () {
+ return function foo() {}.name === 'foo';
+}());
+function pToString (obj) {
+ return Object.prototype.toString.call(obj);
+}
+function isView(arrbuf) {
+ if (isBuffer(arrbuf)) {
+ return false;
+ }
+ if (typeof global.ArrayBuffer !== 'function') {
+ return false;
+ }
+ if (typeof ArrayBuffer.isView === 'function') {
+ return ArrayBuffer.isView(arrbuf);
+ }
+ if (!arrbuf) {
+ return false;
+ }
+ if (arrbuf instanceof DataView) {
+ return true;
+ }
+ if (arrbuf.buffer && arrbuf.buffer instanceof ArrayBuffer) {
+ return true;
+ }
+ return false;
+}
+// 1. The assert module provides functions that throw
+// AssertionError's when particular conditions are not met. The
+// assert module must conform to the following interface.
+
+var assert = module.exports = ok;
+
+// 2. The AssertionError is defined in assert.
+// new assert.AssertionError({ message: message,
+// actual: actual,
+// expected: expected })
+
+var regex = /\s*function\s+([^\(\s]*)\s*/;
+// based on https://github.com/ljharb/function.prototype.name/blob/adeeeec8bfcc6068b187d7d9fb3d5bb1d3a30899/implementation.js
+function getName(func) {
+ if (!util.isFunction(func)) {
+ return;
+ }
+ if (functionsHaveNames) {
+ return func.name;
+ }
+ var str = func.toString();
+ var match = str.match(regex);
+ return match && match[1];
+}
+assert.AssertionError = function AssertionError(options) {
+ this.name = 'AssertionError';
+ this.actual = options.actual;
+ this.expected = options.expected;
+ this.operator = options.operator;
+ if (options.message) {
+ this.message = options.message;
+ this.generatedMessage = false;
+ } else {
+ this.message = getMessage(this);
+ this.generatedMessage = true;
+ }
+ var stackStartFunction = options.stackStartFunction || fail;
+ if (Error.captureStackTrace) {
+ Error.captureStackTrace(this, stackStartFunction);
+ } else {
+ // non v8 browsers so we can have a stacktrace
+ var err = new Error();
+ if (err.stack) {
+ var out = err.stack;
+
+ // try to strip useless frames
+ var fn_name = getName(stackStartFunction);
+ var idx = out.indexOf('\n' + fn_name);
+ if (idx >= 0) {
+ // once we have located the function frame
+ // we need to strip out everything before it (and its line)
+ var next_line = out.indexOf('\n', idx + 1);
+ out = out.substring(next_line + 1);
+ }
+
+ this.stack = out;
+ }
+ }
+};
+
+// assert.AssertionError instanceof Error
+util.inherits(assert.AssertionError, Error);
+
+function truncate(s, n) {
+ if (typeof s === 'string') {
+ return s.length < n ? s : s.slice(0, n);
+ } else {
+ return s;
+ }
+}
+function inspect(something) {
+ if (functionsHaveNames || !util.isFunction(something)) {
+ return util.inspect(something);
+ }
+ var rawname = getName(something);
+ var name = rawname ? ': ' + rawname : '';
+ return '[Function' + name + ']';
+}
+function getMessage(self) {
+ return truncate(inspect(self.actual), 128) + ' ' +
+ self.operator + ' ' +
+ truncate(inspect(self.expected), 128);
+}
+
+// At present only the three keys mentioned above are used and
+// understood by the spec. Implementations or sub modules can pass
+// other keys to the AssertionError's constructor - they will be
+// ignored.
+
+// 3. All of the following functions must throw an AssertionError
+// when a corresponding condition is not met, with a message that
+// may be undefined if not provided. All assertion methods provide
+// both the actual and expected values to the assertion error for
+// display purposes.
+
+function fail(actual, expected, message, operator, stackStartFunction) {
+ throw new assert.AssertionError({
+ message: message,
+ actual: actual,
+ expected: expected,
+ operator: operator,
+ stackStartFunction: stackStartFunction
+ });
+}
+
+// EXTENSION! allows for well behaved errors defined elsewhere.
+assert.fail = fail;
+
+// 4. Pure assertion tests whether a value is truthy, as determined
+// by !!guard.
+// assert.ok(guard, message_opt);
+// This statement is equivalent to assert.equal(true, !!guard,
+// message_opt);. To test strictly for the value true, use
+// assert.strictEqual(true, guard, message_opt);.
+
+function ok(value, message) {
+ if (!value) fail(value, true, message, '==', assert.ok);
+}
+assert.ok = ok;
+
+// 5. The equality assertion tests shallow, coercive equality with
+// ==.
+// assert.equal(actual, expected, message_opt);
+
+assert.equal = function equal(actual, expected, message) {
+ if (actual != expected) fail(actual, expected, message, '==', assert.equal);
+};
+
+// 6. The non-equality assertion tests for whether two objects are not equal
+// with != assert.notEqual(actual, expected, message_opt);
+
+assert.notEqual = function notEqual(actual, expected, message) {
+ if (actual == expected) {
+ fail(actual, expected, message, '!=', assert.notEqual);
+ }
+};
+
+// 7. The equivalence assertion tests a deep equality relation.
+// assert.deepEqual(actual, expected, message_opt);
+
+assert.deepEqual = function deepEqual(actual, expected, message) {
+ if (!_deepEqual(actual, expected, false)) {
+ fail(actual, expected, message, 'deepEqual', assert.deepEqual);
+ }
+};
+
+assert.deepStrictEqual = function deepStrictEqual(actual, expected, message) {
+ if (!_deepEqual(actual, expected, true)) {
+ fail(actual, expected, message, 'deepStrictEqual', assert.deepStrictEqual);
+ }
+};
+
+function _deepEqual(actual, expected, strict, memos) {
+ // 7.1. All identical values are equivalent, as determined by ===.
+ if (actual === expected) {
+ return true;
+ } else if (isBuffer(actual) && isBuffer(expected)) {
+ return compare(actual, expected) === 0;
+
+ // 7.2. If the expected value is a Date object, the actual value is
+ // equivalent if it is also a Date object that refers to the same time.
+ } else if (util.isDate(actual) && util.isDate(expected)) {
+ return actual.getTime() === expected.getTime();
+
+ // 7.3 If the expected value is a RegExp object, the actual value is
+ // equivalent if it is also a RegExp object with the same source and
+ // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`).
+ } else if (util.isRegExp(actual) && util.isRegExp(expected)) {
+ return actual.source === expected.source &&
+ actual.global === expected.global &&
+ actual.multiline === expected.multiline &&
+ actual.lastIndex === expected.lastIndex &&
+ actual.ignoreCase === expected.ignoreCase;
+
+ // 7.4. Other pairs that do not both pass typeof value == 'object',
+ // equivalence is determined by ==.
+ } else if ((actual === null || typeof actual !== 'object') &&
+ (expected === null || typeof expected !== 'object')) {
+ return strict ? actual === expected : actual == expected;
+
+ // If both values are instances of typed arrays, wrap their underlying
+ // ArrayBuffers in a Buffer each to increase performance
+ // This optimization requires the arrays to have the same type as checked by
+ // Object.prototype.toString (aka pToString). Never perform binary
+ // comparisons for Float*Arrays, though, since e.g. +0 === -0 but their
+ // bit patterns are not identical.
+ } else if (isView(actual) && isView(expected) &&
+ pToString(actual) === pToString(expected) &&
+ !(actual instanceof Float32Array ||
+ actual instanceof Float64Array)) {
+ return compare(new Uint8Array(actual.buffer),
+ new Uint8Array(expected.buffer)) === 0;
+
+ // 7.5 For all other Object pairs, including Array objects, equivalence is
+ // determined by having the same number of owned properties (as verified
+ // with Object.prototype.hasOwnProperty.call), the same set of keys
+ // (although not necessarily the same order), equivalent values for every
+ // corresponding key, and an identical 'prototype' property. Note: this
+ // accounts for both named and indexed properties on Arrays.
+ } else if (isBuffer(actual) !== isBuffer(expected)) {
+ return false;
+ } else {
+ memos = memos || {actual: [], expected: []};
+
+ var actualIndex = memos.actual.indexOf(actual);
+ if (actualIndex !== -1) {
+ if (actualIndex === memos.expected.indexOf(expected)) {
+ return true;
+ }
+ }
+
+ memos.actual.push(actual);
+ memos.expected.push(expected);
+
+ return objEquiv(actual, expected, strict, memos);
+ }
+}
+
+function isArguments(object) {
+ return Object.prototype.toString.call(object) == '[object Arguments]';
+}
+
+function objEquiv(a, b, strict, actualVisitedObjects) {
+ if (a === null || a === undefined || b === null || b === undefined)
+ return false;
+ // if one is a primitive, the other must be same
+ if (util.isPrimitive(a) || util.isPrimitive(b))
+ return a === b;
+ if (strict && Object.getPrototypeOf(a) !== Object.getPrototypeOf(b))
+ return false;
+ var aIsArgs = isArguments(a);
+ var bIsArgs = isArguments(b);
+ if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs))
+ return false;
+ if (aIsArgs) {
+ a = pSlice.call(a);
+ b = pSlice.call(b);
+ return _deepEqual(a, b, strict);
+ }
+ var ka = objectKeys(a);
+ var kb = objectKeys(b);
+ var key, i;
+ // having the same number of owned properties (keys incorporates
+ // hasOwnProperty)
+ if (ka.length !== kb.length)
+ return false;
+ //the same set of keys (although not necessarily the same order),
+ ka.sort();
+ kb.sort();
+ //~~~cheap key test
+ for (i = ka.length - 1; i >= 0; i--) {
+ if (ka[i] !== kb[i])
+ return false;
+ }
+ //equivalent values for every corresponding key, and
+ //~~~possibly expensive deep test
+ for (i = ka.length - 1; i >= 0; i--) {
+ key = ka[i];
+ if (!_deepEqual(a[key], b[key], strict, actualVisitedObjects))
+ return false;
+ }
+ return true;
+}
+
+// 8. The non-equivalence assertion tests for any deep inequality.
+// assert.notDeepEqual(actual, expected, message_opt);
+
+assert.notDeepEqual = function notDeepEqual(actual, expected, message) {
+ if (_deepEqual(actual, expected, false)) {
+ fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual);
+ }
+};
+
+assert.notDeepStrictEqual = notDeepStrictEqual;
+function notDeepStrictEqual(actual, expected, message) {
+ if (_deepEqual(actual, expected, true)) {
+ fail(actual, expected, message, 'notDeepStrictEqual', notDeepStrictEqual);
+ }
+}
+
+
+// 9. The strict equality assertion tests strict equality, as determined by ===.
+// assert.strictEqual(actual, expected, message_opt);
+
+assert.strictEqual = function strictEqual(actual, expected, message) {
+ if (actual !== expected) {
+ fail(actual, expected, message, '===', assert.strictEqual);
+ }
+};
+
+// 10. The strict non-equality assertion tests for strict inequality, as
+// determined by !==. assert.notStrictEqual(actual, expected, message_opt);
+
+assert.notStrictEqual = function notStrictEqual(actual, expected, message) {
+ if (actual === expected) {
+ fail(actual, expected, message, '!==', assert.notStrictEqual);
+ }
+};
+
+function expectedException(actual, expected) {
+ if (!actual || !expected) {
+ return false;
+ }
+
+ if (Object.prototype.toString.call(expected) == '[object RegExp]') {
+ return expected.test(actual);
+ }
+
+ try {
+ if (actual instanceof expected) {
+ return true;
+ }
+ } catch (e) {
+ // Ignore. The instanceof check doesn't work for arrow functions.
+ }
+
+ if (Error.isPrototypeOf(expected)) {
+ return false;
+ }
+
+ return expected.call({}, actual) === true;
+}
+
+function _tryBlock(block) {
+ var error;
+ try {
+ block();
+ } catch (e) {
+ error = e;
+ }
+ return error;
+}
+
+function _throws(shouldThrow, block, expected, message) {
+ var actual;
+
+ if (typeof block !== 'function') {
+ throw new TypeError('"block" argument must be a function');
+ }
+
+ if (typeof expected === 'string') {
+ message = expected;
+ expected = null;
+ }
+
+ actual = _tryBlock(block);
+
+ message = (expected && expected.name ? ' (' + expected.name + ').' : '.') +
+ (message ? ' ' + message : '.');
+
+ if (shouldThrow && !actual) {
+ fail(actual, expected, 'Missing expected exception' + message);
+ }
+
+ var userProvidedMessage = typeof message === 'string';
+ var isUnwantedException = !shouldThrow && util.isError(actual);
+ var isUnexpectedException = !shouldThrow && actual && !expected;
+
+ if ((isUnwantedException &&
+ userProvidedMessage &&
+ expectedException(actual, expected)) ||
+ isUnexpectedException) {
+ fail(actual, expected, 'Got unwanted exception' + message);
+ }
+
+ if ((shouldThrow && actual && expected &&
+ !expectedException(actual, expected)) || (!shouldThrow && actual)) {
+ throw actual;
+ }
+}
+
+// 11. Expected to throw an error:
+// assert.throws(block, Error_opt, message_opt);
+
+assert.throws = function(block, /*optional*/error, /*optional*/message) {
+ _throws(true, block, error, message);
+};
+
+// EXTENSION! This is annoying to write outside this module.
+assert.doesNotThrow = function(block, /*optional*/error, /*optional*/message) {
+ _throws(false, block, error, message);
+};
+
+assert.ifError = function(err) { if (err) throw err; };
+
+var objectKeys = Object.keys || function (obj) {
+ var keys = [];
+ for (var key in obj) {
+ if (hasOwn.call(obj, key)) keys.push(key);
+ }
+ return keys;
+};
+
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js")))
+
+/***/ }),
+
+/***/ "./node_modules/base64-js/index.js":
+/*!*****************************************!*\
+ !*** ./node_modules/base64-js/index.js ***!
+ \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+exports.byteLength = byteLength
+exports.toByteArray = toByteArray
+exports.fromByteArray = fromByteArray
+
+var lookup = []
+var revLookup = []
+var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array
+
+var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
+for (var i = 0, len = code.length; i < len; ++i) {
+ lookup[i] = code[i]
+ revLookup[code.charCodeAt(i)] = i
+}
+
+// Support decoding URL-safe base64 strings, as Node.js does.
+// See: https://en.wikipedia.org/wiki/Base64#URL_applications
+revLookup['-'.charCodeAt(0)] = 62
+revLookup['_'.charCodeAt(0)] = 63
+
+function getLens (b64) {
+ var len = b64.length
+
+ if (len % 4 > 0) {
+ throw new Error('Invalid string. Length must be a multiple of 4')
+ }
+
+ // Trim off extra bytes after placeholder bytes are found
+ // See: https://github.com/beatgammit/base64-js/issues/42
+ var validLen = b64.indexOf('=')
+ if (validLen === -1) validLen = len
+
+ var placeHoldersLen = validLen === len
+ ? 0
+ : 4 - (validLen % 4)
+
+ return [validLen, placeHoldersLen]
+}
+
+// base64 is 4/3 + up to two characters of the original data
+function byteLength (b64) {
+ var lens = getLens(b64)
+ var validLen = lens[0]
+ var placeHoldersLen = lens[1]
+ return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
+}
+
+function _byteLength (b64, validLen, placeHoldersLen) {
+ return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
+}
+
+function toByteArray (b64) {
+ var tmp
+ var lens = getLens(b64)
+ var validLen = lens[0]
+ var placeHoldersLen = lens[1]
+
+ var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))
+
+ var curByte = 0
+
+ // if there are placeholders, only get up to the last complete 4 chars
+ var len = placeHoldersLen > 0
+ ? validLen - 4
+ : validLen
+
+ for (var i = 0; i < len; i += 4) {
+ tmp =
+ (revLookup[b64.charCodeAt(i)] << 18) |
+ (revLookup[b64.charCodeAt(i + 1)] << 12) |
+ (revLookup[b64.charCodeAt(i + 2)] << 6) |
+ revLookup[b64.charCodeAt(i + 3)]
+ arr[curByte++] = (tmp >> 16) & 0xFF
+ arr[curByte++] = (tmp >> 8) & 0xFF
+ arr[curByte++] = tmp & 0xFF
+ }
+
+ if (placeHoldersLen === 2) {
+ tmp =
+ (revLookup[b64.charCodeAt(i)] << 2) |
+ (revLookup[b64.charCodeAt(i + 1)] >> 4)
+ arr[curByte++] = tmp & 0xFF
+ }
+
+ if (placeHoldersLen === 1) {
+ tmp =
+ (revLookup[b64.charCodeAt(i)] << 10) |
+ (revLookup[b64.charCodeAt(i + 1)] << 4) |
+ (revLookup[b64.charCodeAt(i + 2)] >> 2)
+ arr[curByte++] = (tmp >> 8) & 0xFF
+ arr[curByte++] = tmp & 0xFF
+ }
+
+ return arr
+}
+
+function tripletToBase64 (num) {
+ return lookup[num >> 18 & 0x3F] +
+ lookup[num >> 12 & 0x3F] +
+ lookup[num >> 6 & 0x3F] +
+ lookup[num & 0x3F]
+}
+
+function encodeChunk (uint8, start, end) {
+ var tmp
+ var output = []
+ for (var i = start; i < end; i += 3) {
+ tmp =
+ ((uint8[i] << 16) & 0xFF0000) +
+ ((uint8[i + 1] << 8) & 0xFF00) +
+ (uint8[i + 2] & 0xFF)
+ output.push(tripletToBase64(tmp))
+ }
+ return output.join('')
+}
+
+function fromByteArray (uint8) {
+ var tmp
+ var len = uint8.length
+ var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
+ var parts = []
+ var maxChunkLength = 16383 // must be multiple of 3
+
+ // go through the array every three bytes, we'll deal with trailing stuff later
+ for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
+ parts.push(encodeChunk(
+ uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)
+ ))
+ }
+
+ // pad the end with zeros, but make sure to not forget the extra bytes
+ if (extraBytes === 1) {
+ tmp = uint8[len - 1]
+ parts.push(
+ lookup[tmp >> 2] +
+ lookup[(tmp << 4) & 0x3F] +
+ '=='
+ )
+ } else if (extraBytes === 2) {
+ tmp = (uint8[len - 2] << 8) + uint8[len - 1]
+ parts.push(
+ lookup[tmp >> 10] +
+ lookup[(tmp >> 4) & 0x3F] +
+ lookup[(tmp << 2) & 0x3F] +
+ '='
+ )
+ }
+
+ return parts.join('')
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/bl/bl.js":
+/*!*******************************!*\
+ !*** ./node_modules/bl/bl.js ***!
+ \*******************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var DuplexStream = __webpack_require__(/*! readable-stream */ "./node_modules/readable-stream/readable-browser.js").Duplex
+ , util = __webpack_require__(/*! util */ "./node_modules/util/util.js")
+ , Buffer = __webpack_require__(/*! safe-buffer */ "./node_modules/bl/node_modules/safe-buffer/index.js").Buffer
+
+var tempBuffer = Buffer.alloc(1)
+
+function BufferList (callback) {
+ if (!(this instanceof BufferList))
+ return new BufferList(callback)
+
+ this._bufs = []
+ this.length = 0
+
+ if (typeof callback == 'function') {
+ this._callback = callback
+
+ var piper = function piper (err) {
+ if (this._callback) {
+ this._callback(err)
+ this._callback = null
+ }
+ }.bind(this)
+
+ this.on('pipe', function onPipe (src) {
+ src.on('error', piper)
+ })
+ this.on('unpipe', function onUnpipe (src) {
+ src.removeListener('error', piper)
+ })
+ } else {
+ this.append(callback)
+ }
+
+ DuplexStream.call(this)
+}
+
+
+util.inherits(BufferList, DuplexStream)
+
+
+BufferList.prototype._offset = function _offset (offset) {
+ var tot = 0, i = 0, _t
+ if (offset === 0) return [ 0, 0 ]
+ for (; i < this._bufs.length; i++) {
+ _t = tot + this._bufs[i].length
+ if (offset < _t || i == this._bufs.length - 1)
+ return [ i, offset - tot ]
+ tot = _t
+ }
+}
+
+
+BufferList.prototype.append = function append (buf) {
+ var i = 0
+
+ if (Buffer.isBuffer(buf)) {
+ this._appendBuffer(buf);
+ } else if (Array.isArray(buf)) {
+ for (; i < buf.length; i++)
+ this.append(buf[i])
+ } else if (buf instanceof BufferList) {
+ // unwrap argument into individual BufferLists
+ for (; i < buf._bufs.length; i++)
+ this.append(buf._bufs[i])
+ } else if (buf != null) {
+ // coerce number arguments to strings, since Buffer(number) does
+ // uninitialized memory allocation
+ if (typeof buf == 'number')
+ buf = buf.toString()
+
+ this._appendBuffer(Buffer.from(buf));
+ }
+
+ return this
+}
+
+
+BufferList.prototype._appendBuffer = function appendBuffer (buf) {
+ this._bufs.push(buf)
+ this.length += buf.length
+}
+
+
+BufferList.prototype._write = function _write (buf, encoding, callback) {
+ this._appendBuffer(buf)
+
+ if (typeof callback == 'function')
+ callback()
+}
+
+
+BufferList.prototype._read = function _read (size) {
+ if (!this.length)
+ return this.push(null)
+
+ size = Math.min(size, this.length)
+ this.push(this.slice(0, size))
+ this.consume(size)
+}
+
+
+BufferList.prototype.end = function end (chunk) {
+ DuplexStream.prototype.end.call(this, chunk)
+
+ if (this._callback) {
+ this._callback(null, this.slice())
+ this._callback = null
+ }
+}
+
+
+BufferList.prototype.get = function get (index) {
+ this.copy(tempBuffer, 0, index, index + 1)
+ return tempBuffer[0]
+}
+
+
+BufferList.prototype.slice = function slice (start, end) {
+ if (typeof start == 'number' && start < 0)
+ start += this.length
+ if (typeof end == 'number' && end < 0)
+ end += this.length
+ return this.copy(null, 0, start, end)
+}
+
+
+BufferList.prototype.copy = function copy (dst, dstStart, srcStart, srcEnd) {
+ if (typeof srcStart != 'number' || srcStart < 0)
+ srcStart = 0
+ if (typeof srcEnd != 'number' || srcEnd > this.length)
+ srcEnd = this.length
+ if (srcStart >= this.length)
+ return dst || Buffer.alloc(0)
+ if (srcEnd <= 0)
+ return dst || Buffer.alloc(0)
+
+ var copy = !!dst
+ , off = this._offset(srcStart)
+ , len = srcEnd - srcStart
+ , bytes = len
+ , bufoff = (copy && dstStart) || 0
+ , start = off[1]
+ , l
+ , i
+
+ // copy/slice everything
+ if (srcStart === 0 && srcEnd == this.length) {
+ if (!copy) { // slice, but full concat if multiple buffers
+ return this._bufs.length === 1
+ ? this._bufs[0]
+ : Buffer.concat(this._bufs, this.length)
+ }
+
+ // copy, need to copy individual buffers
+ for (i = 0; i < this._bufs.length; i++) {
+ this._bufs[i].copy(dst, bufoff)
+ bufoff += this._bufs[i].length
+ }
+
+ return dst
+ }
+
+ // easy, cheap case where it's a subset of one of the buffers
+ if (bytes <= this._bufs[off[0]].length - start) {
+ return copy
+ ? this._bufs[off[0]].copy(dst, dstStart, start, start + bytes)
+ : this._bufs[off[0]].slice(start, start + bytes)
+ }
+
+ if (!copy) // a slice, we need something to copy in to
+ dst = Buffer.allocUnsafe(len)
+
+ for (i = off[0]; i < this._bufs.length; i++) {
+ l = this._bufs[i].length - start
+
+ if (bytes > l) {
+ this._bufs[i].copy(dst, bufoff, start)
+ } else {
+ this._bufs[i].copy(dst, bufoff, start, start + bytes)
+ break
+ }
+
+ bufoff += l
+ bytes -= l
+
+ if (start)
+ start = 0
+ }
+
+ return dst
+}
+
+BufferList.prototype.shallowSlice = function shallowSlice (start, end) {
+ start = start || 0
+ end = end || this.length
+
+ if (start < 0)
+ start += this.length
+ if (end < 0)
+ end += this.length
+
+ var startOffset = this._offset(start)
+ , endOffset = this._offset(end)
+ , buffers = this._bufs.slice(startOffset[0], endOffset[0] + 1)
+
+ if (endOffset[1] == 0)
+ buffers.pop()
+ else
+ buffers[buffers.length-1] = buffers[buffers.length-1].slice(0, endOffset[1])
+
+ if (startOffset[1] != 0)
+ buffers[0] = buffers[0].slice(startOffset[1])
+
+ return new BufferList(buffers)
+}
+
+BufferList.prototype.toString = function toString (encoding, start, end) {
+ return this.slice(start, end).toString(encoding)
+}
+
+BufferList.prototype.consume = function consume (bytes) {
+ while (this._bufs.length) {
+ if (bytes >= this._bufs[0].length) {
+ bytes -= this._bufs[0].length
+ this.length -= this._bufs[0].length
+ this._bufs.shift()
+ } else {
+ this._bufs[0] = this._bufs[0].slice(bytes)
+ this.length -= bytes
+ break
+ }
+ }
+ return this
+}
+
+
+BufferList.prototype.duplicate = function duplicate () {
+ var i = 0
+ , copy = new BufferList()
+
+ for (; i < this._bufs.length; i++)
+ copy.append(this._bufs[i])
+
+ return copy
+}
+
+
+BufferList.prototype.destroy = function destroy () {
+ this._bufs.length = 0
+ this.length = 0
+ this.push(null)
+}
+
+
+;(function () {
+ var methods = {
+ 'readDoubleBE' : 8
+ , 'readDoubleLE' : 8
+ , 'readFloatBE' : 4
+ , 'readFloatLE' : 4
+ , 'readInt32BE' : 4
+ , 'readInt32LE' : 4
+ , 'readUInt32BE' : 4
+ , 'readUInt32LE' : 4
+ , 'readInt16BE' : 2
+ , 'readInt16LE' : 2
+ , 'readUInt16BE' : 2
+ , 'readUInt16LE' : 2
+ , 'readInt8' : 1
+ , 'readUInt8' : 1
+ , 'readIntBE' : null
+ , 'readIntLE' : null
+ , 'readUIntBE' : null
+ , 'readUIntLE' : null
+ }
+
+ for (var m in methods) {
+ (function (m) {
+ if (methods[m] === null) {
+ BufferList.prototype[m] = function (offset, byteLength) {
+ return this.slice(offset, offset + byteLength)[m](0, byteLength)
+ }
+ }
+ else {
+ BufferList.prototype[m] = function (offset) {
+ return this.slice(offset, offset + methods[m])[m](0)
+ }
+ }
+ }(m))
+ }
+}())
+
+
+module.exports = BufferList
+
+
+/***/ }),
+
+/***/ "./node_modules/bl/node_modules/safe-buffer/index.js":
+/*!***********************************************************!*\
+ !*** ./node_modules/bl/node_modules/safe-buffer/index.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* eslint-disable node/no-deprecated-api */
+var buffer = __webpack_require__(/*! buffer */ "./node_modules/buffer/index.js")
+var Buffer = buffer.Buffer
+
+// alternative to using Object.keys for old browsers
+function copyProps (src, dst) {
+ for (var key in src) {
+ dst[key] = src[key]
+ }
+}
+if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {
+ module.exports = buffer
+} else {
+ // Copy properties from require('buffer')
+ copyProps(buffer, exports)
+ exports.Buffer = SafeBuffer
+}
+
+function SafeBuffer (arg, encodingOrOffset, length) {
+ return Buffer(arg, encodingOrOffset, length)
+}
+
+// Copy static methods from Buffer
+copyProps(Buffer, SafeBuffer)
+
+SafeBuffer.from = function (arg, encodingOrOffset, length) {
+ if (typeof arg === 'number') {
+ throw new TypeError('Argument must not be a number')
+ }
+ return Buffer(arg, encodingOrOffset, length)
+}
+
+SafeBuffer.alloc = function (size, fill, encoding) {
+ if (typeof size !== 'number') {
+ throw new TypeError('Argument must be a number')
+ }
+ var buf = Buffer(size)
+ if (fill !== undefined) {
+ if (typeof encoding === 'string') {
+ buf.fill(fill, encoding)
+ } else {
+ buf.fill(fill)
+ }
+ } else {
+ buf.fill(0)
+ }
+ return buf
+}
+
+SafeBuffer.allocUnsafe = function (size) {
+ if (typeof size !== 'number') {
+ throw new TypeError('Argument must be a number')
+ }
+ return Buffer(size)
+}
+
+SafeBuffer.allocUnsafeSlow = function (size) {
+ if (typeof size !== 'number') {
+ throw new TypeError('Argument must be a number')
+ }
+ return buffer.SlowBuffer(size)
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/buffer/index.js":
+/*!**************************************!*\
+ !*** ./node_modules/buffer/index.js ***!
+ \**************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+/* WEBPACK VAR INJECTION */(function(global) {/*!
+ * The buffer module from node.js, for the browser.
+ *
+ * @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
+ * @license MIT
+ */
+/* eslint-disable no-proto */
+
+
+
+var base64 = __webpack_require__(/*! base64-js */ "./node_modules/base64-js/index.js")
+var ieee754 = __webpack_require__(/*! ieee754 */ "./node_modules/ieee754/index.js")
+var isArray = __webpack_require__(/*! isarray */ "./node_modules/isarray/index.js")
+
+exports.Buffer = Buffer
+exports.SlowBuffer = SlowBuffer
+exports.INSPECT_MAX_BYTES = 50
+
+/**
+ * If `Buffer.TYPED_ARRAY_SUPPORT`:
+ * === true Use Uint8Array implementation (fastest)
+ * === false Use Object implementation (most compatible, even IE6)
+ *
+ * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
+ * Opera 11.6+, iOS 4.2+.
+ *
+ * Due to various browser bugs, sometimes the Object implementation will be used even
+ * when the browser supports typed arrays.
+ *
+ * Note:
+ *
+ * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,
+ * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.
+ *
+ * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.
+ *
+ * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of
+ * incorrect length in some situations.
+
+ * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they
+ * get the Object implementation, which is slower but behaves correctly.
+ */
+Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined
+ ? global.TYPED_ARRAY_SUPPORT
+ : typedArraySupport()
+
+/*
+ * Export kMaxLength after typed array support is determined.
+ */
+exports.kMaxLength = kMaxLength()
+
+function typedArraySupport () {
+ try {
+ var arr = new Uint8Array(1)
+ arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}
+ return arr.foo() === 42 && // typed array instances can be augmented
+ typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`
+ arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`
+ } catch (e) {
+ return false
+ }
+}
+
+function kMaxLength () {
+ return Buffer.TYPED_ARRAY_SUPPORT
+ ? 0x7fffffff
+ : 0x3fffffff
+}
+
+function createBuffer (that, length) {
+ if (kMaxLength() < length) {
+ throw new RangeError('Invalid typed array length')
+ }
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ // Return an augmented `Uint8Array` instance, for best performance
+ that = new Uint8Array(length)
+ that.__proto__ = Buffer.prototype
+ } else {
+ // Fallback: Return an object instance of the Buffer class
+ if (that === null) {
+ that = new Buffer(length)
+ }
+ that.length = length
+ }
+
+ return that
+}
+
+/**
+ * The Buffer constructor returns instances of `Uint8Array` that have their
+ * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of
+ * `Uint8Array`, so the returned instances will have all the node `Buffer` methods
+ * and the `Uint8Array` methods. Square bracket notation works as expected -- it
+ * returns a single octet.
+ *
+ * The `Uint8Array` prototype remains unmodified.
+ */
+
+function Buffer (arg, encodingOrOffset, length) {
+ if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {
+ return new Buffer(arg, encodingOrOffset, length)
+ }
+
+ // Common case.
+ if (typeof arg === 'number') {
+ if (typeof encodingOrOffset === 'string') {
+ throw new Error(
+ 'If encoding is specified then the first argument must be a string'
+ )
+ }
+ return allocUnsafe(this, arg)
+ }
+ return from(this, arg, encodingOrOffset, length)
+}
+
+Buffer.poolSize = 8192 // not used by this implementation
+
+// TODO: Legacy, not needed anymore. Remove in next major version.
+Buffer._augment = function (arr) {
+ arr.__proto__ = Buffer.prototype
+ return arr
+}
+
+function from (that, value, encodingOrOffset, length) {
+ if (typeof value === 'number') {
+ throw new TypeError('"value" argument must not be a number')
+ }
+
+ if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {
+ return fromArrayBuffer(that, value, encodingOrOffset, length)
+ }
+
+ if (typeof value === 'string') {
+ return fromString(that, value, encodingOrOffset)
+ }
+
+ return fromObject(that, value)
+}
+
+/**
+ * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError
+ * if value is a number.
+ * Buffer.from(str[, encoding])
+ * Buffer.from(array)
+ * Buffer.from(buffer)
+ * Buffer.from(arrayBuffer[, byteOffset[, length]])
+ **/
+Buffer.from = function (value, encodingOrOffset, length) {
+ return from(null, value, encodingOrOffset, length)
+}
+
+if (Buffer.TYPED_ARRAY_SUPPORT) {
+ Buffer.prototype.__proto__ = Uint8Array.prototype
+ Buffer.__proto__ = Uint8Array
+ if (typeof Symbol !== 'undefined' && Symbol.species &&
+ Buffer[Symbol.species] === Buffer) {
+ // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97
+ Object.defineProperty(Buffer, Symbol.species, {
+ value: null,
+ configurable: true
+ })
+ }
+}
+
+function assertSize (size) {
+ if (typeof size !== 'number') {
+ throw new TypeError('"size" argument must be a number')
+ } else if (size < 0) {
+ throw new RangeError('"size" argument must not be negative')
+ }
+}
+
+function alloc (that, size, fill, encoding) {
+ assertSize(size)
+ if (size <= 0) {
+ return createBuffer(that, size)
+ }
+ if (fill !== undefined) {
+ // Only pay attention to encoding if it's a string. This
+ // prevents accidentally sending in a number that would
+ // be interpretted as a start offset.
+ return typeof encoding === 'string'
+ ? createBuffer(that, size).fill(fill, encoding)
+ : createBuffer(that, size).fill(fill)
+ }
+ return createBuffer(that, size)
+}
+
+/**
+ * Creates a new filled Buffer instance.
+ * alloc(size[, fill[, encoding]])
+ **/
+Buffer.alloc = function (size, fill, encoding) {
+ return alloc(null, size, fill, encoding)
+}
+
+function allocUnsafe (that, size) {
+ assertSize(size)
+ that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)
+ if (!Buffer.TYPED_ARRAY_SUPPORT) {
+ for (var i = 0; i < size; ++i) {
+ that[i] = 0
+ }
+ }
+ return that
+}
+
+/**
+ * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.
+ * */
+Buffer.allocUnsafe = function (size) {
+ return allocUnsafe(null, size)
+}
+/**
+ * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.
+ */
+Buffer.allocUnsafeSlow = function (size) {
+ return allocUnsafe(null, size)
+}
+
+function fromString (that, string, encoding) {
+ if (typeof encoding !== 'string' || encoding === '') {
+ encoding = 'utf8'
+ }
+
+ if (!Buffer.isEncoding(encoding)) {
+ throw new TypeError('"encoding" must be a valid string encoding')
+ }
+
+ var length = byteLength(string, encoding) | 0
+ that = createBuffer(that, length)
+
+ var actual = that.write(string, encoding)
+
+ if (actual !== length) {
+ // Writing a hex string, for example, that contains invalid characters will
+ // cause everything after the first invalid character to be ignored. (e.g.
+ // 'abxxcd' will be treated as 'ab')
+ that = that.slice(0, actual)
+ }
+
+ return that
+}
+
+function fromArrayLike (that, array) {
+ var length = array.length < 0 ? 0 : checked(array.length) | 0
+ that = createBuffer(that, length)
+ for (var i = 0; i < length; i += 1) {
+ that[i] = array[i] & 255
+ }
+ return that
+}
+
+function fromArrayBuffer (that, array, byteOffset, length) {
+ array.byteLength // this throws if `array` is not a valid ArrayBuffer
+
+ if (byteOffset < 0 || array.byteLength < byteOffset) {
+ throw new RangeError('\'offset\' is out of bounds')
+ }
+
+ if (array.byteLength < byteOffset + (length || 0)) {
+ throw new RangeError('\'length\' is out of bounds')
+ }
+
+ if (byteOffset === undefined && length === undefined) {
+ array = new Uint8Array(array)
+ } else if (length === undefined) {
+ array = new Uint8Array(array, byteOffset)
+ } else {
+ array = new Uint8Array(array, byteOffset, length)
+ }
+
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ // Return an augmented `Uint8Array` instance, for best performance
+ that = array
+ that.__proto__ = Buffer.prototype
+ } else {
+ // Fallback: Return an object instance of the Buffer class
+ that = fromArrayLike(that, array)
+ }
+ return that
+}
+
+function fromObject (that, obj) {
+ if (Buffer.isBuffer(obj)) {
+ var len = checked(obj.length) | 0
+ that = createBuffer(that, len)
+
+ if (that.length === 0) {
+ return that
+ }
+
+ obj.copy(that, 0, 0, len)
+ return that
+ }
+
+ if (obj) {
+ if ((typeof ArrayBuffer !== 'undefined' &&
+ obj.buffer instanceof ArrayBuffer) || 'length' in obj) {
+ if (typeof obj.length !== 'number' || isnan(obj.length)) {
+ return createBuffer(that, 0)
+ }
+ return fromArrayLike(that, obj)
+ }
+
+ if (obj.type === 'Buffer' && isArray(obj.data)) {
+ return fromArrayLike(that, obj.data)
+ }
+ }
+
+ throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')
+}
+
+function checked (length) {
+ // Note: cannot use `length < kMaxLength()` here because that fails when
+ // length is NaN (which is otherwise coerced to zero.)
+ if (length >= kMaxLength()) {
+ throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
+ 'size: 0x' + kMaxLength().toString(16) + ' bytes')
+ }
+ return length | 0
+}
+
+function SlowBuffer (length) {
+ if (+length != length) { // eslint-disable-line eqeqeq
+ length = 0
+ }
+ return Buffer.alloc(+length)
+}
+
+Buffer.isBuffer = function isBuffer (b) {
+ return !!(b != null && b._isBuffer)
+}
+
+Buffer.compare = function compare (a, b) {
+ if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
+ throw new TypeError('Arguments must be Buffers')
+ }
+
+ if (a === b) return 0
+
+ var x = a.length
+ var y = b.length
+
+ for (var i = 0, len = Math.min(x, y); i < len; ++i) {
+ if (a[i] !== b[i]) {
+ x = a[i]
+ y = b[i]
+ break
+ }
+ }
+
+ if (x < y) return -1
+ if (y < x) return 1
+ return 0
+}
+
+Buffer.isEncoding = function isEncoding (encoding) {
+ switch (String(encoding).toLowerCase()) {
+ case 'hex':
+ case 'utf8':
+ case 'utf-8':
+ case 'ascii':
+ case 'latin1':
+ case 'binary':
+ case 'base64':
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ return true
+ default:
+ return false
+ }
+}
+
+Buffer.concat = function concat (list, length) {
+ if (!isArray(list)) {
+ throw new TypeError('"list" argument must be an Array of Buffers')
+ }
+
+ if (list.length === 0) {
+ return Buffer.alloc(0)
+ }
+
+ var i
+ if (length === undefined) {
+ length = 0
+ for (i = 0; i < list.length; ++i) {
+ length += list[i].length
+ }
+ }
+
+ var buffer = Buffer.allocUnsafe(length)
+ var pos = 0
+ for (i = 0; i < list.length; ++i) {
+ var buf = list[i]
+ if (!Buffer.isBuffer(buf)) {
+ throw new TypeError('"list" argument must be an Array of Buffers')
+ }
+ buf.copy(buffer, pos)
+ pos += buf.length
+ }
+ return buffer
+}
+
+function byteLength (string, encoding) {
+ if (Buffer.isBuffer(string)) {
+ return string.length
+ }
+ if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&
+ (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {
+ return string.byteLength
+ }
+ if (typeof string !== 'string') {
+ string = '' + string
+ }
+
+ var len = string.length
+ if (len === 0) return 0
+
+ // Use a for loop to avoid recursion
+ var loweredCase = false
+ for (;;) {
+ switch (encoding) {
+ case 'ascii':
+ case 'latin1':
+ case 'binary':
+ return len
+ case 'utf8':
+ case 'utf-8':
+ case undefined:
+ return utf8ToBytes(string).length
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ return len * 2
+ case 'hex':
+ return len >>> 1
+ case 'base64':
+ return base64ToBytes(string).length
+ default:
+ if (loweredCase) return utf8ToBytes(string).length // assume utf8
+ encoding = ('' + encoding).toLowerCase()
+ loweredCase = true
+ }
+ }
+}
+Buffer.byteLength = byteLength
+
+function slowToString (encoding, start, end) {
+ var loweredCase = false
+
+ // No need to verify that "this.length <= MAX_UINT32" since it's a read-only
+ // property of a typed array.
+
+ // This behaves neither like String nor Uint8Array in that we set start/end
+ // to their upper/lower bounds if the value passed is out of range.
+ // undefined is handled specially as per ECMA-262 6th Edition,
+ // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.
+ if (start === undefined || start < 0) {
+ start = 0
+ }
+ // Return early if start > this.length. Done here to prevent potential uint32
+ // coercion fail below.
+ if (start > this.length) {
+ return ''
+ }
+
+ if (end === undefined || end > this.length) {
+ end = this.length
+ }
+
+ if (end <= 0) {
+ return ''
+ }
+
+ // Force coersion to uint32. This will also coerce falsey/NaN values to 0.
+ end >>>= 0
+ start >>>= 0
+
+ if (end <= start) {
+ return ''
+ }
+
+ if (!encoding) encoding = 'utf8'
+
+ while (true) {
+ switch (encoding) {
+ case 'hex':
+ return hexSlice(this, start, end)
+
+ case 'utf8':
+ case 'utf-8':
+ return utf8Slice(this, start, end)
+
+ case 'ascii':
+ return asciiSlice(this, start, end)
+
+ case 'latin1':
+ case 'binary':
+ return latin1Slice(this, start, end)
+
+ case 'base64':
+ return base64Slice(this, start, end)
+
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ return utf16leSlice(this, start, end)
+
+ default:
+ if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
+ encoding = (encoding + '').toLowerCase()
+ loweredCase = true
+ }
+ }
+}
+
+// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect
+// Buffer instances.
+Buffer.prototype._isBuffer = true
+
+function swap (b, n, m) {
+ var i = b[n]
+ b[n] = b[m]
+ b[m] = i
+}
+
+Buffer.prototype.swap16 = function swap16 () {
+ var len = this.length
+ if (len % 2 !== 0) {
+ throw new RangeError('Buffer size must be a multiple of 16-bits')
+ }
+ for (var i = 0; i < len; i += 2) {
+ swap(this, i, i + 1)
+ }
+ return this
+}
+
+Buffer.prototype.swap32 = function swap32 () {
+ var len = this.length
+ if (len % 4 !== 0) {
+ throw new RangeError('Buffer size must be a multiple of 32-bits')
+ }
+ for (var i = 0; i < len; i += 4) {
+ swap(this, i, i + 3)
+ swap(this, i + 1, i + 2)
+ }
+ return this
+}
+
+Buffer.prototype.swap64 = function swap64 () {
+ var len = this.length
+ if (len % 8 !== 0) {
+ throw new RangeError('Buffer size must be a multiple of 64-bits')
+ }
+ for (var i = 0; i < len; i += 8) {
+ swap(this, i, i + 7)
+ swap(this, i + 1, i + 6)
+ swap(this, i + 2, i + 5)
+ swap(this, i + 3, i + 4)
+ }
+ return this
+}
+
+Buffer.prototype.toString = function toString () {
+ var length = this.length | 0
+ if (length === 0) return ''
+ if (arguments.length === 0) return utf8Slice(this, 0, length)
+ return slowToString.apply(this, arguments)
+}
+
+Buffer.prototype.equals = function equals (b) {
+ if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
+ if (this === b) return true
+ return Buffer.compare(this, b) === 0
+}
+
+Buffer.prototype.inspect = function inspect () {
+ var str = ''
+ var max = exports.INSPECT_MAX_BYTES
+ if (this.length > 0) {
+ str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')
+ if (this.length > max) str += ' ... '
+ }
+ return '<Buffer ' + str + '>'
+}
+
+Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {
+ if (!Buffer.isBuffer(target)) {
+ throw new TypeError('Argument must be a Buffer')
+ }
+
+ if (start === undefined) {
+ start = 0
+ }
+ if (end === undefined) {
+ end = target ? target.length : 0
+ }
+ if (thisStart === undefined) {
+ thisStart = 0
+ }
+ if (thisEnd === undefined) {
+ thisEnd = this.length
+ }
+
+ if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {
+ throw new RangeError('out of range index')
+ }
+
+ if (thisStart >= thisEnd && start >= end) {
+ return 0
+ }
+ if (thisStart >= thisEnd) {
+ return -1
+ }
+ if (start >= end) {
+ return 1
+ }
+
+ start >>>= 0
+ end >>>= 0
+ thisStart >>>= 0
+ thisEnd >>>= 0
+
+ if (this === target) return 0
+
+ var x = thisEnd - thisStart
+ var y = end - start
+ var len = Math.min(x, y)
+
+ var thisCopy = this.slice(thisStart, thisEnd)
+ var targetCopy = target.slice(start, end)
+
+ for (var i = 0; i < len; ++i) {
+ if (thisCopy[i] !== targetCopy[i]) {
+ x = thisCopy[i]
+ y = targetCopy[i]
+ break
+ }
+ }
+
+ if (x < y) return -1
+ if (y < x) return 1
+ return 0
+}
+
+// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,
+// OR the last index of `val` in `buffer` at offset <= `byteOffset`.
+//
+// Arguments:
+// - buffer - a Buffer to search
+// - val - a string, Buffer, or number
+// - byteOffset - an index into `buffer`; will be clamped to an int32
+// - encoding - an optional encoding, relevant is val is a string
+// - dir - true for indexOf, false for lastIndexOf
+function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
+ // Empty buffer means no match
+ if (buffer.length === 0) return -1
+
+ // Normalize byteOffset
+ if (typeof byteOffset === 'string') {
+ encoding = byteOffset
+ byteOffset = 0
+ } else if (byteOffset > 0x7fffffff) {
+ byteOffset = 0x7fffffff
+ } else if (byteOffset < -0x80000000) {
+ byteOffset = -0x80000000
+ }
+ byteOffset = +byteOffset // Coerce to Number.
+ if (isNaN(byteOffset)) {
+ // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer
+ byteOffset = dir ? 0 : (buffer.length - 1)
+ }
+
+ // Normalize byteOffset: negative offsets start from the end of the buffer
+ if (byteOffset < 0) byteOffset = buffer.length + byteOffset
+ if (byteOffset >= buffer.length) {
+ if (dir) return -1
+ else byteOffset = buffer.length - 1
+ } else if (byteOffset < 0) {
+ if (dir) byteOffset = 0
+ else return -1
+ }
+
+ // Normalize val
+ if (typeof val === 'string') {
+ val = Buffer.from(val, encoding)
+ }
+
+ // Finally, search either indexOf (if dir is true) or lastIndexOf
+ if (Buffer.isBuffer(val)) {
+ // Special case: looking for empty string/buffer always fails
+ if (val.length === 0) {
+ return -1
+ }
+ return arrayIndexOf(buffer, val, byteOffset, encoding, dir)
+ } else if (typeof val === 'number') {
+ val = val & 0xFF // Search for a byte value [0-255]
+ if (Buffer.TYPED_ARRAY_SUPPORT &&
+ typeof Uint8Array.prototype.indexOf === 'function') {
+ if (dir) {
+ return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)
+ } else {
+ return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)
+ }
+ }
+ return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)
+ }
+
+ throw new TypeError('val must be string, number or Buffer')
+}
+
+function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
+ var indexSize = 1
+ var arrLength = arr.length
+ var valLength = val.length
+
+ if (encoding !== undefined) {
+ encoding = String(encoding).toLowerCase()
+ if (encoding === 'ucs2' || encoding === 'ucs-2' ||
+ encoding === 'utf16le' || encoding === 'utf-16le') {
+ if (arr.length < 2 || val.length < 2) {
+ return -1
+ }
+ indexSize = 2
+ arrLength /= 2
+ valLength /= 2
+ byteOffset /= 2
+ }
+ }
+
+ function read (buf, i) {
+ if (indexSize === 1) {
+ return buf[i]
+ } else {
+ return buf.readUInt16BE(i * indexSize)
+ }
+ }
+
+ var i
+ if (dir) {
+ var foundIndex = -1
+ for (i = byteOffset; i < arrLength; i++) {
+ if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {
+ if (foundIndex === -1) foundIndex = i
+ if (i - foundIndex + 1 === valLength) return foundIndex * indexSize
+ } else {
+ if (foundIndex !== -1) i -= i - foundIndex
+ foundIndex = -1
+ }
+ }
+ } else {
+ if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength
+ for (i = byteOffset; i >= 0; i--) {
+ var found = true
+ for (var j = 0; j < valLength; j++) {
+ if (read(arr, i + j) !== read(val, j)) {
+ found = false
+ break
+ }
+ }
+ if (found) return i
+ }
+ }
+
+ return -1
+}
+
+Buffer.prototype.includes = function includes (val, byteOffset, encoding) {
+ return this.indexOf(val, byteOffset, encoding) !== -1
+}
+
+Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {
+ return bidirectionalIndexOf(this, val, byteOffset, encoding, true)
+}
+
+Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {
+ return bidirectionalIndexOf(this, val, byteOffset, encoding, false)
+}
+
+function hexWrite (buf, string, offset, length) {
+ offset = Number(offset) || 0
+ var remaining = buf.length - offset
+ if (!length) {
+ length = remaining
+ } else {
+ length = Number(length)
+ if (length > remaining) {
+ length = remaining
+ }
+ }
+
+ // must be an even number of digits
+ var strLen = string.length
+ if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')
+
+ if (length > strLen / 2) {
+ length = strLen / 2
+ }
+ for (var i = 0; i < length; ++i) {
+ var parsed = parseInt(string.substr(i * 2, 2), 16)
+ if (isNaN(parsed)) return i
+ buf[offset + i] = parsed
+ }
+ return i
+}
+
+function utf8Write (buf, string, offset, length) {
+ return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
+}
+
+function asciiWrite (buf, string, offset, length) {
+ return blitBuffer(asciiToBytes(string), buf, offset, length)
+}
+
+function latin1Write (buf, string, offset, length) {
+ return asciiWrite(buf, string, offset, length)
+}
+
+function base64Write (buf, string, offset, length) {
+ return blitBuffer(base64ToBytes(string), buf, offset, length)
+}
+
+function ucs2Write (buf, string, offset, length) {
+ return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
+}
+
+Buffer.prototype.write = function write (string, offset, length, encoding) {
+ // Buffer#write(string)
+ if (offset === undefined) {
+ encoding = 'utf8'
+ length = this.length
+ offset = 0
+ // Buffer#write(string, encoding)
+ } else if (length === undefined && typeof offset === 'string') {
+ encoding = offset
+ length = this.length
+ offset = 0
+ // Buffer#write(string, offset[, length][, encoding])
+ } else if (isFinite(offset)) {
+ offset = offset | 0
+ if (isFinite(length)) {
+ length = length | 0
+ if (encoding === undefined) encoding = 'utf8'
+ } else {
+ encoding = length
+ length = undefined
+ }
+ // legacy write(string, encoding, offset, length) - remove in v0.13
+ } else {
+ throw new Error(
+ 'Buffer.write(string, encoding, offset[, length]) is no longer supported'
+ )
+ }
+
+ var remaining = this.length - offset
+ if (length === undefined || length > remaining) length = remaining
+
+ if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
+ throw new RangeError('Attempt to write outside buffer bounds')
+ }
+
+ if (!encoding) encoding = 'utf8'
+
+ var loweredCase = false
+ for (;;) {
+ switch (encoding) {
+ case 'hex':
+ return hexWrite(this, string, offset, length)
+
+ case 'utf8':
+ case 'utf-8':
+ return utf8Write(this, string, offset, length)
+
+ case 'ascii':
+ return asciiWrite(this, string, offset, length)
+
+ case 'latin1':
+ case 'binary':
+ return latin1Write(this, string, offset, length)
+
+ case 'base64':
+ // Warning: maxLength not taken into account in base64Write
+ return base64Write(this, string, offset, length)
+
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ return ucs2Write(this, string, offset, length)
+
+ default:
+ if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
+ encoding = ('' + encoding).toLowerCase()
+ loweredCase = true
+ }
+ }
+}
+
+Buffer.prototype.toJSON = function toJSON () {
+ return {
+ type: 'Buffer',
+ data: Array.prototype.slice.call(this._arr || this, 0)
+ }
+}
+
+function base64Slice (buf, start, end) {
+ if (start === 0 && end === buf.length) {
+ return base64.fromByteArray(buf)
+ } else {
+ return base64.fromByteArray(buf.slice(start, end))
+ }
+}
+
+function utf8Slice (buf, start, end) {
+ end = Math.min(buf.length, end)
+ var res = []
+
+ var i = start
+ while (i < end) {
+ var firstByte = buf[i]
+ var codePoint = null
+ var bytesPerSequence = (firstByte > 0xEF) ? 4
+ : (firstByte > 0xDF) ? 3
+ : (firstByte > 0xBF) ? 2
+ : 1
+
+ if (i + bytesPerSequence <= end) {
+ var secondByte, thirdByte, fourthByte, tempCodePoint
+
+ switch (bytesPerSequence) {
+ case 1:
+ if (firstByte < 0x80) {
+ codePoint = firstByte
+ }
+ break
+ case 2:
+ secondByte = buf[i + 1]
+ if ((secondByte & 0xC0) === 0x80) {
+ tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)
+ if (tempCodePoint > 0x7F) {
+ codePoint = tempCodePoint
+ }
+ }
+ break
+ case 3:
+ secondByte = buf[i + 1]
+ thirdByte = buf[i + 2]
+ if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
+ tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)
+ if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
+ codePoint = tempCodePoint
+ }
+ }
+ break
+ case 4:
+ secondByte = buf[i + 1]
+ thirdByte = buf[i + 2]
+ fourthByte = buf[i + 3]
+ if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
+ tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)
+ if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
+ codePoint = tempCodePoint
+ }
+ }
+ }
+ }
+
+ if (codePoint === null) {
+ // we did not generate a valid codePoint so insert a
+ // replacement char (U+FFFD) and advance only 1 byte
+ codePoint = 0xFFFD
+ bytesPerSequence = 1
+ } else if (codePoint > 0xFFFF) {
+ // encode to utf16 (surrogate pair dance)
+ codePoint -= 0x10000
+ res.push(codePoint >>> 10 & 0x3FF | 0xD800)
+ codePoint = 0xDC00 | codePoint & 0x3FF
+ }
+
+ res.push(codePoint)
+ i += bytesPerSequence
+ }
+
+ return decodeCodePointsArray(res)
+}
+
+// Based on http://stackoverflow.com/a/22747272/680742, the browser with
+// the lowest limit is Chrome, with 0x10000 args.
+// We go 1 magnitude less, for safety
+var MAX_ARGUMENTS_LENGTH = 0x1000
+
+function decodeCodePointsArray (codePoints) {
+ var len = codePoints.length
+ if (len <= MAX_ARGUMENTS_LENGTH) {
+ return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
+ }
+
+ // Decode in chunks to avoid "call stack size exceeded".
+ var res = ''
+ var i = 0
+ while (i < len) {
+ res += String.fromCharCode.apply(
+ String,
+ codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
+ )
+ }
+ return res
+}
+
+function asciiSlice (buf, start, end) {
+ var ret = ''
+ end = Math.min(buf.length, end)
+
+ for (var i = start; i < end; ++i) {
+ ret += String.fromCharCode(buf[i] & 0x7F)
+ }
+ return ret
+}
+
+function latin1Slice (buf, start, end) {
+ var ret = ''
+ end = Math.min(buf.length, end)
+
+ for (var i = start; i < end; ++i) {
+ ret += String.fromCharCode(buf[i])
+ }
+ return ret
+}
+
+function hexSlice (buf, start, end) {
+ var len = buf.length
+
+ if (!start || start < 0) start = 0
+ if (!end || end < 0 || end > len) end = len
+
+ var out = ''
+ for (var i = start; i < end; ++i) {
+ out += toHex(buf[i])
+ }
+ return out
+}
+
+function utf16leSlice (buf, start, end) {
+ var bytes = buf.slice(start, end)
+ var res = ''
+ for (var i = 0; i < bytes.length; i += 2) {
+ res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)
+ }
+ return res
+}
+
+Buffer.prototype.slice = function slice (start, end) {
+ var len = this.length
+ start = ~~start
+ end = end === undefined ? len : ~~end
+
+ if (start < 0) {
+ start += len
+ if (start < 0) start = 0
+ } else if (start > len) {
+ start = len
+ }
+
+ if (end < 0) {
+ end += len
+ if (end < 0) end = 0
+ } else if (end > len) {
+ end = len
+ }
+
+ if (end < start) end = start
+
+ var newBuf
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ newBuf = this.subarray(start, end)
+ newBuf.__proto__ = Buffer.prototype
+ } else {
+ var sliceLen = end - start
+ newBuf = new Buffer(sliceLen, undefined)
+ for (var i = 0; i < sliceLen; ++i) {
+ newBuf[i] = this[i + start]
+ }
+ }
+
+ return newBuf
+}
+
+/*
+ * Need to make sure that buffer isn't trying to write out of bounds.
+ */
+function checkOffset (offset, ext, length) {
+ if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
+ if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
+}
+
+Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
+ offset = offset | 0
+ byteLength = byteLength | 0
+ if (!noAssert) checkOffset(offset, byteLength, this.length)
+
+ var val = this[offset]
+ var mul = 1
+ var i = 0
+ while (++i < byteLength && (mul *= 0x100)) {
+ val += this[offset + i] * mul
+ }
+
+ return val
+}
+
+Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
+ offset = offset | 0
+ byteLength = byteLength | 0
+ if (!noAssert) {
+ checkOffset(offset, byteLength, this.length)
+ }
+
+ var val = this[offset + --byteLength]
+ var mul = 1
+ while (byteLength > 0 && (mul *= 0x100)) {
+ val += this[offset + --byteLength] * mul
+ }
+
+ return val
+}
+
+Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 1, this.length)
+ return this[offset]
+}
+
+Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 2, this.length)
+ return this[offset] | (this[offset + 1] << 8)
+}
+
+Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 2, this.length)
+ return (this[offset] << 8) | this[offset + 1]
+}
+
+Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 4, this.length)
+
+ return ((this[offset]) |
+ (this[offset + 1] << 8) |
+ (this[offset + 2] << 16)) +
+ (this[offset + 3] * 0x1000000)
+}
+
+Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 4, this.length)
+
+ return (this[offset] * 0x1000000) +
+ ((this[offset + 1] << 16) |
+ (this[offset + 2] << 8) |
+ this[offset + 3])
+}
+
+Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
+ offset = offset | 0
+ byteLength = byteLength | 0
+ if (!noAssert) checkOffset(offset, byteLength, this.length)
+
+ var val = this[offset]
+ var mul = 1
+ var i = 0
+ while (++i < byteLength && (mul *= 0x100)) {
+ val += this[offset + i] * mul
+ }
+ mul *= 0x80
+
+ if (val >= mul) val -= Math.pow(2, 8 * byteLength)
+
+ return val
+}
+
+Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
+ offset = offset | 0
+ byteLength = byteLength | 0
+ if (!noAssert) checkOffset(offset, byteLength, this.length)
+
+ var i = byteLength
+ var mul = 1
+ var val = this[offset + --i]
+ while (i > 0 && (mul *= 0x100)) {
+ val += this[offset + --i] * mul
+ }
+ mul *= 0x80
+
+ if (val >= mul) val -= Math.pow(2, 8 * byteLength)
+
+ return val
+}
+
+Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 1, this.length)
+ if (!(this[offset] & 0x80)) return (this[offset])
+ return ((0xff - this[offset] + 1) * -1)
+}
+
+Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 2, this.length)
+ var val = this[offset] | (this[offset + 1] << 8)
+ return (val & 0x8000) ? val | 0xFFFF0000 : val
+}
+
+Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 2, this.length)
+ var val = this[offset + 1] | (this[offset] << 8)
+ return (val & 0x8000) ? val | 0xFFFF0000 : val
+}
+
+Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 4, this.length)
+
+ return (this[offset]) |
+ (this[offset + 1] << 8) |
+ (this[offset + 2] << 16) |
+ (this[offset + 3] << 24)
+}
+
+Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 4, this.length)
+
+ return (this[offset] << 24) |
+ (this[offset + 1] << 16) |
+ (this[offset + 2] << 8) |
+ (this[offset + 3])
+}
+
+Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 4, this.length)
+ return ieee754.read(this, offset, true, 23, 4)
+}
+
+Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 4, this.length)
+ return ieee754.read(this, offset, false, 23, 4)
+}
+
+Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 8, this.length)
+ return ieee754.read(this, offset, true, 52, 8)
+}
+
+Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 8, this.length)
+ return ieee754.read(this, offset, false, 52, 8)
+}
+
+function checkInt (buf, value, offset, ext, max, min) {
+ if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance')
+ if (value > max || value < min) throw new RangeError('"value" argument is out of bounds')
+ if (offset + ext > buf.length) throw new RangeError('Index out of range')
+}
+
+Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
+ value = +value
+ offset = offset | 0
+ byteLength = byteLength | 0
+ if (!noAssert) {
+ var maxBytes = Math.pow(2, 8 * byteLength) - 1
+ checkInt(this, value, offset, byteLength, maxBytes, 0)
+ }
+
+ var mul = 1
+ var i = 0
+ this[offset] = value & 0xFF
+ while (++i < byteLength && (mul *= 0x100)) {
+ this[offset + i] = (value / mul) & 0xFF
+ }
+
+ return offset + byteLength
+}
+
+Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
+ value = +value
+ offset = offset | 0
+ byteLength = byteLength | 0
+ if (!noAssert) {
+ var maxBytes = Math.pow(2, 8 * byteLength) - 1
+ checkInt(this, value, offset, byteLength, maxBytes, 0)
+ }
+
+ var i = byteLength - 1
+ var mul = 1
+ this[offset + i] = value & 0xFF
+ while (--i >= 0 && (mul *= 0x100)) {
+ this[offset + i] = (value / mul) & 0xFF
+ }
+
+ return offset + byteLength
+}
+
+Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
+ value = +value
+ offset = offset | 0
+ if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
+ if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
+ this[offset] = (value & 0xff)
+ return offset + 1
+}
+
+function objectWriteUInt16 (buf, value, offset, littleEndian) {
+ if (value < 0) value = 0xffff + value + 1
+ for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {
+ buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>
+ (littleEndian ? i : 1 - i) * 8
+ }
+}
+
+Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
+ value = +value
+ offset = offset | 0
+ if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset] = (value & 0xff)
+ this[offset + 1] = (value >>> 8)
+ } else {
+ objectWriteUInt16(this, value, offset, true)
+ }
+ return offset + 2
+}
+
+Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
+ value = +value
+ offset = offset | 0
+ if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset] = (value >>> 8)
+ this[offset + 1] = (value & 0xff)
+ } else {
+ objectWriteUInt16(this, value, offset, false)
+ }
+ return offset + 2
+}
+
+function objectWriteUInt32 (buf, value, offset, littleEndian) {
+ if (value < 0) value = 0xffffffff + value + 1
+ for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {
+ buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff
+ }
+}
+
+Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
+ value = +value
+ offset = offset | 0
+ if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset + 3] = (value >>> 24)
+ this[offset + 2] = (value >>> 16)
+ this[offset + 1] = (value >>> 8)
+ this[offset] = (value & 0xff)
+ } else {
+ objectWriteUInt32(this, value, offset, true)
+ }
+ return offset + 4
+}
+
+Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
+ value = +value
+ offset = offset | 0
+ if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset] = (value >>> 24)
+ this[offset + 1] = (value >>> 16)
+ this[offset + 2] = (value >>> 8)
+ this[offset + 3] = (value & 0xff)
+ } else {
+ objectWriteUInt32(this, value, offset, false)
+ }
+ return offset + 4
+}
+
+Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
+ value = +value
+ offset = offset | 0
+ if (!noAssert) {
+ var limit = Math.pow(2, 8 * byteLength - 1)
+
+ checkInt(this, value, offset, byteLength, limit - 1, -limit)
+ }
+
+ var i = 0
+ var mul = 1
+ var sub = 0
+ this[offset] = value & 0xFF
+ while (++i < byteLength && (mul *= 0x100)) {
+ if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {
+ sub = 1
+ }
+ this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
+ }
+
+ return offset + byteLength
+}
+
+Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
+ value = +value
+ offset = offset | 0
+ if (!noAssert) {
+ var limit = Math.pow(2, 8 * byteLength - 1)
+
+ checkInt(this, value, offset, byteLength, limit - 1, -limit)
+ }
+
+ var i = byteLength - 1
+ var mul = 1
+ var sub = 0
+ this[offset + i] = value & 0xFF
+ while (--i >= 0 && (mul *= 0x100)) {
+ if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {
+ sub = 1
+ }
+ this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
+ }
+
+ return offset + byteLength
+}
+
+Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
+ value = +value
+ offset = offset | 0
+ if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
+ if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
+ if (value < 0) value = 0xff + value + 1
+ this[offset] = (value & 0xff)
+ return offset + 1
+}
+
+Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
+ value = +value
+ offset = offset | 0
+ if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset] = (value & 0xff)
+ this[offset + 1] = (value >>> 8)
+ } else {
+ objectWriteUInt16(this, value, offset, true)
+ }
+ return offset + 2
+}
+
+Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
+ value = +value
+ offset = offset | 0
+ if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset] = (value >>> 8)
+ this[offset + 1] = (value & 0xff)
+ } else {
+ objectWriteUInt16(this, value, offset, false)
+ }
+ return offset + 2
+}
+
+Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
+ value = +value
+ offset = offset | 0
+ if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset] = (value & 0xff)
+ this[offset + 1] = (value >>> 8)
+ this[offset + 2] = (value >>> 16)
+ this[offset + 3] = (value >>> 24)
+ } else {
+ objectWriteUInt32(this, value, offset, true)
+ }
+ return offset + 4
+}
+
+Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
+ value = +value
+ offset = offset | 0
+ if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
+ if (value < 0) value = 0xffffffff + value + 1
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset] = (value >>> 24)
+ this[offset + 1] = (value >>> 16)
+ this[offset + 2] = (value >>> 8)
+ this[offset + 3] = (value & 0xff)
+ } else {
+ objectWriteUInt32(this, value, offset, false)
+ }
+ return offset + 4
+}
+
+function checkIEEE754 (buf, value, offset, ext, max, min) {
+ if (offset + ext > buf.length) throw new RangeError('Index out of range')
+ if (offset < 0) throw new RangeError('Index out of range')
+}
+
+function writeFloat (buf, value, offset, littleEndian, noAssert) {
+ if (!noAssert) {
+ checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
+ }
+ ieee754.write(buf, value, offset, littleEndian, 23, 4)
+ return offset + 4
+}
+
+Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
+ return writeFloat(this, value, offset, true, noAssert)
+}
+
+Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
+ return writeFloat(this, value, offset, false, noAssert)
+}
+
+function writeDouble (buf, value, offset, littleEndian, noAssert) {
+ if (!noAssert) {
+ checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
+ }
+ ieee754.write(buf, value, offset, littleEndian, 52, 8)
+ return offset + 8
+}
+
+Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
+ return writeDouble(this, value, offset, true, noAssert)
+}
+
+Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
+ return writeDouble(this, value, offset, false, noAssert)
+}
+
+// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
+Buffer.prototype.copy = function copy (target, targetStart, start, end) {
+ if (!start) start = 0
+ if (!end && end !== 0) end = this.length
+ if (targetStart >= target.length) targetStart = target.length
+ if (!targetStart) targetStart = 0
+ if (end > 0 && end < start) end = start
+
+ // Copy 0 bytes; we're done
+ if (end === start) return 0
+ if (target.length === 0 || this.length === 0) return 0
+
+ // Fatal error conditions
+ if (targetStart < 0) {
+ throw new RangeError('targetStart out of bounds')
+ }
+ if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')
+ if (end < 0) throw new RangeError('sourceEnd out of bounds')
+
+ // Are we oob?
+ if (end > this.length) end = this.length
+ if (target.length - targetStart < end - start) {
+ end = target.length - targetStart + start
+ }
+
+ var len = end - start
+ var i
+
+ if (this === target && start < targetStart && targetStart < end) {
+ // descending copy from end
+ for (i = len - 1; i >= 0; --i) {
+ target[i + targetStart] = this[i + start]
+ }
+ } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {
+ // ascending copy from start
+ for (i = 0; i < len; ++i) {
+ target[i + targetStart] = this[i + start]
+ }
+ } else {
+ Uint8Array.prototype.set.call(
+ target,
+ this.subarray(start, start + len),
+ targetStart
+ )
+ }
+
+ return len
+}
+
+// Usage:
+// buffer.fill(number[, offset[, end]])
+// buffer.fill(buffer[, offset[, end]])
+// buffer.fill(string[, offset[, end]][, encoding])
+Buffer.prototype.fill = function fill (val, start, end, encoding) {
+ // Handle string cases:
+ if (typeof val === 'string') {
+ if (typeof start === 'string') {
+ encoding = start
+ start = 0
+ end = this.length
+ } else if (typeof end === 'string') {
+ encoding = end
+ end = this.length
+ }
+ if (val.length === 1) {
+ var code = val.charCodeAt(0)
+ if (code < 256) {
+ val = code
+ }
+ }
+ if (encoding !== undefined && typeof encoding !== 'string') {
+ throw new TypeError('encoding must be a string')
+ }
+ if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {
+ throw new TypeError('Unknown encoding: ' + encoding)
+ }
+ } else if (typeof val === 'number') {
+ val = val & 255
+ }
+
+ // Invalid ranges are not set to a default, so can range check early.
+ if (start < 0 || this.length < start || this.length < end) {
+ throw new RangeError('Out of range index')
+ }
+
+ if (end <= start) {
+ return this
+ }
+
+ start = start >>> 0
+ end = end === undefined ? this.length : end >>> 0
+
+ if (!val) val = 0
+
+ var i
+ if (typeof val === 'number') {
+ for (i = start; i < end; ++i) {
+ this[i] = val
+ }
+ } else {
+ var bytes = Buffer.isBuffer(val)
+ ? val
+ : utf8ToBytes(new Buffer(val, encoding).toString())
+ var len = bytes.length
+ for (i = 0; i < end - start; ++i) {
+ this[i + start] = bytes[i % len]
+ }
+ }
+
+ return this
+}
+
+// HELPER FUNCTIONS
+// ================
+
+var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g
+
+function base64clean (str) {
+ // Node strips out invalid characters like \n and \t from the string, base64-js does not
+ str = stringtrim(str).replace(INVALID_BASE64_RE, '')
+ // Node converts strings with length < 2 to ''
+ if (str.length < 2) return ''
+ // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
+ while (str.length % 4 !== 0) {
+ str = str + '='
+ }
+ return str
+}
+
+function stringtrim (str) {
+ if (str.trim) return str.trim()
+ return str.replace(/^\s+|\s+$/g, '')
+}
+
+function toHex (n) {
+ if (n < 16) return '0' + n.toString(16)
+ return n.toString(16)
+}
+
+function utf8ToBytes (string, units) {
+ units = units || Infinity
+ var codePoint
+ var length = string.length
+ var leadSurrogate = null
+ var bytes = []
+
+ for (var i = 0; i < length; ++i) {
+ codePoint = string.charCodeAt(i)
+
+ // is surrogate component
+ if (codePoint > 0xD7FF && codePoint < 0xE000) {
+ // last char was a lead
+ if (!leadSurrogate) {
+ // no lead yet
+ if (codePoint > 0xDBFF) {
+ // unexpected trail
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
+ continue
+ } else if (i + 1 === length) {
+ // unpaired lead
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
+ continue
+ }
+
+ // valid lead
+ leadSurrogate = codePoint
+
+ continue
+ }
+
+ // 2 leads in a row
+ if (codePoint < 0xDC00) {
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
+ leadSurrogate = codePoint
+ continue
+ }
+
+ // valid surrogate pair
+ codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000
+ } else if (leadSurrogate) {
+ // valid bmp char, but last char was a lead
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
+ }
+
+ leadSurrogate = null
+
+ // encode utf8
+ if (codePoint < 0x80) {
+ if ((units -= 1) < 0) break
+ bytes.push(codePoint)
+ } else if (codePoint < 0x800) {
+ if ((units -= 2) < 0) break
+ bytes.push(
+ codePoint >> 0x6 | 0xC0,
+ codePoint & 0x3F | 0x80
+ )
+ } else if (codePoint < 0x10000) {
+ if ((units -= 3) < 0) break
+ bytes.push(
+ codePoint >> 0xC | 0xE0,
+ codePoint >> 0x6 & 0x3F | 0x80,
+ codePoint & 0x3F | 0x80
+ )
+ } else if (codePoint < 0x110000) {
+ if ((units -= 4) < 0) break
+ bytes.push(
+ codePoint >> 0x12 | 0xF0,
+ codePoint >> 0xC & 0x3F | 0x80,
+ codePoint >> 0x6 & 0x3F | 0x80,
+ codePoint & 0x3F | 0x80
+ )
+ } else {
+ throw new Error('Invalid code point')
+ }
+ }
+
+ return bytes
+}
+
+function asciiToBytes (str) {
+ var byteArray = []
+ for (var i = 0; i < str.length; ++i) {
+ // Node's code seems to be doing this and not & 0x7F..
+ byteArray.push(str.charCodeAt(i) & 0xFF)
+ }
+ return byteArray
+}
+
+function utf16leToBytes (str, units) {
+ var c, hi, lo
+ var byteArray = []
+ for (var i = 0; i < str.length; ++i) {
+ if ((units -= 2) < 0) break
+
+ c = str.charCodeAt(i)
+ hi = c >> 8
+ lo = c % 256
+ byteArray.push(lo)
+ byteArray.push(hi)
+ }
+
+ return byteArray
+}
+
+function base64ToBytes (str) {
+ return base64.toByteArray(base64clean(str))
+}
+
+function blitBuffer (src, dst, offset, length) {
+ for (var i = 0; i < length; ++i) {
+ if ((i + offset >= dst.length) || (i >= src.length)) break
+ dst[i + offset] = src[i]
+ }
+ return i
+}
+
+function isnan (val) {
+ return val !== val // eslint-disable-line no-self-compare
+}
+
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js")))
+
+/***/ }),
+
+/***/ "./node_modules/core-util-is/lib/util.js":
+/*!***********************************************!*\
+ !*** ./node_modules/core-util-is/lib/util.js ***!
+ \***********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(Buffer) {// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// NOTE: These type checking functions intentionally don't use `instanceof`
+// because it is fragile and can be easily faked with `Object.create()`.
+
+function isArray(arg) {
+ if (Array.isArray) {
+ return Array.isArray(arg);
+ }
+ return objectToString(arg) === '[object Array]';
+}
+exports.isArray = isArray;
+
+function isBoolean(arg) {
+ return typeof arg === 'boolean';
+}
+exports.isBoolean = isBoolean;
+
+function isNull(arg) {
+ return arg === null;
+}
+exports.isNull = isNull;
+
+function isNullOrUndefined(arg) {
+ return arg == null;
+}
+exports.isNullOrUndefined = isNullOrUndefined;
+
+function isNumber(arg) {
+ return typeof arg === 'number';
+}
+exports.isNumber = isNumber;
+
+function isString(arg) {
+ return typeof arg === 'string';
+}
+exports.isString = isString;
+
+function isSymbol(arg) {
+ return typeof arg === 'symbol';
+}
+exports.isSymbol = isSymbol;
+
+function isUndefined(arg) {
+ return arg === void 0;
+}
+exports.isUndefined = isUndefined;
+
+function isRegExp(re) {
+ return objectToString(re) === '[object RegExp]';
+}
+exports.isRegExp = isRegExp;
+
+function isObject(arg) {
+ return typeof arg === 'object' && arg !== null;
+}
+exports.isObject = isObject;
+
+function isDate(d) {
+ return objectToString(d) === '[object Date]';
+}
+exports.isDate = isDate;
+
+function isError(e) {
+ return (objectToString(e) === '[object Error]' || e instanceof Error);
+}
+exports.isError = isError;
+
+function isFunction(arg) {
+ return typeof arg === 'function';
+}
+exports.isFunction = isFunction;
+
+function isPrimitive(arg) {
+ return arg === null ||
+ typeof arg === 'boolean' ||
+ typeof arg === 'number' ||
+ typeof arg === 'string' ||
+ typeof arg === 'symbol' || // ES6 symbol
+ typeof arg === 'undefined';
+}
+exports.isPrimitive = isPrimitive;
+
+exports.isBuffer = Buffer.isBuffer;
+
+function objectToString(o) {
+ return Object.prototype.toString.call(o);
+}
+
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../buffer/index.js */ "./node_modules/buffer/index.js").Buffer))
+
+/***/ }),
+
+/***/ "./node_modules/events/events.js":
+/*!***************************************!*\
+ !*** ./node_modules/events/events.js ***!
+ \***************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+function EventEmitter() {
+ this._events = this._events || {};
+ this._maxListeners = this._maxListeners || undefined;
+}
+module.exports = EventEmitter;
+
+// Backwards-compat with node 0.10.x
+EventEmitter.EventEmitter = EventEmitter;
+
+EventEmitter.prototype._events = undefined;
+EventEmitter.prototype._maxListeners = undefined;
+
+// By default EventEmitters will print a warning if more than 10 listeners are
+// added to it. This is a useful default which helps finding memory leaks.
+EventEmitter.defaultMaxListeners = 10;
+
+// Obviously not all Emitters should be limited to 10. This function allows
+// that to be increased. Set to zero for unlimited.
+EventEmitter.prototype.setMaxListeners = function(n) {
+ if (!isNumber(n) || n < 0 || isNaN(n))
+ throw TypeError('n must be a positive number');
+ this._maxListeners = n;
+ return this;
+};
+
+EventEmitter.prototype.emit = function(type) {
+ var er, handler, len, args, i, listeners;
+
+ if (!this._events)
+ this._events = {};
+
+ // If there is no 'error' event listener then throw.
+ if (type === 'error') {
+ if (!this._events.error ||
+ (isObject(this._events.error) && !this._events.error.length)) {
+ er = arguments[1];
+ if (er instanceof Error) {
+ throw er; // Unhandled 'error' event
+ } else {
+ // At least give some kind of context to the user
+ var err = new Error('Uncaught, unspecified "error" event. (' + er + ')');
+ err.context = er;
+ throw err;
+ }
+ }
+ }
+
+ handler = this._events[type];
+
+ if (isUndefined(handler))
+ return false;
+
+ if (isFunction(handler)) {
+ switch (arguments.length) {
+ // fast cases
+ case 1:
+ handler.call(this);
+ break;
+ case 2:
+ handler.call(this, arguments[1]);
+ break;
+ case 3:
+ handler.call(this, arguments[1], arguments[2]);
+ break;
+ // slower
+ default:
+ args = Array.prototype.slice.call(arguments, 1);
+ handler.apply(this, args);
+ }
+ } else if (isObject(handler)) {
+ args = Array.prototype.slice.call(arguments, 1);
+ listeners = handler.slice();
+ len = listeners.length;
+ for (i = 0; i < len; i++)
+ listeners[i].apply(this, args);
+ }
+
+ return true;
+};
+
+EventEmitter.prototype.addListener = function(type, listener) {
+ var m;
+
+ if (!isFunction(listener))
+ throw TypeError('listener must be a function');
+
+ if (!this._events)
+ this._events = {};
+
+ // To avoid recursion in the case that type === "newListener"! Before
+ // adding it to the listeners, first emit "newListener".
+ if (this._events.newListener)
+ this.emit('newListener', type,
+ isFunction(listener.listener) ?
+ listener.listener : listener);
+
+ if (!this._events[type])
+ // Optimize the case of one listener. Don't need the extra array object.
+ this._events[type] = listener;
+ else if (isObject(this._events[type]))
+ // If we've already got an array, just append.
+ this._events[type].push(listener);
+ else
+ // Adding the second element, need to change to array.
+ this._events[type] = [this._events[type], listener];
+
+ // Check for listener leak
+ if (isObject(this._events[type]) && !this._events[type].warned) {
+ if (!isUndefined(this._maxListeners)) {
+ m = this._maxListeners;
+ } else {
+ m = EventEmitter.defaultMaxListeners;
+ }
+
+ if (m && m > 0 && this._events[type].length > m) {
+ this._events[type].warned = true;
+ console.error('(node) warning: possible EventEmitter memory ' +
+ 'leak detected. %d listeners added. ' +
+ 'Use emitter.setMaxListeners() to increase limit.',
+ this._events[type].length);
+ if (typeof console.trace === 'function') {
+ // not supported in IE 10
+ console.trace();
+ }
+ }
+ }
+
+ return this;
+};
+
+EventEmitter.prototype.on = EventEmitter.prototype.addListener;
+
+EventEmitter.prototype.once = function(type, listener) {
+ if (!isFunction(listener))
+ throw TypeError('listener must be a function');
+
+ var fired = false;
+
+ function g() {
+ this.removeListener(type, g);
+
+ if (!fired) {
+ fired = true;
+ listener.apply(this, arguments);
+ }
+ }
+
+ g.listener = listener;
+ this.on(type, g);
+
+ return this;
+};
+
+// emits a 'removeListener' event iff the listener was removed
+EventEmitter.prototype.removeListener = function(type, listener) {
+ var list, position, length, i;
+
+ if (!isFunction(listener))
+ throw TypeError('listener must be a function');
+
+ if (!this._events || !this._events[type])
+ return this;
+
+ list = this._events[type];
+ length = list.length;
+ position = -1;
+
+ if (list === listener ||
+ (isFunction(list.listener) && list.listener === listener)) {
+ delete this._events[type];
+ if (this._events.removeListener)
+ this.emit('removeListener', type, listener);
+
+ } else if (isObject(list)) {
+ for (i = length; i-- > 0;) {
+ if (list[i] === listener ||
+ (list[i].listener && list[i].listener === listener)) {
+ position = i;
+ break;
+ }
+ }
+
+ if (position < 0)
+ return this;
+
+ if (list.length === 1) {
+ list.length = 0;
+ delete this._events[type];
+ } else {
+ list.splice(position, 1);
+ }
+
+ if (this._events.removeListener)
+ this.emit('removeListener', type, listener);
+ }
+
+ return this;
+};
+
+EventEmitter.prototype.removeAllListeners = function(type) {
+ var key, listeners;
+
+ if (!this._events)
+ return this;
+
+ // not listening for removeListener, no need to emit
+ if (!this._events.removeListener) {
+ if (arguments.length === 0)
+ this._events = {};
+ else if (this._events[type])
+ delete this._events[type];
+ return this;
+ }
+
+ // emit removeListener for all listeners on all events
+ if (arguments.length === 0) {
+ for (key in this._events) {
+ if (key === 'removeListener') continue;
+ this.removeAllListeners(key);
+ }
+ this.removeAllListeners('removeListener');
+ this._events = {};
+ return this;
+ }
+
+ listeners = this._events[type];
+
+ if (isFunction(listeners)) {
+ this.removeListener(type, listeners);
+ } else if (listeners) {
+ // LIFO order
+ while (listeners.length)
+ this.removeListener(type, listeners[listeners.length - 1]);
+ }
+ delete this._events[type];
+
+ return this;
+};
+
+EventEmitter.prototype.listeners = function(type) {
+ var ret;
+ if (!this._events || !this._events[type])
+ ret = [];
+ else if (isFunction(this._events[type]))
+ ret = [this._events[type]];
+ else
+ ret = this._events[type].slice();
+ return ret;
+};
+
+EventEmitter.prototype.listenerCount = function(type) {
+ if (this._events) {
+ var evlistener = this._events[type];
+
+ if (isFunction(evlistener))
+ return 1;
+ else if (evlistener)
+ return evlistener.length;
+ }
+ return 0;
+};
+
+EventEmitter.listenerCount = function(emitter, type) {
+ return emitter.listenerCount(type);
+};
+
+function isFunction(arg) {
+ return typeof arg === 'function';
+}
+
+function isNumber(arg) {
+ return typeof arg === 'number';
+}
+
+function isObject(arg) {
+ return typeof arg === 'object' && arg !== null;
+}
+
+function isUndefined(arg) {
+ return arg === void 0;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/ieee754/index.js":
+/*!***************************************!*\
+ !*** ./node_modules/ieee754/index.js ***!
+ \***************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+exports.read = function (buffer, offset, isLE, mLen, nBytes) {
+ var e, m
+ var eLen = (nBytes * 8) - mLen - 1
+ var eMax = (1 << eLen) - 1
+ var eBias = eMax >> 1
+ var nBits = -7
+ var i = isLE ? (nBytes - 1) : 0
+ var d = isLE ? -1 : 1
+ var s = buffer[offset + i]
+
+ i += d
+
+ e = s & ((1 << (-nBits)) - 1)
+ s >>= (-nBits)
+ nBits += eLen
+ for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}
+
+ m = e & ((1 << (-nBits)) - 1)
+ e >>= (-nBits)
+ nBits += mLen
+ for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}
+
+ if (e === 0) {
+ e = 1 - eBias
+ } else if (e === eMax) {
+ return m ? NaN : ((s ? -1 : 1) * Infinity)
+ } else {
+ m = m + Math.pow(2, mLen)
+ e = e - eBias
+ }
+ return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
+}
+
+exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
+ var e, m, c
+ var eLen = (nBytes * 8) - mLen - 1
+ var eMax = (1 << eLen) - 1
+ var eBias = eMax >> 1
+ var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
+ var i = isLE ? 0 : (nBytes - 1)
+ var d = isLE ? 1 : -1
+ var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0
+
+ value = Math.abs(value)
+
+ if (isNaN(value) || value === Infinity) {
+ m = isNaN(value) ? 1 : 0
+ e = eMax
+ } else {
+ e = Math.floor(Math.log(value) / Math.LN2)
+ if (value * (c = Math.pow(2, -e)) < 1) {
+ e--
+ c *= 2
+ }
+ if (e + eBias >= 1) {
+ value += rt / c
+ } else {
+ value += rt * Math.pow(2, 1 - eBias)
+ }
+ if (value * c >= 2) {
+ e++
+ c /= 2
+ }
+
+ if (e + eBias >= eMax) {
+ m = 0
+ e = eMax
+ } else if (e + eBias >= 1) {
+ m = ((value * c) - 1) * Math.pow(2, mLen)
+ e = e + eBias
+ } else {
+ m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
+ e = 0
+ }
+ }
+
+ for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
+
+ e = (e << mLen) | m
+ eLen += mLen
+ for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
+
+ buffer[offset + i - d] |= s * 128
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/inherits/inherits_browser.js":
+/*!***************************************************!*\
+ !*** ./node_modules/inherits/inherits_browser.js ***!
+ \***************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+if (typeof Object.create === 'function') {
+ // implementation from standard node.js 'util' module
+ module.exports = function inherits(ctor, superCtor) {
+ ctor.super_ = superCtor
+ ctor.prototype = Object.create(superCtor.prototype, {
+ constructor: {
+ value: ctor,
+ enumerable: false,
+ writable: true,
+ configurable: true
+ }
+ });
+ };
+} else {
+ // old school shim for old browsers
+ module.exports = function inherits(ctor, superCtor) {
+ ctor.super_ = superCtor
+ var TempCtor = function () {}
+ TempCtor.prototype = superCtor.prototype
+ ctor.prototype = new TempCtor()
+ ctor.prototype.constructor = ctor
+ }
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/isarray/index.js":
+/*!***************************************!*\
+ !*** ./node_modules/isarray/index.js ***!
+ \***************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+var toString = {}.toString;
+
+module.exports = Array.isArray || function (arr) {
+ return toString.call(arr) == '[object Array]';
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/msgpack5/index.js":
+/*!****************************************!*\
+ !*** ./node_modules/msgpack5/index.js ***!
+ \****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var Buffer = __webpack_require__(/*! safe-buffer */ "./node_modules/safe-buffer/index.js").Buffer
+var assert = __webpack_require__(/*! assert */ "./node_modules/assert/assert.js")
+var bl = __webpack_require__(/*! bl */ "./node_modules/bl/bl.js")
+var streams = __webpack_require__(/*! ./lib/streams */ "./node_modules/msgpack5/lib/streams.js")
+var buildDecode = __webpack_require__(/*! ./lib/decoder */ "./node_modules/msgpack5/lib/decoder.js")
+var buildEncode = __webpack_require__(/*! ./lib/encoder */ "./node_modules/msgpack5/lib/encoder.js")
+
+function msgpack (options) {
+ var encodingTypes = []
+ var decodingTypes = []
+
+ options = options || {
+ forceFloat64: false,
+ compatibilityMode: false,
+ disableTimestampEncoding: false // if true, skips encoding Dates using the msgpack timestamp ext format (-1)
+ }
+
+ function registerEncoder (check, encode) {
+ assert(check, 'must have an encode function')
+ assert(encode, 'must have an encode function')
+
+ encodingTypes.push({
+ check: check, encode: encode
+ })
+
+ return this
+ }
+
+ function registerDecoder (type, decode) {
+ assert(type >= 0, 'must have a non-negative type')
+ assert(decode, 'must have a decode function')
+
+ decodingTypes.push({
+ type: type, decode: decode
+ })
+
+ return this
+ }
+
+ function register (type, constructor, encode, decode) {
+ assert(constructor, 'must have a constructor')
+ assert(encode, 'must have an encode function')
+ assert(type >= 0, 'must have a non-negative type')
+ assert(decode, 'must have a decode function')
+
+ function check (obj) {
+ return (obj instanceof constructor)
+ }
+
+ function reEncode (obj) {
+ var buf = bl()
+ var header = Buffer.allocUnsafe(1)
+
+ header.writeInt8(type, 0)
+
+ buf.append(header)
+ buf.append(encode(obj))
+
+ return buf
+ }
+
+ this.registerEncoder(check, reEncode)
+ this.registerDecoder(type, decode)
+
+ return this
+ }
+
+ return {
+ encode: buildEncode(encodingTypes, options.forceFloat64, options.compatibilityMode, options.disableTimestampEncoding),
+ decode: buildDecode(decodingTypes),
+ register: register,
+ registerEncoder: registerEncoder,
+ registerDecoder: registerDecoder,
+ encoder: streams.encoder,
+ decoder: streams.decoder,
+ // needed for levelup support
+ buffer: true,
+ type: 'msgpack5',
+ IncompleteBufferError: buildDecode.IncompleteBufferError
+ }
+}
+
+module.exports = msgpack
+
+
+/***/ }),
+
+/***/ "./node_modules/msgpack5/lib/decoder.js":
+/*!**********************************************!*\
+ !*** ./node_modules/msgpack5/lib/decoder.js ***!
+ \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var bl = __webpack_require__(/*! bl */ "./node_modules/bl/bl.js")
+var util = __webpack_require__(/*! util */ "./node_modules/util/util.js")
+
+function IncompleteBufferError (message) {
+ Error.call(this) // super constructor
+ if (Error.captureStackTrace) {
+ Error.captureStackTrace(this, this.constructor) // super helper method to include stack trace in error object
+ }
+ this.name = this.constructor.name
+ this.message = message || 'unable to decode'
+}
+
+util.inherits(IncompleteBufferError, Error)
+
+module.exports = function buildDecode (decodingTypes) {
+ return decode
+
+ function getSize (first) {
+ switch (first) {
+ case 0xc4:
+ return 2
+ case 0xc5:
+ return 3
+ case 0xc6:
+ return 5
+ case 0xc7:
+ return 3
+ case 0xc8:
+ return 4
+ case 0xc9:
+ return 6
+ case 0xca:
+ return 5
+ case 0xcb:
+ return 9
+ case 0xcc:
+ return 2
+ case 0xcd:
+ return 3
+ case 0xce:
+ return 5
+ case 0xcf:
+ return 9
+ case 0xd0:
+ return 2
+ case 0xd1:
+ return 3
+ case 0xd2:
+ return 5
+ case 0xd3:
+ return 9
+ case 0xd4:
+ return 3
+ case 0xd5:
+ return 4
+ case 0xd6:
+ return 6
+ case 0xd7:
+ return 10
+ case 0xd8:
+ return 18
+ case 0xd9:
+ return 2
+ case 0xda:
+ return 3
+ case 0xdb:
+ return 5
+ case 0xde:
+ return 3
+ default:
+ return -1
+ }
+ }
+
+ function hasMinBufferSize (first, length) {
+ var size = getSize(first)
+
+ if (size !== -1 && length < size) {
+ return false
+ } else {
+ return true
+ }
+ }
+
+ function isValidDataSize (dataLength, bufLength, headerLength) {
+ return bufLength >= headerLength + dataLength
+ }
+
+ function buildDecodeResult (value, bytesConsumed) {
+ return {
+ value: value,
+ bytesConsumed: bytesConsumed
+ }
+ }
+
+ function decode (buf) {
+ if (!(buf instanceof bl)) {
+ buf = bl().append(buf)
+ }
+
+ var result = tryDecode(buf)
+ if (result) {
+ buf.consume(result.bytesConsumed)
+ return result.value
+ } else {
+ throw new IncompleteBufferError()
+ }
+ }
+
+ function tryDecode (buf, offset) {
+ offset = offset === undefined ? 0 : offset
+ var bufLength = buf.length - offset
+ if (bufLength <= 0) {
+ return null
+ }
+
+ var first = buf.readUInt8(offset)
+ var length
+ var result = 0
+ var type
+ var bytePos
+
+ if (!hasMinBufferSize(first, bufLength)) {
+ return null
+ }
+
+ switch (first) {
+ case 0xc0:
+ return buildDecodeResult(null, 1)
+ case 0xc2:
+ return buildDecodeResult(false, 1)
+ case 0xc3:
+ return buildDecodeResult(true, 1)
+ case 0xcc:
+ // 1-byte unsigned int
+ result = buf.readUInt8(offset + 1)
+ return buildDecodeResult(result, 2)
+ case 0xcd:
+ // 2-bytes BE unsigned int
+ result = buf.readUInt16BE(offset + 1)
+ return buildDecodeResult(result, 3)
+ case 0xce:
+ // 4-bytes BE unsigned int
+ result = buf.readUInt32BE(offset + 1)
+ return buildDecodeResult(result, 5)
+ case 0xcf:
+ // 8-bytes BE unsigned int
+ // Read long byte by byte, big-endian
+ for (bytePos = 7; bytePos >= 0; bytePos--) {
+ result += (buf.readUInt8(offset + bytePos + 1) * Math.pow(2, (8 * (7 - bytePos))))
+ }
+ return buildDecodeResult(result, 9)
+ case 0xd0:
+ // 1-byte signed int
+ result = buf.readInt8(offset + 1)
+ return buildDecodeResult(result, 2)
+ case 0xd1:
+ // 2-bytes signed int
+ result = buf.readInt16BE(offset + 1)
+ return buildDecodeResult(result, 3)
+ case 0xd2:
+ // 4-bytes signed int
+ result = buf.readInt32BE(offset + 1)
+ return buildDecodeResult(result, 5)
+ case 0xd3:
+ result = readInt64BE(buf.slice(offset + 1, offset + 9), 0)
+ return buildDecodeResult(result, 9)
+ case 0xca:
+ // 4-bytes float
+ result = buf.readFloatBE(offset + 1)
+ return buildDecodeResult(result, 5)
+ case 0xcb:
+ // 8-bytes double
+ result = buf.readDoubleBE(offset + 1)
+ return buildDecodeResult(result, 9)
+ case 0xd9:
+ // strings up to 2^8 - 1 bytes
+ length = buf.readUInt8(offset + 1)
+ if (!isValidDataSize(length, bufLength, 2)) {
+ return null
+ }
+ result = buf.toString('utf8', offset + 2, offset + 2 + length)
+ return buildDecodeResult(result, 2 + length)
+ case 0xda:
+ // strings up to 2^16 - 2 bytes
+ length = buf.readUInt16BE(offset + 1)
+ if (!isValidDataSize(length, bufLength, 3)) {
+ return null
+ }
+ result = buf.toString('utf8', offset + 3, offset + 3 + length)
+ return buildDecodeResult(result, 3 + length)
+ case 0xdb:
+ // strings up to 2^32 - 4 bytes
+ length = buf.readUInt32BE(offset + 1)
+ if (!isValidDataSize(length, bufLength, 5)) {
+ return null
+ }
+ result = buf.toString('utf8', offset + 5, offset + 5 + length)
+ return buildDecodeResult(result, 5 + length)
+ case 0xc4:
+ // buffers up to 2^8 - 1 bytes
+ length = buf.readUInt8(offset + 1)
+ if (!isValidDataSize(length, bufLength, 2)) {
+ return null
+ }
+ result = buf.slice(offset + 2, offset + 2 + length)
+ return buildDecodeResult(result, 2 + length)
+ case 0xc5:
+ // buffers up to 2^16 - 1 bytes
+ length = buf.readUInt16BE(offset + 1)
+ if (!isValidDataSize(length, bufLength, 3)) {
+ return null
+ }
+ result = buf.slice(offset + 3, offset + 3 + length)
+ return buildDecodeResult(result, 3 + length)
+ case 0xc6:
+ // buffers up to 2^32 - 1 bytes
+ length = buf.readUInt32BE(offset + 1)
+ if (!isValidDataSize(length, bufLength, 5)) {
+ return null
+ }
+ result = buf.slice(offset + 5, offset + 5 + length)
+ return buildDecodeResult(result, 5 + length)
+ case 0xdc:
+ // array up to 2^16 elements - 2 bytes
+ if (bufLength < 3) {
+ return null
+ }
+
+ length = buf.readUInt16BE(offset + 1)
+ return decodeArray(buf, offset, length, 3)
+ case 0xdd:
+ // array up to 2^32 elements - 4 bytes
+ if (bufLength < 5) {
+ return null
+ }
+
+ length = buf.readUInt32BE(offset + 1)
+ return decodeArray(buf, offset, length, 5)
+ case 0xde:
+ // maps up to 2^16 elements - 2 bytes
+ length = buf.readUInt16BE(offset + 1)
+ return decodeMap(buf, offset, length, 3)
+ case 0xdf:
+ length = buf.readUInt32BE(offset + 1)
+ return decodeMap(buf, offset, length, 5)
+ case 0xd4:
+ return decodeFixExt(buf, offset, 1)
+ case 0xd5:
+ return decodeFixExt(buf, offset, 2)
+ case 0xd6:
+ return decodeFixExt(buf, offset, 4)
+ case 0xd7:
+ return decodeFixExt(buf, offset, 8)
+ case 0xd8:
+ return decodeFixExt(buf, offset, 16)
+ case 0xc7:
+ // ext up to 2^8 - 1 bytes
+ length = buf.readUInt8(offset + 1)
+ type = buf.readUInt8(offset + 2)
+ if (!isValidDataSize(length, bufLength, 3)) {
+ return null
+ }
+ return decodeExt(buf, offset, type, length, 3)
+ case 0xc8:
+ // ext up to 2^16 - 1 bytes
+ length = buf.readUInt16BE(offset + 1)
+ type = buf.readUInt8(offset + 3)
+ if (!isValidDataSize(length, bufLength, 4)) {
+ return null
+ }
+ return decodeExt(buf, offset, type, length, 4)
+ case 0xc9:
+ // ext up to 2^32 - 1 bytes
+ length = buf.readUInt32BE(offset + 1)
+ type = buf.readUInt8(offset + 5)
+ if (!isValidDataSize(length, bufLength, 6)) {
+ return null
+ }
+ return decodeExt(buf, offset, type, length, 6)
+ }
+
+ if ((first & 0xf0) === 0x90) {
+ // we have an array with less than 15 elements
+ length = first & 0x0f
+ return decodeArray(buf, offset, length, 1)
+ } else if ((first & 0xf0) === 0x80) {
+ // we have a map with less than 15 elements
+ length = first & 0x0f
+ return decodeMap(buf, offset, length, 1)
+ } else if ((first & 0xe0) === 0xa0) {
+ // fixstr up to 31 bytes
+ length = first & 0x1f
+ if (isValidDataSize(length, bufLength, 1)) {
+ result = buf.toString('utf8', offset + 1, offset + length + 1)
+ return buildDecodeResult(result, length + 1)
+ } else {
+ return null
+ }
+ } else if (first >= 0xe0) {
+ // 5 bits negative ints
+ result = first - 0x100
+ return buildDecodeResult(result, 1)
+ } else if (first < 0x80) {
+ // 7-bits positive ints
+ return buildDecodeResult(first, 1)
+ } else {
+ throw new Error('not implemented yet')
+ }
+ }
+
+ function readInt64BE (buf, offset) {
+ var negate = (buf[offset] & 0x80) == 0x80 // eslint-disable-line
+
+ if (negate) {
+ var carry = 1
+ for (var i = offset + 7; i >= offset; i--) {
+ var v = (buf[i] ^ 0xff) + carry
+ buf[i] = v & 0xff
+ carry = v >> 8
+ }
+ }
+
+ var hi = buf.readUInt32BE(offset + 0)
+ var lo = buf.readUInt32BE(offset + 4)
+ return (hi * 4294967296 + lo) * (negate ? -1 : +1)
+ }
+
+ function decodeArray (buf, offset, length, headerLength) {
+ var result = []
+ var i
+ var totalBytesConsumed = 0
+
+ offset += headerLength
+ for (i = 0; i < length; i++) {
+ var decodeResult = tryDecode(buf, offset)
+ if (decodeResult) {
+ result.push(decodeResult.value)
+ offset += decodeResult.bytesConsumed
+ totalBytesConsumed += decodeResult.bytesConsumed
+ } else {
+ return null
+ }
+ }
+ return buildDecodeResult(result, headerLength + totalBytesConsumed)
+ }
+
+ function decodeMap (buf, offset, length, headerLength) {
+ var result = {}
+ var key
+ var i
+ var totalBytesConsumed = 0
+
+ offset += headerLength
+ for (i = 0; i < length; i++) {
+ var keyResult = tryDecode(buf, offset)
+ if (keyResult) {
+ offset += keyResult.bytesConsumed
+ var valueResult = tryDecode(buf, offset)
+ if (valueResult) {
+ key = keyResult.value
+ result[key] = valueResult.value
+ offset += valueResult.bytesConsumed
+ totalBytesConsumed += (keyResult.bytesConsumed + valueResult.bytesConsumed)
+ } else {
+ return null
+ }
+ } else {
+ return null
+ }
+ }
+ return buildDecodeResult(result, headerLength + totalBytesConsumed)
+ }
+
+ function decodeFixExt (buf, offset, size) {
+ var type = buf.readInt8(offset + 1) // Signed
+ return decodeExt(buf, offset, type, size, 2)
+ }
+
+ function decodeTimestamp (buf, size, headerSize) {
+ var seconds
+ var nanoseconds = 0
+
+ switch (size) {
+ case 4:
+ // timestamp 32 stores the number of seconds that have elapsed since 1970-01-01 00:00:00 UTC in an 32-bit unsigned integer
+ seconds = buf.readUInt32BE(0)
+ break
+
+ case 8:
+ // Timestamp 64 stores the number of seconds and nanoseconds that have elapsed
+ // since 1970-01-01 00:00:00 UTC in 32-bit unsigned integers, split 30/34 bits
+ var upper = buf.readUInt32BE(0)
+ var lower = buf.readUInt32BE(4)
+ nanoseconds = upper / 4
+ seconds = ((upper & 0x03) * Math.pow(2, 32)) + lower // If we use bitwise operators, we get truncated to 32bits
+ break
+
+ case 12:
+ throw new Error('timestamp 96 is not yet implemented')
+ }
+
+ var millis = (seconds * 1000) + Math.round(nanoseconds / 1E6)
+ return buildDecodeResult(new Date(millis), size + headerSize)
+ }
+
+ function decodeExt (buf, offset, type, size, headerSize) {
+ var i,
+ toDecode
+
+ offset += headerSize
+
+ // Pre-defined
+ if (type < 0) { // Reserved for future extensions
+ switch (type) {
+ case -1: // Tiemstamp https://github.com/msgpack/msgpack/blob/master/spec.md#timestamp-extension-type
+ toDecode = buf.slice(offset, offset + size)
+ return decodeTimestamp(toDecode, size, headerSize)
+ }
+ }
+
+ for (i = 0; i < decodingTypes.length; i++) {
+ if (type === decodingTypes[i].type) {
+ toDecode = buf.slice(offset, offset + size)
+ var value = decodingTypes[i].decode(toDecode)
+ return buildDecodeResult(value, headerSize + size)
+ }
+ }
+
+ throw new Error('unable to find ext type ' + type)
+ }
+}
+
+module.exports.IncompleteBufferError = IncompleteBufferError
+
+
+/***/ }),
+
+/***/ "./node_modules/msgpack5/lib/encoder.js":
+/*!**********************************************!*\
+ !*** ./node_modules/msgpack5/lib/encoder.js ***!
+ \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var Buffer = __webpack_require__(/*! safe-buffer */ "./node_modules/safe-buffer/index.js").Buffer
+var bl = __webpack_require__(/*! bl */ "./node_modules/bl/bl.js")
+
+module.exports = function buildEncode (encodingTypes, forceFloat64, compatibilityMode, disableTimestampEncoding) {
+ function encode (obj, avoidSlice) {
+ var buf
+ var len
+
+ if (obj === undefined) {
+ throw new Error('undefined is not encodable in msgpack!')
+ } else if (obj === null) {
+ buf = Buffer.allocUnsafe(1)
+ buf[0] = 0xc0
+ } else if (obj === true) {
+ buf = Buffer.allocUnsafe(1)
+ buf[0] = 0xc3
+ } else if (obj === false) {
+ buf = Buffer.allocUnsafe(1)
+ buf[0] = 0xc2
+ } else if (typeof obj === 'string') {
+ len = Buffer.byteLength(obj)
+ if (len < 32) {
+ buf = Buffer.allocUnsafe(1 + len)
+ buf[0] = 0xa0 | len
+ if (len > 0) {
+ buf.write(obj, 1)
+ }
+ } else if (len <= 0xff && !compatibilityMode) {
+ // str8, but only when not in compatibility mode
+ buf = Buffer.allocUnsafe(2 + len)
+ buf[0] = 0xd9
+ buf[1] = len
+ buf.write(obj, 2)
+ } else if (len <= 0xffff) {
+ buf = Buffer.allocUnsafe(3 + len)
+ buf[0] = 0xda
+ buf.writeUInt16BE(len, 1)
+ buf.write(obj, 3)
+ } else {
+ buf = Buffer.allocUnsafe(5 + len)
+ buf[0] = 0xdb
+ buf.writeUInt32BE(len, 1)
+ buf.write(obj, 5)
+ }
+ } else if (obj && (obj.readUInt32LE || obj instanceof Uint8Array)) {
+ if (obj instanceof Uint8Array) {
+ obj = Buffer.from(obj)
+ }
+ // weird hack to support Buffer
+ // and Buffer-like objects
+ if (obj.length <= 0xff) {
+ buf = Buffer.allocUnsafe(2)
+ buf[0] = 0xc4
+ buf[1] = obj.length
+ } else if (obj.length <= 0xffff) {
+ buf = Buffer.allocUnsafe(3)
+ buf[0] = 0xc5
+ buf.writeUInt16BE(obj.length, 1)
+ } else {
+ buf = Buffer.allocUnsafe(5)
+ buf[0] = 0xc6
+ buf.writeUInt32BE(obj.length, 1)
+ }
+
+ buf = bl([buf, obj])
+ } else if (Array.isArray(obj)) {
+ if (obj.length < 16) {
+ buf = Buffer.allocUnsafe(1)
+ buf[0] = 0x90 | obj.length
+ } else if (obj.length < 65536) {
+ buf = Buffer.allocUnsafe(3)
+ buf[0] = 0xdc
+ buf.writeUInt16BE(obj.length, 1)
+ } else {
+ buf = Buffer.allocUnsafe(5)
+ buf[0] = 0xdd
+ buf.writeUInt32BE(obj.length, 1)
+ }
+
+ buf = obj.reduce(function (acc, obj) {
+ acc.append(encode(obj, true))
+ return acc
+ }, bl().append(buf))
+ } else if (!disableTimestampEncoding && typeof obj.getDate === 'function') {
+ return encodeDate(obj)
+ } else if (typeof obj === 'object') {
+ buf = encodeExt(obj) || encodeObject(obj)
+ } else if (typeof obj === 'number') {
+ if (isFloat(obj)) {
+ return encodeFloat(obj, forceFloat64)
+ } else if (obj >= 0) {
+ if (obj < 128) {
+ buf = Buffer.allocUnsafe(1)
+ buf[0] = obj
+ } else if (obj < 256) {
+ buf = Buffer.allocUnsafe(2)
+ buf[0] = 0xcc
+ buf[1] = obj
+ } else if (obj < 65536) {
+ buf = Buffer.allocUnsafe(3)
+ buf[0] = 0xcd
+ buf.writeUInt16BE(obj, 1)
+ } else if (obj <= 0xffffffff) {
+ buf = Buffer.allocUnsafe(5)
+ buf[0] = 0xce
+ buf.writeUInt32BE(obj, 1)
+ } else if (obj <= 9007199254740991) {
+ buf = Buffer.allocUnsafe(9)
+ buf[0] = 0xcf
+ write64BitUint(buf, obj)
+ } else {
+ return encodeFloat(obj, true)
+ }
+ } else {
+ if (obj >= -32) {
+ buf = Buffer.allocUnsafe(1)
+ buf[0] = 0x100 + obj
+ } else if (obj >= -128) {
+ buf = Buffer.allocUnsafe(2)
+ buf[0] = 0xd0
+ buf.writeInt8(obj, 1)
+ } else if (obj >= -32768) {
+ buf = Buffer.allocUnsafe(3)
+ buf[0] = 0xd1
+ buf.writeInt16BE(obj, 1)
+ } else if (obj > -214748365) {
+ buf = Buffer.allocUnsafe(5)
+ buf[0] = 0xd2
+ buf.writeInt32BE(obj, 1)
+ } else if (obj >= -9007199254740991) {
+ buf = Buffer.allocUnsafe(9)
+ buf[0] = 0xd3
+ write64BitInt(buf, 1, obj)
+ } else {
+ return encodeFloat(obj, true)
+ }
+ }
+ }
+
+ if (!buf) {
+ throw new Error('not implemented yet')
+ }
+
+ if (avoidSlice) {
+ return buf
+ } else {
+ return buf.slice()
+ }
+ }
+
+ function encodeDate (dt) {
+ var encoded
+ var millis = dt * 1
+ var seconds = Math.floor(millis / 1000)
+ var nanos = (millis - (seconds * 1000)) * 1E6
+
+ if (nanos || seconds > 0xFFFFFFFF) {
+ // Timestamp64
+ encoded = Buffer.allocUnsafe(10)
+ encoded[0] = 0xd7
+ encoded[1] = -1
+
+ var upperNanos = ((nanos * 4))
+ var upperSeconds = seconds / Math.pow(2, 32)
+ var upper = (upperNanos + upperSeconds) & 0xFFFFFFFF
+ var lower = seconds & 0xFFFFFFFF
+
+ encoded.writeInt32BE(upper, 2)
+ encoded.writeInt32BE(lower, 6)
+ } else {
+ // Timestamp32
+ encoded = Buffer.allocUnsafe(6)
+ encoded[0] = 0xd6
+ encoded[1] = -1
+ encoded.writeUInt32BE(Math.floor(millis / 1000), 2)
+ }
+ return bl().append(encoded)
+ }
+
+ function encodeExt (obj) {
+ var i
+ var encoded
+ var length = -1
+ var headers = []
+
+ for (i = 0; i < encodingTypes.length; i++) {
+ if (encodingTypes[i].check(obj)) {
+ encoded = encodingTypes[i].encode(obj)
+ break
+ }
+ }
+
+ if (!encoded) {
+ return null
+ }
+
+ // we subtract 1 because the length does not
+ // include the type
+ length = encoded.length - 1
+
+ if (length === 1) {
+ headers.push(0xd4)
+ } else if (length === 2) {
+ headers.push(0xd5)
+ } else if (length === 4) {
+ headers.push(0xd6)
+ } else if (length === 8) {
+ headers.push(0xd7)
+ } else if (length === 16) {
+ headers.push(0xd8)
+ } else if (length < 256) {
+ headers.push(0xc7)
+ headers.push(length)
+ } else if (length < 0x10000) {
+ headers.push(0xc8)
+ headers.push(length >> 8)
+ headers.push(length & 0x00ff)
+ } else {
+ headers.push(0xc9)
+ headers.push(length >> 24)
+ headers.push((length >> 16) & 0x000000ff)
+ headers.push((length >> 8) & 0x000000ff)
+ headers.push(length & 0x000000ff)
+ }
+
+ return bl().append(Buffer.from(headers)).append(encoded)
+ }
+
+ function encodeObject (obj) {
+ var acc = []
+ var length = 0
+ var key
+ var header
+
+ for (key in obj) {
+ if (obj.hasOwnProperty(key) &&
+ obj[key] !== undefined &&
+ typeof obj[key] !== 'function') {
+ ++length
+ acc.push(encode(key, true))
+ acc.push(encode(obj[key], true))
+ }
+ }
+
+ if (length < 16) {
+ header = Buffer.allocUnsafe(1)
+ header[0] = 0x80 | length
+ } else if (length < 0xFFFF) {
+ header = Buffer.allocUnsafe(3)
+ header[0] = 0xde
+ header.writeUInt16BE(length, 1)
+ } else {
+ header = Buffer.allocUnsafe(5)
+ header[0] = 0xdf
+ header.writeUInt32BE(length, 1)
+ }
+
+ acc.unshift(header)
+
+ var result = acc.reduce(function (list, buf) {
+ return list.append(buf)
+ }, bl())
+
+ return result
+ }
+
+ return encode
+}
+
+function write64BitUint (buf, obj) {
+ // Write long byte by byte, in big-endian order
+ for (var currByte = 7; currByte >= 0; currByte--) {
+ buf[currByte + 1] = (obj & 0xff)
+ obj = obj / 256
+ }
+}
+
+function write64BitInt (buf, offset, num) {
+ var negate = num < 0
+
+ if (negate) {
+ num = Math.abs(num)
+ }
+
+ var lo = num % 4294967296
+ var hi = num / 4294967296
+ buf.writeUInt32BE(Math.floor(hi), offset + 0)
+ buf.writeUInt32BE(lo, offset + 4)
+
+ if (negate) {
+ var carry = 1
+ for (var i = offset + 7; i >= offset; i--) {
+ var v = (buf[i] ^ 0xff) + carry
+ buf[i] = v & 0xff
+ carry = v >> 8
+ }
+ }
+}
+
+function isFloat (n) {
+ return n % 1 !== 0
+}
+
+function encodeFloat (obj, forceFloat64) {
+ var useDoublePrecision = true
+
+ // If `fround` is supported, we can check if a float
+ // is double or single precision by rounding the object
+ // to single precision and comparing the difference.
+ // If it's not supported, it's safer to use a 64 bit
+ // float so we don't lose precision without meaning to.
+ if (Math.fround) {
+ useDoublePrecision = Math.fround(obj) !== obj
+ }
+
+ if (forceFloat64) {
+ useDoublePrecision = true
+ }
+
+ var buf
+
+ if (useDoublePrecision) {
+ buf = Buffer.allocUnsafe(9)
+ buf[0] = 0xcb
+ buf.writeDoubleBE(obj, 1)
+ } else {
+ buf = Buffer.allocUnsafe(5)
+ buf[0] = 0xca
+ buf.writeFloatBE(obj, 1)
+ }
+
+ return buf
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/msgpack5/lib/streams.js":
+/*!**********************************************!*\
+ !*** ./node_modules/msgpack5/lib/streams.js ***!
+ \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var Transform = __webpack_require__(/*! readable-stream */ "./node_modules/readable-stream/readable-browser.js").Transform
+var inherits = __webpack_require__(/*! inherits */ "./node_modules/inherits/inherits_browser.js")
+var bl = __webpack_require__(/*! bl */ "./node_modules/bl/bl.js")
+
+function Base (opts) {
+ opts = opts || {}
+
+ opts.objectMode = true
+ opts.highWaterMark = 16
+
+ Transform.call(this, opts)
+
+ this._msgpack = opts.msgpack
+}
+
+inherits(Base, Transform)
+
+function Encoder (opts) {
+ if (!(this instanceof Encoder)) {
+ opts = opts || {}
+ opts.msgpack = this
+ return new Encoder(opts)
+ }
+
+ Base.call(this, opts)
+ this._wrap = ('wrap' in opts) && opts.wrap
+}
+
+inherits(Encoder, Base)
+
+Encoder.prototype._transform = function (obj, enc, done) {
+ var buf = null
+
+ try {
+ buf = this._msgpack.encode(this._wrap ? obj.value : obj).slice(0)
+ } catch (err) {
+ this.emit('error', err)
+ return done()
+ }
+
+ this.push(buf)
+ done()
+}
+
+function Decoder (opts) {
+ if (!(this instanceof Decoder)) {
+ opts = opts || {}
+ opts.msgpack = this
+ return new Decoder(opts)
+ }
+
+ Base.call(this, opts)
+
+ this._chunks = bl()
+ this._wrap = ('wrap' in opts) && opts.wrap
+}
+
+inherits(Decoder, Base)
+
+Decoder.prototype._transform = function (buf, enc, done) {
+ if (buf) {
+ this._chunks.append(buf)
+ }
+
+ try {
+ var result = this._msgpack.decode(this._chunks)
+ if (this._wrap) {
+ result = {value: result}
+ }
+ this.push(result)
+ } catch (err) {
+ if (err instanceof this._msgpack.IncompleteBufferError) {
+ done()
+ } else {
+ this.emit('error', err)
+ }
+ return
+ }
+
+ if (this._chunks.length > 0) {
+ this._transform(null, enc, done)
+ } else {
+ done()
+ }
+}
+
+module.exports.decoder = Decoder
+module.exports.encoder = Encoder
+
+
+/***/ }),
+
+/***/ "./node_modules/process-nextick-args/index.js":
+/*!****************************************************!*\
+ !*** ./node_modules/process-nextick-args/index.js ***!
+ \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+/* WEBPACK VAR INJECTION */(function(process) {
+
+if (!process.version ||
+ process.version.indexOf('v0.') === 0 ||
+ process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) {
+ module.exports = { nextTick: nextTick };
+} else {
+ module.exports = process
+}
+
+function nextTick(fn, arg1, arg2, arg3) {
+ if (typeof fn !== 'function') {
+ throw new TypeError('"callback" argument must be a function');
+ }
+ var len = arguments.length;
+ var args, i;
+ switch (len) {
+ case 0:
+ case 1:
+ return process.nextTick(fn);
+ case 2:
+ return process.nextTick(function afterTickOne() {
+ fn.call(null, arg1);
+ });
+ case 3:
+ return process.nextTick(function afterTickTwo() {
+ fn.call(null, arg1, arg2);
+ });
+ case 4:
+ return process.nextTick(function afterTickThree() {
+ fn.call(null, arg1, arg2, arg3);
+ });
+ default:
+ args = new Array(len - 1);
+ i = 0;
+ while (i < args.length) {
+ args[i++] = arguments[i];
+ }
+ return process.nextTick(function afterTick() {
+ fn.apply(null, args);
+ });
+ }
+}
+
+
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../process/browser.js */ "./node_modules/process/browser.js")))
+
+/***/ }),
+
+/***/ "./node_modules/process/browser.js":
+/*!*****************************************!*\
+ !*** ./node_modules/process/browser.js ***!
+ \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+// shim for using process in browser
+var process = module.exports = {};
+
+// cached from whatever global is present so that test runners that stub it
+// don't break things. But we need to wrap it in a try catch in case it is
+// wrapped in strict mode code which doesn't define any globals. It's inside a
+// function because try/catches deoptimize in certain engines.
+
+var cachedSetTimeout;
+var cachedClearTimeout;
+
+function defaultSetTimout() {
+ throw new Error('setTimeout has not been defined');
+}
+function defaultClearTimeout () {
+ throw new Error('clearTimeout has not been defined');
+}
+(function () {
+ try {
+ if (typeof setTimeout === 'function') {
+ cachedSetTimeout = setTimeout;
+ } else {
+ cachedSetTimeout = defaultSetTimout;
+ }
+ } catch (e) {
+ cachedSetTimeout = defaultSetTimout;
+ }
+ try {
+ if (typeof clearTimeout === 'function') {
+ cachedClearTimeout = clearTimeout;
+ } else {
+ cachedClearTimeout = defaultClearTimeout;
+ }
+ } catch (e) {
+ cachedClearTimeout = defaultClearTimeout;
+ }
+} ())
+function runTimeout(fun) {
+ if (cachedSetTimeout === setTimeout) {
+ //normal enviroments in sane situations
+ return setTimeout(fun, 0);
+ }
+ // if setTimeout wasn't available but was latter defined
+ if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
+ cachedSetTimeout = setTimeout;
+ return setTimeout(fun, 0);
+ }
+ try {
+ // when when somebody has screwed with setTimeout but no I.E. maddness
+ return cachedSetTimeout(fun, 0);
+ } catch(e){
+ try {
+ // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+ return cachedSetTimeout.call(null, fun, 0);
+ } catch(e){
+ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
+ return cachedSetTimeout.call(this, fun, 0);
+ }
+ }
+
+
+}
+function runClearTimeout(marker) {
+ if (cachedClearTimeout === clearTimeout) {
+ //normal enviroments in sane situations
+ return clearTimeout(marker);
+ }
+ // if clearTimeout wasn't available but was latter defined
+ if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
+ cachedClearTimeout = clearTimeout;
+ return clearTimeout(marker);
+ }
+ try {
+ // when when somebody has screwed with setTimeout but no I.E. maddness
+ return cachedClearTimeout(marker);
+ } catch (e){
+ try {
+ // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+ return cachedClearTimeout.call(null, marker);
+ } catch (e){
+ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
+ // Some versions of I.E. have different rules for clearTimeout vs setTimeout
+ return cachedClearTimeout.call(this, marker);
+ }
+ }
+
+
+
+}
+var queue = [];
+var draining = false;
+var currentQueue;
+var queueIndex = -1;
+
+function cleanUpNextTick() {
+ if (!draining || !currentQueue) {
+ return;
+ }
+ draining = false;
+ if (currentQueue.length) {
+ queue = currentQueue.concat(queue);
+ } else {
+ queueIndex = -1;
+ }
+ if (queue.length) {
+ drainQueue();
+ }
+}
+
+function drainQueue() {
+ if (draining) {
+ return;
+ }
+ var timeout = runTimeout(cleanUpNextTick);
+ draining = true;
+
+ var len = queue.length;
+ while(len) {
+ currentQueue = queue;
+ queue = [];
+ while (++queueIndex < len) {
+ if (currentQueue) {
+ currentQueue[queueIndex].run();
+ }
+ }
+ queueIndex = -1;
+ len = queue.length;
+ }
+ currentQueue = null;
+ draining = false;
+ runClearTimeout(timeout);
+}
+
+process.nextTick = function (fun) {
+ var args = new Array(arguments.length - 1);
+ if (arguments.length > 1) {
+ for (var i = 1; i < arguments.length; i++) {
+ args[i - 1] = arguments[i];
+ }
+ }
+ queue.push(new Item(fun, args));
+ if (queue.length === 1 && !draining) {
+ runTimeout(drainQueue);
+ }
+};
+
+// v8 likes predictible objects
+function Item(fun, array) {
+ this.fun = fun;
+ this.array = array;
+}
+Item.prototype.run = function () {
+ this.fun.apply(null, this.array);
+};
+process.title = 'browser';
+process.browser = true;
+process.env = {};
+process.argv = [];
+process.version = ''; // empty string to avoid regexp issues
+process.versions = {};
+
+function noop() {}
+
+process.on = noop;
+process.addListener = noop;
+process.once = noop;
+process.off = noop;
+process.removeListener = noop;
+process.removeAllListeners = noop;
+process.emit = noop;
+process.prependListener = noop;
+process.prependOnceListener = noop;
+
+process.listeners = function (name) { return [] }
+
+process.binding = function (name) {
+ throw new Error('process.binding is not supported');
+};
+
+process.cwd = function () { return '/' };
+process.chdir = function (dir) {
+ throw new Error('process.chdir is not supported');
+};
+process.umask = function() { return 0; };
+
+
+/***/ }),
+
+/***/ "./node_modules/readable-stream/lib/_stream_duplex.js":
+/*!************************************************************!*\
+ !*** ./node_modules/readable-stream/lib/_stream_duplex.js ***!
+ \************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// a duplex stream is just a stream that is both readable and writable.
+// Since JS doesn't have multiple prototypal inheritance, this class
+// prototypally inherits from Readable, and then parasitically from
+// Writable.
+
+
+
+/*<replacement>*/
+
+var pna = __webpack_require__(/*! process-nextick-args */ "./node_modules/process-nextick-args/index.js");
+/*</replacement>*/
+
+/*<replacement>*/
+var objectKeys = Object.keys || function (obj) {
+ var keys = [];
+ for (var key in obj) {
+ keys.push(key);
+ }return keys;
+};
+/*</replacement>*/
+
+module.exports = Duplex;
+
+/*<replacement>*/
+var util = __webpack_require__(/*! core-util-is */ "./node_modules/core-util-is/lib/util.js");
+util.inherits = __webpack_require__(/*! inherits */ "./node_modules/inherits/inherits_browser.js");
+/*</replacement>*/
+
+var Readable = __webpack_require__(/*! ./_stream_readable */ "./node_modules/readable-stream/lib/_stream_readable.js");
+var Writable = __webpack_require__(/*! ./_stream_writable */ "./node_modules/readable-stream/lib/_stream_writable.js");
+
+util.inherits(Duplex, Readable);
+
+{
+ // avoid scope creep, the keys array can then be collected
+ var keys = objectKeys(Writable.prototype);
+ for (var v = 0; v < keys.length; v++) {
+ var method = keys[v];
+ if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];
+ }
+}
+
+function Duplex(options) {
+ if (!(this instanceof Duplex)) return new Duplex(options);
+
+ Readable.call(this, options);
+ Writable.call(this, options);
+
+ if (options && options.readable === false) this.readable = false;
+
+ if (options && options.writable === false) this.writable = false;
+
+ this.allowHalfOpen = true;
+ if (options && options.allowHalfOpen === false) this.allowHalfOpen = false;
+
+ this.once('end', onend);
+}
+
+Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', {
+ // making it explicit this property is not enumerable
+ // because otherwise some prototype manipulation in
+ // userland will fail
+ enumerable: false,
+ get: function () {
+ return this._writableState.highWaterMark;
+ }
+});
+
+// the no-half-open enforcer
+function onend() {
+ // if we allow half-open state, or if the writable side ended,
+ // then we're ok.
+ if (this.allowHalfOpen || this._writableState.ended) return;
+
+ // no more data can be written.
+ // But allow more writes to happen in this tick.
+ pna.nextTick(onEndNT, this);
+}
+
+function onEndNT(self) {
+ self.end();
+}
+
+Object.defineProperty(Duplex.prototype, 'destroyed', {
+ get: function () {
+ if (this._readableState === undefined || this._writableState === undefined) {
+ return false;
+ }
+ return this._readableState.destroyed && this._writableState.destroyed;
+ },
+ set: function (value) {
+ // we ignore the value if the stream
+ // has not been initialized yet
+ if (this._readableState === undefined || this._writableState === undefined) {
+ return;
+ }
+
+ // backward compatibility, the user is explicitly
+ // managing destroyed
+ this._readableState.destroyed = value;
+ this._writableState.destroyed = value;
+ }
+});
+
+Duplex.prototype._destroy = function (err, cb) {
+ this.push(null);
+ this.end();
+
+ pna.nextTick(cb, err);
+};
+
+/***/ }),
+
+/***/ "./node_modules/readable-stream/lib/_stream_passthrough.js":
+/*!*****************************************************************!*\
+ !*** ./node_modules/readable-stream/lib/_stream_passthrough.js ***!
+ \*****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// a passthrough stream.
+// basically just the most minimal sort of Transform stream.
+// Every written chunk gets output as-is.
+
+
+
+module.exports = PassThrough;
+
+var Transform = __webpack_require__(/*! ./_stream_transform */ "./node_modules/readable-stream/lib/_stream_transform.js");
+
+/*<replacement>*/
+var util = __webpack_require__(/*! core-util-is */ "./node_modules/core-util-is/lib/util.js");
+util.inherits = __webpack_require__(/*! inherits */ "./node_modules/inherits/inherits_browser.js");
+/*</replacement>*/
+
+util.inherits(PassThrough, Transform);
+
+function PassThrough(options) {
+ if (!(this instanceof PassThrough)) return new PassThrough(options);
+
+ Transform.call(this, options);
+}
+
+PassThrough.prototype._transform = function (chunk, encoding, cb) {
+ cb(null, chunk);
+};
+
+/***/ }),
+
+/***/ "./node_modules/readable-stream/lib/_stream_readable.js":
+/*!**************************************************************!*\
+ !*** ./node_modules/readable-stream/lib/_stream_readable.js ***!
+ \**************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+/* WEBPACK VAR INJECTION */(function(global, process) {// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+
+/*<replacement>*/
+
+var pna = __webpack_require__(/*! process-nextick-args */ "./node_modules/process-nextick-args/index.js");
+/*</replacement>*/
+
+module.exports = Readable;
+
+/*<replacement>*/
+var isArray = __webpack_require__(/*! isarray */ "./node_modules/isarray/index.js");
+/*</replacement>*/
+
+/*<replacement>*/
+var Duplex;
+/*</replacement>*/
+
+Readable.ReadableState = ReadableState;
+
+/*<replacement>*/
+var EE = __webpack_require__(/*! events */ "./node_modules/events/events.js").EventEmitter;
+
+var EElistenerCount = function (emitter, type) {
+ return emitter.listeners(type).length;
+};
+/*</replacement>*/
+
+/*<replacement>*/
+var Stream = __webpack_require__(/*! ./internal/streams/stream */ "./node_modules/readable-stream/lib/internal/streams/stream-browser.js");
+/*</replacement>*/
+
+/*<replacement>*/
+
+var Buffer = __webpack_require__(/*! safe-buffer */ "./node_modules/safe-buffer/index.js").Buffer;
+var OurUint8Array = global.Uint8Array || function () {};
+function _uint8ArrayToBuffer(chunk) {
+ return Buffer.from(chunk);
+}
+function _isUint8Array(obj) {
+ return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
+}
+
+/*</replacement>*/
+
+/*<replacement>*/
+var util = __webpack_require__(/*! core-util-is */ "./node_modules/core-util-is/lib/util.js");
+util.inherits = __webpack_require__(/*! inherits */ "./node_modules/inherits/inherits_browser.js");
+/*</replacement>*/
+
+/*<replacement>*/
+var debugUtil = __webpack_require__(/*! util */ 0);
+var debug = void 0;
+if (debugUtil && debugUtil.debuglog) {
+ debug = debugUtil.debuglog('stream');
+} else {
+ debug = function () {};
+}
+/*</replacement>*/
+
+var BufferList = __webpack_require__(/*! ./internal/streams/BufferList */ "./node_modules/readable-stream/lib/internal/streams/BufferList.js");
+var destroyImpl = __webpack_require__(/*! ./internal/streams/destroy */ "./node_modules/readable-stream/lib/internal/streams/destroy.js");
+var StringDecoder;
+
+util.inherits(Readable, Stream);
+
+var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume'];
+
+function prependListener(emitter, event, fn) {
+ // Sadly this is not cacheable as some libraries bundle their own
+ // event emitter implementation with them.
+ if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn);
+
+ // This is a hack to make sure that our error handler is attached before any
+ // userland ones. NEVER DO THIS. This is here only because this code needs
+ // to continue to work with older versions of Node.js that do not include
+ // the prependListener() method. The goal is to eventually remove this hack.
+ if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];
+}
+
+function ReadableState(options, stream) {
+ Duplex = Duplex || __webpack_require__(/*! ./_stream_duplex */ "./node_modules/readable-stream/lib/_stream_duplex.js");
+
+ options = options || {};
+
+ // Duplex streams are both readable and writable, but share
+ // the same options object.
+ // However, some cases require setting options to different
+ // values for the readable and the writable sides of the duplex stream.
+ // These options can be provided separately as readableXXX and writableXXX.
+ var isDuplex = stream instanceof Duplex;
+
+ // object stream flag. Used to make read(n) ignore n and to
+ // make all the buffer merging and length checks go away
+ this.objectMode = !!options.objectMode;
+
+ if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode;
+
+ // the point at which it stops calling _read() to fill the buffer
+ // Note: 0 is a valid value, means "don't call _read preemptively ever"
+ var hwm = options.highWaterMark;
+ var readableHwm = options.readableHighWaterMark;
+ var defaultHwm = this.objectMode ? 16 : 16 * 1024;
+
+ if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm;
+
+ // cast to ints.
+ this.highWaterMark = Math.floor(this.highWaterMark);
+
+ // A linked list is used to store data chunks instead of an array because the
+ // linked list can remove elements from the beginning faster than
+ // array.shift()
+ this.buffer = new BufferList();
+ this.length = 0;
+ this.pipes = null;
+ this.pipesCount = 0;
+ this.flowing = null;
+ this.ended = false;
+ this.endEmitted = false;
+ this.reading = false;
+
+ // a flag to be able to tell if the event 'readable'/'data' is emitted
+ // immediately, or on a later tick. We set this to true at first, because
+ // any actions that shouldn't happen until "later" should generally also
+ // not happen before the first read call.
+ this.sync = true;
+
+ // whenever we return null, then we set a flag to say
+ // that we're awaiting a 'readable' event emission.
+ this.needReadable = false;
+ this.emittedReadable = false;
+ this.readableListening = false;
+ this.resumeScheduled = false;
+
+ // has it been destroyed
+ this.destroyed = false;
+
+ // Crypto is kind of old and crusty. Historically, its default string
+ // encoding is 'binary' so we have to make this configurable.
+ // Everything else in the universe uses 'utf8', though.
+ this.defaultEncoding = options.defaultEncoding || 'utf8';
+
+ // the number of writers that are awaiting a drain event in .pipe()s
+ this.awaitDrain = 0;
+
+ // if true, a maybeReadMore has been scheduled
+ this.readingMore = false;
+
+ this.decoder = null;
+ this.encoding = null;
+ if (options.encoding) {
+ if (!StringDecoder) StringDecoder = __webpack_require__(/*! string_decoder/ */ "./node_modules/string_decoder/lib/string_decoder.js").StringDecoder;
+ this.decoder = new StringDecoder(options.encoding);
+ this.encoding = options.encoding;
+ }
+}
+
+function Readable(options) {
+ Duplex = Duplex || __webpack_require__(/*! ./_stream_duplex */ "./node_modules/readable-stream/lib/_stream_duplex.js");
+
+ if (!(this instanceof Readable)) return new Readable(options);
+
+ this._readableState = new ReadableState(options, this);
+
+ // legacy
+ this.readable = true;
+
+ if (options) {
+ if (typeof options.read === 'function') this._read = options.read;
+
+ if (typeof options.destroy === 'function') this._destroy = options.destroy;
+ }
+
+ Stream.call(this);
+}
+
+Object.defineProperty(Readable.prototype, 'destroyed', {
+ get: function () {
+ if (this._readableState === undefined) {
+ return false;
+ }
+ return this._readableState.destroyed;
+ },
+ set: function (value) {
+ // we ignore the value if the stream
+ // has not been initialized yet
+ if (!this._readableState) {
+ return;
+ }
+
+ // backward compatibility, the user is explicitly
+ // managing destroyed
+ this._readableState.destroyed = value;
+ }
+});
+
+Readable.prototype.destroy = destroyImpl.destroy;
+Readable.prototype._undestroy = destroyImpl.undestroy;
+Readable.prototype._destroy = function (err, cb) {
+ this.push(null);
+ cb(err);
+};
+
+// Manually shove something into the read() buffer.
+// This returns true if the highWaterMark has not been hit yet,
+// similar to how Writable.write() returns true if you should
+// write() some more.
+Readable.prototype.push = function (chunk, encoding) {
+ var state = this._readableState;
+ var skipChunkCheck;
+
+ if (!state.objectMode) {
+ if (typeof chunk === 'string') {
+ encoding = encoding || state.defaultEncoding;
+ if (encoding !== state.encoding) {
+ chunk = Buffer.from(chunk, encoding);
+ encoding = '';
+ }
+ skipChunkCheck = true;
+ }
+ } else {
+ skipChunkCheck = true;
+ }
+
+ return readableAddChunk(this, chunk, encoding, false, skipChunkCheck);
+};
+
+// Unshift should *always* be something directly out of read()
+Readable.prototype.unshift = function (chunk) {
+ return readableAddChunk(this, chunk, null, true, false);
+};
+
+function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) {
+ var state = stream._readableState;
+ if (chunk === null) {
+ state.reading = false;
+ onEofChunk(stream, state);
+ } else {
+ var er;
+ if (!skipChunkCheck) er = chunkInvalid(state, chunk);
+ if (er) {
+ stream.emit('error', er);
+ } else if (state.objectMode || chunk && chunk.length > 0) {
+ if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) {
+ chunk = _uint8ArrayToBuffer(chunk);
+ }
+
+ if (addToFront) {
+ if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true);
+ } else if (state.ended) {
+ stream.emit('error', new Error('stream.push() after EOF'));
+ } else {
+ state.reading = false;
+ if (state.decoder && !encoding) {
+ chunk = state.decoder.write(chunk);
+ if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state);
+ } else {
+ addChunk(stream, state, chunk, false);
+ }
+ }
+ } else if (!addToFront) {
+ state.reading = false;
+ }
+ }
+
+ return needMoreData(state);
+}
+
+function addChunk(stream, state, chunk, addToFront) {
+ if (state.flowing && state.length === 0 && !state.sync) {
+ stream.emit('data', chunk);
+ stream.read(0);
+ } else {
+ // update the buffer info.
+ state.length += state.objectMode ? 1 : chunk.length;
+ if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);
+
+ if (state.needReadable) emitReadable(stream);
+ }
+ maybeReadMore(stream, state);
+}
+
+function chunkInvalid(state, chunk) {
+ var er;
+ if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
+ er = new TypeError('Invalid non-string/buffer chunk');
+ }
+ return er;
+}
+
+// if it's past the high water mark, we can push in some more.
+// Also, if we have no data yet, we can stand some
+// more bytes. This is to work around cases where hwm=0,
+// such as the repl. Also, if the push() triggered a
+// readable event, and the user called read(largeNumber) such that
+// needReadable was set, then we ought to push more, so that another
+// 'readable' event will be triggered.
+function needMoreData(state) {
+ return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0);
+}
+
+Readable.prototype.isPaused = function () {
+ return this._readableState.flowing === false;
+};
+
+// backwards compatibility.
+Readable.prototype.setEncoding = function (enc) {
+ if (!StringDecoder) StringDecoder = __webpack_require__(/*! string_decoder/ */ "./node_modules/string_decoder/lib/string_decoder.js").StringDecoder;
+ this._readableState.decoder = new StringDecoder(enc);
+ this._readableState.encoding = enc;
+ return this;
+};
+
+// Don't raise the hwm > 8MB
+var MAX_HWM = 0x800000;
+function computeNewHighWaterMark(n) {
+ if (n >= MAX_HWM) {
+ n = MAX_HWM;
+ } else {
+ // Get the next highest power of 2 to prevent increasing hwm excessively in
+ // tiny amounts
+ n--;
+ n |= n >>> 1;
+ n |= n >>> 2;
+ n |= n >>> 4;
+ n |= n >>> 8;
+ n |= n >>> 16;
+ n++;
+ }
+ return n;
+}
+
+// This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+function howMuchToRead(n, state) {
+ if (n <= 0 || state.length === 0 && state.ended) return 0;
+ if (state.objectMode) return 1;
+ if (n !== n) {
+ // Only flow one buffer at a time
+ if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;
+ }
+ // If we're asking for more than the current hwm, then raise the hwm.
+ if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);
+ if (n <= state.length) return n;
+ // Don't have enough
+ if (!state.ended) {
+ state.needReadable = true;
+ return 0;
+ }
+ return state.length;
+}
+
+// you can override either this method, or the async _read(n) below.
+Readable.prototype.read = function (n) {
+ debug('read', n);
+ n = parseInt(n, 10);
+ var state = this._readableState;
+ var nOrig = n;
+
+ if (n !== 0) state.emittedReadable = false;
+
+ // if we're doing read(0) to trigger a readable event, but we
+ // already have a bunch of data in the buffer, then just trigger
+ // the 'readable' event and move on.
+ if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) {
+ debug('read: emitReadable', state.length, state.ended);
+ if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);
+ return null;
+ }
+
+ n = howMuchToRead(n, state);
+
+ // if we've ended, and we're now clear, then finish it up.
+ if (n === 0 && state.ended) {
+ if (state.length === 0) endReadable(this);
+ return null;
+ }
+
+ // All the actual chunk generation logic needs to be
+ // *below* the call to _read. The reason is that in certain
+ // synthetic stream cases, such as passthrough streams, _read
+ // may be a completely synchronous operation which may change
+ // the state of the read buffer, providing enough data when
+ // before there was *not* enough.
+ //
+ // So, the steps are:
+ // 1. Figure out what the state of things will be after we do
+ // a read from the buffer.
+ //
+ // 2. If that resulting state will trigger a _read, then call _read.
+ // Note that this may be asynchronous, or synchronous. Yes, it is
+ // deeply ugly to write APIs this way, but that still doesn't mean
+ // that the Readable class should behave improperly, as streams are
+ // designed to be sync/async agnostic.
+ // Take note if the _read call is sync or async (ie, if the read call
+ // has returned yet), so that we know whether or not it's safe to emit
+ // 'readable' etc.
+ //
+ // 3. Actually pull the requested chunks out of the buffer and return.
+
+ // if we need a readable event, then we need to do some reading.
+ var doRead = state.needReadable;
+ debug('need readable', doRead);
+
+ // if we currently have less than the highWaterMark, then also read some
+ if (state.length === 0 || state.length - n < state.highWaterMark) {
+ doRead = true;
+ debug('length less than watermark', doRead);
+ }
+
+ // however, if we've ended, then there's no point, and if we're already
+ // reading, then it's unnecessary.
+ if (state.ended || state.reading) {
+ doRead = false;
+ debug('reading or ended', doRead);
+ } else if (doRead) {
+ debug('do read');
+ state.reading = true;
+ state.sync = true;
+ // if the length is currently zero, then we *need* a readable event.
+ if (state.length === 0) state.needReadable = true;
+ // call internal read method
+ this._read(state.highWaterMark);
+ state.sync = false;
+ // If _read pushed data synchronously, then `reading` will be false,
+ // and we need to re-evaluate how much data we can return to the user.
+ if (!state.reading) n = howMuchToRead(nOrig, state);
+ }
+
+ var ret;
+ if (n > 0) ret = fromList(n, state);else ret = null;
+
+ if (ret === null) {
+ state.needReadable = true;
+ n = 0;
+ } else {
+ state.length -= n;
+ }
+
+ if (state.length === 0) {
+ // If we have nothing in the buffer, then we want to know
+ // as soon as we *do* get something into the buffer.
+ if (!state.ended) state.needReadable = true;
+
+ // If we tried to read() past the EOF, then emit end on the next tick.
+ if (nOrig !== n && state.ended) endReadable(this);
+ }
+
+ if (ret !== null) this.emit('data', ret);
+
+ return ret;
+};
+
+function onEofChunk(stream, state) {
+ if (state.ended) return;
+ if (state.decoder) {
+ var chunk = state.decoder.end();
+ if (chunk && chunk.length) {
+ state.buffer.push(chunk);
+ state.length += state.objectMode ? 1 : chunk.length;
+ }
+ }
+ state.ended = true;
+
+ // emit 'readable' now to make sure it gets picked up.
+ emitReadable(stream);
+}
+
+// Don't emit readable right away in sync mode, because this can trigger
+// another read() call => stack overflow. This way, it might trigger
+// a nextTick recursion warning, but that's not so bad.
+function emitReadable(stream) {
+ var state = stream._readableState;
+ state.needReadable = false;
+ if (!state.emittedReadable) {
+ debug('emitReadable', state.flowing);
+ state.emittedReadable = true;
+ if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream);
+ }
+}
+
+function emitReadable_(stream) {
+ debug('emit readable');
+ stream.emit('readable');
+ flow(stream);
+}
+
+// at this point, the user has presumably seen the 'readable' event,
+// and called read() to consume some data. that may have triggered
+// in turn another _read(n) call, in which case reading = true if
+// it's in progress.
+// However, if we're not ended, or reading, and the length < hwm,
+// then go ahead and try to read some more preemptively.
+function maybeReadMore(stream, state) {
+ if (!state.readingMore) {
+ state.readingMore = true;
+ pna.nextTick(maybeReadMore_, stream, state);
+ }
+}
+
+function maybeReadMore_(stream, state) {
+ var len = state.length;
+ while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) {
+ debug('maybeReadMore read 0');
+ stream.read(0);
+ if (len === state.length)
+ // didn't get any data, stop spinning.
+ break;else len = state.length;
+ }
+ state.readingMore = false;
+}
+
+// abstract method. to be overridden in specific implementation classes.
+// call cb(er, data) where data is <= n in length.
+// for virtual (non-string, non-buffer) streams, "length" is somewhat
+// arbitrary, and perhaps not very meaningful.
+Readable.prototype._read = function (n) {
+ this.emit('error', new Error('_read() is not implemented'));
+};
+
+Readable.prototype.pipe = function (dest, pipeOpts) {
+ var src = this;
+ var state = this._readableState;
+
+ switch (state.pipesCount) {
+ case 0:
+ state.pipes = dest;
+ break;
+ case 1:
+ state.pipes = [state.pipes, dest];
+ break;
+ default:
+ state.pipes.push(dest);
+ break;
+ }
+ state.pipesCount += 1;
+ debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);
+
+ var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;
+
+ var endFn = doEnd ? onend : unpipe;
+ if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn);
+
+ dest.on('unpipe', onunpipe);
+ function onunpipe(readable, unpipeInfo) {
+ debug('onunpipe');
+ if (readable === src) {
+ if (unpipeInfo && unpipeInfo.hasUnpiped === false) {
+ unpipeInfo.hasUnpiped = true;
+ cleanup();
+ }
+ }
+ }
+
+ function onend() {
+ debug('onend');
+ dest.end();
+ }
+
+ // when the dest drains, it reduces the awaitDrain counter
+ // on the source. This would be more elegant with a .once()
+ // handler in flow(), but adding and removing repeatedly is
+ // too slow.
+ var ondrain = pipeOnDrain(src);
+ dest.on('drain', ondrain);
+
+ var cleanedUp = false;
+ function cleanup() {
+ debug('cleanup');
+ // cleanup event handlers once the pipe is broken
+ dest.removeListener('close', onclose);
+ dest.removeListener('finish', onfinish);
+ dest.removeListener('drain', ondrain);
+ dest.removeListener('error', onerror);
+ dest.removeListener('unpipe', onunpipe);
+ src.removeListener('end', onend);
+ src.removeListener('end', unpipe);
+ src.removeListener('data', ondata);
+
+ cleanedUp = true;
+
+ // if the reader is waiting for a drain event from this
+ // specific writer, then it would cause it to never start
+ // flowing again.
+ // So, if this is awaiting a drain, then we just call it now.
+ // If we don't know, then assume that we are waiting for one.
+ if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();
+ }
+
+ // If the user pushes more data while we're writing to dest then we'll end up
+ // in ondata again. However, we only want to increase awaitDrain once because
+ // dest will only emit one 'drain' event for the multiple writes.
+ // => Introduce a guard on increasing awaitDrain.
+ var increasedAwaitDrain = false;
+ src.on('data', ondata);
+ function ondata(chunk) {
+ debug('ondata');
+ increasedAwaitDrain = false;
+ var ret = dest.write(chunk);
+ if (false === ret && !increasedAwaitDrain) {
+ // If the user unpiped during `dest.write()`, it is possible
+ // to get stuck in a permanently paused state if that write
+ // also returned false.
+ // => Check whether `dest` is still a piping destination.
+ if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {
+ debug('false write response, pause', src._readableState.awaitDrain);
+ src._readableState.awaitDrain++;
+ increasedAwaitDrain = true;
+ }
+ src.pause();
+ }
+ }
+
+ // if the dest has an error, then stop piping into it.
+ // however, don't suppress the throwing behavior for this.
+ function onerror(er) {
+ debug('onerror', er);
+ unpipe();
+ dest.removeListener('error', onerror);
+ if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er);
+ }
+
+ // Make sure our error handler is attached before userland ones.
+ prependListener(dest, 'error', onerror);
+
+ // Both close and finish should trigger unpipe, but only once.
+ function onclose() {
+ dest.removeListener('finish', onfinish);
+ unpipe();
+ }
+ dest.once('close', onclose);
+ function onfinish() {
+ debug('onfinish');
+ dest.removeListener('close', onclose);
+ unpipe();
+ }
+ dest.once('finish', onfinish);
+
+ function unpipe() {
+ debug('unpipe');
+ src.unpipe(dest);
+ }
+
+ // tell the dest that it's being piped to
+ dest.emit('pipe', src);
+
+ // start the flow if it hasn't been started already.
+ if (!state.flowing) {
+ debug('pipe resume');
+ src.resume();
+ }
+
+ return dest;
+};
+
+function pipeOnDrain(src) {
+ return function () {
+ var state = src._readableState;
+ debug('pipeOnDrain', state.awaitDrain);
+ if (state.awaitDrain) state.awaitDrain--;
+ if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {
+ state.flowing = true;
+ flow(src);
+ }
+ };
+}
+
+Readable.prototype.unpipe = function (dest) {
+ var state = this._readableState;
+ var unpipeInfo = { hasUnpiped: false };
+
+ // if we're not piping anywhere, then do nothing.
+ if (state.pipesCount === 0) return this;
+
+ // just one destination. most common case.
+ if (state.pipesCount === 1) {
+ // passed in one, but it's not the right one.
+ if (dest && dest !== state.pipes) return this;
+
+ if (!dest) dest = state.pipes;
+
+ // got a match.
+ state.pipes = null;
+ state.pipesCount = 0;
+ state.flowing = false;
+ if (dest) dest.emit('unpipe', this, unpipeInfo);
+ return this;
+ }
+
+ // slow case. multiple pipe destinations.
+
+ if (!dest) {
+ // remove all.
+ var dests = state.pipes;
+ var len = state.pipesCount;
+ state.pipes = null;
+ state.pipesCount = 0;
+ state.flowing = false;
+
+ for (var i = 0; i < len; i++) {
+ dests[i].emit('unpipe', this, unpipeInfo);
+ }return this;
+ }
+
+ // try to find the right one.
+ var index = indexOf(state.pipes, dest);
+ if (index === -1) return this;
+
+ state.pipes.splice(index, 1);
+ state.pipesCount -= 1;
+ if (state.pipesCount === 1) state.pipes = state.pipes[0];
+
+ dest.emit('unpipe', this, unpipeInfo);
+
+ return this;
+};
+
+// set up data events if they are asked for
+// Ensure readable listeners eventually get something
+Readable.prototype.on = function (ev, fn) {
+ var res = Stream.prototype.on.call(this, ev, fn);
+
+ if (ev === 'data') {
+ // Start flowing on next tick if stream isn't explicitly paused
+ if (this._readableState.flowing !== false) this.resume();
+ } else if (ev === 'readable') {
+ var state = this._readableState;
+ if (!state.endEmitted && !state.readableListening) {
+ state.readableListening = state.needReadable = true;
+ state.emittedReadable = false;
+ if (!state.reading) {
+ pna.nextTick(nReadingNextTick, this);
+ } else if (state.length) {
+ emitReadable(this);
+ }
+ }
+ }
+
+ return res;
+};
+Readable.prototype.addListener = Readable.prototype.on;
+
+function nReadingNextTick(self) {
+ debug('readable nexttick read 0');
+ self.read(0);
+}
+
+// pause() and resume() are remnants of the legacy readable stream API
+// If the user uses them, then switch into old mode.
+Readable.prototype.resume = function () {
+ var state = this._readableState;
+ if (!state.flowing) {
+ debug('resume');
+ state.flowing = true;
+ resume(this, state);
+ }
+ return this;
+};
+
+function resume(stream, state) {
+ if (!state.resumeScheduled) {
+ state.resumeScheduled = true;
+ pna.nextTick(resume_, stream, state);
+ }
+}
+
+function resume_(stream, state) {
+ if (!state.reading) {
+ debug('resume read 0');
+ stream.read(0);
+ }
+
+ state.resumeScheduled = false;
+ state.awaitDrain = 0;
+ stream.emit('resume');
+ flow(stream);
+ if (state.flowing && !state.reading) stream.read(0);
+}
+
+Readable.prototype.pause = function () {
+ debug('call pause flowing=%j', this._readableState.flowing);
+ if (false !== this._readableState.flowing) {
+ debug('pause');
+ this._readableState.flowing = false;
+ this.emit('pause');
+ }
+ return this;
+};
+
+function flow(stream) {
+ var state = stream._readableState;
+ debug('flow', state.flowing);
+ while (state.flowing && stream.read() !== null) {}
+}
+
+// wrap an old-style stream as the async data source.
+// This is *not* part of the readable stream interface.
+// It is an ugly unfortunate mess of history.
+Readable.prototype.wrap = function (stream) {
+ var _this = this;
+
+ var state = this._readableState;
+ var paused = false;
+
+ stream.on('end', function () {
+ debug('wrapped end');
+ if (state.decoder && !state.ended) {
+ var chunk = state.decoder.end();
+ if (chunk && chunk.length) _this.push(chunk);
+ }
+
+ _this.push(null);
+ });
+
+ stream.on('data', function (chunk) {
+ debug('wrapped data');
+ if (state.decoder) chunk = state.decoder.write(chunk);
+
+ // don't skip over falsy values in objectMode
+ if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;
+
+ var ret = _this.push(chunk);
+ if (!ret) {
+ paused = true;
+ stream.pause();
+ }
+ });
+
+ // proxy all the other methods.
+ // important when wrapping filters and duplexes.
+ for (var i in stream) {
+ if (this[i] === undefined && typeof stream[i] === 'function') {
+ this[i] = function (method) {
+ return function () {
+ return stream[method].apply(stream, arguments);
+ };
+ }(i);
+ }
+ }
+
+ // proxy certain important events.
+ for (var n = 0; n < kProxyEvents.length; n++) {
+ stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n]));
+ }
+
+ // when we try to consume some more bytes, simply unpause the
+ // underlying stream.
+ this._read = function (n) {
+ debug('wrapped _read', n);
+ if (paused) {
+ paused = false;
+ stream.resume();
+ }
+ };
+
+ return this;
+};
+
+Object.defineProperty(Readable.prototype, 'readableHighWaterMark', {
+ // making it explicit this property is not enumerable
+ // because otherwise some prototype manipulation in
+ // userland will fail
+ enumerable: false,
+ get: function () {
+ return this._readableState.highWaterMark;
+ }
+});
+
+// exposed for testing purposes only.
+Readable._fromList = fromList;
+
+// Pluck off n bytes from an array of buffers.
+// Length is the combined lengths of all the buffers in the list.
+// This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+function fromList(n, state) {
+ // nothing buffered
+ if (state.length === 0) return null;
+
+ var ret;
+ if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {
+ // read it all, truncate the list
+ if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length);
+ state.buffer.clear();
+ } else {
+ // read part of list
+ ret = fromListPartial(n, state.buffer, state.decoder);
+ }
+
+ return ret;
+}
+
+// Extracts only enough buffered data to satisfy the amount requested.
+// This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+function fromListPartial(n, list, hasStrings) {
+ var ret;
+ if (n < list.head.data.length) {
+ // slice is the same for buffers and strings
+ ret = list.head.data.slice(0, n);
+ list.head.data = list.head.data.slice(n);
+ } else if (n === list.head.data.length) {
+ // first chunk is a perfect match
+ ret = list.shift();
+ } else {
+ // result spans more than one buffer
+ ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list);
+ }
+ return ret;
+}
+
+// Copies a specified amount of characters from the list of buffered data
+// chunks.
+// This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+function copyFromBufferString(n, list) {
+ var p = list.head;
+ var c = 1;
+ var ret = p.data;
+ n -= ret.length;
+ while (p = p.next) {
+ var str = p.data;
+ var nb = n > str.length ? str.length : n;
+ if (nb === str.length) ret += str;else ret += str.slice(0, n);
+ n -= nb;
+ if (n === 0) {
+ if (nb === str.length) {
+ ++c;
+ if (p.next) list.head = p.next;else list.head = list.tail = null;
+ } else {
+ list.head = p;
+ p.data = str.slice(nb);
+ }
+ break;
+ }
+ ++c;
+ }
+ list.length -= c;
+ return ret;
+}
+
+// Copies a specified amount of bytes from the list of buffered data chunks.
+// This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+function copyFromBuffer(n, list) {
+ var ret = Buffer.allocUnsafe(n);
+ var p = list.head;
+ var c = 1;
+ p.data.copy(ret);
+ n -= p.data.length;
+ while (p = p.next) {
+ var buf = p.data;
+ var nb = n > buf.length ? buf.length : n;
+ buf.copy(ret, ret.length - n, 0, nb);
+ n -= nb;
+ if (n === 0) {
+ if (nb === buf.length) {
+ ++c;
+ if (p.next) list.head = p.next;else list.head = list.tail = null;
+ } else {
+ list.head = p;
+ p.data = buf.slice(nb);
+ }
+ break;
+ }
+ ++c;
+ }
+ list.length -= c;
+ return ret;
+}
+
+function endReadable(stream) {
+ var state = stream._readableState;
+
+ // If we get here before consuming all the bytes, then that is a
+ // bug in node. Should never happen.
+ if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream');
+
+ if (!state.endEmitted) {
+ state.ended = true;
+ pna.nextTick(endReadableNT, state, stream);
+ }
+}
+
+function endReadableNT(state, stream) {
+ // Check that we didn't get one last unshift.
+ if (!state.endEmitted && state.length === 0) {
+ state.endEmitted = true;
+ stream.readable = false;
+ stream.emit('end');
+ }
+}
+
+function indexOf(xs, x) {
+ for (var i = 0, l = xs.length; i < l; i++) {
+ if (xs[i] === x) return i;
+ }
+ return -1;
+}
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"), __webpack_require__(/*! ./../../process/browser.js */ "./node_modules/process/browser.js")))
+
+/***/ }),
+
+/***/ "./node_modules/readable-stream/lib/_stream_transform.js":
+/*!***************************************************************!*\
+ !*** ./node_modules/readable-stream/lib/_stream_transform.js ***!
+ \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// a transform stream is a readable/writable stream where you do
+// something with the data. Sometimes it's called a "filter",
+// but that's not a great name for it, since that implies a thing where
+// some bits pass through, and others are simply ignored. (That would
+// be a valid example of a transform, of course.)
+//
+// While the output is causally related to the input, it's not a
+// necessarily symmetric or synchronous transformation. For example,
+// a zlib stream might take multiple plain-text writes(), and then
+// emit a single compressed chunk some time in the future.
+//
+// Here's how this works:
+//
+// The Transform stream has all the aspects of the readable and writable
+// stream classes. When you write(chunk), that calls _write(chunk,cb)
+// internally, and returns false if there's a lot of pending writes
+// buffered up. When you call read(), that calls _read(n) until
+// there's enough pending readable data buffered up.
+//
+// In a transform stream, the written data is placed in a buffer. When
+// _read(n) is called, it transforms the queued up data, calling the
+// buffered _write cb's as it consumes chunks. If consuming a single
+// written chunk would result in multiple output chunks, then the first
+// outputted bit calls the readcb, and subsequent chunks just go into
+// the read buffer, and will cause it to emit 'readable' if necessary.
+//
+// This way, back-pressure is actually determined by the reading side,
+// since _read has to be called to start processing a new chunk. However,
+// a pathological inflate type of transform can cause excessive buffering
+// here. For example, imagine a stream where every byte of input is
+// interpreted as an integer from 0-255, and then results in that many
+// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in
+// 1kb of data being output. In this case, you could write a very small
+// amount of input, and end up with a very large amount of output. In
+// such a pathological inflating mechanism, there'd be no way to tell
+// the system to stop doing the transform. A single 4MB write could
+// cause the system to run out of memory.
+//
+// However, even in such a pathological case, only a single written chunk
+// would be consumed, and then the rest would wait (un-transformed) until
+// the results of the previous transformed chunk were consumed.
+
+
+
+module.exports = Transform;
+
+var Duplex = __webpack_require__(/*! ./_stream_duplex */ "./node_modules/readable-stream/lib/_stream_duplex.js");
+
+/*<replacement>*/
+var util = __webpack_require__(/*! core-util-is */ "./node_modules/core-util-is/lib/util.js");
+util.inherits = __webpack_require__(/*! inherits */ "./node_modules/inherits/inherits_browser.js");
+/*</replacement>*/
+
+util.inherits(Transform, Duplex);
+
+function afterTransform(er, data) {
+ var ts = this._transformState;
+ ts.transforming = false;
+
+ var cb = ts.writecb;
+
+ if (!cb) {
+ return this.emit('error', new Error('write callback called multiple times'));
+ }
+
+ ts.writechunk = null;
+ ts.writecb = null;
+
+ if (data != null) // single equals check for both `null` and `undefined`
+ this.push(data);
+
+ cb(er);
+
+ var rs = this._readableState;
+ rs.reading = false;
+ if (rs.needReadable || rs.length < rs.highWaterMark) {
+ this._read(rs.highWaterMark);
+ }
+}
+
+function Transform(options) {
+ if (!(this instanceof Transform)) return new Transform(options);
+
+ Duplex.call(this, options);
+
+ this._transformState = {
+ afterTransform: afterTransform.bind(this),
+ needTransform: false,
+ transforming: false,
+ writecb: null,
+ writechunk: null,
+ writeencoding: null
+ };
+
+ // start out asking for a readable event once data is transformed.
+ this._readableState.needReadable = true;
+
+ // we have implemented the _read method, and done the other things
+ // that Readable wants before the first _read call, so unset the
+ // sync guard flag.
+ this._readableState.sync = false;
+
+ if (options) {
+ if (typeof options.transform === 'function') this._transform = options.transform;
+
+ if (typeof options.flush === 'function') this._flush = options.flush;
+ }
+
+ // When the writable side finishes, then flush out anything remaining.
+ this.on('prefinish', prefinish);
+}
+
+function prefinish() {
+ var _this = this;
+
+ if (typeof this._flush === 'function') {
+ this._flush(function (er, data) {
+ done(_this, er, data);
+ });
+ } else {
+ done(this, null, null);
+ }
+}
+
+Transform.prototype.push = function (chunk, encoding) {
+ this._transformState.needTransform = false;
+ return Duplex.prototype.push.call(this, chunk, encoding);
+};
+
+// This is the part where you do stuff!
+// override this function in implementation classes.
+// 'chunk' is an input chunk.
+//
+// Call `push(newChunk)` to pass along transformed output
+// to the readable side. You may call 'push' zero or more times.
+//
+// Call `cb(err)` when you are done with this chunk. If you pass
+// an error, then that'll put the hurt on the whole operation. If you
+// never call cb(), then you'll never get another chunk.
+Transform.prototype._transform = function (chunk, encoding, cb) {
+ throw new Error('_transform() is not implemented');
+};
+
+Transform.prototype._write = function (chunk, encoding, cb) {
+ var ts = this._transformState;
+ ts.writecb = cb;
+ ts.writechunk = chunk;
+ ts.writeencoding = encoding;
+ if (!ts.transforming) {
+ var rs = this._readableState;
+ if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);
+ }
+};
+
+// Doesn't matter what the args are here.
+// _transform does all the work.
+// That we got here means that the readable side wants more data.
+Transform.prototype._read = function (n) {
+ var ts = this._transformState;
+
+ if (ts.writechunk !== null && ts.writecb && !ts.transforming) {
+ ts.transforming = true;
+ this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);
+ } else {
+ // mark that we need a transform, so that any data that comes in
+ // will get processed, now that we've asked for it.
+ ts.needTransform = true;
+ }
+};
+
+Transform.prototype._destroy = function (err, cb) {
+ var _this2 = this;
+
+ Duplex.prototype._destroy.call(this, err, function (err2) {
+ cb(err2);
+ _this2.emit('close');
+ });
+};
+
+function done(stream, er, data) {
+ if (er) return stream.emit('error', er);
+
+ if (data != null) // single equals check for both `null` and `undefined`
+ stream.push(data);
+
+ // if there's nothing in the write buffer, then that means
+ // that nothing more will ever be provided
+ if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0');
+
+ if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming');
+
+ return stream.push(null);
+}
+
+/***/ }),
+
+/***/ "./node_modules/readable-stream/lib/_stream_writable.js":
+/*!**************************************************************!*\
+ !*** ./node_modules/readable-stream/lib/_stream_writable.js ***!
+ \**************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+/* WEBPACK VAR INJECTION */(function(process, setImmediate, global) {// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// A bit simpler than readable streams.
+// Implement an async ._write(chunk, encoding, cb), and it'll handle all
+// the drain event emission and buffering.
+
+
+
+/*<replacement>*/
+
+var pna = __webpack_require__(/*! process-nextick-args */ "./node_modules/process-nextick-args/index.js");
+/*</replacement>*/
+
+module.exports = Writable;
+
+/* <replacement> */
+function WriteReq(chunk, encoding, cb) {
+ this.chunk = chunk;
+ this.encoding = encoding;
+ this.callback = cb;
+ this.next = null;
+}
+
+// It seems a linked list but it is not
+// there will be only 2 of these for each stream
+function CorkedRequest(state) {
+ var _this = this;
+
+ this.next = null;
+ this.entry = null;
+ this.finish = function () {
+ onCorkedFinish(_this, state);
+ };
+}
+/* </replacement> */
+
+/*<replacement>*/
+var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick;
+/*</replacement>*/
+
+/*<replacement>*/
+var Duplex;
+/*</replacement>*/
+
+Writable.WritableState = WritableState;
+
+/*<replacement>*/
+var util = __webpack_require__(/*! core-util-is */ "./node_modules/core-util-is/lib/util.js");
+util.inherits = __webpack_require__(/*! inherits */ "./node_modules/inherits/inherits_browser.js");
+/*</replacement>*/
+
+/*<replacement>*/
+var internalUtil = {
+ deprecate: __webpack_require__(/*! util-deprecate */ "./node_modules/util-deprecate/browser.js")
+};
+/*</replacement>*/
+
+/*<replacement>*/
+var Stream = __webpack_require__(/*! ./internal/streams/stream */ "./node_modules/readable-stream/lib/internal/streams/stream-browser.js");
+/*</replacement>*/
+
+/*<replacement>*/
+
+var Buffer = __webpack_require__(/*! safe-buffer */ "./node_modules/safe-buffer/index.js").Buffer;
+var OurUint8Array = global.Uint8Array || function () {};
+function _uint8ArrayToBuffer(chunk) {
+ return Buffer.from(chunk);
+}
+function _isUint8Array(obj) {
+ return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
+}
+
+/*</replacement>*/
+
+var destroyImpl = __webpack_require__(/*! ./internal/streams/destroy */ "./node_modules/readable-stream/lib/internal/streams/destroy.js");
+
+util.inherits(Writable, Stream);
+
+function nop() {}
+
+function WritableState(options, stream) {
+ Duplex = Duplex || __webpack_require__(/*! ./_stream_duplex */ "./node_modules/readable-stream/lib/_stream_duplex.js");
+
+ options = options || {};
+
+ // Duplex streams are both readable and writable, but share
+ // the same options object.
+ // However, some cases require setting options to different
+ // values for the readable and the writable sides of the duplex stream.
+ // These options can be provided separately as readableXXX and writableXXX.
+ var isDuplex = stream instanceof Duplex;
+
+ // object stream flag to indicate whether or not this stream
+ // contains buffers or objects.
+ this.objectMode = !!options.objectMode;
+
+ if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode;
+
+ // the point at which write() starts returning false
+ // Note: 0 is a valid value, means that we always return false if
+ // the entire buffer is not flushed immediately on write()
+ var hwm = options.highWaterMark;
+ var writableHwm = options.writableHighWaterMark;
+ var defaultHwm = this.objectMode ? 16 : 16 * 1024;
+
+ if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm;
+
+ // cast to ints.
+ this.highWaterMark = Math.floor(this.highWaterMark);
+
+ // if _final has been called
+ this.finalCalled = false;
+
+ // drain event flag.
+ this.needDrain = false;
+ // at the start of calling end()
+ this.ending = false;
+ // when end() has been called, and returned
+ this.ended = false;
+ // when 'finish' is emitted
+ this.finished = false;
+
+ // has it been destroyed
+ this.destroyed = false;
+
+ // should we decode strings into buffers before passing to _write?
+ // this is here so that some node-core streams can optimize string
+ // handling at a lower level.
+ var noDecode = options.decodeStrings === false;
+ this.decodeStrings = !noDecode;
+
+ // Crypto is kind of old and crusty. Historically, its default string
+ // encoding is 'binary' so we have to make this configurable.
+ // Everything else in the universe uses 'utf8', though.
+ this.defaultEncoding = options.defaultEncoding || 'utf8';
+
+ // not an actual buffer we keep track of, but a measurement
+ // of how much we're waiting to get pushed to some underlying
+ // socket or file.
+ this.length = 0;
+
+ // a flag to see when we're in the middle of a write.
+ this.writing = false;
+
+ // when true all writes will be buffered until .uncork() call
+ this.corked = 0;
+
+ // a flag to be able to tell if the onwrite cb is called immediately,
+ // or on a later tick. We set this to true at first, because any
+ // actions that shouldn't happen until "later" should generally also
+ // not happen before the first write call.
+ this.sync = true;
+
+ // a flag to know if we're processing previously buffered items, which
+ // may call the _write() callback in the same tick, so that we don't
+ // end up in an overlapped onwrite situation.
+ this.bufferProcessing = false;
+
+ // the callback that's passed to _write(chunk,cb)
+ this.onwrite = function (er) {
+ onwrite(stream, er);
+ };
+
+ // the callback that the user supplies to write(chunk,encoding,cb)
+ this.writecb = null;
+
+ // the amount that is being written when _write is called.
+ this.writelen = 0;
+
+ this.bufferedRequest = null;
+ this.lastBufferedRequest = null;
+
+ // number of pending user-supplied write callbacks
+ // this must be 0 before 'finish' can be emitted
+ this.pendingcb = 0;
+
+ // emit prefinish if the only thing we're waiting for is _write cbs
+ // This is relevant for synchronous Transform streams
+ this.prefinished = false;
+
+ // True if the error was already emitted and should not be thrown again
+ this.errorEmitted = false;
+
+ // count buffered requests
+ this.bufferedRequestCount = 0;
+
+ // allocate the first CorkedRequest, there is always
+ // one allocated and free to use, and we maintain at most two
+ this.corkedRequestsFree = new CorkedRequest(this);
+}
+
+WritableState.prototype.getBuffer = function getBuffer() {
+ var current = this.bufferedRequest;
+ var out = [];
+ while (current) {
+ out.push(current);
+ current = current.next;
+ }
+ return out;
+};
+
+(function () {
+ try {
+ Object.defineProperty(WritableState.prototype, 'buffer', {
+ get: internalUtil.deprecate(function () {
+ return this.getBuffer();
+ }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003')
+ });
+ } catch (_) {}
+})();
+
+// Test _writableState for inheritance to account for Duplex streams,
+// whose prototype chain only points to Readable.
+var realHasInstance;
+if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') {
+ realHasInstance = Function.prototype[Symbol.hasInstance];
+ Object.defineProperty(Writable, Symbol.hasInstance, {
+ value: function (object) {
+ if (realHasInstance.call(this, object)) return true;
+ if (this !== Writable) return false;
+
+ return object && object._writableState instanceof WritableState;
+ }
+ });
+} else {
+ realHasInstance = function (object) {
+ return object instanceof this;
+ };
+}
+
+function Writable(options) {
+ Duplex = Duplex || __webpack_require__(/*! ./_stream_duplex */ "./node_modules/readable-stream/lib/_stream_duplex.js");
+
+ // Writable ctor is applied to Duplexes, too.
+ // `realHasInstance` is necessary because using plain `instanceof`
+ // would return false, as no `_writableState` property is attached.
+
+ // Trying to use the custom `instanceof` for Writable here will also break the
+ // Node.js LazyTransform implementation, which has a non-trivial getter for
+ // `_writableState` that would lead to infinite recursion.
+ if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) {
+ return new Writable(options);
+ }
+
+ this._writableState = new WritableState(options, this);
+
+ // legacy.
+ this.writable = true;
+
+ if (options) {
+ if (typeof options.write === 'function') this._write = options.write;
+
+ if (typeof options.writev === 'function') this._writev = options.writev;
+
+ if (typeof options.destroy === 'function') this._destroy = options.destroy;
+
+ if (typeof options.final === 'function') this._final = options.final;
+ }
+
+ Stream.call(this);
+}
+
+// Otherwise people can pipe Writable streams, which is just wrong.
+Writable.prototype.pipe = function () {
+ this.emit('error', new Error('Cannot pipe, not readable'));
+};
+
+function writeAfterEnd(stream, cb) {
+ var er = new Error('write after end');
+ // TODO: defer error events consistently everywhere, not just the cb
+ stream.emit('error', er);
+ pna.nextTick(cb, er);
+}
+
+// Checks that a user-supplied chunk is valid, especially for the particular
+// mode the stream is in. Currently this means that `null` is never accepted
+// and undefined/non-string values are only allowed in object mode.
+function validChunk(stream, state, chunk, cb) {
+ var valid = true;
+ var er = false;
+
+ if (chunk === null) {
+ er = new TypeError('May not write null values to stream');
+ } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
+ er = new TypeError('Invalid non-string/buffer chunk');
+ }
+ if (er) {
+ stream.emit('error', er);
+ pna.nextTick(cb, er);
+ valid = false;
+ }
+ return valid;
+}
+
+Writable.prototype.write = function (chunk, encoding, cb) {
+ var state = this._writableState;
+ var ret = false;
+ var isBuf = !state.objectMode && _isUint8Array(chunk);
+
+ if (isBuf && !Buffer.isBuffer(chunk)) {
+ chunk = _uint8ArrayToBuffer(chunk);
+ }
+
+ if (typeof encoding === 'function') {
+ cb = encoding;
+ encoding = null;
+ }
+
+ if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;
+
+ if (typeof cb !== 'function') cb = nop;
+
+ if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) {
+ state.pendingcb++;
+ ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb);
+ }
+
+ return ret;
+};
+
+Writable.prototype.cork = function () {
+ var state = this._writableState;
+
+ state.corked++;
+};
+
+Writable.prototype.uncork = function () {
+ var state = this._writableState;
+
+ if (state.corked) {
+ state.corked--;
+
+ if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);
+ }
+};
+
+Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {
+ // node::ParseEncoding() requires lower case.
+ if (typeof encoding === 'string') encoding = encoding.toLowerCase();
+ if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding);
+ this._writableState.defaultEncoding = encoding;
+ return this;
+};
+
+function decodeChunk(state, chunk, encoding) {
+ if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {
+ chunk = Buffer.from(chunk, encoding);
+ }
+ return chunk;
+}
+
+Object.defineProperty(Writable.prototype, 'writableHighWaterMark', {
+ // making it explicit this property is not enumerable
+ // because otherwise some prototype manipulation in
+ // userland will fail
+ enumerable: false,
+ get: function () {
+ return this._writableState.highWaterMark;
+ }
+});
+
+// if we're already writing something, then just put this
+// in the queue, and wait our turn. Otherwise, call _write
+// If we return false, then we need a drain event, so set that flag.
+function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {
+ if (!isBuf) {
+ var newChunk = decodeChunk(state, chunk, encoding);
+ if (chunk !== newChunk) {
+ isBuf = true;
+ encoding = 'buffer';
+ chunk = newChunk;
+ }
+ }
+ var len = state.objectMode ? 1 : chunk.length;
+
+ state.length += len;
+
+ var ret = state.length < state.highWaterMark;
+ // we must ensure that previous needDrain will not be reset to false.
+ if (!ret) state.needDrain = true;
+
+ if (state.writing || state.corked) {
+ var last = state.lastBufferedRequest;
+ state.lastBufferedRequest = {
+ chunk: chunk,
+ encoding: encoding,
+ isBuf: isBuf,
+ callback: cb,
+ next: null
+ };
+ if (last) {
+ last.next = state.lastBufferedRequest;
+ } else {
+ state.bufferedRequest = state.lastBufferedRequest;
+ }
+ state.bufferedRequestCount += 1;
+ } else {
+ doWrite(stream, state, false, len, chunk, encoding, cb);
+ }
+
+ return ret;
+}
+
+function doWrite(stream, state, writev, len, chunk, encoding, cb) {
+ state.writelen = len;
+ state.writecb = cb;
+ state.writing = true;
+ state.sync = true;
+ if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);
+ state.sync = false;
+}
+
+function onwriteError(stream, state, sync, er, cb) {
+ --state.pendingcb;
+
+ if (sync) {
+ // defer the callback if we are being called synchronously
+ // to avoid piling up things on the stack
+ pna.nextTick(cb, er);
+ // this can emit finish, and it will always happen
+ // after error
+ pna.nextTick(finishMaybe, stream, state);
+ stream._writableState.errorEmitted = true;
+ stream.emit('error', er);
+ } else {
+ // the caller expect this to happen before if
+ // it is async
+ cb(er);
+ stream._writableState.errorEmitted = true;
+ stream.emit('error', er);
+ // this can emit finish, but finish must
+ // always follow error
+ finishMaybe(stream, state);
+ }
+}
+
+function onwriteStateUpdate(state) {
+ state.writing = false;
+ state.writecb = null;
+ state.length -= state.writelen;
+ state.writelen = 0;
+}
+
+function onwrite(stream, er) {
+ var state = stream._writableState;
+ var sync = state.sync;
+ var cb = state.writecb;
+
+ onwriteStateUpdate(state);
+
+ if (er) onwriteError(stream, state, sync, er, cb);else {
+ // Check if we're actually ready to finish, but don't emit yet
+ var finished = needFinish(state);
+
+ if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {
+ clearBuffer(stream, state);
+ }
+
+ if (sync) {
+ /*<replacement>*/
+ asyncWrite(afterWrite, stream, state, finished, cb);
+ /*</replacement>*/
+ } else {
+ afterWrite(stream, state, finished, cb);
+ }
+ }
+}
+
+function afterWrite(stream, state, finished, cb) {
+ if (!finished) onwriteDrain(stream, state);
+ state.pendingcb--;
+ cb();
+ finishMaybe(stream, state);
+}
+
+// Must force callback to be called on nextTick, so that we don't
+// emit 'drain' before the write() consumer gets the 'false' return
+// value, and has a chance to attach a 'drain' listener.
+function onwriteDrain(stream, state) {
+ if (state.length === 0 && state.needDrain) {
+ state.needDrain = false;
+ stream.emit('drain');
+ }
+}
+
+// if there's something in the buffer waiting, then process it
+function clearBuffer(stream, state) {
+ state.bufferProcessing = true;
+ var entry = state.bufferedRequest;
+
+ if (stream._writev && entry && entry.next) {
+ // Fast case, write everything using _writev()
+ var l = state.bufferedRequestCount;
+ var buffer = new Array(l);
+ var holder = state.corkedRequestsFree;
+ holder.entry = entry;
+
+ var count = 0;
+ var allBuffers = true;
+ while (entry) {
+ buffer[count] = entry;
+ if (!entry.isBuf) allBuffers = false;
+ entry = entry.next;
+ count += 1;
+ }
+ buffer.allBuffers = allBuffers;
+
+ doWrite(stream, state, true, state.length, buffer, '', holder.finish);
+
+ // doWrite is almost always async, defer these to save a bit of time
+ // as the hot path ends with doWrite
+ state.pendingcb++;
+ state.lastBufferedRequest = null;
+ if (holder.next) {
+ state.corkedRequestsFree = holder.next;
+ holder.next = null;
+ } else {
+ state.corkedRequestsFree = new CorkedRequest(state);
+ }
+ state.bufferedRequestCount = 0;
+ } else {
+ // Slow case, write chunks one-by-one
+ while (entry) {
+ var chunk = entry.chunk;
+ var encoding = entry.encoding;
+ var cb = entry.callback;
+ var len = state.objectMode ? 1 : chunk.length;
+
+ doWrite(stream, state, false, len, chunk, encoding, cb);
+ entry = entry.next;
+ state.bufferedRequestCount--;
+ // if we didn't call the onwrite immediately, then
+ // it means that we need to wait until it does.
+ // also, that means that the chunk and cb are currently
+ // being processed, so move the buffer counter past them.
+ if (state.writing) {
+ break;
+ }
+ }
+
+ if (entry === null) state.lastBufferedRequest = null;
+ }
+
+ state.bufferedRequest = entry;
+ state.bufferProcessing = false;
+}
+
+Writable.prototype._write = function (chunk, encoding, cb) {
+ cb(new Error('_write() is not implemented'));
+};
+
+Writable.prototype._writev = null;
+
+Writable.prototype.end = function (chunk, encoding, cb) {
+ var state = this._writableState;
+
+ if (typeof chunk === 'function') {
+ cb = chunk;
+ chunk = null;
+ encoding = null;
+ } else if (typeof encoding === 'function') {
+ cb = encoding;
+ encoding = null;
+ }
+
+ if (chunk !== null && chunk !== undefined) this.write(chunk, encoding);
+
+ // .end() fully uncorks
+ if (state.corked) {
+ state.corked = 1;
+ this.uncork();
+ }
+
+ // ignore unnecessary end() calls.
+ if (!state.ending && !state.finished) endWritable(this, state, cb);
+};
+
+function needFinish(state) {
+ return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;
+}
+function callFinal(stream, state) {
+ stream._final(function (err) {
+ state.pendingcb--;
+ if (err) {
+ stream.emit('error', err);
+ }
+ state.prefinished = true;
+ stream.emit('prefinish');
+ finishMaybe(stream, state);
+ });
+}
+function prefinish(stream, state) {
+ if (!state.prefinished && !state.finalCalled) {
+ if (typeof stream._final === 'function') {
+ state.pendingcb++;
+ state.finalCalled = true;
+ pna.nextTick(callFinal, stream, state);
+ } else {
+ state.prefinished = true;
+ stream.emit('prefinish');
+ }
+ }
+}
+
+function finishMaybe(stream, state) {
+ var need = needFinish(state);
+ if (need) {
+ prefinish(stream, state);
+ if (state.pendingcb === 0) {
+ state.finished = true;
+ stream.emit('finish');
+ }
+ }
+ return need;
+}
+
+function endWritable(stream, state, cb) {
+ state.ending = true;
+ finishMaybe(stream, state);
+ if (cb) {
+ if (state.finished) pna.nextTick(cb);else stream.once('finish', cb);
+ }
+ state.ended = true;
+ stream.writable = false;
+}
+
+function onCorkedFinish(corkReq, state, err) {
+ var entry = corkReq.entry;
+ corkReq.entry = null;
+ while (entry) {
+ var cb = entry.callback;
+ state.pendingcb--;
+ cb(err);
+ entry = entry.next;
+ }
+ if (state.corkedRequestsFree) {
+ state.corkedRequestsFree.next = corkReq;
+ } else {
+ state.corkedRequestsFree = corkReq;
+ }
+}
+
+Object.defineProperty(Writable.prototype, 'destroyed', {
+ get: function () {
+ if (this._writableState === undefined) {
+ return false;
+ }
+ return this._writableState.destroyed;
+ },
+ set: function (value) {
+ // we ignore the value if the stream
+ // has not been initialized yet
+ if (!this._writableState) {
+ return;
+ }
+
+ // backward compatibility, the user is explicitly
+ // managing destroyed
+ this._writableState.destroyed = value;
+ }
+});
+
+Writable.prototype.destroy = destroyImpl.destroy;
+Writable.prototype._undestroy = destroyImpl.undestroy;
+Writable.prototype._destroy = function (err, cb) {
+ this.end();
+ cb(err);
+};
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../process/browser.js */ "./node_modules/process/browser.js"), __webpack_require__(/*! ./../../timers-browserify/main.js */ "./node_modules/timers-browserify/main.js").setImmediate, __webpack_require__(/*! ./../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js")))
+
+/***/ }),
+
+/***/ "./node_modules/readable-stream/lib/internal/streams/BufferList.js":
+/*!*************************************************************************!*\
+ !*** ./node_modules/readable-stream/lib/internal/streams/BufferList.js ***!
+ \*************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var Buffer = __webpack_require__(/*! safe-buffer */ "./node_modules/safe-buffer/index.js").Buffer;
+var util = __webpack_require__(/*! util */ 1);
+
+function copyBuffer(src, target, offset) {
+ src.copy(target, offset);
+}
+
+module.exports = function () {
+ function BufferList() {
+ _classCallCheck(this, BufferList);
+
+ this.head = null;
+ this.tail = null;
+ this.length = 0;
+ }
+
+ BufferList.prototype.push = function push(v) {
+ var entry = { data: v, next: null };
+ if (this.length > 0) this.tail.next = entry;else this.head = entry;
+ this.tail = entry;
+ ++this.length;
+ };
+
+ BufferList.prototype.unshift = function unshift(v) {
+ var entry = { data: v, next: this.head };
+ if (this.length === 0) this.tail = entry;
+ this.head = entry;
+ ++this.length;
+ };
+
+ BufferList.prototype.shift = function shift() {
+ if (this.length === 0) return;
+ var ret = this.head.data;
+ if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;
+ --this.length;
+ return ret;
+ };
+
+ BufferList.prototype.clear = function clear() {
+ this.head = this.tail = null;
+ this.length = 0;
+ };
+
+ BufferList.prototype.join = function join(s) {
+ if (this.length === 0) return '';
+ var p = this.head;
+ var ret = '' + p.data;
+ while (p = p.next) {
+ ret += s + p.data;
+ }return ret;
+ };
+
+ BufferList.prototype.concat = function concat(n) {
+ if (this.length === 0) return Buffer.alloc(0);
+ if (this.length === 1) return this.head.data;
+ var ret = Buffer.allocUnsafe(n >>> 0);
+ var p = this.head;
+ var i = 0;
+ while (p) {
+ copyBuffer(p.data, ret, i);
+ i += p.data.length;
+ p = p.next;
+ }
+ return ret;
+ };
+
+ return BufferList;
+}();
+
+if (util && util.inspect && util.inspect.custom) {
+ module.exports.prototype[util.inspect.custom] = function () {
+ var obj = util.inspect({ length: this.length });
+ return this.constructor.name + ' ' + obj;
+ };
+}
+
+/***/ }),
+
+/***/ "./node_modules/readable-stream/lib/internal/streams/destroy.js":
+/*!**********************************************************************!*\
+ !*** ./node_modules/readable-stream/lib/internal/streams/destroy.js ***!
+ \**********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+/*<replacement>*/
+
+var pna = __webpack_require__(/*! process-nextick-args */ "./node_modules/process-nextick-args/index.js");
+/*</replacement>*/
+
+// undocumented cb() API, needed for core, not for public API
+function destroy(err, cb) {
+ var _this = this;
+
+ var readableDestroyed = this._readableState && this._readableState.destroyed;
+ var writableDestroyed = this._writableState && this._writableState.destroyed;
+
+ if (readableDestroyed || writableDestroyed) {
+ if (cb) {
+ cb(err);
+ } else if (err && (!this._writableState || !this._writableState.errorEmitted)) {
+ pna.nextTick(emitErrorNT, this, err);
+ }
+ return this;
+ }
+
+ // we set destroyed to true before firing error callbacks in order
+ // to make it re-entrance safe in case destroy() is called within callbacks
+
+ if (this._readableState) {
+ this._readableState.destroyed = true;
+ }
+
+ // if this is a duplex stream mark the writable part as destroyed as well
+ if (this._writableState) {
+ this._writableState.destroyed = true;
+ }
+
+ this._destroy(err || null, function (err) {
+ if (!cb && err) {
+ pna.nextTick(emitErrorNT, _this, err);
+ if (_this._writableState) {
+ _this._writableState.errorEmitted = true;
+ }
+ } else if (cb) {
+ cb(err);
+ }
+ });
+
+ return this;
+}
+
+function undestroy() {
+ if (this._readableState) {
+ this._readableState.destroyed = false;
+ this._readableState.reading = false;
+ this._readableState.ended = false;
+ this._readableState.endEmitted = false;
+ }
+
+ if (this._writableState) {
+ this._writableState.destroyed = false;
+ this._writableState.ended = false;
+ this._writableState.ending = false;
+ this._writableState.finished = false;
+ this._writableState.errorEmitted = false;
+ }
+}
+
+function emitErrorNT(self, err) {
+ self.emit('error', err);
+}
+
+module.exports = {
+ destroy: destroy,
+ undestroy: undestroy
+};
+
+/***/ }),
+
+/***/ "./node_modules/readable-stream/lib/internal/streams/stream-browser.js":
+/*!*****************************************************************************!*\
+ !*** ./node_modules/readable-stream/lib/internal/streams/stream-browser.js ***!
+ \*****************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = __webpack_require__(/*! events */ "./node_modules/events/events.js").EventEmitter;
+
+
+/***/ }),
+
+/***/ "./node_modules/readable-stream/readable-browser.js":
+/*!**********************************************************!*\
+ !*** ./node_modules/readable-stream/readable-browser.js ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+exports = module.exports = __webpack_require__(/*! ./lib/_stream_readable.js */ "./node_modules/readable-stream/lib/_stream_readable.js");
+exports.Stream = exports;
+exports.Readable = exports;
+exports.Writable = __webpack_require__(/*! ./lib/_stream_writable.js */ "./node_modules/readable-stream/lib/_stream_writable.js");
+exports.Duplex = __webpack_require__(/*! ./lib/_stream_duplex.js */ "./node_modules/readable-stream/lib/_stream_duplex.js");
+exports.Transform = __webpack_require__(/*! ./lib/_stream_transform.js */ "./node_modules/readable-stream/lib/_stream_transform.js");
+exports.PassThrough = __webpack_require__(/*! ./lib/_stream_passthrough.js */ "./node_modules/readable-stream/lib/_stream_passthrough.js");
+
+
+/***/ }),
+
+/***/ "./node_modules/safe-buffer/index.js":
+/*!*******************************************!*\
+ !*** ./node_modules/safe-buffer/index.js ***!
+ \*******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* eslint-disable node/no-deprecated-api */
+var buffer = __webpack_require__(/*! buffer */ "./node_modules/buffer/index.js")
+var Buffer = buffer.Buffer
+
+// alternative to using Object.keys for old browsers
+function copyProps (src, dst) {
+ for (var key in src) {
+ dst[key] = src[key]
+ }
+}
+if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {
+ module.exports = buffer
+} else {
+ // Copy properties from require('buffer')
+ copyProps(buffer, exports)
+ exports.Buffer = SafeBuffer
+}
+
+function SafeBuffer (arg, encodingOrOffset, length) {
+ return Buffer(arg, encodingOrOffset, length)
+}
+
+// Copy static methods from Buffer
+copyProps(Buffer, SafeBuffer)
+
+SafeBuffer.from = function (arg, encodingOrOffset, length) {
+ if (typeof arg === 'number') {
+ throw new TypeError('Argument must not be a number')
+ }
+ return Buffer(arg, encodingOrOffset, length)
+}
+
+SafeBuffer.alloc = function (size, fill, encoding) {
+ if (typeof size !== 'number') {
+ throw new TypeError('Argument must be a number')
+ }
+ var buf = Buffer(size)
+ if (fill !== undefined) {
+ if (typeof encoding === 'string') {
+ buf.fill(fill, encoding)
+ } else {
+ buf.fill(fill)
+ }
+ } else {
+ buf.fill(0)
+ }
+ return buf
+}
+
+SafeBuffer.allocUnsafe = function (size) {
+ if (typeof size !== 'number') {
+ throw new TypeError('Argument must be a number')
+ }
+ return Buffer(size)
+}
+
+SafeBuffer.allocUnsafeSlow = function (size) {
+ if (typeof size !== 'number') {
+ throw new TypeError('Argument must be a number')
+ }
+ return buffer.SlowBuffer(size)
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/setimmediate/setImmediate.js":
+/*!***************************************************!*\
+ !*** ./node_modules/setimmediate/setImmediate.js ***!
+ \***************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(global, process) {(function (global, undefined) {
+ "use strict";
+
+ if (global.setImmediate) {
+ return;
+ }
+
+ var nextHandle = 1; // Spec says greater than zero
+ var tasksByHandle = {};
+ var currentlyRunningATask = false;
+ var doc = global.document;
+ var registerImmediate;
+
+ function setImmediate(callback) {
+ // Callback can either be a function or a string
+ if (typeof callback !== "function") {
+ callback = new Function("" + callback);
+ }
+ // Copy function arguments
+ var args = new Array(arguments.length - 1);
+ for (var i = 0; i < args.length; i++) {
+ args[i] = arguments[i + 1];
+ }
+ // Store and register the task
+ var task = { callback: callback, args: args };
+ tasksByHandle[nextHandle] = task;
+ registerImmediate(nextHandle);
+ return nextHandle++;
+ }
+
+ function clearImmediate(handle) {
+ delete tasksByHandle[handle];
+ }
+
+ function run(task) {
+ var callback = task.callback;
+ var args = task.args;
+ switch (args.length) {
+ case 0:
+ callback();
+ break;
+ case 1:
+ callback(args[0]);
+ break;
+ case 2:
+ callback(args[0], args[1]);
+ break;
+ case 3:
+ callback(args[0], args[1], args[2]);
+ break;
+ default:
+ callback.apply(undefined, args);
+ break;
+ }
+ }
+
+ function runIfPresent(handle) {
+ // From the spec: "Wait until any invocations of this algorithm started before this one have completed."
+ // So if we're currently running a task, we'll need to delay this invocation.
+ if (currentlyRunningATask) {
+ // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a
+ // "too much recursion" error.
+ setTimeout(runIfPresent, 0, handle);
+ } else {
+ var task = tasksByHandle[handle];
+ if (task) {
+ currentlyRunningATask = true;
+ try {
+ run(task);
+ } finally {
+ clearImmediate(handle);
+ currentlyRunningATask = false;
+ }
+ }
+ }
+ }
+
+ function installNextTickImplementation() {
+ registerImmediate = function(handle) {
+ process.nextTick(function () { runIfPresent(handle); });
+ };
+ }
+
+ function canUsePostMessage() {
+ // The test against `importScripts` prevents this implementation from being installed inside a web worker,
+ // where `global.postMessage` means something completely different and can't be used for this purpose.
+ if (global.postMessage && !global.importScripts) {
+ var postMessageIsAsynchronous = true;
+ var oldOnMessage = global.onmessage;
+ global.onmessage = function() {
+ postMessageIsAsynchronous = false;
+ };
+ global.postMessage("", "*");
+ global.onmessage = oldOnMessage;
+ return postMessageIsAsynchronous;
+ }
+ }
+
+ function installPostMessageImplementation() {
+ // Installs an event handler on `global` for the `message` event: see
+ // * https://developer.mozilla.org/en/DOM/window.postMessage
+ // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages
+
+ var messagePrefix = "setImmediate$" + Math.random() + "$";
+ var onGlobalMessage = function(event) {
+ if (event.source === global &&
+ typeof event.data === "string" &&
+ event.data.indexOf(messagePrefix) === 0) {
+ runIfPresent(+event.data.slice(messagePrefix.length));
+ }
+ };
+
+ if (global.addEventListener) {
+ global.addEventListener("message", onGlobalMessage, false);
+ } else {
+ global.attachEvent("onmessage", onGlobalMessage);
+ }
+
+ registerImmediate = function(handle) {
+ global.postMessage(messagePrefix + handle, "*");
+ };
+ }
+
+ function installMessageChannelImplementation() {
+ var channel = new MessageChannel();
+ channel.port1.onmessage = function(event) {
+ var handle = event.data;
+ runIfPresent(handle);
+ };
+
+ registerImmediate = function(handle) {
+ channel.port2.postMessage(handle);
+ };
+ }
+
+ function installReadyStateChangeImplementation() {
+ var html = doc.documentElement;
+ registerImmediate = function(handle) {
+ // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted
+ // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.
+ var script = doc.createElement("script");
+ script.onreadystatechange = function () {
+ runIfPresent(handle);
+ script.onreadystatechange = null;
+ html.removeChild(script);
+ script = null;
+ };
+ html.appendChild(script);
+ };
+ }
+
+ function installSetTimeoutImplementation() {
+ registerImmediate = function(handle) {
+ setTimeout(runIfPresent, 0, handle);
+ };
+ }
+
+ // If supported, we should attach to the prototype of global, since that is where setTimeout et al. live.
+ var attachTo = Object.getPrototypeOf && Object.getPrototypeOf(global);
+ attachTo = attachTo && attachTo.setTimeout ? attachTo : global;
+
+ // Don't get fooled by e.g. browserify environments.
+ if ({}.toString.call(global.process) === "[object process]") {
+ // For Node.js before 0.9
+ installNextTickImplementation();
+
+ } else if (canUsePostMessage()) {
+ // For non-IE10 modern browsers
+ installPostMessageImplementation();
+
+ } else if (global.MessageChannel) {
+ // For web workers, where supported
+ installMessageChannelImplementation();
+
+ } else if (doc && "onreadystatechange" in doc.createElement("script")) {
+ // For IE 6–8
+ installReadyStateChangeImplementation();
+
+ } else {
+ // For older browsers
+ installSetTimeoutImplementation();
+ }
+
+ attachTo.setImmediate = setImmediate;
+ attachTo.clearImmediate = clearImmediate;
+}(typeof self === "undefined" ? typeof global === "undefined" ? this : global : self));
+
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"), __webpack_require__(/*! ./../process/browser.js */ "./node_modules/process/browser.js")))
+
+/***/ }),
+
+/***/ "./node_modules/string_decoder/lib/string_decoder.js":
+/*!***********************************************************!*\
+ !*** ./node_modules/string_decoder/lib/string_decoder.js ***!
+ \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+
+/*<replacement>*/
+
+var Buffer = __webpack_require__(/*! safe-buffer */ "./node_modules/safe-buffer/index.js").Buffer;
+/*</replacement>*/
+
+var isEncoding = Buffer.isEncoding || function (encoding) {
+ encoding = '' + encoding;
+ switch (encoding && encoding.toLowerCase()) {
+ case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw':
+ return true;
+ default:
+ return false;
+ }
+};
+
+function _normalizeEncoding(enc) {
+ if (!enc) return 'utf8';
+ var retried;
+ while (true) {
+ switch (enc) {
+ case 'utf8':
+ case 'utf-8':
+ return 'utf8';
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ return 'utf16le';
+ case 'latin1':
+ case 'binary':
+ return 'latin1';
+ case 'base64':
+ case 'ascii':
+ case 'hex':
+ return enc;
+ default:
+ if (retried) return; // undefined
+ enc = ('' + enc).toLowerCase();
+ retried = true;
+ }
+ }
+};
+
+// Do not cache `Buffer.isEncoding` when checking encoding names as some
+// modules monkey-patch it to support additional encodings
+function normalizeEncoding(enc) {
+ var nenc = _normalizeEncoding(enc);
+ if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc);
+ return nenc || enc;
+}
+
+// StringDecoder provides an interface for efficiently splitting a series of
+// buffers into a series of JS strings without breaking apart multi-byte
+// characters.
+exports.StringDecoder = StringDecoder;
+function StringDecoder(encoding) {
+ this.encoding = normalizeEncoding(encoding);
+ var nb;
+ switch (this.encoding) {
+ case 'utf16le':
+ this.text = utf16Text;
+ this.end = utf16End;
+ nb = 4;
+ break;
+ case 'utf8':
+ this.fillLast = utf8FillLast;
+ nb = 4;
+ break;
+ case 'base64':
+ this.text = base64Text;
+ this.end = base64End;
+ nb = 3;
+ break;
+ default:
+ this.write = simpleWrite;
+ this.end = simpleEnd;
+ return;
+ }
+ this.lastNeed = 0;
+ this.lastTotal = 0;
+ this.lastChar = Buffer.allocUnsafe(nb);
+}
+
+StringDecoder.prototype.write = function (buf) {
+ if (buf.length === 0) return '';
+ var r;
+ var i;
+ if (this.lastNeed) {
+ r = this.fillLast(buf);
+ if (r === undefined) return '';
+ i = this.lastNeed;
+ this.lastNeed = 0;
+ } else {
+ i = 0;
+ }
+ if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i);
+ return r || '';
+};
+
+StringDecoder.prototype.end = utf8End;
+
+// Returns only complete characters in a Buffer
+StringDecoder.prototype.text = utf8Text;
+
+// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer
+StringDecoder.prototype.fillLast = function (buf) {
+ if (this.lastNeed <= buf.length) {
+ buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed);
+ return this.lastChar.toString(this.encoding, 0, this.lastTotal);
+ }
+ buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length);
+ this.lastNeed -= buf.length;
+};
+
+// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a
+// continuation byte. If an invalid byte is detected, -2 is returned.
+function utf8CheckByte(byte) {
+ if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4;
+ return byte >> 6 === 0x02 ? -1 : -2;
+}
+
+// Checks at most 3 bytes at the end of a Buffer in order to detect an
+// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4)
+// needed to complete the UTF-8 character (if applicable) are returned.
+function utf8CheckIncomplete(self, buf, i) {
+ var j = buf.length - 1;
+ if (j < i) return 0;
+ var nb = utf8CheckByte(buf[j]);
+ if (nb >= 0) {
+ if (nb > 0) self.lastNeed = nb - 1;
+ return nb;
+ }
+ if (--j < i || nb === -2) return 0;
+ nb = utf8CheckByte(buf[j]);
+ if (nb >= 0) {
+ if (nb > 0) self.lastNeed = nb - 2;
+ return nb;
+ }
+ if (--j < i || nb === -2) return 0;
+ nb = utf8CheckByte(buf[j]);
+ if (nb >= 0) {
+ if (nb > 0) {
+ if (nb === 2) nb = 0;else self.lastNeed = nb - 3;
+ }
+ return nb;
+ }
+ return 0;
+}
+
+// Validates as many continuation bytes for a multi-byte UTF-8 character as
+// needed or are available. If we see a non-continuation byte where we expect
+// one, we "replace" the validated continuation bytes we've seen so far with
+// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding
+// behavior. The continuation byte check is included three times in the case
+// where all of the continuation bytes for a character exist in the same buffer.
+// It is also done this way as a slight performance increase instead of using a
+// loop.
+function utf8CheckExtraBytes(self, buf, p) {
+ if ((buf[0] & 0xC0) !== 0x80) {
+ self.lastNeed = 0;
+ return '\ufffd';
+ }
+ if (self.lastNeed > 1 && buf.length > 1) {
+ if ((buf[1] & 0xC0) !== 0x80) {
+ self.lastNeed = 1;
+ return '\ufffd';
+ }
+ if (self.lastNeed > 2 && buf.length > 2) {
+ if ((buf[2] & 0xC0) !== 0x80) {
+ self.lastNeed = 2;
+ return '\ufffd';
+ }
+ }
+ }
+}
+
+// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer.
+function utf8FillLast(buf) {
+ var p = this.lastTotal - this.lastNeed;
+ var r = utf8CheckExtraBytes(this, buf, p);
+ if (r !== undefined) return r;
+ if (this.lastNeed <= buf.length) {
+ buf.copy(this.lastChar, p, 0, this.lastNeed);
+ return this.lastChar.toString(this.encoding, 0, this.lastTotal);
+ }
+ buf.copy(this.lastChar, p, 0, buf.length);
+ this.lastNeed -= buf.length;
+}
+
+// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a
+// partial character, the character's bytes are buffered until the required
+// number of bytes are available.
+function utf8Text(buf, i) {
+ var total = utf8CheckIncomplete(this, buf, i);
+ if (!this.lastNeed) return buf.toString('utf8', i);
+ this.lastTotal = total;
+ var end = buf.length - (total - this.lastNeed);
+ buf.copy(this.lastChar, 0, end);
+ return buf.toString('utf8', i, end);
+}
+
+// For UTF-8, a replacement character is added when ending on a partial
+// character.
+function utf8End(buf) {
+ var r = buf && buf.length ? this.write(buf) : '';
+ if (this.lastNeed) return r + '\ufffd';
+ return r;
+}
+
+// UTF-16LE typically needs two bytes per character, but even if we have an even
+// number of bytes available, we need to check if we end on a leading/high
+// surrogate. In that case, we need to wait for the next two bytes in order to
+// decode the last character properly.
+function utf16Text(buf, i) {
+ if ((buf.length - i) % 2 === 0) {
+ var r = buf.toString('utf16le', i);
+ if (r) {
+ var c = r.charCodeAt(r.length - 1);
+ if (c >= 0xD800 && c <= 0xDBFF) {
+ this.lastNeed = 2;
+ this.lastTotal = 4;
+ this.lastChar[0] = buf[buf.length - 2];
+ this.lastChar[1] = buf[buf.length - 1];
+ return r.slice(0, -1);
+ }
+ }
+ return r;
+ }
+ this.lastNeed = 1;
+ this.lastTotal = 2;
+ this.lastChar[0] = buf[buf.length - 1];
+ return buf.toString('utf16le', i, buf.length - 1);
+}
+
+// For UTF-16LE we do not explicitly append special replacement characters if we
+// end on a partial character, we simply let v8 handle that.
+function utf16End(buf) {
+ var r = buf && buf.length ? this.write(buf) : '';
+ if (this.lastNeed) {
+ var end = this.lastTotal - this.lastNeed;
+ return r + this.lastChar.toString('utf16le', 0, end);
+ }
+ return r;
+}
+
+function base64Text(buf, i) {
+ var n = (buf.length - i) % 3;
+ if (n === 0) return buf.toString('base64', i);
+ this.lastNeed = 3 - n;
+ this.lastTotal = 3;
+ if (n === 1) {
+ this.lastChar[0] = buf[buf.length - 1];
+ } else {
+ this.lastChar[0] = buf[buf.length - 2];
+ this.lastChar[1] = buf[buf.length - 1];
+ }
+ return buf.toString('base64', i, buf.length - n);
+}
+
+function base64End(buf) {
+ var r = buf && buf.length ? this.write(buf) : '';
+ if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed);
+ return r;
+}
+
+// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex)
+function simpleWrite(buf) {
+ return buf.toString(this.encoding);
+}
+
+function simpleEnd(buf) {
+ return buf && buf.length ? this.write(buf) : '';
+}
+
+/***/ }),
+
+/***/ "./node_modules/timers-browserify/main.js":
+/*!************************************************!*\
+ !*** ./node_modules/timers-browserify/main.js ***!
+ \************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(global) {var scope = (typeof global !== "undefined" && global) ||
+ (typeof self !== "undefined" && self) ||
+ window;
+var apply = Function.prototype.apply;
+
+// DOM APIs, for completeness
+
+exports.setTimeout = function() {
+ return new Timeout(apply.call(setTimeout, scope, arguments), clearTimeout);
+};
+exports.setInterval = function() {
+ return new Timeout(apply.call(setInterval, scope, arguments), clearInterval);
+};
+exports.clearTimeout =
+exports.clearInterval = function(timeout) {
+ if (timeout) {
+ timeout.close();
+ }
+};
+
+function Timeout(id, clearFn) {
+ this._id = id;
+ this._clearFn = clearFn;
+}
+Timeout.prototype.unref = Timeout.prototype.ref = function() {};
+Timeout.prototype.close = function() {
+ this._clearFn.call(scope, this._id);
+};
+
+// Does not start the time, just sets up the members needed.
+exports.enroll = function(item, msecs) {
+ clearTimeout(item._idleTimeoutId);
+ item._idleTimeout = msecs;
+};
+
+exports.unenroll = function(item) {
+ clearTimeout(item._idleTimeoutId);
+ item._idleTimeout = -1;
+};
+
+exports._unrefActive = exports.active = function(item) {
+ clearTimeout(item._idleTimeoutId);
+
+ var msecs = item._idleTimeout;
+ if (msecs >= 0) {
+ item._idleTimeoutId = setTimeout(function onTimeout() {
+ if (item._onTimeout)
+ item._onTimeout();
+ }, msecs);
+ }
+};
+
+// setimmediate attaches itself to the global object
+__webpack_require__(/*! setimmediate */ "./node_modules/setimmediate/setImmediate.js");
+// On some exotic environments, it's not clear which object `setimmediate` was
+// able to install onto. Search each possibility in the same order as the
+// `setimmediate` library.
+exports.setImmediate = (typeof self !== "undefined" && self.setImmediate) ||
+ (typeof global !== "undefined" && global.setImmediate) ||
+ (this && this.setImmediate);
+exports.clearImmediate = (typeof self !== "undefined" && self.clearImmediate) ||
+ (typeof global !== "undefined" && global.clearImmediate) ||
+ (this && this.clearImmediate);
+
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js")))
+
+/***/ }),
+
+/***/ "./node_modules/tslib/tslib.es6.js":
+/*!*****************************************!*\
+ !*** ./node_modules/tslib/tslib.es6.js ***!
+ \*****************************************/
+/*! exports provided: __extends, __assign, __rest, __decorate, __param, __metadata, __awaiter, __generator, __exportStar, __values, __read, __spread, __await, __asyncGenerator, __asyncDelegator, __asyncValues, __makeTemplateObject, __importStar, __importDefault */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__extends", function() { return __extends; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__assign", function() { return __assign; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__rest", function() { return __rest; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__decorate", function() { return __decorate; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__param", function() { return __param; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__metadata", function() { return __metadata; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__awaiter", function() { return __awaiter; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__generator", function() { return __generator; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__exportStar", function() { return __exportStar; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__values", function() { return __values; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__read", function() { return __read; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__spread", function() { return __spread; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__await", function() { return __await; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__asyncGenerator", function() { return __asyncGenerator; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__asyncDelegator", function() { return __asyncDelegator; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__asyncValues", function() { return __asyncValues; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__makeTemplateObject", function() { return __makeTemplateObject; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__importStar", function() { return __importStar; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__importDefault", function() { return __importDefault; });
+/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+/* global Reflect, Promise */
+
+var extendStatics = Object.setPrototypeOf ||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+ function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+
+function __extends(d, b) {
+ extendStatics(d, b);
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+}
+
+var __assign = Object.assign || function __assign(t) {
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
+ s = arguments[i];
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
+ }
+ return t;
+}
+
+function __rest(s, e) {
+ var t = {};
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
+ t[p] = s[p];
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0)
+ t[p[i]] = s[p[i]];
+ return t;
+}
+
+function __decorate(decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+}
+
+function __param(paramIndex, decorator) {
+ return function (target, key) { decorator(target, key, paramIndex); }
+}
+
+function __metadata(metadataKey, metadataValue) {
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
+}
+
+function __awaiter(thisArg, _arguments, P, generator) {
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+}
+
+function __generator(thisArg, body) {
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
+ function verb(n) { return function (v) { return step([n, v]); }; }
+ function step(op) {
+ if (f) throw new TypeError("Generator is already executing.");
+ while (_) try {
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
+ if (y = 0, t) op = [op[0] & 2, t.value];
+ switch (op[0]) {
+ case 0: case 1: t = op; break;
+ case 4: _.label++; return { value: op[1], done: false };
+ case 5: _.label++; y = op[1]; op = [0]; continue;
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
+ default:
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
+ if (t[2]) _.ops.pop();
+ _.trys.pop(); continue;
+ }
+ op = body.call(thisArg, _);
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
+ }
+}
+
+function __exportStar(m, exports) {
+ for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
+}
+
+function __values(o) {
+ var m = typeof Symbol === "function" && o[Symbol.iterator], i = 0;
+ if (m) return m.call(o);
+ return {
+ next: function () {
+ if (o && i >= o.length) o = void 0;
+ return { value: o && o[i++], done: !o };
+ }
+ };
+}
+
+function __read(o, n) {
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
+ if (!m) return o;
+ var i = m.call(o), r, ar = [], e;
+ try {
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
+ }
+ catch (error) { e = { error: error }; }
+ finally {
+ try {
+ if (r && !r.done && (m = i["return"])) m.call(i);
+ }
+ finally { if (e) throw e.error; }
+ }
+ return ar;
+}
+
+function __spread() {
+ for (var ar = [], i = 0; i < arguments.length; i++)
+ ar = ar.concat(__read(arguments[i]));
+ return ar;
+}
+
+function __await(v) {
+ return this instanceof __await ? (this.v = v, this) : new __await(v);
+}
+
+function __asyncGenerator(thisArg, _arguments, generator) {
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
+ var g = generator.apply(thisArg, _arguments || []), i, q = [];
+ return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
+ function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
+ function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
+ function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
+ function fulfill(value) { resume("next", value); }
+ function reject(value) { resume("throw", value); }
+ function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
+}
+
+function __asyncDelegator(o) {
+ var i, p;
+ return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
+ function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
+}
+
+function __asyncValues(o) {
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
+ var m = o[Symbol.asyncIterator], i;
+ return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
+ function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
+ function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
+}
+
+function __makeTemplateObject(cooked, raw) {
+ if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
+ return cooked;
+};
+
+function __importStar(mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
+ result.default = mod;
+ return result;
+}
+
+function __importDefault(mod) {
+ return (mod && mod.__esModule) ? mod : { default: mod };
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/util-deprecate/browser.js":
+/*!************************************************!*\
+ !*** ./node_modules/util-deprecate/browser.js ***!
+ \************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(global) {
+/**
+ * Module exports.
+ */
+
+module.exports = deprecate;
+
+/**
+ * Mark that a method should not be used.
+ * Returns a modified function which warns once by default.
+ *
+ * If `localStorage.noDeprecation = true` is set, then it is a no-op.
+ *
+ * If `localStorage.throwDeprecation = true` is set, then deprecated functions
+ * will throw an Error when invoked.
+ *
+ * If `localStorage.traceDeprecation = true` is set, then deprecated functions
+ * will invoke `console.trace()` instead of `console.error()`.
+ *
+ * @param {Function} fn - the function to deprecate
+ * @param {String} msg - the string to print to the console when `fn` is invoked
+ * @returns {Function} a new "deprecated" version of `fn`
+ * @api public
+ */
+
+function deprecate (fn, msg) {
+ if (config('noDeprecation')) {
+ return fn;
+ }
+
+ var warned = false;
+ function deprecated() {
+ if (!warned) {
+ if (config('throwDeprecation')) {
+ throw new Error(msg);
+ } else if (config('traceDeprecation')) {
+ console.trace(msg);
+ } else {
+ console.warn(msg);
+ }
+ warned = true;
+ }
+ return fn.apply(this, arguments);
+ }
+
+ return deprecated;
+}
+
+/**
+ * Checks `localStorage` for boolean values for the given `name`.
+ *
+ * @param {String} name
+ * @returns {Boolean}
+ * @api private
+ */
+
+function config (name) {
+ // accessing global.localStorage can trigger a DOMException in sandboxed iframes
+ try {
+ if (!global.localStorage) return false;
+ } catch (_) {
+ return false;
+ }
+ var val = global.localStorage[name];
+ if (null == val) return false;
+ return String(val).toLowerCase() === 'true';
+}
+
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js")))
+
+/***/ }),
+
+/***/ "./node_modules/util/support/isBufferBrowser.js":
+/*!******************************************************!*\
+ !*** ./node_modules/util/support/isBufferBrowser.js ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function isBuffer(arg) {
+ return arg && typeof arg === 'object'
+ && typeof arg.copy === 'function'
+ && typeof arg.fill === 'function'
+ && typeof arg.readUInt8 === 'function';
+}
+
+/***/ }),
+
+/***/ "./node_modules/util/util.js":
+/*!***********************************!*\
+ !*** ./node_modules/util/util.js ***!
+ \***********************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(global, process) {// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+var formatRegExp = /%[sdj%]/g;
+exports.format = function(f) {
+ if (!isString(f)) {
+ var objects = [];
+ for (var i = 0; i < arguments.length; i++) {
+ objects.push(inspect(arguments[i]));
+ }
+ return objects.join(' ');
+ }
+
+ var i = 1;
+ var args = arguments;
+ var len = args.length;
+ var str = String(f).replace(formatRegExp, function(x) {
+ if (x === '%%') return '%';
+ if (i >= len) return x;
+ switch (x) {
+ case '%s': return String(args[i++]);
+ case '%d': return Number(args[i++]);
+ case '%j':
+ try {
+ return JSON.stringify(args[i++]);
+ } catch (_) {
+ return '[Circular]';
+ }
+ default:
+ return x;
+ }
+ });
+ for (var x = args[i]; i < len; x = args[++i]) {
+ if (isNull(x) || !isObject(x)) {
+ str += ' ' + x;
+ } else {
+ str += ' ' + inspect(x);
+ }
+ }
+ return str;
+};
+
+
+// Mark that a method should not be used.
+// Returns a modified function which warns once by default.
+// If --no-deprecation is set, then it is a no-op.
+exports.deprecate = function(fn, msg) {
+ // Allow for deprecating things in the process of starting up.
+ if (isUndefined(global.process)) {
+ return function() {
+ return exports.deprecate(fn, msg).apply(this, arguments);
+ };
+ }
+
+ if (process.noDeprecation === true) {
+ return fn;
+ }
+
+ var warned = false;
+ function deprecated() {
+ if (!warned) {
+ if (process.throwDeprecation) {
+ throw new Error(msg);
+ } else if (process.traceDeprecation) {
+ console.trace(msg);
+ } else {
+ console.error(msg);
+ }
+ warned = true;
+ }
+ return fn.apply(this, arguments);
+ }
+
+ return deprecated;
+};
+
+
+var debugs = {};
+var debugEnviron;
+exports.debuglog = function(set) {
+ if (isUndefined(debugEnviron))
+ debugEnviron = process.env.NODE_DEBUG || '';
+ set = set.toUpperCase();
+ if (!debugs[set]) {
+ if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
+ var pid = process.pid;
+ debugs[set] = function() {
+ var msg = exports.format.apply(exports, arguments);
+ console.error('%s %d: %s', set, pid, msg);
+ };
+ } else {
+ debugs[set] = function() {};
+ }
+ }
+ return debugs[set];
+};
+
+
+/**
+ * Echos the value of a value. Trys to print the value out
+ * in the best way possible given the different types.
+ *
+ * @param {Object} obj The object to print out.
+ * @param {Object} opts Optional options object that alters the output.
+ */
+/* legacy: obj, showHidden, depth, colors*/
+function inspect(obj, opts) {
+ // default options
+ var ctx = {
+ seen: [],
+ stylize: stylizeNoColor
+ };
+ // legacy...
+ if (arguments.length >= 3) ctx.depth = arguments[2];
+ if (arguments.length >= 4) ctx.colors = arguments[3];
+ if (isBoolean(opts)) {
+ // legacy...
+ ctx.showHidden = opts;
+ } else if (opts) {
+ // got an "options" object
+ exports._extend(ctx, opts);
+ }
+ // set default options
+ if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
+ if (isUndefined(ctx.depth)) ctx.depth = 2;
+ if (isUndefined(ctx.colors)) ctx.colors = false;
+ if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
+ if (ctx.colors) ctx.stylize = stylizeWithColor;
+ return formatValue(ctx, obj, ctx.depth);
+}
+exports.inspect = inspect;
+
+
+// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
+inspect.colors = {
+ 'bold' : [1, 22],
+ 'italic' : [3, 23],
+ 'underline' : [4, 24],
+ 'inverse' : [7, 27],
+ 'white' : [37, 39],
+ 'grey' : [90, 39],
+ 'black' : [30, 39],
+ 'blue' : [34, 39],
+ 'cyan' : [36, 39],
+ 'green' : [32, 39],
+ 'magenta' : [35, 39],
+ 'red' : [31, 39],
+ 'yellow' : [33, 39]
+};
+
+// Don't use 'blue' not visible on cmd.exe
+inspect.styles = {
+ 'special': 'cyan',
+ 'number': 'yellow',
+ 'boolean': 'yellow',
+ 'undefined': 'grey',
+ 'null': 'bold',
+ 'string': 'green',
+ 'date': 'magenta',
+ // "name": intentionally not styling
+ 'regexp': 'red'
+};
+
+
+function stylizeWithColor(str, styleType) {
+ var style = inspect.styles[styleType];
+
+ if (style) {
+ return '\u001b[' + inspect.colors[style][0] + 'm' + str +
+ '\u001b[' + inspect.colors[style][1] + 'm';
+ } else {
+ return str;
+ }
+}
+
+
+function stylizeNoColor(str, styleType) {
+ return str;
+}
+
+
+function arrayToHash(array) {
+ var hash = {};
+
+ array.forEach(function(val, idx) {
+ hash[val] = true;
+ });
+
+ return hash;
+}
+
+
+function formatValue(ctx, value, recurseTimes) {
+ // Provide a hook for user-specified inspect functions.
+ // Check that value is an object with an inspect function on it
+ if (ctx.customInspect &&
+ value &&
+ isFunction(value.inspect) &&
+ // Filter out the util module, it's inspect function is special
+ value.inspect !== exports.inspect &&
+ // Also filter out any prototype objects using the circular check.
+ !(value.constructor && value.constructor.prototype === value)) {
+ var ret = value.inspect(recurseTimes, ctx);
+ if (!isString(ret)) {
+ ret = formatValue(ctx, ret, recurseTimes);
+ }
+ return ret;
+ }
+
+ // Primitive types cannot have properties
+ var primitive = formatPrimitive(ctx, value);
+ if (primitive) {
+ return primitive;
+ }
+
+ // Look up the keys of the object.
+ var keys = Object.keys(value);
+ var visibleKeys = arrayToHash(keys);
+
+ if (ctx.showHidden) {
+ keys = Object.getOwnPropertyNames(value);
+ }
+
+ // IE doesn't make error fields non-enumerable
+ // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx
+ if (isError(value)
+ && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {
+ return formatError(value);
+ }
+
+ // Some type of object without properties can be shortcutted.
+ if (keys.length === 0) {
+ if (isFunction(value)) {
+ var name = value.name ? ': ' + value.name : '';
+ return ctx.stylize('[Function' + name + ']', 'special');
+ }
+ if (isRegExp(value)) {
+ return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
+ }
+ if (isDate(value)) {
+ return ctx.stylize(Date.prototype.toString.call(value), 'date');
+ }
+ if (isError(value)) {
+ return formatError(value);
+ }
+ }
+
+ var base = '', array = false, braces = ['{', '}'];
+
+ // Make Array say that they are Array
+ if (isArray(value)) {
+ array = true;
+ braces = ['[', ']'];
+ }
+
+ // Make functions say that they are functions
+ if (isFunction(value)) {
+ var n = value.name ? ': ' + value.name : '';
+ base = ' [Function' + n + ']';
+ }
+
+ // Make RegExps say that they are RegExps
+ if (isRegExp(value)) {
+ base = ' ' + RegExp.prototype.toString.call(value);
+ }
+
+ // Make dates with properties first say the date
+ if (isDate(value)) {
+ base = ' ' + Date.prototype.toUTCString.call(value);
+ }
+
+ // Make error with message first say the error
+ if (isError(value)) {
+ base = ' ' + formatError(value);
+ }
+
+ if (keys.length === 0 && (!array || value.length == 0)) {
+ return braces[0] + base + braces[1];
+ }
+
+ if (recurseTimes < 0) {
+ if (isRegExp(value)) {
+ return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
+ } else {
+ return ctx.stylize('[Object]', 'special');
+ }
+ }
+
+ ctx.seen.push(value);
+
+ var output;
+ if (array) {
+ output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
+ } else {
+ output = keys.map(function(key) {
+ return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
+ });
+ }
+
+ ctx.seen.pop();
+
+ return reduceToSingleString(output, base, braces);
+}
+
+
+function formatPrimitive(ctx, value) {
+ if (isUndefined(value))
+ return ctx.stylize('undefined', 'undefined');
+ if (isString(value)) {
+ var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
+ .replace(/'/g, "\\'")
+ .replace(/\\"/g, '"') + '\'';
+ return ctx.stylize(simple, 'string');
+ }
+ if (isNumber(value))
+ return ctx.stylize('' + value, 'number');
+ if (isBoolean(value))
+ return ctx.stylize('' + value, 'boolean');
+ // For some reason typeof null is "object", so special case here.
+ if (isNull(value))
+ return ctx.stylize('null', 'null');
+}
+
+
+function formatError(value) {
+ return '[' + Error.prototype.toString.call(value) + ']';
+}
+
+
+function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
+ var output = [];
+ for (var i = 0, l = value.length; i < l; ++i) {
+ if (hasOwnProperty(value, String(i))) {
+ output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
+ String(i), true));
+ } else {
+ output.push('');
+ }
+ }
+ keys.forEach(function(key) {
+ if (!key.match(/^\d+$/)) {
+ output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
+ key, true));
+ }
+ });
+ return output;
+}
+
+
+function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
+ var name, str, desc;
+ desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
+ if (desc.get) {
+ if (desc.set) {
+ str = ctx.stylize('[Getter/Setter]', 'special');
+ } else {
+ str = ctx.stylize('[Getter]', 'special');
+ }
+ } else {
+ if (desc.set) {
+ str = ctx.stylize('[Setter]', 'special');
+ }
+ }
+ if (!hasOwnProperty(visibleKeys, key)) {
+ name = '[' + key + ']';
+ }
+ if (!str) {
+ if (ctx.seen.indexOf(desc.value) < 0) {
+ if (isNull(recurseTimes)) {
+ str = formatValue(ctx, desc.value, null);
+ } else {
+ str = formatValue(ctx, desc.value, recurseTimes - 1);
+ }
+ if (str.indexOf('\n') > -1) {
+ if (array) {
+ str = str.split('\n').map(function(line) {
+ return ' ' + line;
+ }).join('\n').substr(2);
+ } else {
+ str = '\n' + str.split('\n').map(function(line) {
+ return ' ' + line;
+ }).join('\n');
+ }
+ }
+ } else {
+ str = ctx.stylize('[Circular]', 'special');
+ }
+ }
+ if (isUndefined(name)) {
+ if (array && key.match(/^\d+$/)) {
+ return str;
+ }
+ name = JSON.stringify('' + key);
+ if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
+ name = name.substr(1, name.length - 2);
+ name = ctx.stylize(name, 'name');
+ } else {
+ name = name.replace(/'/g, "\\'")
+ .replace(/\\"/g, '"')
+ .replace(/(^"|"$)/g, "'");
+ name = ctx.stylize(name, 'string');
+ }
+ }
+
+ return name + ': ' + str;
+}
+
+
+function reduceToSingleString(output, base, braces) {
+ var numLinesEst = 0;
+ var length = output.reduce(function(prev, cur) {
+ numLinesEst++;
+ if (cur.indexOf('\n') >= 0) numLinesEst++;
+ return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
+ }, 0);
+
+ if (length > 60) {
+ return braces[0] +
+ (base === '' ? '' : base + '\n ') +
+ ' ' +
+ output.join(',\n ') +
+ ' ' +
+ braces[1];
+ }
+
+ return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
+}
+
+
+// NOTE: These type checking functions intentionally don't use `instanceof`
+// because it is fragile and can be easily faked with `Object.create()`.
+function isArray(ar) {
+ return Array.isArray(ar);
+}
+exports.isArray = isArray;
+
+function isBoolean(arg) {
+ return typeof arg === 'boolean';
+}
+exports.isBoolean = isBoolean;
+
+function isNull(arg) {
+ return arg === null;
+}
+exports.isNull = isNull;
+
+function isNullOrUndefined(arg) {
+ return arg == null;
+}
+exports.isNullOrUndefined = isNullOrUndefined;
+
+function isNumber(arg) {
+ return typeof arg === 'number';
+}
+exports.isNumber = isNumber;
+
+function isString(arg) {
+ return typeof arg === 'string';
+}
+exports.isString = isString;
+
+function isSymbol(arg) {
+ return typeof arg === 'symbol';
+}
+exports.isSymbol = isSymbol;
+
+function isUndefined(arg) {
+ return arg === void 0;
+}
+exports.isUndefined = isUndefined;
+
+function isRegExp(re) {
+ return isObject(re) && objectToString(re) === '[object RegExp]';
+}
+exports.isRegExp = isRegExp;
+
+function isObject(arg) {
+ return typeof arg === 'object' && arg !== null;
+}
+exports.isObject = isObject;
+
+function isDate(d) {
+ return isObject(d) && objectToString(d) === '[object Date]';
+}
+exports.isDate = isDate;
+
+function isError(e) {
+ return isObject(e) &&
+ (objectToString(e) === '[object Error]' || e instanceof Error);
+}
+exports.isError = isError;
+
+function isFunction(arg) {
+ return typeof arg === 'function';
+}
+exports.isFunction = isFunction;
+
+function isPrimitive(arg) {
+ return arg === null ||
+ typeof arg === 'boolean' ||
+ typeof arg === 'number' ||
+ typeof arg === 'string' ||
+ typeof arg === 'symbol' || // ES6 symbol
+ typeof arg === 'undefined';
+}
+exports.isPrimitive = isPrimitive;
+
+exports.isBuffer = __webpack_require__(/*! ./support/isBuffer */ "./node_modules/util/support/isBufferBrowser.js");
+
+function objectToString(o) {
+ return Object.prototype.toString.call(o);
+}
+
+
+function pad(n) {
+ return n < 10 ? '0' + n.toString(10) : n.toString(10);
+}
+
+
+var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
+ 'Oct', 'Nov', 'Dec'];
+
+// 26 Feb 16:19:34
+function timestamp() {
+ var d = new Date();
+ var time = [pad(d.getHours()),
+ pad(d.getMinutes()),
+ pad(d.getSeconds())].join(':');
+ return [d.getDate(), months[d.getMonth()], time].join(' ');
+}
+
+
+// log is just a thin wrapper to console.log that prepends a timestamp
+exports.log = function() {
+ console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
+};
+
+
+/**
+ * Inherit the prototype methods from one constructor into another.
+ *
+ * The Function.prototype.inherits from lang.js rewritten as a standalone
+ * function (not on Function.prototype). NOTE: If this file is to be loaded
+ * during bootstrapping this function needs to be rewritten using some native
+ * functions as prototype setup using normal JavaScript does not work as
+ * expected during bootstrapping (see mirror.js in r114903).
+ *
+ * @param {function} ctor Constructor function which needs to inherit the
+ * prototype.
+ * @param {function} superCtor Constructor function to inherit prototype from.
+ */
+exports.inherits = __webpack_require__(/*! inherits */ "./node_modules/inherits/inherits_browser.js");
+
+exports._extend = function(origin, add) {
+ // Don't do anything if add isn't an object
+ if (!add || !isObject(add)) return origin;
+
+ var keys = Object.keys(add);
+ var i = keys.length;
+ while (i--) {
+ origin[keys[i]] = add[keys[i]];
+ }
+ return origin;
+};
+
+function hasOwnProperty(obj, prop) {
+ return Object.prototype.hasOwnProperty.call(obj, prop);
+}
+
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"), __webpack_require__(/*! ./../process/browser.js */ "./node_modules/process/browser.js")))
+
+/***/ }),
+
+/***/ "./node_modules/webpack/buildin/global.js":
+/*!***********************************!*\
+ !*** (webpack)/buildin/global.js ***!
+ \***********************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+var g;
+
+// This works in non-strict mode
+g = (function() {
+ return this;
+})();
+
+try {
+ // This works if eval is allowed (see CSP)
+ g = g || Function("return this")() || (1, eval)("this");
+} catch (e) {
+ // This works if the window reference is available
+ if (typeof window === "object") g = window;
+}
+
+// g can still be undefined, but nothing to do about it...
+// We return undefined, instead of nothing here, so it's
+// easier to handle this case. if(!global) { ...}
+
+module.exports = g;
+
+
+/***/ }),
+
+/***/ 0:
+/*!**********************!*\
+ !*** util (ignored) ***!
+ \**********************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/* (ignored) */
+
+/***/ }),
+
+/***/ 1:
+/*!**********************!*\
+ !*** util (ignored) ***!
+ \**********************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/* (ignored) */
+
+/***/ })
+
+/******/ });
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vQm9vdC5TZXJ2ZXIudHMiLCJ3ZWJwYWNrOi8vLy4vQm9vdENvbW1vbi50cyIsIndlYnBhY2s6Ly8vLi9FbnZpcm9ubWVudC50cyIsIndlYnBhY2s6Ly8vLi9HbG9iYWxFeHBvcnRzLnRzIiwid2VicGFjazovLy8uL1BsYXRmb3JtL0NpcmN1aXRzL0F1dG9SZWNvbm5lY3RDaXJjdWl0SGFuZGxlci50cyIsIndlYnBhY2s6Ly8vLi9QbGF0Zm9ybS9DaXJjdWl0cy9EZWZhdWx0UmVjb25uZWN0RGlzcGxheS50cyIsIndlYnBhY2s6Ly8vLi9QbGF0Zm9ybS9DaXJjdWl0cy9Vc2VyU3BlY2lmaWVkRGlzcGxheS50cyIsIndlYnBhY2s6Ly8vLi9SZW5kZXJpbmcvQnJvd3NlclJlbmRlcmVyLnRzIiwid2VicGFjazovLy8uL1JlbmRlcmluZy9FbGVtZW50UmVmZXJlbmNlQ2FwdHVyZS50cyIsIndlYnBhY2s6Ly8vLi9SZW5kZXJpbmcvRXZlbnREZWxlZ2F0b3IudHMiLCJ3ZWJwYWNrOi8vLy4vUmVuZGVyaW5nL0V2ZW50Rm9yRG90TmV0LnRzIiwid2VicGFjazovLy8uL1JlbmRlcmluZy9Mb2dpY2FsRWxlbWVudHMudHMiLCJ3ZWJwYWNrOi8vLy4vUmVuZGVyaW5nL1JlbmRlckJhdGNoL091dE9mUHJvY2Vzc1JlbmRlckJhdGNoLnRzIiwid2VicGFjazovLy8uL1JlbmRlcmluZy9SZW5kZXJCYXRjaC9SZW5kZXJCYXRjaC50cyIsIndlYnBhY2s6Ly8vLi9SZW5kZXJpbmcvUmVuZGVyQmF0Y2gvVXRmOERlY29kZXIudHMiLCJ3ZWJwYWNrOi8vLy4vUmVuZGVyaW5nL1JlbmRlcmVyLnRzIiwid2VicGFjazovLy8uL1NlcnZpY2VzL0h0dHAudHMiLCJ3ZWJwYWNrOi8vLy4vU2VydmljZXMvVXJpSGVscGVyLnRzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYXNwbmV0L3NpZ25hbHItcHJvdG9jb2wtbXNncGFjay9kaXN0L2VzbS9CaW5hcnlNZXNzYWdlRm9ybWF0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYXNwbmV0L3NpZ25hbHItcHJvdG9jb2wtbXNncGFjay9kaXN0L2VzbS9NZXNzYWdlUGFja0h1YlByb3RvY29sLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYXNwbmV0L3NpZ25hbHItcHJvdG9jb2wtbXNncGFjay9kaXN0L2VzbS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFzcG5ldC9zaWduYWxyL2Rpc3QvZXNtL0Fib3J0Q29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFzcG5ldC9zaWduYWxyL2Rpc3QvZXNtL0Vycm9ycy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFzcG5ldC9zaWduYWxyL2Rpc3QvZXNtL0hhbmRzaGFrZVByb3RvY29sLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYXNwbmV0L3NpZ25hbHIvZGlzdC9lc20vSHR0cENsaWVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFzcG5ldC9zaWduYWxyL2Rpc3QvZXNtL0h0dHBDb25uZWN0aW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYXNwbmV0L3NpZ25hbHIvZGlzdC9lc20vSHViQ29ubmVjdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFzcG5ldC9zaWduYWxyL2Rpc3QvZXNtL0h1YkNvbm5lY3Rpb25CdWlsZGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYXNwbmV0L3NpZ25hbHIvZGlzdC9lc20vSUh1YlByb3RvY29sLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYXNwbmV0L3NpZ25hbHIvZGlzdC9lc20vSUxvZ2dlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFzcG5ldC9zaWduYWxyL2Rpc3QvZXNtL0lUcmFuc3BvcnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bhc3BuZXQvc2lnbmFsci9kaXN0L2VzbS9Kc29uSHViUHJvdG9jb2wuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bhc3BuZXQvc2lnbmFsci9kaXN0L2VzbS9Mb2dnZXJzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYXNwbmV0L3NpZ25hbHIvZGlzdC9lc20vTG9uZ1BvbGxpbmdUcmFuc3BvcnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bhc3BuZXQvc2lnbmFsci9kaXN0L2VzbS9TZXJ2ZXJTZW50RXZlbnRzVHJhbnNwb3J0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYXNwbmV0L3NpZ25hbHIvZGlzdC9lc20vVGV4dE1lc3NhZ2VGb3JtYXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bhc3BuZXQvc2lnbmFsci9kaXN0L2VzbS9VdGlscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFzcG5ldC9zaWduYWxyL2Rpc3QvZXNtL1dlYlNvY2tldFRyYW5zcG9ydC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFzcG5ldC9zaWduYWxyL2Rpc3QvZXNtL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AZG90bmV0L2pzaW50ZXJvcC9kaXN0L01pY3Jvc29mdC5KU0ludGVyb3AuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2Fzc2VydC9hc3NlcnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2Jhc2U2NC1qcy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYmwvYmwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2JsL25vZGVfbW9kdWxlcy9zYWZlLWJ1ZmZlci9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYnVmZmVyL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLXV0aWwtaXMvbGliL3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2V2ZW50cy9ldmVudHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2llZWU3NTQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2lzYXJyYXkvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL21zZ3BhY2s1L2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9tc2dwYWNrNS9saWIvZGVjb2Rlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbXNncGFjazUvbGliL2VuY29kZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL21zZ3BhY2s1L2xpYi9zdHJlYW1zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wcm9jZXNzLW5leHRpY2stYXJncy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fZHVwbGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fcGFzc3Rocm91Z2guanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9yZWFkYWJsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3RyYW5zZm9ybS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3dyaXRhYmxlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvQnVmZmVyTGlzdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2Rlc3Ryb3kuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9zdHJlYW0tYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL3JlYWRhYmxlLWJyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NhZmUtYnVmZmVyL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zZXRpbW1lZGlhdGUvc2V0SW1tZWRpYXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zdHJpbmdfZGVjb2Rlci9saWIvc3RyaW5nX2RlY29kZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3RpbWVycy1icm93c2VyaWZ5L21haW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdXRpbC1kZXByZWNhdGUvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdXRpbC9zdXBwb3J0L2lzQnVmZmVyQnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdXRpbC91dGlsLmpzIiwid2VicGFjazovLy8od2VicGFjaykvYnVpbGRpbi9nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vL3V0aWwgKGlnbm9yZWQpIiwid2VicGFjazovLy91dGlsIChpZ25vcmVkKT8xODNiIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUFDQTtBQUNBLCtEQUErRCxnQ0FBZ0M7QUFDL0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2RUFBNkUsc0VBQTBCLEVBQUU7QUFDekc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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Q0E7QUFDQTtBQUNBLHNFQUFzRSxhQUFhLEVBQUU7QUFDckY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBLENBQUM7QUFDTztBQUNSLGdEOzs7Ozs7Ozs7Ozs7Ozs7OztBQzdOQTtBQUFBO0FBQ0E7QUFDQTtBQUNtQjtBQUNNO0FBQ2lCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBLHNFQUFzRSxhQUFhLEVBQUU7QUFDckY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdFQUF3RSx3QkFBd0I7QUFDaEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDTztBQUNSLHFEOzs7Ozs7Ozs7Ozs7O0FDekdBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDTztBQUNSLDZDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3RCQTtBQUFBO0FBQ0E7QUFDQTtBQUNtQjtBQUNFO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDTztBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLGdCQUFnQjtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLGdCQUFnQjtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxnQkFBZ0I7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDTztBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0EsbURBQW1EOztBQUVuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEIsZ0RBQWdEOztBQUVoRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0gsc0JBQXNCOztBQUV0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLFFBQVE7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixRQUFRO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSx5QkFBeUI7QUFDekI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FB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QTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQSxRQUFRLHVCQUF1QjtBQUMvQjs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxDQUFDOzs7QUFHRDs7Ozs7Ozs7Ozs7O0FDclNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQzdEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixtREFBbUQ7QUFDeEU7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixVQUFVO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixZQUFZO0FBQzdCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUEsdUNBQXVDLFNBQVM7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxpQkFBaUI7QUFDaEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhLGlCQUFpQjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFNBQVM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFNBQVM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0QsRUFBRTtBQUNsRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsZUFBZTtBQUN2QztBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSx3QkFBd0IsUUFBUTtBQUNoQztBQUNBLHFCQUFxQixlQUFlO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixZQUFZO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxxQkFBcUIsU0FBUztBQUM5QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEscUJBQXFCLFNBQVM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EscUJBQXFCLFNBQVM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLGtCQUFrQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsbUJBQW1CLGNBQWM7QUFDakM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHVEQUF1RCxPQUFPO0FBQzlEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1REFBdUQsT0FBTztBQUM5RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0I7QUFDbEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxxQkFBcUIsUUFBUTtBQUM3QjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsbUJBQW1CLFNBQVM7QUFDNUI7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsaUJBQWlCO0FBQ2hDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUJBQWlCLFlBQVk7QUFDN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlCQUFpQixnQkFBZ0I7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsZ0JBQWdCO0FBQ2pDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQixZQUFZO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDNXZEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQzFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7QUFDSCxvQkFBb0IsU0FBUztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDN1NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLFdBQVc7O0FBRW5CO0FBQ0E7QUFDQTtBQUNBLFFBQVEsV0FBVzs7QUFFbkI7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFFBQVEsV0FBVzs7QUFFbkI7QUFDQTtBQUNBLFFBQVEsVUFBVTs7QUFFbEI7QUFDQTs7Ozs7Ozs7Ozs7O0FDbkZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUN0QkEsaUJBQWlCOztBQUVqQjtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNKQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7OztBQ3BGQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLGNBQWM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw4QkFBOEIsYUFBYTtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxZQUFZO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxZQUFZO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZUFBZSwwQkFBMEI7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7OztBQ25iQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxlQUFlLDBCQUEwQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esd0JBQXdCLGVBQWU7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDRCQUE0QixhQUFhO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDOVVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7Ozs7Ozs7OytDQ3pGQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEIsQ0FBQztBQUNEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDMUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsc0JBQXNCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQ0FBcUM7O0FBRXJDO0FBQ0E7QUFDQTs7QUFFQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLFVBQVU7Ozs7Ozs7Ozs7Ozs7QUN2THRDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsaUJBQWlCO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFOzs7Ozs7Ozs7Ozs7QUNsSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFOzs7Ozs7Ozs7Ozs7QUM5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5RUFBeUUsNkVBQTZFO0FBQ3RKOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlEQUFpRCwwRkFBMEY7O0FBRTNJO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtHQUFrRztBQUNsRyxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsNEZBQTRGO0FBQzVGLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLGdEQUFnRDs7QUFFaEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEVBQTRFO0FBQzVFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQ7QUFDN0Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNDQUFzQzs7QUFFdEM7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RDtBQUN4RDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSw0Q0FBNEM7O0FBRTVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9CQUFvQjs7QUFFcEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQkFBbUIsU0FBUztBQUM1QjtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNEVBQTRFOztBQUU1RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUIseUJBQXlCO0FBQzFDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1EQUFtRDtBQUNuRDtBQUNBLG1EQUFtRCxpRUFBaUU7QUFDcEg7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkMsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkMsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGdDQUFnQyxPQUFPO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBLEM7Ozs7Ozs7Ozs7Ozs7QUMxL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsWUFBWTtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxDOzs7Ozs7Ozs7Ozs7QUNyTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpREFBaUQsMEZBQTBGOztBQUUzSTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMLEdBQUc7QUFDSCxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpQ0FBaUM7O0FBRWpDOztBQUVBLDJDQUEyQztBQUMzQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1EO0FBQ25EO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLG9EQUFvRDtBQUNwRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFOzs7Ozs7Ozs7Ozs7O0FDOXFCQTs7QUFFQSxpREFBaUQsMENBQTBDLDBEQUEwRCxFQUFFOztBQUV2SjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUI7QUFDakIsZ0RBQWdEO0FBQ2hEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3REFBd0Q7QUFDeEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBLDRCQUE0QixzQkFBc0I7QUFDbEQ7QUFDQTtBQUNBLEM7Ozs7Ozs7Ozs7OztBQzlFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFOzs7Ozs7Ozs7OztBQ3pFQTs7Ozs7Ozs7Ozs7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ05BO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDN0RBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixpQkFBaUI7QUFDdEM7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDBDQUEwQyxzQkFBc0IsRUFBRTtBQUNsRTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUN6TEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsc0NBQXNDLHNDQUFzQztBQUN6RztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQzs7Ozs7Ozs7Ozs7QUN2U0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM5REE7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QUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNENBQTRDLEtBQUs7O0FBRWpEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQSxtQ0FBbUMsT0FBTztBQUMxQztBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOzs7QUFHQTtBQUNBO0FBQ0EseURBQXlEO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQ3prQkE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw0Q0FBNEM7O0FBRTVDOzs7Ozs7Ozs7Ozs7QUNuQkEsZTs7Ozs7Ozs7Ozs7QUNBQSxlIiwiZmlsZSI6ImNvbXBvbmVudHMuc2VydmVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9Cb290LlNlcnZlci50c1wiKTtcbiIsImltcG9ydCAnQGRvdG5ldC9qc2ludGVyb3AnO1xuaW1wb3J0ICcuL0dsb2JhbEV4cG9ydHMnO1xuaW1wb3J0ICogYXMgc2lnbmFsUiBmcm9tICdAYXNwbmV0L3NpZ25hbHInO1xuaW1wb3J0IHsgTWVzc2FnZVBhY2tIdWJQcm90b2NvbCB9IGZyb20gJ0Bhc3BuZXQvc2lnbmFsci1wcm90b2NvbC1tc2dwYWNrJztcbmltcG9ydCB7IE91dE9mUHJvY2Vzc1JlbmRlckJhdGNoIH0gZnJvbSAnLi9SZW5kZXJpbmcvUmVuZGVyQmF0Y2gvT3V0T2ZQcm9jZXNzUmVuZGVyQmF0Y2gnO1xuaW1wb3J0IHsgaW50ZXJuYWxGdW5jdGlvbnMgYXMgdXJpSGVscGVyRnVuY3Rpb25zIH0gZnJvbSAnLi9TZXJ2aWNlcy9VcmlIZWxwZXInO1xuaW1wb3J0IHsgcmVuZGVyQmF0Y2ggfSBmcm9tICcuL1JlbmRlcmluZy9SZW5kZXJlcic7XG5pbXBvcnQgeyBmZXRjaEJvb3RDb25maWdBc3luYywgbG9hZEVtYmVkZGVkUmVzb3VyY2VzQXN5bmMgfSBmcm9tICcuL0Jvb3RDb21tb24nO1xuaW1wb3J0IHsgQ2lyY3VpdEhhbmRsZXIgfSBmcm9tICcuL1BsYXRmb3JtL0NpcmN1aXRzL0NpcmN1aXRIYW5kbGVyJztcbmltcG9ydCB7IEF1dG9SZWNvbm5lY3RDaXJjdWl0SGFuZGxlciB9IGZyb20gJy4vUGxhdGZvcm0vQ2lyY3VpdHMvQXV0b1JlY29ubmVjdENpcmN1aXRIYW5kbGVyJztcblxuYXN5bmMgZnVuY3Rpb24gYm9vdCgpIHtcbiAgY29uc3QgY2lyY3VpdEhhbmRsZXJzOiBDaXJjdWl0SGFuZGxlcltdID0gWyBuZXcgQXV0b1JlY29ubmVjdENpcmN1aXRIYW5kbGVyKCkgXTtcbiAgd2luZG93WydCbGF6b3InXS5jaXJjdWl0SGFuZGxlcnMgPSBjaXJjdWl0SGFuZGxlcnM7XG5cbiAgLy8gSW4gdGhlIGJhY2tncm91bmQsIHN0YXJ0IGxvYWRpbmcgdGhlIGJvb3QgY29uZmlnIGFuZCBhbnkgZW1iZWRkZWQgcmVzb3VyY2VzXG4gIGNvbnN0IGVtYmVkZGVkUmVzb3VyY2VzUHJvbWlzZSA9IGZldGNoQm9vdENvbmZpZ0FzeW5jKCkudGhlbihib290Q29uZmlnID0+IHtcbiAgICByZXR1cm4gbG9hZEVtYmVkZGVkUmVzb3VyY2VzQXN5bmMoYm9vdENvbmZpZyk7XG4gIH0pO1xuXG4gIGNvbnN0IGluaXRpYWxDb25uZWN0aW9uID0gYXdhaXQgaW5pdGlhbGl6ZUNvbm5lY3Rpb24oY2lyY3VpdEhhbmRsZXJzKTtcblxuICAvLyBFbnN1cmUgYW55IGVtYmVkZGVkIHJlc291cmNlcyBoYXZlIGJlZW4gbG9hZGVkIGJlZm9yZSBzdGFydGluZyB0aGUgYXBwXG4gIGF3YWl0IGVtYmVkZGVkUmVzb3VyY2VzUHJvbWlzZTtcbiAgY29uc3QgY2lyY3VpdElkID0gYXdhaXQgaW5pdGlhbENvbm5lY3Rpb24uaW52b2tlPHN0cmluZz4oXG4gICAgJ1N0YXJ0Q2lyY3VpdCcsXG4gICAgdXJpSGVscGVyRnVuY3Rpb25zLmdldExvY2F0aW9uSHJlZigpLFxuICAgIHVyaUhlbHBlckZ1bmN0aW9ucy5nZXRCYXNlVVJJKClcbiAgKTtcblxuICB3aW5kb3dbJ0JsYXpvciddLnJlY29ubmVjdCA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZWNvbm5lY3Rpb24gPSBhd2FpdCBpbml0aWFsaXplQ29ubmVjdGlvbihjaXJjdWl0SGFuZGxlcnMpO1xuICAgIGlmICghKGF3YWl0IHJlY29ubmVjdGlvbi5pbnZva2U8Qm9vbGVhbj4oJ0Nvbm5lY3RDaXJjdWl0JywgY2lyY3VpdElkKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjaXJjdWl0SGFuZGxlcnMuZm9yRWFjaChoID0+IGgub25Db25uZWN0aW9uVXAgJiYgaC5vbkNvbm5lY3Rpb25VcCgpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICBjaXJjdWl0SGFuZGxlcnMuZm9yRWFjaChoID0+IGgub25Db25uZWN0aW9uVXAgJiYgaC5vbkNvbm5lY3Rpb25VcCgpKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaW5pdGlhbGl6ZUNvbm5lY3Rpb24oY2lyY3VpdEhhbmRsZXJzOiBDaXJjdWl0SGFuZGxlcltdKTogUHJvbWlzZTxzaWduYWxSLkh1YkNvbm5lY3Rpb24+IHtcbiAgY29uc3QgY29ubmVjdGlvbiA9IG5ldyBzaWduYWxSLkh1YkNvbm5lY3Rpb25CdWlsZGVyKClcbiAgICAud2l0aFVybCgnX2JsYXpvcicpXG4gICAgLndpdGhIdWJQcm90b2NvbChuZXcgTWVzc2FnZVBhY2tIdWJQcm90b2NvbCgpKVxuICAgIC5jb25maWd1cmVMb2dnaW5nKHNpZ25hbFIuTG9nTGV2ZWwuSW5mb3JtYXRpb24pXG4gICAgLmJ1aWxkKCk7XG5cbiAgY29ubmVjdGlvbi5vbignSlMuQmVnaW5JbnZva2VKUycsIERvdE5ldC5qc0NhbGxEaXNwYXRjaGVyLmJlZ2luSW52b2tlSlNGcm9tRG90TmV0KTtcbiAgY29ubmVjdGlvbi5vbignSlMuUmVuZGVyQmF0Y2gnLCAoYnJvd3NlclJlbmRlcmVySWQ6IG51bWJlciwgcmVuZGVySWQ6IG51bWJlciwgYmF0Y2hEYXRhOiBVaW50OEFycmF5KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJlbmRlckJhdGNoKGJyb3dzZXJSZW5kZXJlcklkLCBuZXcgT3V0T2ZQcm9jZXNzUmVuZGVyQmF0Y2goYmF0Y2hEYXRhKSk7XG4gICAgICBjb25uZWN0aW9uLnNlbmQoJ09uUmVuZGVyQ29tcGxldGVkJywgcmVuZGVySWQsIG51bGwpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAvLyBJZiB0aGVyZSdzIGEgcmVuZGVyaW5nIGV4Y2VwdGlvbiwgbm90aWZ5IHNlcnZlciAqYW5kKiB0aHJvdyBvbiBjbGllbnRcbiAgICAgIGNvbm5lY3Rpb24uc2VuZCgnT25SZW5kZXJDb21wbGV0ZWQnLCByZW5kZXJJZCwgZXgudG9TdHJpbmcoKSk7XG4gICAgICB0aHJvdyBleDtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbm5lY3Rpb24ub25jbG9zZShlcnJvciA9PiBjaXJjdWl0SGFuZGxlcnMuZm9yRWFjaChoID0+IGgub25Db25uZWN0aW9uRG93biAmJiBoLm9uQ29ubmVjdGlvbkRvd24oZXJyb3IpKSk7XG4gIGNvbm5lY3Rpb24ub24oJ0pTLkVycm9yJywgZXJyb3IgPT4gdW5oYW5kbGVkRXJyb3IoY29ubmVjdGlvbiwgZXJyb3IpKTtcblxuICB3aW5kb3dbJ0JsYXpvciddLl9pbnRlcm5hbC5mb3JjZUNsb3NlQ29ubmVjdGlvbiA9ICgpID0+IGNvbm5lY3Rpb24uc3RvcCgpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgY29ubmVjdGlvbi5zdGFydCgpO1xuICB9IGNhdGNoIChleCkge1xuICAgIHVuaGFuZGxlZEVycm9yKGNvbm5lY3Rpb24sIGV4KTtcbiAgfVxuXG4gIERvdE5ldC5hdHRhY2hEaXNwYXRjaGVyKHtcbiAgICBiZWdpbkludm9rZURvdE5ldEZyb21KUzogKGNhbGxJZCwgYXNzZW1ibHlOYW1lLCBtZXRob2RJZGVudGlmaWVyLCBkb3ROZXRPYmplY3RJZCwgYXJnc0pzb24pID0+IHtcbiAgICAgIGNvbm5lY3Rpb24uc2VuZCgnQmVnaW5JbnZva2VEb3ROZXRGcm9tSlMnLCBjYWxsSWQgPyBjYWxsSWQudG9TdHJpbmcoKSA6IG51bGwsIGFzc2VtYmx5TmFtZSwgbWV0aG9kSWRlbnRpZmllciwgZG90TmV0T2JqZWN0SWQgfHwgMCwgYXJnc0pzb24pO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGNvbm5lY3Rpb247XG59XG5cbmZ1bmN0aW9uIHVuaGFuZGxlZEVycm9yKGNvbm5lY3Rpb246IHNpZ25hbFIuSHViQ29ubmVjdGlvbiwgZXJyOiBFcnJvcikge1xuICBjb25zb2xlLmVycm9yKGVycik7XG5cbiAgLy8gRGlzY29ubmVjdCBvbiBlcnJvcnMuXG4gIC8vXG4gIC8vIFRyeWluZyB0byBjYWxsIG1ldGhvZHMgb24gdGhlIGNvbm5lY3Rpb24gYWZ0ZXIgaXRzIGJlZW4gY2xvc2VkIHdpbGwgdGhyb3cuXG4gIGlmIChjb25uZWN0aW9uKSB7XG4gICAgY29ubmVjdGlvbi5zdG9wKCk7XG4gIH1cbn1cblxuYm9vdCgpO1xuIiwiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoQm9vdENvbmZpZ0FzeW5jKCkge1xuICAvLyBMYXRlciB3ZSBtaWdodCBtYWtlIHRoZSBsb2NhdGlvbiBvZiB0aGlzIGNvbmZpZ3VyYWJsZSAoZS5nLiwgYXMgYW4gYXR0cmlidXRlIG9uIHRoZSA8c2NyaXB0PlxuICAvLyBlbGVtZW50IHRoYXQncyBpbXBvcnRpbmcgdGhpcyBmaWxlKSwgYnV0IGN1cnJlbnRseSB0aGVyZSBpc24ndCBhIHVzZSBjYXNlIGZvciB0aGF0LlxuICBjb25zdCBib290Q29uZmlnUmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnX2ZyYW1ld29yay9ibGF6b3IuYm9vdC5qc29uJywgeyBtZXRob2Q6ICdHZXQnLCBjcmVkZW50aWFsczogJ2luY2x1ZGUnIH0pO1xuICByZXR1cm4gYm9vdENvbmZpZ1Jlc3BvbnNlLmpzb24oKSBhcyBQcm9taXNlPEJvb3RKc29uRGF0YT47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkRW1iZWRkZWRSZXNvdXJjZXNBc3luYyhib290Q29uZmlnOiBCb290SnNvbkRhdGEpOiBQcm9taXNlPGFueT4ge1xuICBjb25zdCBjc3NMb2FkaW5nUHJvbWlzZXMgPSBib290Q29uZmlnLmNzc1JlZmVyZW5jZXMubWFwKGNzc1JlZmVyZW5jZSA9PiB7XG4gICAgY29uc3QgbGlua0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgbGlua0VsZW1lbnQucmVsID0gJ3N0eWxlc2hlZXQnO1xuICAgIGxpbmtFbGVtZW50LmhyZWYgPSBjc3NSZWZlcmVuY2U7XG4gICAgcmV0dXJuIGxvYWRSZXNvdXJjZUZyb21FbGVtZW50KGxpbmtFbGVtZW50KTtcbiAgfSk7XG4gIGNvbnN0IGpzTG9hZGluZ1Byb21pc2VzID0gYm9vdENvbmZpZy5qc1JlZmVyZW5jZXMubWFwKGpzUmVmZXJlbmNlID0+IHtcbiAgICBjb25zdCBzY3JpcHRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgc2NyaXB0RWxlbWVudC5zcmMgPSBqc1JlZmVyZW5jZTtcbiAgICByZXR1cm4gbG9hZFJlc291cmNlRnJvbUVsZW1lbnQoc2NyaXB0RWxlbWVudCk7XG4gIH0pO1xuICByZXR1cm4gUHJvbWlzZS5hbGwoY3NzTG9hZGluZ1Byb21pc2VzLmNvbmNhdChqc0xvYWRpbmdQcm9taXNlcykpO1xufVxuXG5mdW5jdGlvbiBsb2FkUmVzb3VyY2VGcm9tRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGVsZW1lbnQub25sb2FkID0gcmVzb2x2ZTtcbiAgICBlbGVtZW50Lm9uZXJyb3IgPSByZWplY3Q7XG4gICAgZG9jdW1lbnQuaGVhZCEuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gIH0pO1xufVxuXG4vLyBLZWVwIGluIHN5bmMgd2l0aCBCb290SnNvbkRhdGEgaW4gTWljcm9zb2Z0LkFzcE5ldENvcmUuQmxhem9yLkJ1aWxkXG5pbnRlcmZhY2UgQm9vdEpzb25EYXRhIHtcbiAgbWFpbjogc3RyaW5nO1xuICBlbnRyeVBvaW50OiBzdHJpbmc7XG4gIGFzc2VtYmx5UmVmZXJlbmNlczogc3RyaW5nW107XG4gIGNzc1JlZmVyZW5jZXM6IHN0cmluZ1tdO1xuICBqc1JlZmVyZW5jZXM6IHN0cmluZ1tdO1xuICBsaW5rZXJFbmFibGVkOiBib29sZWFuO1xufVxuIiwiLy8gRXhwb3NlIGFuIGV4cG9ydCBjYWxsZWQgJ3BsYXRmb3JtJyBvZiB0aGUgaW50ZXJmYWNlIHR5cGUgJ1BsYXRmb3JtJyxcbi8vIHNvIHRoYXQgY29uc3VtZXJzIGNhbiBiZSBhZ25vc3RpYyBhYm91dCB3aGljaCBpbXBsZW1lbnRhdGlvbiB0aGV5IHVzZS5cbi8vIEJhc2ljIGFsdGVybmF0aXZlIHRvIGhhdmluZyBhbiBhY3R1YWwgREkgY29udGFpbmVyLlxuaW1wb3J0IHsgUGxhdGZvcm0gfSBmcm9tICcuL1BsYXRmb3JtL1BsYXRmb3JtJztcblxuZXhwb3J0IGxldCBwbGF0Zm9ybTogUGxhdGZvcm07XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRQbGF0Zm9ybShwbGF0Zm9ybUluc3RhbmNlOiBQbGF0Zm9ybSkge1xuICBwbGF0Zm9ybSA9IHBsYXRmb3JtSW5zdGFuY2U7XG4gIHJldHVybiBwbGF0Zm9ybTtcbn1cbiIsImltcG9ydCB7IHBsYXRmb3JtIH0gZnJvbSAnLi9FbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBuYXZpZ2F0ZVRvLCBpbnRlcm5hbEZ1bmN0aW9ucyBhcyB1cmlIZWxwZXJJbnRlcm5hbEZ1bmN0aW9ucyB9IGZyb20gJy4vU2VydmljZXMvVXJpSGVscGVyJztcbmltcG9ydCB7IGludGVybmFsRnVuY3Rpb25zIGFzIGh0dHBJbnRlcm5hbEZ1bmN0aW9ucyB9IGZyb20gJy4vU2VydmljZXMvSHR0cCc7XG5pbXBvcnQgeyBhdHRhY2hSb290Q29tcG9uZW50VG9FbGVtZW50IH0gZnJvbSAnLi9SZW5kZXJpbmcvUmVuZGVyZXInO1xuaW1wb3J0IHsgUG9pbnRlciB9IGZyb20gJy4vUGxhdGZvcm0vUGxhdGZvcm0nO1xuXG4vLyBNYWtlIHRoZSBmb2xsb3dpbmcgQVBJcyBhdmFpbGFibGUgaW4gZ2xvYmFsIHNjb3BlIGZvciBpbnZvY2F0aW9uIGZyb20gSlNcbndpbmRvd1snQmxhem9yJ10gPSB7XG4gIG5hdmlnYXRlVG8sXG5cbiAgX2ludGVybmFsOiB7XG4gICAgYXR0YWNoUm9vdENvbXBvbmVudFRvRWxlbWVudCxcbiAgICBodHRwOiBodHRwSW50ZXJuYWxGdW5jdGlvbnMsXG4gICAgdXJpSGVscGVyOiB1cmlIZWxwZXJJbnRlcm5hbEZ1bmN0aW9uc1xuICB9XG59O1xuIiwiaW1wb3J0IHsgQ2lyY3VpdEhhbmRsZXIgfSBmcm9tICcuL0NpcmN1aXRIYW5kbGVyJztcbmltcG9ydCB7IFVzZXJTcGVjaWZpZWREaXNwbGF5IH0gZnJvbSAnLi9Vc2VyU3BlY2lmaWVkRGlzcGxheSc7XG5pbXBvcnQgeyBEZWZhdWx0UmVjb25uZWN0RGlzcGxheSB9IGZyb20gJy4vRGVmYXVsdFJlY29ubmVjdERpc3BsYXknO1xuaW1wb3J0IHsgUmVjb25uZWN0RGlzcGxheSB9IGZyb20gJy4vUmVjb25uZWN0RGlzcGxheSc7XG5leHBvcnQgY2xhc3MgQXV0b1JlY29ubmVjdENpcmN1aXRIYW5kbGVyIGltcGxlbWVudHMgQ2lyY3VpdEhhbmRsZXIge1xuICBzdGF0aWMgcmVhZG9ubHkgTWF4UmV0cmllcyA9IDU7XG4gIHN0YXRpYyByZWFkb25seSBSZXRyeUludGVydmFsID0gMzAwMDtcbiAgc3RhdGljIHJlYWRvbmx5IERpYWxvZ0lkID0gJ2NvbXBvbmVudHMtcmVjb25uZWN0LW1vZGFsJztcbiAgcmVjb25uZWN0RGlzcGxheTogUmVjb25uZWN0RGlzcGxheTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnJlY29ubmVjdERpc3BsYXkgPSBuZXcgRGVmYXVsdFJlY29ubmVjdERpc3BsYXkoZG9jdW1lbnQpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKEF1dG9SZWNvbm5lY3RDaXJjdWl0SGFuZGxlci5EaWFsb2dJZCk7XG4gICAgICBpZiAobW9kYWwpIHtcbiAgICAgICAgdGhpcy5yZWNvbm5lY3REaXNwbGF5ID0gbmV3IFVzZXJTcGVjaWZpZWREaXNwbGF5KG1vZGFsKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBvbkNvbm5lY3Rpb25VcCgpICA6IHZvaWR7XG4gICAgdGhpcy5yZWNvbm5lY3REaXNwbGF5LmhpZGUoKTtcbiAgfVxuXG4gIGRlbGF5KCkgOiBQcm9taXNlPHZvaWQ+e1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBBdXRvUmVjb25uZWN0Q2lyY3VpdEhhbmRsZXIuUmV0cnlJbnRlcnZhbCkpO1xuICB9XG5cbiAgYXN5bmMgb25Db25uZWN0aW9uRG93bigpIDogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5yZWNvbm5lY3REaXNwbGF5LnNob3coKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgQXV0b1JlY29ubmVjdENpcmN1aXRIYW5kbGVyLk1heFJldHJpZXM7IGkrKykge1xuICAgICAgYXdhaXQgdGhpcy5kZWxheSgpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2luZG93WydCbGF6b3InXS5yZWNvbm5lY3QoKTtcbiAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgc2VydmVyIHJlc3BvbmRlZCBhbmQgcmVmdXNlZCB0byByZWNvbm5lY3QsIHN0b3AgYXV0by1yZXRyeWluZy5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMucmVjb25uZWN0RGlzcGxheS5mYWlsZWQoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgUmVjb25uZWN0RGlzcGxheSB9IGZyb20gXCIuL1JlY29ubmVjdERpc3BsYXlcIjtcbmltcG9ydCB7IEF1dG9SZWNvbm5lY3RDaXJjdWl0SGFuZGxlciB9IGZyb20gXCIuL0F1dG9SZWNvbm5lY3RDaXJjdWl0SGFuZGxlclwiO1xuZXhwb3J0IGNsYXNzIERlZmF1bHRSZWNvbm5lY3REaXNwbGF5IGltcGxlbWVudHMgUmVjb25uZWN0RGlzcGxheSB7XG4gIG1vZGFsOiBIVE1MRGl2RWxlbWVudDtcbiAgbWVzc2FnZTogSFRNTEhlYWRpbmdFbGVtZW50O1xuICBidXR0b246IEhUTUxCdXR0b25FbGVtZW50O1xuICBhZGRlZFRvRG9tOiBib29sZWFuID0gZmFsc2U7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZG9jdW1lbnQ6IERvY3VtZW50KSB7XG4gICAgdGhpcy5tb2RhbCA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5tb2RhbC5pZCA9IEF1dG9SZWNvbm5lY3RDaXJjdWl0SGFuZGxlci5EaWFsb2dJZDtcblxuICAgIGNvbnN0IG1vZGFsU3R5bGVzID0gW1xuICAgICAgXCJwb3NpdGlvbjogZml4ZWRcIixcbiAgICAgIFwidG9wOiAwXCIsXG4gICAgICBcInJpZ2h0OiAwXCIsXG4gICAgICBcImJvdHRvbTogMFwiLFxuICAgICAgXCJsZWZ0OiAwXCIsXG4gICAgICBcInotaW5kZXg6IDEwMDBcIixcbiAgICAgIFwiZGlzcGxheTogbm9uZVwiLFxuICAgICAgXCJvdmVyZmxvdzogaGlkZGVuXCIsXG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICNmZmZcIixcbiAgICAgIFwib3BhY2l0eTogMC44XCIsXG4gICAgICBcInRleHQtYWxpZ246IGNlbnRlclwiLFxuICAgICAgXCJmb250LXdlaWdodDogYm9sZFwiXG4gICAgXTtcblxuICAgIHRoaXMubW9kYWwuc3R5bGUuY3NzVGV4dCA9IG1vZGFsU3R5bGVzLmpvaW4oJzsnKTtcbiAgICB0aGlzLm1vZGFsLmlubmVySFRNTCA9ICc8aDUgc3R5bGU9XCJtYXJnaW4tdG9wOiAyMHB4XCI+PC9oNT48YnV0dG9uIHN0eWxlPVwibWFyZ2luOjVweCBhdXRvIDVweFwiPlJldHJ5PzwvYnV0dG9uPic7XG4gICAgdGhpcy5tZXNzYWdlID0gdGhpcy5tb2RhbC5xdWVyeVNlbGVjdG9yKCdoNScpITtcbiAgICB0aGlzLmJ1dHRvbiA9IHRoaXMubW9kYWwucXVlcnlTZWxlY3RvcignYnV0dG9uJykhO1xuXG4gICAgdGhpcy5idXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB3aW5kb3dbJ0JsYXpvciddLnJlY29ubmVjdCgpKTtcbiAgfVxuICBzaG93KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5hZGRlZFRvRG9tKSB7XG4gICAgICB0aGlzLmFkZGVkVG9Eb20gPSB0cnVlO1xuICAgICAgdGhpcy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMubW9kYWwpO1xuICAgIH1cbiAgICB0aGlzLm1vZGFsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIHRoaXMuYnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgdGhpcy5tZXNzYWdlLnRleHRDb250ZW50ID0gJ0F0dGVtcHRpbmcgdG8gcmVjb25uZWN0IHRvIHRoZSBzZXJ2ZXIuLi4nO1xuICB9XG4gIGhpZGUoKTogdm9pZCB7XG4gICAgdGhpcy5tb2RhbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB9XG4gIGZhaWxlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmJ1dHRvbi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICB0aGlzLm1lc3NhZ2UudGV4dENvbnRlbnQgPSAnRmFpbGVkIHRvIHJlY29ubmVjdCB0byB0aGUgc2VydmVyLic7XG4gIH1cbn1cbiIsImltcG9ydCB7IFJlY29ubmVjdERpc3BsYXkgfSBmcm9tIFwiLi9SZWNvbm5lY3REaXNwbGF5XCI7XG5leHBvcnQgY2xhc3MgVXNlclNwZWNpZmllZERpc3BsYXkgaW1wbGVtZW50cyBSZWNvbm5lY3REaXNwbGF5IHtcbiAgc3RhdGljIHJlYWRvbmx5IFNob3dDbGFzc05hbWUgPSAnY29tcG9uZW50cy1yZWNvbm5lY3Qtc2hvdyc7XG4gIHN0YXRpYyByZWFkb25seSBIaWRlQ2xhc3NOYW1lID0gJ2NvbXBvbmVudHMtcmVjb25uZWN0LWhpZGUnO1xuICBzdGF0aWMgcmVhZG9ubHkgRmFpbGVkQ2xhc3NOYW1lID0gJ2NvbXBvbmVudHMtcmVjb25uZWN0LWZhaWxlZCc7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZGlhbG9nOiBIVE1MRWxlbWVudCkge1xuICB9XG4gIHNob3coKTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVDbGFzc2VzKCk7XG4gICAgdGhpcy5kaWFsb2cuY2xhc3NMaXN0LmFkZChVc2VyU3BlY2lmaWVkRGlzcGxheS5TaG93Q2xhc3NOYW1lKTtcbiAgfVxuICBoaWRlKCk6IHZvaWQge1xuICAgIHRoaXMucmVtb3ZlQ2xhc3NlcygpO1xuICAgIHRoaXMuZGlhbG9nLmNsYXNzTGlzdC5hZGQoVXNlclNwZWNpZmllZERpc3BsYXkuSGlkZUNsYXNzTmFtZSk7XG4gIH1cbiAgZmFpbGVkKCk6IHZvaWQge1xuICAgIHRoaXMucmVtb3ZlQ2xhc3NlcygpO1xuICAgIHRoaXMuZGlhbG9nLmNsYXNzTGlzdC5hZGQoVXNlclNwZWNpZmllZERpc3BsYXkuRmFpbGVkQ2xhc3NOYW1lKTtcbiAgfVxuICBwcml2YXRlIHJlbW92ZUNsYXNzZXMoKSB7XG4gICAgdGhpcy5kaWFsb2cuY2xhc3NMaXN0LnJlbW92ZShVc2VyU3BlY2lmaWVkRGlzcGxheS5TaG93Q2xhc3NOYW1lLCBVc2VyU3BlY2lmaWVkRGlzcGxheS5IaWRlQ2xhc3NOYW1lLCBVc2VyU3BlY2lmaWVkRGlzcGxheS5GYWlsZWRDbGFzc05hbWUpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBSZW5kZXJCYXRjaCwgQXJyYXlTZWdtZW50LCBSZW5kZXJUcmVlRWRpdCwgUmVuZGVyVHJlZUZyYW1lLCBFZGl0VHlwZSwgRnJhbWVUeXBlLCBBcnJheVZhbHVlcyB9IGZyb20gJy4vUmVuZGVyQmF0Y2gvUmVuZGVyQmF0Y2gnO1xuaW1wb3J0IHsgRXZlbnREZWxlZ2F0b3IgfSBmcm9tICcuL0V2ZW50RGVsZWdhdG9yJztcbmltcG9ydCB7IEV2ZW50Rm9yRG90TmV0LCBVSUV2ZW50QXJncyB9IGZyb20gJy4vRXZlbnRGb3JEb3ROZXQnO1xuaW1wb3J0IHsgTG9naWNhbEVsZW1lbnQsIHRvTG9naWNhbEVsZW1lbnQsIGluc2VydExvZ2ljYWxDaGlsZCwgcmVtb3ZlTG9naWNhbENoaWxkLCBnZXRMb2dpY2FsUGFyZW50LCBnZXRMb2dpY2FsQ2hpbGQsIGNyZWF0ZUFuZEluc2VydExvZ2ljYWxDb250YWluZXIsIGlzU3ZnRWxlbWVudCB9IGZyb20gJy4vTG9naWNhbEVsZW1lbnRzJztcbmltcG9ydCB7IGFwcGx5Q2FwdHVyZUlkVG9FbGVtZW50IH0gZnJvbSAnLi9FbGVtZW50UmVmZXJlbmNlQ2FwdHVyZSc7XG5jb25zdCBzZWxlY3RWYWx1ZVByb3BuYW1lID0gJ19ibGF6b3JTZWxlY3RWYWx1ZSc7XG5jb25zdCBzaGFyZWRUZW1wbGF0ZUVsZW1Gb3JQYXJzaW5nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTtcbmNvbnN0IHNoYXJlZFN2Z0VsZW1Gb3JQYXJzaW5nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdnJyk7XG5jb25zdCBwcmV2ZW50RGVmYXVsdEV2ZW50czogeyBbZXZlbnRUeXBlOiBzdHJpbmddOiBib29sZWFuIH0gPSB7IHN1Ym1pdDogdHJ1ZSB9O1xuY29uc3Qgcm9vdENvbXBvbmVudHNQZW5kaW5nRmlyc3RSZW5kZXI6IHsgW2NvbXBvbmVudElkOiBudW1iZXJdOiBFbGVtZW50IH0gPSB7fTtcblxuZXhwb3J0IGNsYXNzIEJyb3dzZXJSZW5kZXJlciB7XG4gIHByaXZhdGUgZXZlbnREZWxlZ2F0b3I6IEV2ZW50RGVsZWdhdG9yO1xuICBwcml2YXRlIGNoaWxkQ29tcG9uZW50TG9jYXRpb25zOiB7IFtjb21wb25lbnRJZDogbnVtYmVyXTogTG9naWNhbEVsZW1lbnQgfSA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYnJvd3NlclJlbmRlcmVySWQ6IG51bWJlcikge1xuICAgIHRoaXMuZXZlbnREZWxlZ2F0b3IgPSBuZXcgRXZlbnREZWxlZ2F0b3IoKGV2ZW50LCBldmVudEhhbmRsZXJJZCwgZXZlbnRBcmdzKSA9PiB7XG4gICAgICByYWlzZUV2ZW50KGV2ZW50LCB0aGlzLmJyb3dzZXJSZW5kZXJlcklkLCBldmVudEhhbmRsZXJJZCwgZXZlbnRBcmdzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhdHRhY2hSb290Q29tcG9uZW50VG9FbGVtZW50KGNvbXBvbmVudElkOiBudW1iZXIsIGVsZW1lbnQ6IEVsZW1lbnQpIHtcbiAgICAvLyAnYWxsb3dFeGlzdGluZ0NvbnRlbnRzJyB0byBrZWVwIGFueSBwcmVyZW5kZXJlZCBjb250ZW50IHVudGlsIHdlIGRvIHRoZSBmaXJzdCBjbGllbnQtc2lkZSByZW5kZXJcbiAgICB0aGlzLmF0dGFjaENvbXBvbmVudFRvRWxlbWVudChjb21wb25lbnRJZCwgdG9Mb2dpY2FsRWxlbWVudChlbGVtZW50LCAvKiBhbGxvd0V4aXN0aW5nQ29udGVudHMgKi8gdHJ1ZSkpO1xuICAgIHJvb3RDb21wb25lbnRzUGVuZGluZ0ZpcnN0UmVuZGVyW2NvbXBvbmVudElkXSA9IGVsZW1lbnQ7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlQ29tcG9uZW50KGJhdGNoOiBSZW5kZXJCYXRjaCwgY29tcG9uZW50SWQ6IG51bWJlciwgZWRpdHM6IEFycmF5U2VnbWVudDxSZW5kZXJUcmVlRWRpdD4sIHJlZmVyZW5jZUZyYW1lczogQXJyYXlWYWx1ZXM8UmVuZGVyVHJlZUZyYW1lPikge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmNoaWxkQ29tcG9uZW50TG9jYXRpb25zW2NvbXBvbmVudElkXTtcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gZWxlbWVudCBpcyBjdXJyZW50bHkgYXNzb2NpYXRlZCB3aXRoIGNvbXBvbmVudCAke2NvbXBvbmVudElkfWApO1xuICAgIH1cblxuICAgIC8vIE9uIHRoZSBmaXJzdCByZW5kZXIgZm9yIGVhY2ggcm9vdCBjb21wb25lbnQsIGNsZWFyIGFueSBleGlzdGluZyBjb250ZW50IChlLmcuLCBwcmVyZW5kZXJlZClcbiAgICBjb25zdCByb290RWxlbWVudFRvQ2xlYXIgPSByb290Q29tcG9uZW50c1BlbmRpbmdGaXJzdFJlbmRlcltjb21wb25lbnRJZF07XG4gICAgaWYgKHJvb3RFbGVtZW50VG9DbGVhcikge1xuICAgICAgZGVsZXRlIHJvb3RDb21wb25lbnRzUGVuZGluZ0ZpcnN0UmVuZGVyW2NvbXBvbmVudElkXTtcbiAgICAgIGNsZWFyRWxlbWVudChyb290RWxlbWVudFRvQ2xlYXIpO1xuICAgIH1cblxuICAgIHRoaXMuYXBwbHlFZGl0cyhiYXRjaCwgZWxlbWVudCwgMCwgZWRpdHMsIHJlZmVyZW5jZUZyYW1lcyk7XG4gIH1cblxuICBwdWJsaWMgZGlzcG9zZUNvbXBvbmVudChjb21wb25lbnRJZDogbnVtYmVyKSB7XG4gICAgZGVsZXRlIHRoaXMuY2hpbGRDb21wb25lbnRMb2NhdGlvbnNbY29tcG9uZW50SWRdO1xuICB9XG5cbiAgcHVibGljIGRpc3Bvc2VFdmVudEhhbmRsZXIoZXZlbnRIYW5kbGVySWQ6IG51bWJlcikge1xuICAgIHRoaXMuZXZlbnREZWxlZ2F0b3IucmVtb3ZlTGlzdGVuZXIoZXZlbnRIYW5kbGVySWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhdHRhY2hDb21wb25lbnRUb0VsZW1lbnQoY29tcG9uZW50SWQ6IG51bWJlciwgZWxlbWVudDogTG9naWNhbEVsZW1lbnQpIHtcbiAgICB0aGlzLmNoaWxkQ29tcG9uZW50TG9jYXRpb25zW2NvbXBvbmVudElkXSA9IGVsZW1lbnQ7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5RWRpdHMoYmF0Y2g6IFJlbmRlckJhdGNoLCBwYXJlbnQ6IExvZ2ljYWxFbGVtZW50LCBjaGlsZEluZGV4OiBudW1iZXIsIGVkaXRzOiBBcnJheVNlZ21lbnQ8UmVuZGVyVHJlZUVkaXQ+LCByZWZlcmVuY2VGcmFtZXM6IEFycmF5VmFsdWVzPFJlbmRlclRyZWVGcmFtZT4pIHtcbiAgICBsZXQgY3VycmVudERlcHRoID0gMDtcbiAgICBsZXQgY2hpbGRJbmRleEF0Q3VycmVudERlcHRoID0gY2hpbGRJbmRleDtcblxuICAgIGNvbnN0IGFycmF5U2VnbWVudFJlYWRlciA9IGJhdGNoLmFycmF5U2VnbWVudFJlYWRlcjtcbiAgICBjb25zdCBlZGl0UmVhZGVyID0gYmF0Y2guZWRpdFJlYWRlcjtcbiAgICBjb25zdCBmcmFtZVJlYWRlciA9IGJhdGNoLmZyYW1lUmVhZGVyO1xuICAgIGNvbnN0IGVkaXRzVmFsdWVzID0gYXJyYXlTZWdtZW50UmVhZGVyLnZhbHVlcyhlZGl0cyk7XG4gICAgY29uc3QgZWRpdHNPZmZzZXQgPSBhcnJheVNlZ21lbnRSZWFkZXIub2Zmc2V0KGVkaXRzKTtcbiAgICBjb25zdCBlZGl0c0xlbmd0aCA9IGFycmF5U2VnbWVudFJlYWRlci5jb3VudChlZGl0cyk7XG4gICAgY29uc3QgbWF4RWRpdEluZGV4RXhjbCA9IGVkaXRzT2Zmc2V0ICsgZWRpdHNMZW5ndGg7XG5cbiAgICBmb3IgKGxldCBlZGl0SW5kZXggPSBlZGl0c09mZnNldDsgZWRpdEluZGV4IDwgbWF4RWRpdEluZGV4RXhjbDsgZWRpdEluZGV4KyspIHtcbiAgICAgIGNvbnN0IGVkaXQgPSBiYXRjaC5kaWZmUmVhZGVyLmVkaXRzRW50cnkoZWRpdHNWYWx1ZXMsIGVkaXRJbmRleCk7XG4gICAgICBjb25zdCBlZGl0VHlwZSA9IGVkaXRSZWFkZXIuZWRpdFR5cGUoZWRpdCk7XG4gICAgICBzd2l0Y2ggKGVkaXRUeXBlKSB7XG4gICAgICAgIGNhc2UgRWRpdFR5cGUucHJlcGVuZEZyYW1lOiB7XG4gICAgICAgICAgY29uc3QgZnJhbWVJbmRleCA9IGVkaXRSZWFkZXIubmV3VHJlZUluZGV4KGVkaXQpO1xuICAgICAgICAgIGNvbnN0IGZyYW1lID0gYmF0Y2gucmVmZXJlbmNlRnJhbWVzRW50cnkocmVmZXJlbmNlRnJhbWVzLCBmcmFtZUluZGV4KTtcbiAgICAgICAgICBjb25zdCBzaWJsaW5nSW5kZXggPSBlZGl0UmVhZGVyLnNpYmxpbmdJbmRleChlZGl0KTtcbiAgICAgICAgICB0aGlzLmluc2VydEZyYW1lKGJhdGNoLCBwYXJlbnQsIGNoaWxkSW5kZXhBdEN1cnJlbnREZXB0aCArIHNpYmxpbmdJbmRleCwgcmVmZXJlbmNlRnJhbWVzLCBmcmFtZSwgZnJhbWVJbmRleCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBFZGl0VHlwZS5yZW1vdmVGcmFtZToge1xuICAgICAgICAgIGNvbnN0IHNpYmxpbmdJbmRleCA9IGVkaXRSZWFkZXIuc2libGluZ0luZGV4KGVkaXQpO1xuICAgICAgICAgIHJlbW92ZUxvZ2ljYWxDaGlsZChwYXJlbnQsIGNoaWxkSW5kZXhBdEN1cnJlbnREZXB0aCArIHNpYmxpbmdJbmRleCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBFZGl0VHlwZS5zZXRBdHRyaWJ1dGU6IHtcbiAgICAgICAgICBjb25zdCBmcmFtZUluZGV4ID0gZWRpdFJlYWRlci5uZXdUcmVlSW5kZXgoZWRpdCk7XG4gICAgICAgICAgY29uc3QgZnJhbWUgPSBiYXRjaC5yZWZlcmVuY2VGcmFtZXNFbnRyeShyZWZlcmVuY2VGcmFtZXMsIGZyYW1lSW5kZXgpO1xuICAgICAgICAgIGNvbnN0IHNpYmxpbmdJbmRleCA9IGVkaXRSZWFkZXIuc2libGluZ0luZGV4KGVkaXQpO1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBnZXRMb2dpY2FsQ2hpbGQocGFyZW50LCBjaGlsZEluZGV4QXRDdXJyZW50RGVwdGggKyBzaWJsaW5nSW5kZXgpO1xuICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5hcHBseUF0dHJpYnV0ZShiYXRjaCwgZWxlbWVudCwgZnJhbWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBzZXQgYXR0cmlidXRlIG9uIG5vbi1lbGVtZW50IGNoaWxkYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgRWRpdFR5cGUucmVtb3ZlQXR0cmlidXRlOiB7XG4gICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGRvbid0IGhhdmUgdG8gZGlzcG9zZSB0aGUgaW5mbyB3ZSB0cmFjayBhYm91dCBldmVudCBoYW5kbGVycyBoZXJlLCBiZWNhdXNlIHRoZVxuICAgICAgICAgIC8vIGRpc3Bvc2VkIGV2ZW50IGhhbmRsZXIgSURzIGFyZSBkZWxpdmVyZWQgc2VwYXJhdGVseSAoaW4gdGhlICdkaXNwb3NlZEV2ZW50SGFuZGxlcklkcycgYXJyYXkpXG4gICAgICAgICAgY29uc3Qgc2libGluZ0luZGV4ID0gZWRpdFJlYWRlci5zaWJsaW5nSW5kZXgoZWRpdCk7XG4gICAgICAgICAgY29uc3QgZWxlbWVudCA9IGdldExvZ2ljYWxDaGlsZChwYXJlbnQsIGNoaWxkSW5kZXhBdEN1cnJlbnREZXB0aCArIHNpYmxpbmdJbmRleCk7XG4gICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgYXR0cmlidXRlTmFtZSA9IGVkaXRSZWFkZXIucmVtb3ZlZEF0dHJpYnV0ZU5hbWUoZWRpdCkhO1xuICAgICAgICAgICAgLy8gRmlyc3QgdHJ5IHRvIHJlbW92ZSBhbnkgc3BlY2lhbCBwcm9wZXJ0eSB3ZSB1c2UgZm9yIHRoaXMgYXR0cmlidXRlXG4gICAgICAgICAgICBpZiAoIXRoaXMudHJ5QXBwbHlTcGVjaWFsUHJvcGVydHkoYmF0Y2gsIGVsZW1lbnQsIGF0dHJpYnV0ZU5hbWUsIG51bGwpKSB7XG4gICAgICAgICAgICAgIC8vIElmIHRoYXQncyBub3QgYXBwbGljYWJsZSwgaXQncyBhIHJlZ3VsYXIgRE9NIGF0dHJpYnV0ZSBzbyByZW1vdmUgdGhhdFxuICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVtb3ZlIGF0dHJpYnV0ZSBmcm9tIG5vbi1lbGVtZW50IGNoaWxkYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgRWRpdFR5cGUudXBkYXRlVGV4dDoge1xuICAgICAgICAgIGNvbnN0IGZyYW1lSW5kZXggPSBlZGl0UmVhZGVyLm5ld1RyZWVJbmRleChlZGl0KTtcbiAgICAgICAgICBjb25zdCBmcmFtZSA9IGJhdGNoLnJlZmVyZW5jZUZyYW1lc0VudHJ5KHJlZmVyZW5jZUZyYW1lcywgZnJhbWVJbmRleCk7XG4gICAgICAgICAgY29uc3Qgc2libGluZ0luZGV4ID0gZWRpdFJlYWRlci5zaWJsaW5nSW5kZXgoZWRpdCk7XG4gICAgICAgICAgY29uc3QgdGV4dE5vZGUgPSBnZXRMb2dpY2FsQ2hpbGQocGFyZW50LCBjaGlsZEluZGV4QXRDdXJyZW50RGVwdGggKyBzaWJsaW5nSW5kZXgpO1xuICAgICAgICAgIGlmICh0ZXh0Tm9kZSBpbnN0YW5jZW9mIFRleHQpIHtcbiAgICAgICAgICAgIHRleHROb2RlLnRleHRDb250ZW50ID0gZnJhbWVSZWFkZXIudGV4dENvbnRlbnQoZnJhbWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBzZXQgdGV4dCBjb250ZW50IG9uIG5vbi10ZXh0IGNoaWxkYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgRWRpdFR5cGUudXBkYXRlTWFya3VwOiB7XG4gICAgICAgICAgY29uc3QgZnJhbWVJbmRleCA9IGVkaXRSZWFkZXIubmV3VHJlZUluZGV4KGVkaXQpO1xuICAgICAgICAgIGNvbnN0IGZyYW1lID0gYmF0Y2gucmVmZXJlbmNlRnJhbWVzRW50cnkocmVmZXJlbmNlRnJhbWVzLCBmcmFtZUluZGV4KTtcbiAgICAgICAgICBjb25zdCBzaWJsaW5nSW5kZXggPSBlZGl0UmVhZGVyLnNpYmxpbmdJbmRleChlZGl0KTtcbiAgICAgICAgICByZW1vdmVMb2dpY2FsQ2hpbGQocGFyZW50LCBjaGlsZEluZGV4QXRDdXJyZW50RGVwdGggKyBzaWJsaW5nSW5kZXgpO1xuICAgICAgICAgIHRoaXMuaW5zZXJ0TWFya3VwKGJhdGNoLCBwYXJlbnQsIGNoaWxkSW5kZXhBdEN1cnJlbnREZXB0aCArIHNpYmxpbmdJbmRleCwgZnJhbWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgRWRpdFR5cGUuc3RlcEluOiB7XG4gICAgICAgICAgY29uc3Qgc2libGluZ0luZGV4ID0gZWRpdFJlYWRlci5zaWJsaW5nSW5kZXgoZWRpdCk7XG4gICAgICAgICAgcGFyZW50ID0gZ2V0TG9naWNhbENoaWxkKHBhcmVudCwgY2hpbGRJbmRleEF0Q3VycmVudERlcHRoICsgc2libGluZ0luZGV4KTtcbiAgICAgICAgICBjdXJyZW50RGVwdGgrKztcbiAgICAgICAgICBjaGlsZEluZGV4QXRDdXJyZW50RGVwdGggPSAwO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgRWRpdFR5cGUuc3RlcE91dDoge1xuICAgICAgICAgIHBhcmVudCA9IGdldExvZ2ljYWxQYXJlbnQocGFyZW50KSE7XG4gICAgICAgICAgY3VycmVudERlcHRoLS07XG4gICAgICAgICAgY2hpbGRJbmRleEF0Q3VycmVudERlcHRoID0gY3VycmVudERlcHRoID09PSAwID8gY2hpbGRJbmRleCA6IDA7IC8vIFRoZSBjaGlsZEluZGV4IGlzIG9ubHkgZXZlciBub256ZXJvIGF0IHplcm8gZGVwdGhcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgY29uc3QgdW5rbm93blR5cGU6IG5ldmVyID0gZWRpdFR5cGU7IC8vIENvbXBpbGUtdGltZSB2ZXJpZmljYXRpb24gdGhhdCB0aGUgc3dpdGNoIHdhcyBleGhhdXN0aXZlXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGVkaXQgdHlwZTogJHt1bmtub3duVHlwZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5zZXJ0RnJhbWUoYmF0Y2g6IFJlbmRlckJhdGNoLCBwYXJlbnQ6IExvZ2ljYWxFbGVtZW50LCBjaGlsZEluZGV4OiBudW1iZXIsIGZyYW1lczogQXJyYXlWYWx1ZXM8UmVuZGVyVHJlZUZyYW1lPiwgZnJhbWU6IFJlbmRlclRyZWVGcmFtZSwgZnJhbWVJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBmcmFtZVJlYWRlciA9IGJhdGNoLmZyYW1lUmVhZGVyO1xuICAgIGNvbnN0IGZyYW1lVHlwZSA9IGZyYW1lUmVhZGVyLmZyYW1lVHlwZShmcmFtZSk7XG4gICAgc3dpdGNoIChmcmFtZVR5cGUpIHtcbiAgICAgIGNhc2UgRnJhbWVUeXBlLmVsZW1lbnQ6XG4gICAgICAgIHRoaXMuaW5zZXJ0RWxlbWVudChiYXRjaCwgcGFyZW50LCBjaGlsZEluZGV4LCBmcmFtZXMsIGZyYW1lLCBmcmFtZUluZGV4KTtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICBjYXNlIEZyYW1lVHlwZS50ZXh0OlxuICAgICAgICB0aGlzLmluc2VydFRleHQoYmF0Y2gsIHBhcmVudCwgY2hpbGRJbmRleCwgZnJhbWUpO1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIGNhc2UgRnJhbWVUeXBlLmF0dHJpYnV0ZTpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdHRyaWJ1dGUgZnJhbWVzIHNob3VsZCBvbmx5IGJlIHByZXNlbnQgYXMgbGVhZGluZyBjaGlsZHJlbiBvZiBlbGVtZW50IGZyYW1lcy4nKTtcbiAgICAgIGNhc2UgRnJhbWVUeXBlLmNvbXBvbmVudDpcbiAgICAgICAgdGhpcy5pbnNlcnRDb21wb25lbnQoYmF0Y2gsIHBhcmVudCwgY2hpbGRJbmRleCwgZnJhbWUpO1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIGNhc2UgRnJhbWVUeXBlLnJlZ2lvbjpcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0RnJhbWVSYW5nZShiYXRjaCwgcGFyZW50LCBjaGlsZEluZGV4LCBmcmFtZXMsIGZyYW1lSW5kZXggKyAxLCBmcmFtZUluZGV4ICsgZnJhbWVSZWFkZXIuc3VidHJlZUxlbmd0aChmcmFtZSkpO1xuICAgICAgY2FzZSBGcmFtZVR5cGUuZWxlbWVudFJlZmVyZW5jZUNhcHR1cmU6XG4gICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICAgICAgYXBwbHlDYXB0dXJlSWRUb0VsZW1lbnQocGFyZW50LCBmcmFtZVJlYWRlci5lbGVtZW50UmVmZXJlbmNlQ2FwdHVyZUlkKGZyYW1lKSEpO1xuICAgICAgICAgIHJldHVybiAwOyAvLyBBIFwiY2FwdHVyZVwiIGlzIGEgY2hpbGQgaW4gdGhlIGRpZmYsIGJ1dCBoYXMgbm8gbm9kZSBpbiB0aGUgRE9NXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWZlcmVuY2UgY2FwdHVyZSBmcmFtZXMgY2FuIG9ubHkgYmUgY2hpbGRyZW4gb2YgZWxlbWVudCBmcmFtZXMuJyk7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgRnJhbWVUeXBlLm1hcmt1cDpcbiAgICAgICAgdGhpcy5pbnNlcnRNYXJrdXAoYmF0Y2gsIHBhcmVudCwgY2hpbGRJbmRleCwgZnJhbWUpO1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGNvbnN0IHVua25vd25UeXBlOiBuZXZlciA9IGZyYW1lVHlwZTsgLy8gQ29tcGlsZS10aW1lIHZlcmlmaWNhdGlvbiB0aGF0IHRoZSBzd2l0Y2ggd2FzIGV4aGF1c3RpdmVcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGZyYW1lIHR5cGU6ICR7dW5rbm93blR5cGV9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbnNlcnRFbGVtZW50KGJhdGNoOiBSZW5kZXJCYXRjaCwgcGFyZW50OiBMb2dpY2FsRWxlbWVudCwgY2hpbGRJbmRleDogbnVtYmVyLCBmcmFtZXM6IEFycmF5VmFsdWVzPFJlbmRlclRyZWVGcmFtZT4sIGZyYW1lOiBSZW5kZXJUcmVlRnJhbWUsIGZyYW1lSW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IGZyYW1lUmVhZGVyID0gYmF0Y2guZnJhbWVSZWFkZXI7XG4gICAgY29uc3QgdGFnTmFtZSA9IGZyYW1lUmVhZGVyLmVsZW1lbnROYW1lKGZyYW1lKSE7XG4gICAgY29uc3QgbmV3RG9tRWxlbWVudFJhdyA9IHRhZ05hbWUgPT09ICdzdmcnIHx8IGlzU3ZnRWxlbWVudChwYXJlbnQpID9cbiAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCB0YWdOYW1lKSA6XG4gICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpO1xuICAgIGNvbnN0IG5ld0VsZW1lbnQgPSB0b0xvZ2ljYWxFbGVtZW50KG5ld0RvbUVsZW1lbnRSYXcpO1xuICAgIGluc2VydExvZ2ljYWxDaGlsZChuZXdEb21FbGVtZW50UmF3LCBwYXJlbnQsIGNoaWxkSW5kZXgpO1xuXG4gICAgLy8gQXBwbHkgYXR0cmlidXRlc1xuICAgIGNvbnN0IGRlc2NlbmRhbnRzRW5kSW5kZXhFeGNsID0gZnJhbWVJbmRleCArIGZyYW1lUmVhZGVyLnN1YnRyZWVMZW5ndGgoZnJhbWUpO1xuICAgIGZvciAobGV0IGRlc2NlbmRhbnRJbmRleCA9IGZyYW1lSW5kZXggKyAxOyBkZXNjZW5kYW50SW5kZXggPCBkZXNjZW5kYW50c0VuZEluZGV4RXhjbDsgZGVzY2VuZGFudEluZGV4KyspIHtcbiAgICAgIGNvbnN0IGRlc2NlbmRhbnRGcmFtZSA9IGJhdGNoLnJlZmVyZW5jZUZyYW1lc0VudHJ5KGZyYW1lcywgZGVzY2VuZGFudEluZGV4KTtcbiAgICAgIGlmIChmcmFtZVJlYWRlci5mcmFtZVR5cGUoZGVzY2VuZGFudEZyYW1lKSA9PT0gRnJhbWVUeXBlLmF0dHJpYnV0ZSkge1xuICAgICAgICB0aGlzLmFwcGx5QXR0cmlidXRlKGJhdGNoLCBuZXdEb21FbGVtZW50UmF3LCBkZXNjZW5kYW50RnJhbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQXMgc29vbiBhcyB3ZSBzZWUgYSBub24tYXR0cmlidXRlIGNoaWxkLCBhbGwgdGhlIHN1YnNlcXVlbnQgY2hpbGQgZnJhbWVzIGFyZVxuICAgICAgICAvLyBub3QgYXR0cmlidXRlcywgc28gYmFpbCBvdXQgYW5kIGluc2VydCB0aGUgcmVtbmFudHMgcmVjdXJzaXZlbHlcbiAgICAgICAgdGhpcy5pbnNlcnRGcmFtZVJhbmdlKGJhdGNoLCBuZXdFbGVtZW50LCAwLCBmcmFtZXMsIGRlc2NlbmRhbnRJbmRleCwgZGVzY2VuZGFudHNFbmRJbmRleEV4Y2wpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluc2VydENvbXBvbmVudChiYXRjaDogUmVuZGVyQmF0Y2gsIHBhcmVudDogTG9naWNhbEVsZW1lbnQsIGNoaWxkSW5kZXg6IG51bWJlciwgZnJhbWU6IFJlbmRlclRyZWVGcmFtZSkge1xuICAgIGNvbnN0IGNvbnRhaW5lckVsZW1lbnQgPSBjcmVhdGVBbmRJbnNlcnRMb2dpY2FsQ29udGFpbmVyKHBhcmVudCwgY2hpbGRJbmRleCk7XG5cbiAgICAvLyBBbGwgd2UgaGF2ZSB0byBkbyBpcyBhc3NvY2lhdGUgdGhlIGNoaWxkIGNvbXBvbmVudCBJRCB3aXRoIGl0cyBsb2NhdGlvbi4gV2UgZG9uJ3QgYWN0dWFsbHlcbiAgICAvLyBkbyBhbnkgcmVuZGVyaW5nIGhlcmUsIGJlY2F1c2UgdGhlIGRpZmYgZm9yIHRoZSBjaGlsZCB3aWxsIGFwcGVhciBsYXRlciBpbiB0aGUgcmVuZGVyIGJhdGNoLlxuICAgIGNvbnN0IGNoaWxkQ29tcG9uZW50SWQgPSBiYXRjaC5mcmFtZVJlYWRlci5jb21wb25lbnRJZChmcmFtZSk7XG4gICAgdGhpcy5hdHRhY2hDb21wb25lbnRUb0VsZW1lbnQoY2hpbGRDb21wb25lbnRJZCwgY29udGFpbmVyRWxlbWVudCk7XG4gIH1cblxuICBwcml2YXRlIGluc2VydFRleHQoYmF0Y2g6IFJlbmRlckJhdGNoLCBwYXJlbnQ6IExvZ2ljYWxFbGVtZW50LCBjaGlsZEluZGV4OiBudW1iZXIsIHRleHRGcmFtZTogUmVuZGVyVHJlZUZyYW1lKSB7XG4gICAgY29uc3QgdGV4dENvbnRlbnQgPSBiYXRjaC5mcmFtZVJlYWRlci50ZXh0Q29udGVudCh0ZXh0RnJhbWUpITtcbiAgICBjb25zdCBuZXdUZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHRDb250ZW50KTtcbiAgICBpbnNlcnRMb2dpY2FsQ2hpbGQobmV3VGV4dE5vZGUsIHBhcmVudCwgY2hpbGRJbmRleCk7XG4gIH1cblxuICBwcml2YXRlIGluc2VydE1hcmt1cChiYXRjaDogUmVuZGVyQmF0Y2gsIHBhcmVudDogTG9naWNhbEVsZW1lbnQsIGNoaWxkSW5kZXg6IG51bWJlciwgbWFya3VwRnJhbWU6IFJlbmRlclRyZWVGcmFtZSkge1xuICAgIGNvbnN0IG1hcmt1cENvbnRhaW5lciA9IGNyZWF0ZUFuZEluc2VydExvZ2ljYWxDb250YWluZXIocGFyZW50LCBjaGlsZEluZGV4KTtcblxuICAgIGNvbnN0IG1hcmt1cENvbnRlbnQgPSBiYXRjaC5mcmFtZVJlYWRlci5tYXJrdXBDb250ZW50KG1hcmt1cEZyYW1lKTtcbiAgICBjb25zdCBwYXJzZWRNYXJrdXAgPSBwYXJzZU1hcmt1cChtYXJrdXBDb250ZW50LCBpc1N2Z0VsZW1lbnQocGFyZW50KSk7XG4gICAgbGV0IGxvZ2ljYWxTaWJsaW5nSW5kZXggPSAwO1xuICAgIHdoaWxlIChwYXJzZWRNYXJrdXAuZmlyc3RDaGlsZCkge1xuICAgICAgaW5zZXJ0TG9naWNhbENoaWxkKHBhcnNlZE1hcmt1cC5maXJzdENoaWxkLCBtYXJrdXBDb250YWluZXIsIGxvZ2ljYWxTaWJsaW5nSW5kZXgrKyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUF0dHJpYnV0ZShiYXRjaDogUmVuZGVyQmF0Y2gsIHRvRG9tRWxlbWVudDogRWxlbWVudCwgYXR0cmlidXRlRnJhbWU6IFJlbmRlclRyZWVGcmFtZSkge1xuICAgIGNvbnN0IGZyYW1lUmVhZGVyID0gYmF0Y2guZnJhbWVSZWFkZXI7XG4gICAgY29uc3QgYXR0cmlidXRlTmFtZSA9IGZyYW1lUmVhZGVyLmF0dHJpYnV0ZU5hbWUoYXR0cmlidXRlRnJhbWUpITtcbiAgICBjb25zdCBicm93c2VyUmVuZGVyZXJJZCA9IHRoaXMuYnJvd3NlclJlbmRlcmVySWQ7XG4gICAgY29uc3QgZXZlbnRIYW5kbGVySWQgPSBmcmFtZVJlYWRlci5hdHRyaWJ1dGVFdmVudEhhbmRsZXJJZChhdHRyaWJ1dGVGcmFtZSk7XG5cbiAgICBpZiAoZXZlbnRIYW5kbGVySWQpIHtcbiAgICAgIGNvbnN0IGZpcnN0VHdvQ2hhcnMgPSBhdHRyaWJ1dGVOYW1lLnN1YnN0cmluZygwLCAyKTtcbiAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IGF0dHJpYnV0ZU5hbWUuc3Vic3RyaW5nKDIpO1xuICAgICAgaWYgKGZpcnN0VHdvQ2hhcnMgIT09ICdvbicgfHwgIWV2ZW50TmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEF0dHJpYnV0ZSBoYXMgbm9uemVybyBldmVudCBoYW5kbGVyIElELCBidXQgYXR0cmlidXRlIG5hbWUgJyR7YXR0cmlidXRlTmFtZX0nIGRvZXMgbm90IHN0YXJ0IHdpdGggJ29uJy5gKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXZlbnREZWxlZ2F0b3Iuc2V0TGlzdGVuZXIodG9Eb21FbGVtZW50LCBldmVudE5hbWUsIGV2ZW50SGFuZGxlcklkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGaXJzdCBzZWUgaWYgd2UgaGF2ZSBzcGVjaWFsIGhhbmRsaW5nIGZvciB0aGlzIGF0dHJpYnV0ZVxuICAgIGlmICghdGhpcy50cnlBcHBseVNwZWNpYWxQcm9wZXJ0eShiYXRjaCwgdG9Eb21FbGVtZW50LCBhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVGcmFtZSkpIHtcbiAgICAgIC8vIElmIG5vdCwgdHJlYXQgaXQgYXMgYSByZWd1bGFyIHN0cmluZy12YWx1ZWQgYXR0cmlidXRlXG4gICAgICB0b0RvbUVsZW1lbnQuc2V0QXR0cmlidXRlKFxuICAgICAgICBhdHRyaWJ1dGVOYW1lLFxuICAgICAgICBmcmFtZVJlYWRlci5hdHRyaWJ1dGVWYWx1ZShhdHRyaWJ1dGVGcmFtZSkhXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdHJ5QXBwbHlTcGVjaWFsUHJvcGVydHkoYmF0Y2g6IFJlbmRlckJhdGNoLCBlbGVtZW50OiBFbGVtZW50LCBhdHRyaWJ1dGVOYW1lOiBzdHJpbmcsIGF0dHJpYnV0ZUZyYW1lOiBSZW5kZXJUcmVlRnJhbWUgfCBudWxsKSB7XG4gICAgc3dpdGNoIChhdHRyaWJ1dGVOYW1lKSB7XG4gICAgICBjYXNlICd2YWx1ZSc6XG4gICAgICAgIHJldHVybiB0aGlzLnRyeUFwcGx5VmFsdWVQcm9wZXJ0eShiYXRjaCwgZWxlbWVudCwgYXR0cmlidXRlRnJhbWUpO1xuICAgICAgY2FzZSAnY2hlY2tlZCc6XG4gICAgICAgIHJldHVybiB0aGlzLnRyeUFwcGx5Q2hlY2tlZFByb3BlcnR5KGJhdGNoLCBlbGVtZW50LCBhdHRyaWJ1dGVGcmFtZSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB0cnlBcHBseVZhbHVlUHJvcGVydHkoYmF0Y2g6IFJlbmRlckJhdGNoLCBlbGVtZW50OiBFbGVtZW50LCBhdHRyaWJ1dGVGcmFtZTogUmVuZGVyVHJlZUZyYW1lIHwgbnVsbCkge1xuICAgIC8vIENlcnRhaW4gZWxlbWVudHMgaGF2ZSBidWlsdC1pbiBiZWhhdmlvdXIgZm9yIHRoZWlyICd2YWx1ZScgcHJvcGVydHlcbiAgICBjb25zdCBmcmFtZVJlYWRlciA9IGJhdGNoLmZyYW1lUmVhZGVyO1xuICAgIHN3aXRjaCAoZWxlbWVudC50YWdOYW1lKSB7XG4gICAgICBjYXNlICdJTlBVVCc6XG4gICAgICBjYXNlICdTRUxFQ1QnOlxuICAgICAgY2FzZSAnVEVYVEFSRUEnOiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXR0cmlidXRlRnJhbWUgPyBmcmFtZVJlYWRlci5hdHRyaWJ1dGVWYWx1ZShhdHRyaWJ1dGVGcmFtZSkgOiBudWxsO1xuICAgICAgICAoZWxlbWVudCBhcyBhbnkpLnZhbHVlID0gdmFsdWU7XG5cbiAgICAgICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ1NFTEVDVCcpIHtcbiAgICAgICAgICAvLyA8c2VsZWN0PiBpcyBzcGVjaWFsLCBpbiB0aGF0IGFueXRoaW5nIHdlIHdyaXRlIHRvIC52YWx1ZSB3aWxsIGJlIGxvc3QgaWYgdGhlcmVcbiAgICAgICAgICAvLyBpc24ndCB5ZXQgYSBtYXRjaGluZyA8b3B0aW9uPi4gVG8gbWFpbnRhaW4gdGhlIGV4cGVjdGVkIGJlaGF2aW9yIG5vIG1hdHRlciB0aGVcbiAgICAgICAgICAvLyBlbGVtZW50IGluc2VydGlvbi91cGRhdGUgb3JkZXIsIHByZXNlcnZlIHRoZSBkZXNpcmVkIHZhbHVlIHNlcGFyYXRlbHkgc29cbiAgICAgICAgICAvLyB3ZSBjYW4gcmVjb3ZlciBpdCB3aGVuIGluc2VydGluZyBhbnkgbWF0Y2hpbmcgPG9wdGlvbj4uXG4gICAgICAgICAgZWxlbWVudFtzZWxlY3RWYWx1ZVByb3BuYW1lXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnT1BUSU9OJzoge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGF0dHJpYnV0ZUZyYW1lID8gZnJhbWVSZWFkZXIuYXR0cmlidXRlVmFsdWUoYXR0cmlidXRlRnJhbWUpIDogbnVsbDtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJywgdmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCd2YWx1ZScpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNlZSBhYm92ZSBmb3Igd2h5IHdlIGhhdmUgdGhpcyBzcGVjaWFsIGhhbmRsaW5nIGZvciA8c2VsZWN0Pi88b3B0aW9uPlxuICAgICAgICBjb25zdCBwYXJlbnRFbGVtZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgICAgICBpZiAocGFyZW50RWxlbWVudCAmJiAoc2VsZWN0VmFsdWVQcm9wbmFtZSBpbiBwYXJlbnRFbGVtZW50KSAmJiBwYXJlbnRFbGVtZW50W3NlbGVjdFZhbHVlUHJvcG5hbWVdID09PSB2YWx1ZSkge1xuICAgICAgICAgIHRoaXMudHJ5QXBwbHlWYWx1ZVByb3BlcnR5KGJhdGNoLCBwYXJlbnRFbGVtZW50LCBhdHRyaWJ1dGVGcmFtZSk7XG4gICAgICAgICAgZGVsZXRlIHBhcmVudEVsZW1lbnRbc2VsZWN0VmFsdWVQcm9wbmFtZV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB0cnlBcHBseUNoZWNrZWRQcm9wZXJ0eShiYXRjaDogUmVuZGVyQmF0Y2gsIGVsZW1lbnQ6IEVsZW1lbnQsIGF0dHJpYnV0ZUZyYW1lOiBSZW5kZXJUcmVlRnJhbWUgfCBudWxsKSB7XG4gICAgLy8gQ2VydGFpbiBlbGVtZW50cyBoYXZlIGJ1aWx0LWluIGJlaGF2aW91ciBmb3IgdGhlaXIgJ2NoZWNrZWQnIHByb3BlcnR5XG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ0lOUFVUJykge1xuICAgICAgY29uc3QgdmFsdWUgPSBhdHRyaWJ1dGVGcmFtZSA/IGJhdGNoLmZyYW1lUmVhZGVyLmF0dHJpYnV0ZVZhbHVlKGF0dHJpYnV0ZUZyYW1lKSA6IG51bGw7XG4gICAgICAoZWxlbWVudCBhcyBhbnkpLmNoZWNrZWQgPSB2YWx1ZSAhPT0gbnVsbDtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbnNlcnRGcmFtZVJhbmdlKGJhdGNoOiBSZW5kZXJCYXRjaCwgcGFyZW50OiBMb2dpY2FsRWxlbWVudCwgY2hpbGRJbmRleDogbnVtYmVyLCBmcmFtZXM6IEFycmF5VmFsdWVzPFJlbmRlclRyZWVGcmFtZT4sIHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXhFeGNsOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IG9yaWdDaGlsZEluZGV4ID0gY2hpbGRJbmRleDtcbiAgICBmb3IgKGxldCBpbmRleCA9IHN0YXJ0SW5kZXg7IGluZGV4IDwgZW5kSW5kZXhFeGNsOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBmcmFtZSA9IGJhdGNoLnJlZmVyZW5jZUZyYW1lc0VudHJ5KGZyYW1lcywgaW5kZXgpO1xuICAgICAgY29uc3QgbnVtQ2hpbGRyZW5JbnNlcnRlZCA9IHRoaXMuaW5zZXJ0RnJhbWUoYmF0Y2gsIHBhcmVudCwgY2hpbGRJbmRleCwgZnJhbWVzLCBmcmFtZSwgaW5kZXgpO1xuICAgICAgY2hpbGRJbmRleCArPSBudW1DaGlsZHJlbkluc2VydGVkO1xuXG4gICAgICAvLyBTa2lwIG92ZXIgYW55IGRlc2NlbmRhbnRzLCBzaW5jZSB0aGV5IGFyZSBhbHJlYWR5IGRlYWx0IHdpdGggcmVjdXJzaXZlbHlcbiAgICAgIGluZGV4ICs9IGNvdW50RGVzY2VuZGFudEZyYW1lcyhiYXRjaCwgZnJhbWUpO1xuICAgIH1cblxuICAgIHJldHVybiAoY2hpbGRJbmRleCAtIG9yaWdDaGlsZEluZGV4KTsgLy8gVG90YWwgbnVtYmVyIG9mIGNoaWxkcmVuIGluc2VydGVkXG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VNYXJrdXAobWFya3VwOiBzdHJpbmcsIGlzU3ZnOiBib29sZWFuKSB7XG4gIGlmIChpc1N2Zykge1xuICAgIHNoYXJlZFN2Z0VsZW1Gb3JQYXJzaW5nLmlubmVySFRNTCA9IG1hcmt1cCB8fCAnICc7XG4gICAgcmV0dXJuIHNoYXJlZFN2Z0VsZW1Gb3JQYXJzaW5nO1xuICB9IGVsc2Uge1xuICAgIHNoYXJlZFRlbXBsYXRlRWxlbUZvclBhcnNpbmcuaW5uZXJIVE1MID0gbWFya3VwIHx8ICcgJztcbiAgICByZXR1cm4gc2hhcmVkVGVtcGxhdGVFbGVtRm9yUGFyc2luZy5jb250ZW50O1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvdW50RGVzY2VuZGFudEZyYW1lcyhiYXRjaDogUmVuZGVyQmF0Y2gsIGZyYW1lOiBSZW5kZXJUcmVlRnJhbWUpOiBudW1iZXIge1xuICBjb25zdCBmcmFtZVJlYWRlciA9IGJhdGNoLmZyYW1lUmVhZGVyO1xuICBzd2l0Y2ggKGZyYW1lUmVhZGVyLmZyYW1lVHlwZShmcmFtZSkpIHtcbiAgICAvLyBUaGUgZm9sbG93aW5nIGZyYW1lIHR5cGVzIGhhdmUgYSBzdWJ0cmVlIGxlbmd0aC4gT3RoZXIgZnJhbWVzIG1heSB1c2UgdGhhdCBtZW1vcnkgc2xvdFxuICAgIC8vIHRvIG1lYW4gc29tZXRoaW5nIGVsc2UsIHNvIHdlIG11c3Qgbm90IHJlYWQgaXQuIFdlIHNob3VsZCBjb25zaWRlciBoYXZpbmcgbm9taW5hbCBzdWJ0eXBlc1xuICAgIC8vIG9mIFJlbmRlclRyZWVGcmFtZVBvaW50ZXIgdGhhdCBwcmV2ZW50IGFjY2VzcyB0byBub24tYXBwbGljYWJsZSBmaWVsZHMuXG4gICAgY2FzZSBGcmFtZVR5cGUuY29tcG9uZW50OlxuICAgIGNhc2UgRnJhbWVUeXBlLmVsZW1lbnQ6XG4gICAgY2FzZSBGcmFtZVR5cGUucmVnaW9uOlxuICAgICAgcmV0dXJuIGZyYW1lUmVhZGVyLnN1YnRyZWVMZW5ndGgoZnJhbWUpIC0gMTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIDA7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmFpc2VFdmVudChldmVudDogRXZlbnQsIGJyb3dzZXJSZW5kZXJlcklkOiBudW1iZXIsIGV2ZW50SGFuZGxlcklkOiBudW1iZXIsIGV2ZW50QXJnczogRXZlbnRGb3JEb3ROZXQ8VUlFdmVudEFyZ3M+KSB7XG4gIGlmIChwcmV2ZW50RGVmYXVsdEV2ZW50c1tldmVudC50eXBlXSkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICBjb25zdCBldmVudERlc2NyaXB0b3IgPSB7XG4gICAgYnJvd3NlclJlbmRlcmVySWQsXG4gICAgZXZlbnRIYW5kbGVySWQsXG4gICAgZXZlbnRBcmdzVHlwZTogZXZlbnRBcmdzLnR5cGVcbiAgfTtcblxuICByZXR1cm4gRG90TmV0Lmludm9rZU1ldGhvZEFzeW5jKFxuICAgICdNaWNyb3NvZnQuQXNwTmV0Q29yZS5Db21wb25lbnRzLkJyb3dzZXInLFxuICAgICdEaXNwYXRjaEV2ZW50JyxcbiAgICBldmVudERlc2NyaXB0b3IsXG4gICAgSlNPTi5zdHJpbmdpZnkoZXZlbnRBcmdzLmRhdGEpKTtcbn1cblxuZnVuY3Rpb24gY2xlYXJFbGVtZW50KGVsZW1lbnQ6IEVsZW1lbnQpIHtcbiAgbGV0IGNoaWxkTm9kZTogTm9kZSB8IG51bGw7XG4gIHdoaWxlIChjaGlsZE5vZGUgPSBlbGVtZW50LmZpcnN0Q2hpbGQpIHtcbiAgICBlbGVtZW50LnJlbW92ZUNoaWxkKGNoaWxkTm9kZSk7XG4gIH1cbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBhcHBseUNhcHR1cmVJZFRvRWxlbWVudChlbGVtZW50OiBFbGVtZW50LCByZWZlcmVuY2VDYXB0dXJlSWQ6IHN0cmluZykge1xuICBlbGVtZW50LnNldEF0dHJpYnV0ZShnZXRDYXB0dXJlSWRBdHRyaWJ1dGVOYW1lKHJlZmVyZW5jZUNhcHR1cmVJZCksICcnKTtcbn1cblxuZnVuY3Rpb24gZ2V0RWxlbWVudEJ5Q2FwdHVyZUlkKHJlZmVyZW5jZUNhcHR1cmVJZDogc3RyaW5nKSB7XG4gIGNvbnN0IHNlbGVjdG9yID0gYFske2dldENhcHR1cmVJZEF0dHJpYnV0ZU5hbWUocmVmZXJlbmNlQ2FwdHVyZUlkKX1dYDtcbiAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xufVxuXG5mdW5jdGlvbiBnZXRDYXB0dXJlSWRBdHRyaWJ1dGVOYW1lKHJlZmVyZW5jZUNhcHR1cmVJZDogc3RyaW5nKSB7XG4gIHJldHVybiBgX2JsXyR7cmVmZXJlbmNlQ2FwdHVyZUlkfWA7XG59XG5cbi8vIFN1cHBvcnQgcmVjZWl2aW5nIEVsZW1lbnRSZWYgaW5zdGFuY2VzIGFzIGFyZ3MgaW4gaW50ZXJvcCBjYWxsc1xuY29uc3QgZWxlbWVudFJlZktleSA9ICdfYmxhem9yRWxlbWVudFJlZic7IC8vIEtlZXAgaW4gc3luYyB3aXRoIEVsZW1lbnRSZWYuY3NcbkRvdE5ldC5hdHRhY2hSZXZpdmVyKChrZXksIHZhbHVlKSA9PiB7XG4gIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlLmhhc093blByb3BlcnR5KGVsZW1lbnRSZWZLZXkpICYmIHR5cGVvZiB2YWx1ZVtlbGVtZW50UmVmS2V5XSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZ2V0RWxlbWVudEJ5Q2FwdHVyZUlkKHZhbHVlW2VsZW1lbnRSZWZLZXldKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn0pO1xuIiwiaW1wb3J0IHsgRXZlbnRGb3JEb3ROZXQsIFVJRXZlbnRBcmdzIH0gZnJvbSAnLi9FdmVudEZvckRvdE5ldCc7XG5cbmNvbnN0IG5vbkJ1YmJsaW5nRXZlbnRzID0gdG9Mb29rdXAoW1xuICAnYWJvcnQnLCAnYmx1cicsICdjaGFuZ2UnLCAnZXJyb3InLCAnZm9jdXMnLCAnbG9hZCcsICdsb2FkZW5kJywgJ2xvYWRzdGFydCcsICdtb3VzZWVudGVyJywgJ21vdXNlbGVhdmUnLFxuICAncHJvZ3Jlc3MnLCAncmVzZXQnLCAnc2Nyb2xsJywgJ3N1Ym1pdCcsICd1bmxvYWQnLCAnRE9NTm9kZUluc2VydGVkSW50b0RvY3VtZW50JywgJ0RPTU5vZGVSZW1vdmVkRnJvbURvY3VtZW50J1xuXSk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT25FdmVudENhbGxiYWNrIHtcbiAgKGV2ZW50OiBFdmVudCwgZXZlbnRIYW5kbGVySWQ6IG51bWJlciwgZXZlbnRBcmdzOiBFdmVudEZvckRvdE5ldDxVSUV2ZW50QXJncz4pOiB2b2lkO1xufVxuXG4vLyBSZXNwb25zaWJsZSBmb3IgYWRkaW5nL3JlbW92aW5nIHRoZSBldmVudEluZm8gb24gYW4gZXhwYW5kbyBwcm9wZXJ0eSBvbiBET00gZWxlbWVudHMsIGFuZFxuLy8gY2FsbGluZyBhbiBFdmVudEluZm9TdG9yZSB0aGF0IGRlYWxzIHdpdGggcmVnaXN0ZXJpbmcvdW5yZWdpc3RlcmluZyB0aGUgdW5kZXJseWluZyBkZWxlZ2F0ZWRcbi8vIGV2ZW50IGxpc3RlbmVycyBhcyByZXF1aXJlZCAoYW5kIGFsc28gbWFwcyBhY3R1YWwgZXZlbnRzIGJhY2sgdG8gdGhlIGdpdmVuIGNhbGxiYWNrKS5cbmV4cG9ydCBjbGFzcyBFdmVudERlbGVnYXRvciB7XG4gIHByaXZhdGUgc3RhdGljIG5leHRFdmVudERlbGVnYXRvcklkID0gMDtcbiAgcHJpdmF0ZSBldmVudHNDb2xsZWN0aW9uS2V5OiBzdHJpbmc7XG4gIHByaXZhdGUgZXZlbnRJbmZvU3RvcmU6IEV2ZW50SW5mb1N0b3JlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgb25FdmVudDogT25FdmVudENhbGxiYWNrKSB7XG4gICAgY29uc3QgZXZlbnREZWxlZ2F0b3JJZCA9ICsrRXZlbnREZWxlZ2F0b3IubmV4dEV2ZW50RGVsZWdhdG9ySWQ7XG4gICAgdGhpcy5ldmVudHNDb2xsZWN0aW9uS2V5ID0gYF9ibGF6b3JFdmVudHNfJHtldmVudERlbGVnYXRvcklkfWA7XG4gICAgdGhpcy5ldmVudEluZm9TdG9yZSA9IG5ldyBFdmVudEluZm9TdG9yZSh0aGlzLm9uR2xvYmFsRXZlbnQuYmluZCh0aGlzKSk7XG4gIH1cblxuICBwdWJsaWMgc2V0TGlzdGVuZXIoZWxlbWVudDogRWxlbWVudCwgZXZlbnROYW1lOiBzdHJpbmcsIGV2ZW50SGFuZGxlcklkOiBudW1iZXIpIHtcbiAgICAvLyBFbnN1cmUgd2UgaGF2ZSBhIHBsYWNlIHRvIHN0b3JlIGV2ZW50IGluZm8gZm9yIHRoaXMgZWxlbWVudFxuICAgIGxldCBpbmZvRm9yRWxlbWVudDogRXZlbnRIYW5kbGVySW5mb3NGb3JFbGVtZW50ID0gZWxlbWVudFt0aGlzLmV2ZW50c0NvbGxlY3Rpb25LZXldO1xuICAgIGlmICghaW5mb0ZvckVsZW1lbnQpIHtcbiAgICAgIGluZm9Gb3JFbGVtZW50ID0gZWxlbWVudFt0aGlzLmV2ZW50c0NvbGxlY3Rpb25LZXldID0ge307XG4gICAgfVxuXG4gICAgaWYgKGluZm9Gb3JFbGVtZW50Lmhhc093blByb3BlcnR5KGV2ZW50TmFtZSkpIHtcbiAgICAgIC8vIFdlIGNhbiBjaGVhcGx5IHVwZGF0ZSB0aGUgaW5mbyBvbiB0aGUgZXhpc3Rpbmcgb2JqZWN0IGFuZCBkb24ndCBuZWVkIGFueSBvdGhlciBob3VzZWtlZXBpbmdcbiAgICAgIGNvbnN0IG9sZEluZm8gPSBpbmZvRm9yRWxlbWVudFtldmVudE5hbWVdO1xuICAgICAgdGhpcy5ldmVudEluZm9TdG9yZS51cGRhdGUob2xkSW5mby5ldmVudEhhbmRsZXJJZCwgZXZlbnRIYW5kbGVySWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBHbyB0aHJvdWdoIHRoZSB3aG9sZSBmbG93IHdoaWNoIG1pZ2h0IGludm9sdmUgcmVnaXN0ZXJpbmcgYSBuZXcgZ2xvYmFsIGhhbmRsZXJcbiAgICAgIGNvbnN0IG5ld0luZm8gPSB7IGVsZW1lbnQsIGV2ZW50TmFtZSwgZXZlbnRIYW5kbGVySWQgfTtcbiAgICAgIHRoaXMuZXZlbnRJbmZvU3RvcmUuYWRkKG5ld0luZm8pO1xuICAgICAgaW5mb0ZvckVsZW1lbnRbZXZlbnROYW1lXSA9IG5ld0luZm87XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlbW92ZUxpc3RlbmVyKGV2ZW50SGFuZGxlcklkOiBudW1iZXIpIHtcbiAgICAvLyBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCB3aGVuZXZlciB0aGUgLk5FVC1zaWRlIGNvZGUgcmVwb3J0cyB0aGF0IGEgY2VydGFpbiBldmVudCBoYW5kbGVyXG4gICAgLy8gaGFzIGJlZW4gZGlzcG9zZWQuIEhvd2V2ZXIgd2Ugd2lsbCBhbHJlYWR5IGhhdmUgZGlzcG9zZWQgdGhlIGluZm8gYWJvdXQgdGhhdCBoYW5kbGVyIGlmXG4gICAgLy8gdGhlIGV2ZW50SGFuZGxlcklkIGZvciB0aGUgKGVsZW1lbnQsZXZlbnROYW1lKSBwYWlyIHdhcyByZXBsYWNlZCBkdXJpbmcgZGlmZiBhcHBsaWNhdGlvbi5cbiAgICBjb25zdCBpbmZvID0gdGhpcy5ldmVudEluZm9TdG9yZS5yZW1vdmUoZXZlbnRIYW5kbGVySWQpO1xuICAgIGlmIChpbmZvKSB7XG4gICAgICAvLyBMb29rcyBsaWtlIHRoaXMgZXZlbnQgaGFuZGxlciB3YXNuJ3QgYWxyZWFkeSBkaXNwb3NlZFxuICAgICAgLy8gUmVtb3ZlIHRoZSBhc3NvY2lhdGVkIGRhdGEgZnJvbSB0aGUgRE9NIGVsZW1lbnRcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBpbmZvLmVsZW1lbnQ7XG4gICAgICBpZiAoZWxlbWVudC5oYXNPd25Qcm9wZXJ0eSh0aGlzLmV2ZW50c0NvbGxlY3Rpb25LZXkpKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRFdmVudEluZm9zOiBFdmVudEhhbmRsZXJJbmZvc0ZvckVsZW1lbnQgPSBlbGVtZW50W3RoaXMuZXZlbnRzQ29sbGVjdGlvbktleV07XG4gICAgICAgIGRlbGV0ZSBlbGVtZW50RXZlbnRJbmZvc1tpbmZvLmV2ZW50TmFtZV07XG4gICAgICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlbGVtZW50RXZlbnRJbmZvcykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgZGVsZXRlIGVsZW1lbnRbdGhpcy5ldmVudHNDb2xsZWN0aW9uS2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25HbG9iYWxFdmVudChldnQ6IEV2ZW50KSB7XG4gICAgaWYgKCEoZXZ0LnRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2NhbiB1cCB0aGUgZWxlbWVudCBoaWVyYXJjaHksIGxvb2tpbmcgZm9yIGFueSBtYXRjaGluZyByZWdpc3RlcmVkIGV2ZW50IGhhbmRsZXJzXG4gICAgbGV0IGNhbmRpZGF0ZUVsZW1lbnQgPSBldnQudGFyZ2V0IGFzIEVsZW1lbnQgfCBudWxsO1xuICAgIGxldCBldmVudEFyZ3M6IEV2ZW50Rm9yRG90TmV0PFVJRXZlbnRBcmdzPiB8IG51bGwgPSBudWxsOyAvLyBQb3B1bGF0ZSBsYXppbHlcbiAgICBjb25zdCBldmVudElzTm9uQnViYmxpbmcgPSBub25CdWJibGluZ0V2ZW50cy5oYXNPd25Qcm9wZXJ0eShldnQudHlwZSk7XG4gICAgd2hpbGUgKGNhbmRpZGF0ZUVsZW1lbnQpIHtcbiAgICAgIGlmIChjYW5kaWRhdGVFbGVtZW50Lmhhc093blByb3BlcnR5KHRoaXMuZXZlbnRzQ29sbGVjdGlvbktleSkpIHtcbiAgICAgICAgY29uc3QgaGFuZGxlckluZm9zID0gY2FuZGlkYXRlRWxlbWVudFt0aGlzLmV2ZW50c0NvbGxlY3Rpb25LZXldO1xuICAgICAgICBpZiAoaGFuZGxlckluZm9zLmhhc093blByb3BlcnR5KGV2dC50eXBlKSkge1xuICAgICAgICAgIC8vIFdlIGFyZSBnb2luZyB0byByYWlzZSBhbiBldmVudCBmb3IgdGhpcyBlbGVtZW50LCBzbyBwcmVwYXJlIGluZm8gbmVlZGVkIGJ5IHRoZSAuTkVUIGNvZGVcbiAgICAgICAgICBpZiAoIWV2ZW50QXJncykge1xuICAgICAgICAgICAgZXZlbnRBcmdzID0gRXZlbnRGb3JEb3ROZXQuZnJvbURPTUV2ZW50KGV2dCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgaGFuZGxlckluZm8gPSBoYW5kbGVySW5mb3NbZXZ0LnR5cGVdO1xuICAgICAgICAgIHRoaXMub25FdmVudChldnQsIGhhbmRsZXJJbmZvLmV2ZW50SGFuZGxlcklkLCBldmVudEFyZ3MpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNhbmRpZGF0ZUVsZW1lbnQgPSBldmVudElzTm9uQnViYmxpbmcgPyBudWxsIDogY2FuZGlkYXRlRWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgIH1cbiAgfVxufVxuXG4vLyBSZXNwb25zaWJsZSBmb3IgYWRkaW5nIGFuZCByZW1vdmluZyB0aGUgZ2xvYmFsIGxpc3RlbmVyIHdoZW4gdGhlIG51bWJlciBvZiBsaXN0ZW5lcnNcbi8vIGZvciBhIGdpdmVuIGV2ZW50IG5hbWUgY2hhbmdlcyBiZXR3ZWVuIHplcm8gYW5kIG5vbnplcm9cbmNsYXNzIEV2ZW50SW5mb1N0b3JlIHtcbiAgcHJpdmF0ZSBpbmZvc0J5RXZlbnRIYW5kbGVySWQ6IHsgW2V2ZW50SGFuZGxlcklkOiBudW1iZXJdOiBFdmVudEhhbmRsZXJJbmZvIH0gPSB7fTtcbiAgcHJpdmF0ZSBjb3VudEJ5RXZlbnROYW1lOiB7IFtldmVudE5hbWU6IHN0cmluZ106IG51bWJlciB9ID0ge307XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBnbG9iYWxMaXN0ZW5lcjogRXZlbnRMaXN0ZW5lcikge1xuICB9XG5cbiAgcHVibGljIGFkZChpbmZvOiBFdmVudEhhbmRsZXJJbmZvKSB7XG4gICAgaWYgKHRoaXMuaW5mb3NCeUV2ZW50SGFuZGxlcklkW2luZm8uZXZlbnRIYW5kbGVySWRdKSB7XG4gICAgICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuLCBidXQgd2Ugd2FudCB0byBrbm93IGlmIGl0IGRvZXNcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXZlbnQgJHtpbmZvLmV2ZW50SGFuZGxlcklkfSBpcyBhbHJlYWR5IHRyYWNrZWRgKTtcbiAgICB9XG5cbiAgICB0aGlzLmluZm9zQnlFdmVudEhhbmRsZXJJZFtpbmZvLmV2ZW50SGFuZGxlcklkXSA9IGluZm87XG5cbiAgICBjb25zdCBldmVudE5hbWUgPSBpbmZvLmV2ZW50TmFtZTtcbiAgICBpZiAodGhpcy5jb3VudEJ5RXZlbnROYW1lLmhhc093blByb3BlcnR5KGV2ZW50TmFtZSkpIHtcbiAgICAgIHRoaXMuY291bnRCeUV2ZW50TmFtZVtldmVudE5hbWVdKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY291bnRCeUV2ZW50TmFtZVtldmVudE5hbWVdID0gMTtcblxuICAgICAgLy8gVG8gbWFrZSBkZWxlZ2F0aW9uIHdvcmsgd2l0aCBub24tYnViYmxpbmcgZXZlbnRzLCByZWdpc3RlciBhICdjYXB0dXJlJyBsaXN0ZW5lci5cbiAgICAgIC8vIFdlIHByZXNlcnZlIHRoZSBub24tYnViYmxpbmcgYmVoYXZpb3IgYnkgb25seSBkaXNwYXRjaGluZyBzdWNoIGV2ZW50cyB0byB0aGUgdGFyZ2V0ZWQgZWxlbWVudC5cbiAgICAgIGNvbnN0IHVzZUNhcHR1cmUgPSBub25CdWJibGluZ0V2ZW50cy5oYXNPd25Qcm9wZXJ0eShldmVudE5hbWUpO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIHRoaXMuZ2xvYmFsTGlzdGVuZXIsIHVzZUNhcHR1cmUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGUob2xkRXZlbnRIYW5kbGVySWQ6IG51bWJlciwgbmV3RXZlbnRIYW5kbGVySWQ6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmluZm9zQnlFdmVudEhhbmRsZXJJZC5oYXNPd25Qcm9wZXJ0eShuZXdFdmVudEhhbmRsZXJJZCkpIHtcbiAgICAgIC8vIFNob3VsZCBuZXZlciBoYXBwZW4sIGJ1dCB3ZSB3YW50IHRvIGtub3cgaWYgaXQgZG9lc1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFdmVudCAke25ld0V2ZW50SGFuZGxlcklkfSBpcyBhbHJlYWR5IHRyYWNrZWRgKTtcbiAgICB9XG5cbiAgICAvLyBTaW5jZSB3ZSdyZSBqdXN0IHVwZGF0aW5nIHRoZSBldmVudCBoYW5kbGVyIElELCB0aGVyZSdzIG5vIG5lZWQgdG8gdXBkYXRlIHRoZSBnbG9iYWwgY291bnRzXG4gICAgY29uc3QgaW5mbyA9IHRoaXMuaW5mb3NCeUV2ZW50SGFuZGxlcklkW29sZEV2ZW50SGFuZGxlcklkXTtcbiAgICBkZWxldGUgdGhpcy5pbmZvc0J5RXZlbnRIYW5kbGVySWRbb2xkRXZlbnRIYW5kbGVySWRdO1xuICAgIGluZm8uZXZlbnRIYW5kbGVySWQgPSBuZXdFdmVudEhhbmRsZXJJZDtcbiAgICB0aGlzLmluZm9zQnlFdmVudEhhbmRsZXJJZFtuZXdFdmVudEhhbmRsZXJJZF0gPSBpbmZvO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZShldmVudEhhbmRsZXJJZDogbnVtYmVyKTogRXZlbnRIYW5kbGVySW5mbyB7XG4gICAgY29uc3QgaW5mbyA9IHRoaXMuaW5mb3NCeUV2ZW50SGFuZGxlcklkW2V2ZW50SGFuZGxlcklkXTtcbiAgICBpZiAoaW5mbykge1xuICAgICAgZGVsZXRlIHRoaXMuaW5mb3NCeUV2ZW50SGFuZGxlcklkW2V2ZW50SGFuZGxlcklkXTtcblxuICAgICAgY29uc3QgZXZlbnROYW1lID0gaW5mby5ldmVudE5hbWU7XG4gICAgICBpZiAoLS10aGlzLmNvdW50QnlFdmVudE5hbWVbZXZlbnROYW1lXSA9PT0gMCkge1xuICAgICAgICBkZWxldGUgdGhpcy5jb3VudEJ5RXZlbnROYW1lW2V2ZW50TmFtZV07XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCB0aGlzLmdsb2JhbExpc3RlbmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaW5mbztcbiAgfVxufVxuXG5pbnRlcmZhY2UgRXZlbnRIYW5kbGVySW5mb3NGb3JFbGVtZW50IHtcbiAgLy8gQWx0aG91Z2ggd2UgKmNvdWxkKiB0cmFjayBtdWx0aXBsZSBldmVudCBoYW5kbGVycyBwZXIgKGVsZW1lbnQsIGV2ZW50TmFtZSkgcGFpclxuICAvLyAoc2luY2UgdGhleSBoYXZlIGRpc3RpbmN0IGV2ZW50SGFuZGxlcklkIHZhbHVlcyksIHRoZXJlJ3Mgbm8gcG9pbnQgZG9pbmcgc28gYmVjYXVzZVxuICAvLyBvdXIgcHJvZ3JhbW1pbmcgbW9kZWwgaXMgdGhhdCB5b3UgZGVjbGFyZSBldmVudCBoYW5kbGVycyBhcyBhdHRyaWJ1dGVzLiBBbiBlbGVtZW50XG4gIC8vIGNhbiBvbmx5IGhhdmUgb25lIGF0dHJpYnV0ZSB3aXRoIGEgZ2l2ZW4gbmFtZSwgaGVuY2Ugb25seSBvbmUgZXZlbnQgaGFuZGxlciB3aXRoXG4gIC8vIHRoYXQgbmFtZSBhdCBhbnkgb25lIHRpbWUuXG4gIC8vIFNvIHRvIGtlZXAgdGhpbmdzIHNpbXBsZSwgb25seSB0cmFjayBvbmUgRXZlbnRIYW5kbGVySW5mbyBwZXIgKGVsZW1lbnQsIGV2ZW50TmFtZSlcbiAgW2V2ZW50TmFtZTogc3RyaW5nXTogRXZlbnRIYW5kbGVySW5mb1xufVxuXG5pbnRlcmZhY2UgRXZlbnRIYW5kbGVySW5mbyB7XG4gIGVsZW1lbnQ6IEVsZW1lbnQ7XG4gIGV2ZW50TmFtZTogc3RyaW5nO1xuICBldmVudEhhbmRsZXJJZDogbnVtYmVyO1xufVxuXG5mdW5jdGlvbiB0b0xvb2t1cChpdGVtczogc3RyaW5nW10pOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSB7XG4gIGNvbnN0IHJlc3VsdCA9IHt9O1xuICBpdGVtcy5mb3JFYWNoKHZhbHVlID0+IHsgcmVzdWx0W3ZhbHVlXSA9IHRydWU7IH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuIiwiZXhwb3J0IGNsYXNzIEV2ZW50Rm9yRG90TmV0PFREYXRhIGV4dGVuZHMgVUlFdmVudEFyZ3M+IHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHR5cGU6IEV2ZW50QXJnc1R5cGUsIHB1YmxpYyByZWFkb25seSBkYXRhOiBURGF0YSkge1xuICB9XG5cbiAgc3RhdGljIGZyb21ET01FdmVudChldmVudDogRXZlbnQpOiBFdmVudEZvckRvdE5ldDxVSUV2ZW50QXJncz4ge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBldmVudC50YXJnZXQgYXMgRWxlbWVudDtcbiAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcblxuICAgICAgY2FzZSAnaW5wdXQnOlxuICAgICAgY2FzZSAnY2hhbmdlJzoge1xuICAgICAgICBjb25zdCB0YXJnZXRJc0NoZWNrYm94ID0gaXNDaGVja2JveChlbGVtZW50KTtcbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSB0YXJnZXRJc0NoZWNrYm94ID8gISFlbGVtZW50WydjaGVja2VkJ10gOiBlbGVtZW50Wyd2YWx1ZSddO1xuICAgICAgICByZXR1cm4gbmV3IEV2ZW50Rm9yRG90TmV0PFVJQ2hhbmdlRXZlbnRBcmdzPignY2hhbmdlJywgeyB0eXBlOiBldmVudC50eXBlLCB2YWx1ZTogbmV3VmFsdWUgfSk7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2NvcHknOlxuICAgICAgY2FzZSAnY3V0JzpcbiAgICAgIGNhc2UgJ3Bhc3RlJzpcbiAgICAgICAgcmV0dXJuIG5ldyBFdmVudEZvckRvdE5ldDxVSUNsaXBib2FyZEV2ZW50QXJncz4oJ2NsaXBib2FyZCcsIHsgdHlwZTogZXZlbnQudHlwZSB9KTtcblxuICAgICAgY2FzZSAnZHJhZyc6XG4gICAgICBjYXNlICdkcmFnZW5kJzpcbiAgICAgIGNhc2UgJ2RyYWdlbnRlcic6XG4gICAgICBjYXNlICdkcmFnbGVhdmUnOlxuICAgICAgY2FzZSAnZHJhZ292ZXInOlxuICAgICAgY2FzZSAnZHJhZ3N0YXJ0JzpcbiAgICAgIGNhc2UgJ2Ryb3AnOlxuICAgICAgICByZXR1cm4gbmV3IEV2ZW50Rm9yRG90TmV0PFVJRHJhZ0V2ZW50QXJncz4oJ2RyYWcnLCBwYXJzZURyYWdFdmVudChldmVudCkpO1xuXG4gICAgICBjYXNlICdmb2N1cyc6XG4gICAgICBjYXNlICdibHVyJzpcbiAgICAgIGNhc2UgJ2ZvY3VzaW4nOlxuICAgICAgY2FzZSAnZm9jdXNvdXQnOlxuICAgICAgICByZXR1cm4gbmV3IEV2ZW50Rm9yRG90TmV0PFVJRm9jdXNFdmVudEFyZ3M+KCdmb2N1cycsIHsgdHlwZTogZXZlbnQudHlwZSB9KTtcblxuICAgICAgY2FzZSAna2V5ZG93bic6XG4gICAgICBjYXNlICdrZXl1cCc6XG4gICAgICBjYXNlICdrZXlwcmVzcyc6XG4gICAgICAgIHJldHVybiBuZXcgRXZlbnRGb3JEb3ROZXQ8VUlLZXlib2FyZEV2ZW50QXJncz4oJ2tleWJvYXJkJywgcGFyc2VLZXlib2FyZEV2ZW50KDxLZXlib2FyZEV2ZW50PmV2ZW50KSk7XG5cbiAgICAgIGNhc2UgJ2NvbnRleHRtZW51JzpcbiAgICAgIGNhc2UgJ2NsaWNrJzpcbiAgICAgIGNhc2UgJ21vdXNlb3Zlcic6XG4gICAgICBjYXNlICdtb3VzZW91dCc6XG4gICAgICBjYXNlICdtb3VzZW1vdmUnOlxuICAgICAgY2FzZSAnbW91c2Vkb3duJzpcbiAgICAgIGNhc2UgJ21vdXNldXAnOlxuICAgICAgY2FzZSAnZGJsY2xpY2snOlxuICAgICAgICByZXR1cm4gbmV3IEV2ZW50Rm9yRG90TmV0PFVJTW91c2VFdmVudEFyZ3M+KCdtb3VzZScsIHBhcnNlTW91c2VFdmVudCg8TW91c2VFdmVudD5ldmVudCkpO1xuXG4gICAgICBjYXNlICdlcnJvcic6XG4gICAgICAgIHJldHVybiBuZXcgRXZlbnRGb3JEb3ROZXQ8VUlFcnJvckV2ZW50QXJncz4oJ2Vycm9yJywgcGFyc2VFcnJvckV2ZW50KDxFcnJvckV2ZW50PmV2ZW50KSk7XG5cbiAgICAgIGNhc2UgJ2xvYWRzdGFydCc6XG4gICAgICBjYXNlICd0aW1lb3V0JzpcbiAgICAgIGNhc2UgJ2Fib3J0JzpcbiAgICAgIGNhc2UgJ2xvYWQnOlxuICAgICAgY2FzZSAnbG9hZGVuZCc6XG4gICAgICBjYXNlICdwcm9ncmVzcyc6XG4gICAgICAgIHJldHVybiBuZXcgRXZlbnRGb3JEb3ROZXQ8VUlQcm9ncmVzc0V2ZW50QXJncz4oJ3Byb2dyZXNzJywgcGFyc2VQcm9ncmVzc0V2ZW50KDxQcm9ncmVzc0V2ZW50PmV2ZW50KSk7XG5cbiAgICAgIGNhc2UgJ3RvdWNoY2FuY2VsJzpcbiAgICAgIGNhc2UgJ3RvdWNoZW5kJzpcbiAgICAgIGNhc2UgJ3RvdWNobW92ZSc6XG4gICAgICBjYXNlICd0b3VjaGVudGVyJzpcbiAgICAgIGNhc2UgJ3RvdWNobGVhdmUnOlxuICAgICAgY2FzZSAndG91Y2hzdGFydCc6XG4gICAgICAgIHJldHVybiBuZXcgRXZlbnRGb3JEb3ROZXQ8VUlUb3VjaEV2ZW50QXJncz4oJ3RvdWNoJywgcGFyc2VUb3VjaEV2ZW50KDxUb3VjaEV2ZW50PmV2ZW50KSk7XG5cbiAgICAgIGNhc2UgJ2dvdHBvaW50ZXJjYXB0dXJlJzpcbiAgICAgIGNhc2UgJ2xvc3Rwb2ludGVyY2FwdHVyZSc6XG4gICAgICBjYXNlICdwb2ludGVyY2FuY2VsJzpcbiAgICAgIGNhc2UgJ3BvaW50ZXJkb3duJzpcbiAgICAgIGNhc2UgJ3BvaW50ZXJlbnRlcic6XG4gICAgICBjYXNlICdwb2ludGVybGVhdmUnOlxuICAgICAgY2FzZSAncG9pbnRlcm1vdmUnOlxuICAgICAgY2FzZSAncG9pbnRlcm91dCc6XG4gICAgICBjYXNlICdwb2ludGVyb3Zlcic6XG4gICAgICBjYXNlICdwb2ludGVydXAnOlxuICAgICAgICByZXR1cm4gbmV3IEV2ZW50Rm9yRG90TmV0PFVJUG9pbnRlckV2ZW50QXJncz4oJ3BvaW50ZXInLCBwYXJzZVBvaW50ZXJFdmVudCg8UG9pbnRlckV2ZW50PmV2ZW50KSk7XG5cbiAgICAgIGNhc2UgJ3doZWVsJzpcbiAgICAgIGNhc2UgJ21vdXNld2hlZWwnOlxuICAgICAgICByZXR1cm4gbmV3IEV2ZW50Rm9yRG90TmV0PFVJV2hlZWxFdmVudEFyZ3M+KCd3aGVlbCcsIHBhcnNlV2hlZWxFdmVudCg8V2hlZWxFdmVudD5ldmVudCkpO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbmV3IEV2ZW50Rm9yRG90TmV0PFVJRXZlbnRBcmdzPigndW5rbm93bicsIHsgdHlwZTogZXZlbnQudHlwZSB9KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VEcmFnRXZlbnQoZXZlbnQ6IGFueSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IGV2ZW50LnR5cGUsXG4gICAgZGV0YWlsOiBldmVudC5kZXRhaWwsXG4gICAgZGF0YVRyYW5zZmVyOiBldmVudC5kYXRhVHJhbnNmZXIsXG4gICAgc2NyZWVuWDogZXZlbnQuc2NyZWVuWCxcbiAgICBzY3JlZW5ZOiBldmVudC5zY3JlZW5ZLFxuICAgIGNsaWVudFg6IGV2ZW50LmNsaWVudFgsXG4gICAgY2xpZW50WTogZXZlbnQuY2xpZW50WSxcbiAgICBidXR0b246IGV2ZW50LmJ1dHRvbixcbiAgICBidXR0b25zOiBldmVudC5idXR0b25zLFxuICAgIGN0cmxLZXk6IGV2ZW50LmN0cmxLZXksXG4gICAgc2hpZnRLZXk6IGV2ZW50LnNoaWZ0S2V5LFxuICAgIGFsdEtleTogZXZlbnQuYWx0S2V5LFxuICAgIG1ldGFLZXk6IGV2ZW50Lm1ldGFLZXlcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZVdoZWVsRXZlbnQoZXZlbnQ6IFdoZWVsRXZlbnQpIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5wYXJzZU1vdXNlRXZlbnQoZXZlbnQpLFxuICAgIGRlbHRhWDogZXZlbnQuZGVsdGFYLFxuICAgIGRlbHRhWTogZXZlbnQuZGVsdGFZLFxuICAgIGRlbHRhWjogZXZlbnQuZGVsdGFaLFxuICAgIGRlbHRhTW9kZTogZXZlbnQuZGVsdGFNb2RlXG4gIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlRXJyb3JFdmVudChldmVudDogRXJyb3JFdmVudCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IGV2ZW50LnR5cGUsXG4gICAgbWVzc2FnZTogZXZlbnQubWVzc2FnZSxcbiAgICBmaWxlbmFtZTogZXZlbnQuZmlsZW5hbWUsXG4gICAgbGluZW5vOiBldmVudC5saW5lbm8sXG4gICAgY29sbm86IGV2ZW50LmNvbG5vXG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VQcm9ncmVzc0V2ZW50KGV2ZW50OiBQcm9ncmVzc0V2ZW50KSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogZXZlbnQudHlwZSxcbiAgICBsZW5ndGhDb21wdXRhYmxlOiBldmVudC5sZW5ndGhDb21wdXRhYmxlLFxuICAgIGxvYWRlZDogZXZlbnQubG9hZGVkLFxuICAgIHRvdGFsOiBldmVudC50b3RhbFxuICB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZVRvdWNoRXZlbnQoZXZlbnQ6IFRvdWNoRXZlbnQpIHtcblxuICBmdW5jdGlvbiBwYXJzZVRvdWNoKHRvdWNoTGlzdDogVG91Y2hMaXN0KSB7XG4gICAgY29uc3QgdG91Y2hlczogVUlUb3VjaFBvaW50W10gPSBbXTtcbiAgICBcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvdWNoTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdG91Y2ggPSB0b3VjaExpc3RbaV07XG4gICAgICB0b3VjaGVzLnB1c2goe1xuICAgICAgICBpZGVudGlmaWVyOiB0b3VjaC5pZGVudGlmaWVyLFxuICAgICAgICBjbGllbnRYOiB0b3VjaC5jbGllbnRYLFxuICAgICAgICBjbGllbnRZOiB0b3VjaC5jbGllbnRZLFxuICAgICAgICBzY3JlZW5YOiB0b3VjaC5zY3JlZW5YLFxuICAgICAgICBzY3JlZW5ZOiB0b3VjaC5zY3JlZW5ZLFxuICAgICAgICBwYWdlWDogdG91Y2gucGFnZVgsXG4gICAgICAgIHBhZ2VZOiB0b3VjaC5wYWdlWVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0b3VjaGVzO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBldmVudC50eXBlLFxuICAgIGRldGFpbDogZXZlbnQuZGV0YWlsLFxuICAgIHRvdWNoZXM6IHBhcnNlVG91Y2goZXZlbnQudG91Y2hlcyksXG4gICAgdGFyZ2V0VG91Y2hlczogcGFyc2VUb3VjaChldmVudC50YXJnZXRUb3VjaGVzKSxcbiAgICBjaGFuZ2VkVG91Y2hlczogcGFyc2VUb3VjaChldmVudC5jaGFuZ2VkVG91Y2hlcyksXG4gICAgY3RybEtleTogZXZlbnQuY3RybEtleSxcbiAgICBzaGlmdEtleTogZXZlbnQuc2hpZnRLZXksXG4gICAgYWx0S2V5OiBldmVudC5hbHRLZXksXG4gICAgbWV0YUtleTogZXZlbnQubWV0YUtleVxuICB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZUtleWJvYXJkRXZlbnQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBldmVudC50eXBlLFxuICAgIGtleTogZXZlbnQua2V5LFxuICAgIGNvZGU6IGV2ZW50LmNvZGUsXG4gICAgbG9jYXRpb246IGV2ZW50LmxvY2F0aW9uLFxuICAgIHJlcGVhdDogZXZlbnQucmVwZWF0LFxuICAgIGN0cmxLZXk6IGV2ZW50LmN0cmxLZXksXG4gICAgc2hpZnRLZXk6IGV2ZW50LnNoaWZ0S2V5LFxuICAgIGFsdEtleTogZXZlbnQuYWx0S2V5LFxuICAgIG1ldGFLZXk6IGV2ZW50Lm1ldGFLZXlcbiAgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VQb2ludGVyRXZlbnQoZXZlbnQ6IFBvaW50ZXJFdmVudCkge1xuICByZXR1cm4ge1xuICAgIC4uLnBhcnNlTW91c2VFdmVudChldmVudCksXG4gICAgcG9pbnRlcklkOiBldmVudC5wb2ludGVySWQsXG4gICAgd2lkdGg6IGV2ZW50LndpZHRoLFxuICAgIGhlaWdodDogZXZlbnQuaGVpZ2h0LFxuICAgIHByZXNzdXJlOiBldmVudC5wcmVzc3VyZSxcbiAgICB0aWx0WDogZXZlbnQudGlsdFgsXG4gICAgdGlsdFk6IGV2ZW50LnRpbHRZLFxuICAgIHBvaW50ZXJUeXBlOiBldmVudC5wb2ludGVyVHlwZSxcbiAgICBpc1ByaW1hcnk6IGV2ZW50LmlzUHJpbWFyeVxuICB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZU1vdXNlRXZlbnQoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBldmVudC50eXBlLFxuICAgIGRldGFpbDogZXZlbnQuZGV0YWlsLFxuICAgIHNjcmVlblg6IGV2ZW50LnNjcmVlblgsXG4gICAgc2NyZWVuWTogZXZlbnQuc2NyZWVuWSxcbiAgICBjbGllbnRYOiBldmVudC5jbGllbnRYLFxuICAgIGNsaWVudFk6IGV2ZW50LmNsaWVudFksXG4gICAgYnV0dG9uOiBldmVudC5idXR0b24sXG4gICAgYnV0dG9uczogZXZlbnQuYnV0dG9ucyxcbiAgICBjdHJsS2V5OiBldmVudC5jdHJsS2V5LFxuICAgIHNoaWZ0S2V5OiBldmVudC5zaGlmdEtleSxcbiAgICBhbHRLZXk6IGV2ZW50LmFsdEtleSxcbiAgICBtZXRhS2V5OiBldmVudC5tZXRhS2V5XG4gIH07XG59XG5cbmZ1bmN0aW9uIGlzQ2hlY2tib3goZWxlbWVudDogRWxlbWVudCB8IG51bGwpIHtcbiAgcmV0dXJuIGVsZW1lbnQgJiYgZWxlbWVudC50YWdOYW1lID09PSAnSU5QVVQnICYmIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd0eXBlJykgPT09ICdjaGVja2JveCc7XG59XG5cbi8vIFRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlcyBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBVSUV2ZW50QXJncyBDIyBjbGFzc2VzXG5cbnR5cGUgRXZlbnRBcmdzVHlwZSA9ICdjaGFuZ2UnIHwgJ2NsaXBib2FyZCcgfCAnZHJhZycgfCAnZXJyb3InIHwgJ2ZvY3VzJyB8ICdrZXlib2FyZCcgfCAnbW91c2UnIHwgJ3BvaW50ZXInIHwgJ3Byb2dyZXNzJyB8ICd0b3VjaCcgfCAndW5rbm93bicgfCAnd2hlZWwnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVJRXZlbnRBcmdzIHtcbiAgdHlwZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgVUlDaGFuZ2VFdmVudEFyZ3MgZXh0ZW5kcyBVSUV2ZW50QXJncyB7XG4gIHZhbHVlOiBzdHJpbmcgfCBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgVUlDbGlwYm9hcmRFdmVudEFyZ3MgZXh0ZW5kcyBVSUV2ZW50QXJncyB7XG59XG5cbmludGVyZmFjZSBVSURyYWdFdmVudEFyZ3MgZXh0ZW5kcyBVSUV2ZW50QXJncyB7XG4gIGRldGFpbDogbnVtYmVyO1xuICBkYXRhVHJhbnNmZXI6IFVJRGF0YVRyYW5zZmVyO1xuICBzY3JlZW5YOiBudW1iZXI7XG4gIHNjcmVlblk6IG51bWJlcjtcbiAgY2xpZW50WDogbnVtYmVyO1xuICBjbGllbnRZOiBudW1iZXI7XG4gIGJ1dHRvbjogbnVtYmVyO1xuICBidXR0b25zOiBudW1iZXI7XG4gIGN0cmxLZXk6IGJvb2xlYW47XG4gIHNoaWZ0S2V5OiBib29sZWFuO1xuICBhbHRLZXk6IGJvb2xlYW47XG4gIG1ldGFLZXk6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBVSURhdGFUcmFuc2ZlciB7XG4gIGRyb3BFZmZlY3Q6IHN0cmluZztcbiAgZWZmZWN0QWxsb3dlZDogc3RyaW5nO1xuICBmaWxlczogc3RyaW5nW107XG4gIGl0ZW1zOiBVSURhdGFUcmFuc2Zlckl0ZW1bXTtcbiAgdHlwZXM6IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgVUlEYXRhVHJhbnNmZXJJdGVtIHtcbiAga2luZDogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBVSUVycm9yRXZlbnRBcmdzIGV4dGVuZHMgVUlFdmVudEFyZ3Mge1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGZpbGVuYW1lOiBzdHJpbmc7XG4gIGxpbmVubzogbnVtYmVyO1xuICBjb2xubzogbnVtYmVyO1xuXG4gIC8vIG9taXR0aW5nICdlcnJvcicgaGVyZSBzaW5jZSB3ZSdkIGhhdmUgdG8gc2VyaWFsaXplIGl0LCBhbmQgaXQncyBub3QgY2xlYXIgd2Ugd2lsbCB3YW50IHRvXG4gIC8vIGRvIHRoYXQuIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FcnJvckV2ZW50XG59XG5cbmludGVyZmFjZSBVSUZvY3VzRXZlbnRBcmdzIGV4dGVuZHMgVUlFdmVudEFyZ3Mge1xufVxuXG5pbnRlcmZhY2UgVUlLZXlib2FyZEV2ZW50QXJncyBleHRlbmRzIFVJRXZlbnRBcmdzIHtcbiAga2V5OiBzdHJpbmc7XG4gIGNvZGU6IHN0cmluZztcbiAgbG9jYXRpb246IG51bWJlcjtcbiAgcmVwZWF0OiBib29sZWFuO1xuICBjdHJsS2V5OiBib29sZWFuO1xuICBzaGlmdEtleTogYm9vbGVhbjtcbiAgYWx0S2V5OiBib29sZWFuO1xuICBtZXRhS2V5OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgVUlNb3VzZUV2ZW50QXJncyBleHRlbmRzIFVJRXZlbnRBcmdzIHtcbiAgZGV0YWlsOiBudW1iZXI7XG4gIHNjcmVlblg6IG51bWJlcjtcbiAgc2NyZWVuWTogbnVtYmVyO1xuICBjbGllbnRYOiBudW1iZXI7XG4gIGNsaWVudFk6IG51bWJlcjtcbiAgYnV0dG9uOiBudW1iZXI7XG4gIGJ1dHRvbnM6IG51bWJlcjtcbiAgY3RybEtleTogYm9vbGVhbjtcbiAgc2hpZnRLZXk6IGJvb2xlYW47XG4gIGFsdEtleTogYm9vbGVhbjtcbiAgbWV0YUtleTogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIFVJUG9pbnRlckV2ZW50QXJncyBleHRlbmRzIFVJTW91c2VFdmVudEFyZ3Mge1xuICBwb2ludGVySWQ6IG51bWJlcjtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIHByZXNzdXJlOiBudW1iZXI7XG4gIHRpbHRYOiBudW1iZXI7XG4gIHRpbHRZOiBudW1iZXI7XG4gIHBvaW50ZXJUeXBlOiBzdHJpbmc7XG4gIGlzUHJpbWFyeTogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIFVJUHJvZ3Jlc3NFdmVudEFyZ3MgZXh0ZW5kcyBVSUV2ZW50QXJncyB7XG4gIGxlbmd0aENvbXB1dGFibGU6IGJvb2xlYW47XG4gIGxvYWRlZDogbnVtYmVyO1xuICB0b3RhbDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgVUlUb3VjaEV2ZW50QXJncyBleHRlbmRzIFVJRXZlbnRBcmdzIHtcbiAgZGV0YWlsOiBudW1iZXI7XG4gIHRvdWNoZXM6IFVJVG91Y2hQb2ludFtdO1xuICB0YXJnZXRUb3VjaGVzOiBVSVRvdWNoUG9pbnRbXTtcbiAgY2hhbmdlZFRvdWNoZXM6IFVJVG91Y2hQb2ludFtdO1xuICBjdHJsS2V5OiBib29sZWFuO1xuICBzaGlmdEtleTogYm9vbGVhbjtcbiAgYWx0S2V5OiBib29sZWFuO1xuICBtZXRhS2V5OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgVUlUb3VjaFBvaW50IHtcbiAgaWRlbnRpZmllcjogbnVtYmVyO1xuICBzY3JlZW5YOiBudW1iZXI7XG4gIHNjcmVlblk6IG51bWJlcjtcbiAgY2xpZW50WDogbnVtYmVyO1xuICBjbGllbnRZOiBudW1iZXI7XG4gIHBhZ2VYOiBudW1iZXI7XG4gIHBhZ2VZOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBVSVdoZWVsRXZlbnRBcmdzIGV4dGVuZHMgVUlNb3VzZUV2ZW50QXJncyB7XG4gIGRlbHRhWDogbnVtYmVyO1xuICBkZWx0YVk6IG51bWJlcjtcbiAgZGVsdGFaOiBudW1iZXI7XG4gIGRlbHRhTW9kZTogbnVtYmVyO1xufVxuIiwiLypcbiAgQSBMb2dpY2FsRWxlbWVudCBwbGF5cyB0aGUgc2FtZSByb2xlIGFzIGFuIEVsZW1lbnQgaW5zdGFuY2UgZnJvbSB0aGUgcG9pbnQgb2YgdmlldyBvZiB0aGVcbiAgQVBJIGNvbnN1bWVyLiBJbnNlcnRpbmcgYW5kIHJlbW92aW5nIGxvZ2ljYWwgZWxlbWVudHMgdXBkYXRlcyB0aGUgYnJvd3NlciBET00ganVzdCB0aGUgc2FtZS5cblxuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0LCB1bmxpa2UgcmVndWxhciBET00gbXV0YXRpb24gQVBJcywgdGhlIExvZ2ljYWxFbGVtZW50IEFQSXMgZG9uJ3QgdXNlXG4gIHRoZSB1bmRlcmx5aW5nIERPTSBzdHJ1Y3R1cmUgYXMgdGhlIGRhdGEgc3RvcmFnZSBmb3IgdGhlIGVsZW1lbnQgaGllcmFyY2h5LiBJbnN0ZWFkLCB0aGVcbiAgTG9naWNhbEVsZW1lbnQgQVBJcyB0YWtlIGNhcmUgb2YgdHJhY2tpbmcgaGllcmFyY2hpY2FsIHJlbGF0aW9uc2hpcHMgc2VwYXJhdGVseS4gVGhlIHBvaW50XG4gIG9mIHRoaXMgaXMgdG8gcGVybWl0IGEgbG9naWNhbCB0cmVlIHN0cnVjdHVyZSBpbiB3aGljaCBwYXJlbnQvY2hpbGQgcmVsYXRpb25zaGlwcyBkb24ndFxuICBoYXZlIHRvIGJlIG1hdGVyaWFsaXplZCBpbiB0ZXJtcyBvZiBET00gZWxlbWVudCBwYXJlbnQvY2hpbGQgcmVsYXRpb25zaGlwcy4gQW5kIHRoZSByZWFzb25cbiAgd2h5IHdlIHdhbnQgdGhhdCBpcyBzbyB0aGF0IGhpZXJhcmNoaWVzIG9mIEJsYXpvciBjb21wb25lbnRzIGNhbiBiZSB0cmFja2VkIGV2ZW4gd2hlbiB0aG9zZVxuICBjb21wb25lbnRzJyByZW5kZXIgb3V0cHV0IG5lZWQgbm90IGJlIGEgc2luZ2xlIGxpdGVyYWwgRE9NIGVsZW1lbnQuXG5cbiAgQ29uc3VtZXJzIG9mIHRoZSBBUEkgZG9uJ3QgbmVlZCB0byBrbm93IGFib3V0IHRoZSBpbXBsZW1lbnRhdGlvbiwgYnV0IGhvdyBpdCdzIGRvbmUgaXM6XG4gIC0gRWFjaCBMb2dpY2FsRWxlbWVudCBpcyBtYXRlcmlhbGl6ZWQgaW4gdGhlIERPTSBhcyBlaXRoZXI6XG4gICAgLSBBIE5vZGUgaW5zdGFuY2UsIGZvciBhY3R1YWwgTm9kZSBpbnN0YW5jZXMgaW5zZXJ0ZWQgdXNpbmcgJ2luc2VydExvZ2ljYWxDaGlsZCcgb3JcbiAgICAgIGZvciBFbGVtZW50IGluc3RhbmNlcyBwcm9tb3RlZCB0byBMb2dpY2FsRWxlbWVudCB2aWEgJ3RvTG9naWNhbEVsZW1lbnQnXG4gICAgLSBBIENvbW1lbnQgaW5zdGFuY2UsIGZvciAnbG9naWNhbCBjb250YWluZXInIGluc3RhbmNlcyBpbnNlcnRlZCB1c2luZyAnY3JlYXRlQW5kSW5zZXJ0TG9naWNhbENvbnRhaW5lcidcbiAgLSBUaGVuLCBvbiB0aGF0IGluc3RhbmNlIChpLmUuLCB0aGUgTm9kZSBvciBDb21tZW50KSwgd2Ugc3RvcmUgYW4gYXJyYXkgb2YgJ2xvZ2ljYWwgY2hpbGRyZW4nXG4gICAgaW5zdGFuY2VzLCBlLmcuLFxuICAgICAgW2ZpcnN0Q2hpbGQsIHNlY29uZENoaWxkLCB0aGlyZENoaWxkLCAuLi5dXG4gICAgLi4uIHBsdXMgd2Ugc3RvcmUgYSByZWZlcmVuY2UgdG8gdGhlICdsb2dpY2FsIHBhcmVudCcgKGlmIGFueSlcbiAgLSBUaGUgJ2xvZ2ljYWwgY2hpbGRyZW4nIGFycmF5IG1lYW5zIHdlIGNhbiBsb29rIHVwIGluIE8oMSk6XG4gICAgLSBUaGUgbnVtYmVyIG9mIGxvZ2ljYWwgY2hpbGRyZW4gKG5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQgYmVjYXVzZSBub3QgcmVxdWlyZWQsIGJ1dCB0cml2aWFsKVxuICAgIC0gVGhlIGxvZ2ljYWwgY2hpbGQgYXQgYW55IGdpdmVuIGluZGV4XG4gIC0gV2hlbmV2ZXIgYSBsb2dpY2FsIGNoaWxkIGlzIGFkZGVkIG9yIHJlbW92ZWQsIHdlIHVwZGF0ZSB0aGUgcGFyZW50J3MgYXJyYXkgb2YgbG9naWNhbCBjaGlsZHJlblxuKi9cblxuY29uc3QgbG9naWNhbENoaWxkcmVuUHJvcG5hbWUgPSBjcmVhdGVTeW1ib2xPckZhbGxiYWNrKCdfYmxhem9yTG9naWNhbENoaWxkcmVuJyk7XG5jb25zdCBsb2dpY2FsUGFyZW50UHJvcG5hbWUgPSBjcmVhdGVTeW1ib2xPckZhbGxiYWNrKCdfYmxhem9yTG9naWNhbFBhcmVudCcpO1xuXG5leHBvcnQgZnVuY3Rpb24gdG9Mb2dpY2FsRWxlbWVudChlbGVtZW50OiBFbGVtZW50LCBhbGxvd0V4aXN0aW5nQ29udGVudHM/OiBib29sZWFuKSB7XG4gIC8vIE5vcm1hbGx5IGl0J3MgZ29vZCB0byBhc3NlcnQgdGhhdCB0aGUgZWxlbWVudCBoYXMgc3RhcnRlZCBlbXB0eSwgYmVjYXVzZSB0aGF0J3MgdGhlIHVzdWFsXG4gIC8vIHNpdHVhdGlvbiBhbmQgd2UgcHJvYmFibHkgaGF2ZSBhIGJ1ZyBpZiBpdCdzIG5vdC4gQnV0IGZvciB0aGUgZWxlbWVudCB0aGF0IGNvbnRhaW4gcHJlcmVuZGVyZWRcbiAgLy8gcm9vdCBjb21wb25lbnRzLCB3ZSB3YW50IHRvIGxldCB0aGVtIGtlZXAgdGhlaXIgY29udGVudCB1bnRpbCB3ZSByZXBsYWNlIGl0LlxuICBpZiAoZWxlbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA+IDAgJiYgIWFsbG93RXhpc3RpbmdDb250ZW50cykge1xuICAgIHRocm93IG5ldyBFcnJvcignTmV3IGxvZ2ljYWwgZWxlbWVudHMgbXVzdCBzdGFydCBlbXB0eSwgb3IgYWxsb3dFeGlzdGluZ0NvbnRlbnRzIG11c3QgYmUgdHJ1ZScpO1xuICB9XG5cbiAgZWxlbWVudFtsb2dpY2FsQ2hpbGRyZW5Qcm9wbmFtZV0gPSBbXTtcbiAgcmV0dXJuIGVsZW1lbnQgYXMgYW55IGFzIExvZ2ljYWxFbGVtZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQW5kSW5zZXJ0TG9naWNhbENvbnRhaW5lcihwYXJlbnQ6IExvZ2ljYWxFbGVtZW50LCBjaGlsZEluZGV4OiBudW1iZXIpOiBMb2dpY2FsRWxlbWVudCB7XG4gIGNvbnN0IGNvbnRhaW5lckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVDb21tZW50KCchJyk7XG4gIGluc2VydExvZ2ljYWxDaGlsZChjb250YWluZXJFbGVtZW50LCBwYXJlbnQsIGNoaWxkSW5kZXgpO1xuICByZXR1cm4gY29udGFpbmVyRWxlbWVudCBhcyBhbnkgYXMgTG9naWNhbEVsZW1lbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRMb2dpY2FsQ2hpbGQoY2hpbGQ6IE5vZGUsIHBhcmVudDogTG9naWNhbEVsZW1lbnQsIGNoaWxkSW5kZXg6IG51bWJlcikge1xuICBjb25zdCBjaGlsZEFzTG9naWNhbEVsZW1lbnQgPSBjaGlsZCBhcyBhbnkgYXMgTG9naWNhbEVsZW1lbnQ7XG4gIGlmIChjaGlsZCBpbnN0YW5jZW9mIENvbW1lbnQpIHtcbiAgICBjb25zdCBleGlzdGluZ0dyYW5kY2hpbGRyZW4gPSBnZXRMb2dpY2FsQ2hpbGRyZW5BcnJheShjaGlsZEFzTG9naWNhbEVsZW1lbnQpO1xuICAgIGlmIChleGlzdGluZ0dyYW5kY2hpbGRyZW4gJiYgZ2V0TG9naWNhbENoaWxkcmVuQXJyYXkoY2hpbGRBc0xvZ2ljYWxFbGVtZW50KS5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBUaGVyZSdzIG5vdGhpbmcgdG8gc3RvcCB1cyBpbXBsZW1lbnRpbmcgc3VwcG9ydCBmb3IgdGhpcyBzY2VuYXJpbywgYW5kIGl0J3Mgbm90IGRpZmZpY3VsdFxuICAgICAgLy8gKGFmdGVyIGluc2VydGluZyAnY2hpbGQnIGl0c2VsZiwgYWxzbyBpdGVyYXRlIHRocm91Z2ggaXRzIGxvZ2ljYWwgY2hpbGRyZW4gYW5kIHBoeXNpY2FsbHlcbiAgICAgIC8vIHB1dCB0aGVtIGFzIGZvbGxvd2luZy1zaWJsaW5ncyBpbiB0aGUgRE9NKS4gSG93ZXZlciB0aGVyZSdzIG5vIHNjZW5hcmlvIHRoYXQgcmVxdWlyZXMgaXRcbiAgICAgIC8vIHByZXNlbnRseSwgc28gaWYgd2UgZGlkIGltcGxlbWVudCBpdCB0aGVyZSdkIGJlIG5vIGdvb2Qgd2F5IHRvIGhhdmUgdGVzdHMgZm9yIGl0LlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQ6IGluc2VydGluZyBub24tZW1wdHkgbG9naWNhbCBjb250YWluZXInKTtcbiAgICB9XG4gIH1cblxuICBpZiAoZ2V0TG9naWNhbFBhcmVudChjaGlsZEFzTG9naWNhbEVsZW1lbnQpKSB7XG4gICAgLy8gTGlrZXdpc2UsIHdlIGNvdWxkIGVhc2lseSBzdXBwb3J0IHRoaXMgc2NlbmFyaW8gdG9vIChpbiB0aGlzICdpZicgYmxvY2ssIGp1c3Qgc3BsaWNlXG4gICAgLy8gb3V0ICdjaGlsZCcgZnJvbSB0aGUgbG9naWNhbCBjaGlsZHJlbiBhcnJheSBvZiBpdHMgcHJldmlvdXMgbG9naWNhbCBwYXJlbnQgYnkgdXNpbmdcbiAgICAvLyBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiB0byBkZXRlcm1pbmUgaXRzIHByZXZpb3VzIHNpYmxpbmcgaW5kZXgpLlxuICAgIC8vIEJ1dCBhZ2Fpbiwgc2luY2UgdGhlcmUncyBub3QgY3VycmVudGx5IGFueSBzY2VuYXJpbyB0aGF0IHdvdWxkIHVzZSBpdCwgd2Ugd291bGQgbm90XG4gICAgLy8gaGF2ZSBhbnkgdGVzdCBjb3ZlcmFnZSBmb3Igc3VjaCBhbiBpbXBsZW1lbnRhdGlvbi5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZDogbW92aW5nIGV4aXN0aW5nIGxvZ2ljYWwgY2hpbGRyZW4nKTtcbiAgfVxuXG4gIGNvbnN0IG5ld1NpYmxpbmdzID0gZ2V0TG9naWNhbENoaWxkcmVuQXJyYXkocGFyZW50KTtcbiAgaWYgKGNoaWxkSW5kZXggPCBuZXdTaWJsaW5ncy5sZW5ndGgpIHtcbiAgICAvLyBJbnNlcnRcbiAgICBjb25zdCBuZXh0U2libGluZyA9IG5ld1NpYmxpbmdzW2NoaWxkSW5kZXhdIGFzIGFueSBhcyBOb2RlO1xuICAgIG5leHRTaWJsaW5nLnBhcmVudE5vZGUhLmluc2VydEJlZm9yZShjaGlsZCwgbmV4dFNpYmxpbmcpO1xuICAgIG5ld1NpYmxpbmdzLnNwbGljZShjaGlsZEluZGV4LCAwLCBjaGlsZEFzTG9naWNhbEVsZW1lbnQpO1xuICB9IGVsc2Uge1xuICAgIC8vIEFwcGVuZFxuICAgIGFwcGVuZERvbU5vZGUoY2hpbGQsIHBhcmVudCk7XG4gICAgbmV3U2libGluZ3MucHVzaChjaGlsZEFzTG9naWNhbEVsZW1lbnQpO1xuICB9XG5cbiAgY2hpbGRBc0xvZ2ljYWxFbGVtZW50W2xvZ2ljYWxQYXJlbnRQcm9wbmFtZV0gPSBwYXJlbnQ7XG4gIGlmICghKGxvZ2ljYWxDaGlsZHJlblByb3BuYW1lIGluIGNoaWxkQXNMb2dpY2FsRWxlbWVudCkpIHtcbiAgICBjaGlsZEFzTG9naWNhbEVsZW1lbnRbbG9naWNhbENoaWxkcmVuUHJvcG5hbWVdID0gW107XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUxvZ2ljYWxDaGlsZChwYXJlbnQ6IExvZ2ljYWxFbGVtZW50LCBjaGlsZEluZGV4OiBudW1iZXIpIHtcbiAgY29uc3QgY2hpbGRyZW5BcnJheSA9IGdldExvZ2ljYWxDaGlsZHJlbkFycmF5KHBhcmVudCk7XG4gIGNvbnN0IGNoaWxkVG9SZW1vdmUgPSBjaGlsZHJlbkFycmF5LnNwbGljZShjaGlsZEluZGV4LCAxKVswXTtcblxuICAvLyBJZiBpdCdzIGEgbG9naWNhbCBjb250YWluZXIsIGFsc28gcmVtb3ZlIGl0cyBkZXNjZW5kYW50c1xuICBpZiAoY2hpbGRUb1JlbW92ZSBpbnN0YW5jZW9mIENvbW1lbnQpIHtcbiAgICBjb25zdCBncmFuZGNoaWxkcmVuQXJyYXkgPSBnZXRMb2dpY2FsQ2hpbGRyZW5BcnJheShjaGlsZFRvUmVtb3ZlKTtcbiAgICB3aGlsZSAoZ3JhbmRjaGlsZHJlbkFycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgIHJlbW92ZUxvZ2ljYWxDaGlsZChjaGlsZFRvUmVtb3ZlLCAwKTtcbiAgICB9XG4gIH1cblxuICAvLyBGaW5hbGx5LCByZW1vdmUgdGhlIG5vZGUgaXRzZWxmXG4gIGNvbnN0IGRvbU5vZGVUb1JlbW92ZSA9IGNoaWxkVG9SZW1vdmUgYXMgYW55IGFzIE5vZGU7XG4gIGRvbU5vZGVUb1JlbW92ZS5wYXJlbnROb2RlIS5yZW1vdmVDaGlsZChkb21Ob2RlVG9SZW1vdmUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9naWNhbFBhcmVudChlbGVtZW50OiBMb2dpY2FsRWxlbWVudCk6IExvZ2ljYWxFbGVtZW50IHwgbnVsbCB7XG4gIHJldHVybiAoZWxlbWVudFtsb2dpY2FsUGFyZW50UHJvcG5hbWVdIGFzIExvZ2ljYWxFbGVtZW50KSB8fCBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9naWNhbENoaWxkKHBhcmVudDogTG9naWNhbEVsZW1lbnQsIGNoaWxkSW5kZXg6IG51bWJlcik6IExvZ2ljYWxFbGVtZW50IHtcbiAgcmV0dXJuIGdldExvZ2ljYWxDaGlsZHJlbkFycmF5KHBhcmVudClbY2hpbGRJbmRleF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1N2Z0VsZW1lbnQoZWxlbWVudDogTG9naWNhbEVsZW1lbnQpIHtcbiAgcmV0dXJuIGdldENsb3Nlc3REb21FbGVtZW50KGVsZW1lbnQpLm5hbWVzcGFjZVVSSSA9PT0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJztcbn1cblxuZnVuY3Rpb24gZ2V0TG9naWNhbENoaWxkcmVuQXJyYXkoZWxlbWVudDogTG9naWNhbEVsZW1lbnQpIHtcbiAgcmV0dXJuIGVsZW1lbnRbbG9naWNhbENoaWxkcmVuUHJvcG5hbWVdIGFzIExvZ2ljYWxFbGVtZW50W107XG59XG5cbmZ1bmN0aW9uIGdldExvZ2ljYWxOZXh0U2libGluZyhlbGVtZW50OiBMb2dpY2FsRWxlbWVudCk6IExvZ2ljYWxFbGVtZW50IHwgbnVsbCB7XG4gIGNvbnN0IHNpYmxpbmdzID0gZ2V0TG9naWNhbENoaWxkcmVuQXJyYXkoZ2V0TG9naWNhbFBhcmVudChlbGVtZW50KSEpO1xuICBjb25zdCBzaWJsaW5nSW5kZXggPSBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKHNpYmxpbmdzLCBlbGVtZW50KTtcbiAgcmV0dXJuIHNpYmxpbmdzW3NpYmxpbmdJbmRleCArIDFdIHx8IG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldENsb3Nlc3REb21FbGVtZW50KGxvZ2ljYWxFbGVtZW50OiBMb2dpY2FsRWxlbWVudCkge1xuICBpZiAobG9naWNhbEVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgcmV0dXJuIGxvZ2ljYWxFbGVtZW50O1xuICB9IGVsc2UgaWYgKGxvZ2ljYWxFbGVtZW50IGluc3RhbmNlb2YgQ29tbWVudCkge1xuICAgIHJldHVybiBsb2dpY2FsRWxlbWVudC5wYXJlbnROb2RlISBhcyBFbGVtZW50O1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignTm90IGEgdmFsaWQgbG9naWNhbCBlbGVtZW50Jyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXBwZW5kRG9tTm9kZShjaGlsZDogTm9kZSwgcGFyZW50OiBMb2dpY2FsRWxlbWVudCkge1xuICAvLyBUaGlzIGZ1bmN0aW9uIG9ubHkgcHV0cyAnY2hpbGQnIGludG8gdGhlIERPTSBpbiB0aGUgcmlnaHQgcGxhY2UgcmVsYXRpdmUgdG8gJ3BhcmVudCdcbiAgLy8gSXQgZG9lcyBub3QgdXBkYXRlIHRoZSBsb2dpY2FsIGNoaWxkcmVuIGFycmF5IG9mIGFueXRoaW5nXG4gIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgcGFyZW50LmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgfSBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBDb21tZW50KSB7XG4gICAgY29uc3QgcGFyZW50TG9naWNhbE5leHRTaWJsaW5nID0gZ2V0TG9naWNhbE5leHRTaWJsaW5nKHBhcmVudCkgYXMgYW55IGFzIE5vZGU7XG4gICAgaWYgKHBhcmVudExvZ2ljYWxOZXh0U2libGluZykge1xuICAgICAgLy8gU2luY2UgdGhlIHBhcmVudCBoYXMgYSBsb2dpY2FsIG5leHQtc2libGluZywgaXRzIGFwcGVuZGVkIGNoaWxkIGdvZXMgcmlnaHQgYmVmb3JlIHRoYXRcbiAgICAgIHBhcmVudExvZ2ljYWxOZXh0U2libGluZy5wYXJlbnROb2RlIS5pbnNlcnRCZWZvcmUoY2hpbGQsIHBhcmVudExvZ2ljYWxOZXh0U2libGluZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNpbmNlIHRoZSBwYXJlbnQgaGFzIG5vIGxvZ2ljYWwgbmV4dC1zaWJsaW5nLCBrZWVwIHJlY3Vyc2luZyB1cHdhcmRzIHVudGlsIHdlIGZpbmRcbiAgICAgIC8vIGEgbG9naWNhbCBhbmNlc3RvciB0aGF0IGRvZXMgaGF2ZSBhIG5leHQtc2libGluZyBvciBpcyBhIHBoeXNpY2FsIGVsZW1lbnQuXG4gICAgICBhcHBlbmREb21Ob2RlKGNoaWxkLCBnZXRMb2dpY2FsUGFyZW50KHBhcmVudCkhKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gU2hvdWxkIG5ldmVyIGhhcHBlblxuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGFwcGVuZCBub2RlIGJlY2F1c2UgdGhlIHBhcmVudCBpcyBub3QgYSB2YWxpZCBsb2dpY2FsIGVsZW1lbnQuIFBhcmVudDogJHtwYXJlbnR9YCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlU3ltYm9sT3JGYWxsYmFjayhmYWxsYmFjazogc3RyaW5nKTogc3ltYm9sIHwgc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgPyBTeW1ib2woKSA6IGZhbGxiYWNrO1xufVxuXG4vLyBOb21pbmFsIHR5cGUgdG8gcmVwcmVzZW50IGEgbG9naWNhbCBlbGVtZW50IHdpdGhvdXQgbmVlZGluZyB0byBhbGxvY2F0ZSBhbnkgb2JqZWN0IGZvciBpbnN0YW5jZXNcbmV4cG9ydCBpbnRlcmZhY2UgTG9naWNhbEVsZW1lbnQgeyBMb2dpY2FsRWxlbWVudF9fRE9fTk9UX0lNUExFTUVOVDogYW55IH07XG4iLCJpbXBvcnQgeyBSZW5kZXJCYXRjaCwgQXJyYXlSYW5nZSwgUmVuZGVyVHJlZURpZmYsIEFycmF5VmFsdWVzLCBSZW5kZXJUcmVlRWRpdCwgRWRpdFR5cGUsIEZyYW1lVHlwZSwgUmVuZGVyVHJlZUZyYW1lLCBSZW5kZXJUcmVlRGlmZlJlYWRlciwgUmVuZGVyVHJlZUZyYW1lUmVhZGVyLCBSZW5kZXJUcmVlRWRpdFJlYWRlciwgQXJyYXlSYW5nZVJlYWRlciwgQXJyYXlTZWdtZW50UmVhZGVyLCBBcnJheVNlZ21lbnQgfSBmcm9tICcuL1JlbmRlckJhdGNoJztcbmltcG9ydCB7IGRlY29kZVV0ZjggfSBmcm9tICcuL1V0ZjhEZWNvZGVyJztcblxuY29uc3QgdXBkYXRlZENvbXBvbmVudHNFbnRyeUxlbmd0aCA9IDQ7IC8vIEVhY2ggaXMgYSBzaW5nbGUgaW50MzIgZ2l2aW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUgZGF0YVxuY29uc3QgcmVmZXJlbmNlRnJhbWVzRW50cnlMZW5ndGggPSAxNjsgLy8gMSBieXRlIGZvciBmcmFtZSB0eXBlLCB0aGVuIDMgYnl0ZXMgZm9yIHR5cGUtc3BlY2lmaWMgZGF0YVxuY29uc3QgZGlzcG9zZWRDb21wb25lbnRJZHNFbnRyeUxlbmd0aCA9IDQ7IC8vIEVhY2ggaXMgYW4gaW50MzIgZ2l2aW5nIHRoZSBJRFxuY29uc3QgZGlzcG9zZWRFdmVudEhhbmRsZXJJZHNFbnRyeUxlbmd0aCA9IDQ7IC8vIEVhY2ggaXMgYW4gaW50MzIgZ2l2aW5nIHRoZSBJRFxuY29uc3QgZWRpdHNFbnRyeUxlbmd0aCA9IDE2OyAvLyA0IGludHNcbmNvbnN0IHN0cmluZ1RhYmxlRW50cnlMZW5ndGggPSA0OyAvLyBFYWNoIGlzIGFuIGludDMyIGdpdmluZyB0aGUgc3RyaW5nIGRhdGEgbG9jYXRpb24sIG9yIC0xIGZvciBudWxsXG5cbmV4cG9ydCBjbGFzcyBPdXRPZlByb2Nlc3NSZW5kZXJCYXRjaCBpbXBsZW1lbnRzIFJlbmRlckJhdGNoIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBiYXRjaERhdGE6IFVpbnQ4QXJyYXkpIHtcbiAgICBjb25zdCBzdHJpbmdSZWFkZXIgPSBuZXcgT3V0T2ZQcm9jZXNzU3RyaW5nUmVhZGVyKGJhdGNoRGF0YSk7XG5cbiAgICB0aGlzLmFycmF5UmFuZ2VSZWFkZXIgPSBuZXcgT3V0T2ZQcm9jZXNzQXJyYXlSYW5nZVJlYWRlcihiYXRjaERhdGEpO1xuICAgIHRoaXMuYXJyYXlTZWdtZW50UmVhZGVyID0gbmV3IE91dE9mUHJvY2Vzc0FycmF5U2VnbWVudFJlYWRlcihiYXRjaERhdGEpO1xuICAgIHRoaXMuZGlmZlJlYWRlciA9IG5ldyBPdXRPZlByb2Nlc3NSZW5kZXJUcmVlRGlmZlJlYWRlcihiYXRjaERhdGEpO1xuICAgIHRoaXMuZWRpdFJlYWRlciA9IG5ldyBPdXRPZlByb2Nlc3NSZW5kZXJUcmVlRWRpdFJlYWRlcihiYXRjaERhdGEsIHN0cmluZ1JlYWRlcik7XG4gICAgdGhpcy5mcmFtZVJlYWRlciA9IG5ldyBPdXRPZlByb2Nlc3NSZW5kZXJUcmVlRnJhbWVSZWFkZXIoYmF0Y2hEYXRhLCBzdHJpbmdSZWFkZXIpO1xuICB9XG5cbiAgdXBkYXRlZENvbXBvbmVudHMoKTogQXJyYXlSYW5nZTxSZW5kZXJUcmVlRGlmZj4ge1xuICAgIHJldHVybiByZWFkSW50MzJMRSh0aGlzLmJhdGNoRGF0YSwgdGhpcy5iYXRjaERhdGEubGVuZ3RoIC0gMjApOyAvLyA1dGgtZnJvbS1sYXN0IGludDMyXG4gIH1cblxuICByZWZlcmVuY2VGcmFtZXMoKTogQXJyYXlSYW5nZTxSZW5kZXJUcmVlRnJhbWU+IHtcbiAgICByZXR1cm4gcmVhZEludDMyTEUodGhpcy5iYXRjaERhdGEsIHRoaXMuYmF0Y2hEYXRhLmxlbmd0aCAtIDE2KTsgLy8gNHRoLWZyb20tbGFzdCBpbnQzMlxuICB9XG5cbiAgZGlzcG9zZWRDb21wb25lbnRJZHMoKTogQXJyYXlSYW5nZTxudW1iZXI+IHtcbiAgICByZXR1cm4gcmVhZEludDMyTEUodGhpcy5iYXRjaERhdGEsIHRoaXMuYmF0Y2hEYXRhLmxlbmd0aCAtIDEyKTsgLy8gM3JkLWZyb20tbGFzdCBpbnQzMlxuICB9XG5cbiAgZGlzcG9zZWRFdmVudEhhbmRsZXJJZHMoKTogQXJyYXlSYW5nZTxudW1iZXI+IHtcbiAgICByZXR1cm4gcmVhZEludDMyTEUodGhpcy5iYXRjaERhdGEsIHRoaXMuYmF0Y2hEYXRhLmxlbmd0aCAtIDgpOyAvLyAydGgtZnJvbS1sYXN0IGludDMyXG4gIH1cblxuICB1cGRhdGVkQ29tcG9uZW50c0VudHJ5KHZhbHVlczogQXJyYXlWYWx1ZXM8UmVuZGVyVHJlZURpZmY+LCBpbmRleDogbnVtYmVyKTogUmVuZGVyVHJlZURpZmYge1xuICAgIGNvbnN0IHRhYmxlRW50cnlQb3MgPSAodmFsdWVzIGFzIGFueSkgKyBpbmRleCAqIHVwZGF0ZWRDb21wb25lbnRzRW50cnlMZW5ndGg7XG4gICAgcmV0dXJuIHJlYWRJbnQzMkxFKHRoaXMuYmF0Y2hEYXRhLCB0YWJsZUVudHJ5UG9zKTtcbiAgfVxuXG4gIHJlZmVyZW5jZUZyYW1lc0VudHJ5KHZhbHVlczogQXJyYXlWYWx1ZXM8UmVuZGVyVHJlZUZyYW1lPiwgaW5kZXg6IG51bWJlcik6IFJlbmRlclRyZWVGcmFtZSB7XG4gICAgcmV0dXJuICh2YWx1ZXMgYXMgYW55KSArIGluZGV4ICogcmVmZXJlbmNlRnJhbWVzRW50cnlMZW5ndGggYXMgYW55O1xuICB9XG5cbiAgZGlzcG9zZWRDb21wb25lbnRJZHNFbnRyeSh2YWx1ZXM6IEFycmF5VmFsdWVzPG51bWJlcj4sIGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IGVudHJ5UG9zID0gKHZhbHVlcyBhcyBhbnkpICsgaW5kZXggKiBkaXNwb3NlZENvbXBvbmVudElkc0VudHJ5TGVuZ3RoO1xuICAgIHJldHVybiByZWFkSW50MzJMRSh0aGlzLmJhdGNoRGF0YSwgZW50cnlQb3MpO1xuICB9XG5cbiAgZGlzcG9zZWRFdmVudEhhbmRsZXJJZHNFbnRyeSh2YWx1ZXM6IEFycmF5VmFsdWVzPG51bWJlcj4sIGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IGVudHJ5UG9zID0gKHZhbHVlcyBhcyBhbnkpICsgaW5kZXggKiBkaXNwb3NlZEV2ZW50SGFuZGxlcklkc0VudHJ5TGVuZ3RoO1xuICAgIHJldHVybiByZWFkSW50MzJMRSh0aGlzLmJhdGNoRGF0YSwgZW50cnlQb3MpO1xuICB9XG5cbiAgZGlmZlJlYWRlcjogUmVuZGVyVHJlZURpZmZSZWFkZXI7XG4gIGVkaXRSZWFkZXI6IFJlbmRlclRyZWVFZGl0UmVhZGVyO1xuICBmcmFtZVJlYWRlcjogUmVuZGVyVHJlZUZyYW1lUmVhZGVyO1xuICBhcnJheVJhbmdlUmVhZGVyOiBBcnJheVJhbmdlUmVhZGVyO1xuICBhcnJheVNlZ21lbnRSZWFkZXI6IEFycmF5U2VnbWVudFJlYWRlcjtcbn1cblxuY2xhc3MgT3V0T2ZQcm9jZXNzUmVuZGVyVHJlZURpZmZSZWFkZXIgaW1wbGVtZW50cyBSZW5kZXJUcmVlRGlmZlJlYWRlciB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYmF0Y2hEYXRhVWludDg6IFVpbnQ4QXJyYXkpIHtcbiAgfVxuXG4gIGNvbXBvbmVudElkKGRpZmY6IFJlbmRlclRyZWVEaWZmKSB7XG4gICAgLy8gRmlyc3QgaW50MzIgaXMgY29tcG9uZW50SWRcbiAgICByZXR1cm4gcmVhZEludDMyTEUodGhpcy5iYXRjaERhdGFVaW50OCwgZGlmZiBhcyBhbnkpO1xuICB9XG5cbiAgZWRpdHMoZGlmZjogUmVuZGVyVHJlZURpZmYpIHtcbiAgICAvLyBFbnRyaWVzIGRhdGEgc3RhcnRzIGFmdGVyIHRoZSBjb21wb25lbnRJZCAod2hpY2ggaXMgYSA0LWJ5dGUgaW50KVxuICAgIHJldHVybiAoZGlmZiBhcyBhbnkgKyA0KTtcbiAgfVxuXG4gIGVkaXRzRW50cnkodmFsdWVzOiBBcnJheVZhbHVlczxSZW5kZXJUcmVlRWRpdD4sIGluZGV4OiBudW1iZXIpIHtcbiAgICByZXR1cm4gKHZhbHVlcyBhcyBhbnkpICsgaW5kZXggKiBlZGl0c0VudHJ5TGVuZ3RoO1xuICB9XG59XG5cbmNsYXNzIE91dE9mUHJvY2Vzc1JlbmRlclRyZWVFZGl0UmVhZGVyIGltcGxlbWVudHMgUmVuZGVyVHJlZUVkaXRSZWFkZXIge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGJhdGNoRGF0YVVpbnQ4OiBVaW50OEFycmF5LCBwcml2YXRlIHN0cmluZ1JlYWRlcjogT3V0T2ZQcm9jZXNzU3RyaW5nUmVhZGVyKSB7XG4gIH1cblxuICBlZGl0VHlwZShlZGl0OiBSZW5kZXJUcmVlRWRpdCkge1xuICAgIHJldHVybiByZWFkSW50MzJMRSh0aGlzLmJhdGNoRGF0YVVpbnQ4LCBlZGl0IGFzIGFueSk7IC8vIDFzdCBpbnRcbiAgfVxuXG4gIHNpYmxpbmdJbmRleChlZGl0OiBSZW5kZXJUcmVlRWRpdCkge1xuICAgIHJldHVybiByZWFkSW50MzJMRSh0aGlzLmJhdGNoRGF0YVVpbnQ4LCBlZGl0IGFzIGFueSArIDQpOyAvLyAybmQgaW50XG4gIH1cblxuICBuZXdUcmVlSW5kZXgoZWRpdDogUmVuZGVyVHJlZUVkaXQpIHtcbiAgICByZXR1cm4gcmVhZEludDMyTEUodGhpcy5iYXRjaERhdGFVaW50OCwgZWRpdCBhcyBhbnkgKyA4KTsgLy8gM3JkIGludFxuICB9XG5cbiAgcmVtb3ZlZEF0dHJpYnV0ZU5hbWUoZWRpdDogUmVuZGVyVHJlZUVkaXQpIHtcbiAgICBjb25zdCBzdHJpbmdJbmRleCA9IHJlYWRJbnQzMkxFKHRoaXMuYmF0Y2hEYXRhVWludDgsIGVkaXQgYXMgYW55ICsgMTIpOyAvLyA0dGggaW50XG4gICAgcmV0dXJuIHRoaXMuc3RyaW5nUmVhZGVyLnJlYWRTdHJpbmcoc3RyaW5nSW5kZXgpO1xuICB9XG59XG5cbmNsYXNzIE91dE9mUHJvY2Vzc1JlbmRlclRyZWVGcmFtZVJlYWRlciBpbXBsZW1lbnRzIFJlbmRlclRyZWVGcmFtZVJlYWRlciB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYmF0Y2hEYXRhVWludDg6IFVpbnQ4QXJyYXksIHByaXZhdGUgc3RyaW5nUmVhZGVyOiBPdXRPZlByb2Nlc3NTdHJpbmdSZWFkZXIpIHtcbiAgfVxuXG4gIC8vIEZvciByZW5kZXIgZnJhbWVzLCB0aGUgMm5kLTR0aCBpbnRzIGhhdmUgZGlmZmVyZW50IG1lYW5pbmdzIGRlcGVuZGluZyBvbiBmcmFtZVR5cGUuXG4gIC8vIEl0J3MgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IG5vdCB0byBldmFsdWF0ZSBwcm9wZXJ0aWVzIHRoYXQgYXJlbid0IGFwcGxpY2FibGUgdG8gdGhlIGZyYW1lVHlwZS5cblxuICBmcmFtZVR5cGUoZnJhbWU6IFJlbmRlclRyZWVGcmFtZSkge1xuICAgIHJldHVybiByZWFkSW50MzJMRSh0aGlzLmJhdGNoRGF0YVVpbnQ4LCBmcmFtZSBhcyBhbnkpOyAvLyAxc3QgaW50XG4gIH1cblxuICBzdWJ0cmVlTGVuZ3RoKGZyYW1lOiBSZW5kZXJUcmVlRnJhbWUpIHtcbiAgICByZXR1cm4gcmVhZEludDMyTEUodGhpcy5iYXRjaERhdGFVaW50OCwgZnJhbWUgYXMgYW55ICsgNCk7IC8vIDJuZCBpbnRcbiAgfVxuXG4gIGVsZW1lbnRSZWZlcmVuY2VDYXB0dXJlSWQoZnJhbWU6IFJlbmRlclRyZWVGcmFtZSkge1xuICAgIGNvbnN0IHN0cmluZ0luZGV4ID0gcmVhZEludDMyTEUodGhpcy5iYXRjaERhdGFVaW50OCwgZnJhbWUgYXMgYW55ICsgNCk7IC8vIDJuZCBpbnRcbiAgICByZXR1cm4gdGhpcy5zdHJpbmdSZWFkZXIucmVhZFN0cmluZyhzdHJpbmdJbmRleCk7XG4gIH1cblxuICBjb21wb25lbnRJZChmcmFtZTogUmVuZGVyVHJlZUZyYW1lKSB7XG4gICAgcmV0dXJuIHJlYWRJbnQzMkxFKHRoaXMuYmF0Y2hEYXRhVWludDgsIGZyYW1lIGFzIGFueSArIDgpOyAvLyAzcmQgaW50XG4gIH1cblxuICBlbGVtZW50TmFtZShmcmFtZTogUmVuZGVyVHJlZUZyYW1lKSB7XG4gICAgY29uc3Qgc3RyaW5nSW5kZXggPSByZWFkSW50MzJMRSh0aGlzLmJhdGNoRGF0YVVpbnQ4LCBmcmFtZSBhcyBhbnkgKyA4KTsgLy8gM3JkIGludFxuICAgIHJldHVybiB0aGlzLnN0cmluZ1JlYWRlci5yZWFkU3RyaW5nKHN0cmluZ0luZGV4KTtcbiAgfVxuXG4gIHRleHRDb250ZW50KGZyYW1lOiBSZW5kZXJUcmVlRnJhbWUpIHtcbiAgICBjb25zdCBzdHJpbmdJbmRleCA9IHJlYWRJbnQzMkxFKHRoaXMuYmF0Y2hEYXRhVWludDgsIGZyYW1lIGFzIGFueSArIDQpOyAvLyAybmQgaW50XG4gICAgcmV0dXJuIHRoaXMuc3RyaW5nUmVhZGVyLnJlYWRTdHJpbmcoc3RyaW5nSW5kZXgpO1xuICB9XG5cbiAgbWFya3VwQ29udGVudChmcmFtZTogUmVuZGVyVHJlZUZyYW1lKSB7XG4gICAgY29uc3Qgc3RyaW5nSW5kZXggPSByZWFkSW50MzJMRSh0aGlzLmJhdGNoRGF0YVVpbnQ4LCBmcmFtZSBhcyBhbnkgKyA0KTsgLy8gMm5kIGludFxuICAgIHJldHVybiB0aGlzLnN0cmluZ1JlYWRlci5yZWFkU3RyaW5nKHN0cmluZ0luZGV4KSE7XG4gIH1cblxuICBhdHRyaWJ1dGVOYW1lKGZyYW1lOiBSZW5kZXJUcmVlRnJhbWUpIHtcbiAgICBjb25zdCBzdHJpbmdJbmRleCA9IHJlYWRJbnQzMkxFKHRoaXMuYmF0Y2hEYXRhVWludDgsIGZyYW1lIGFzIGFueSArIDQpOyAvLyAybmQgaW50XG4gICAgcmV0dXJuIHRoaXMuc3RyaW5nUmVhZGVyLnJlYWRTdHJpbmcoc3RyaW5nSW5kZXgpO1xuICB9XG5cbiAgYXR0cmlidXRlVmFsdWUoZnJhbWU6IFJlbmRlclRyZWVGcmFtZSkge1xuICAgIGNvbnN0IHN0cmluZ0luZGV4ID0gcmVhZEludDMyTEUodGhpcy5iYXRjaERhdGFVaW50OCwgZnJhbWUgYXMgYW55ICsgOCk7IC8vIDNyZCBpbnRcbiAgICByZXR1cm4gdGhpcy5zdHJpbmdSZWFkZXIucmVhZFN0cmluZyhzdHJpbmdJbmRleCk7XG4gIH1cblxuICBhdHRyaWJ1dGVFdmVudEhhbmRsZXJJZChmcmFtZTogUmVuZGVyVHJlZUZyYW1lKSB7XG4gICAgcmV0dXJuIHJlYWRJbnQzMkxFKHRoaXMuYmF0Y2hEYXRhVWludDgsIGZyYW1lIGFzIGFueSArIDEyKTsgLy8gNHRoIGludFxuICB9XG59XG5cbmNsYXNzIE91dE9mUHJvY2Vzc1N0cmluZ1JlYWRlciB7XG4gIHByaXZhdGUgc3RyaW5nVGFibGVTdGFydEluZGV4OiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBiYXRjaERhdGFVaW50ODogVWludDhBcnJheSkge1xuICAgIC8vIEZpbmFsIGludCBnaXZlcyBzdGFydCBwb3NpdGlvbiBvZiB0aGUgc3RyaW5nIHRhYmxlXG4gICAgdGhpcy5zdHJpbmdUYWJsZVN0YXJ0SW5kZXggPSByZWFkSW50MzJMRShiYXRjaERhdGFVaW50OCwgYmF0Y2hEYXRhVWludDgubGVuZ3RoIC0gNCk7XG4gIH1cblxuICByZWFkU3RyaW5nKGluZGV4OiBudW1iZXIpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7IC8vIFNwZWNpYWwgdmFsdWUgZW5jb2RlcyAnbnVsbCdcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzdHJpbmdUYWJsZUVudHJ5UG9zID0gcmVhZEludDMyTEUodGhpcy5iYXRjaERhdGFVaW50OCwgdGhpcy5zdHJpbmdUYWJsZVN0YXJ0SW5kZXggKyBpbmRleCAqIHN0cmluZ1RhYmxlRW50cnlMZW5ndGgpO1xuXG4gICAgICAvLyBCeSBkZWZhdWx0LCAuTkVUJ3MgQmluYXJ5V3JpdGVyIGdpdmVzIExFQjEyOC1sZW5ndGgtcHJlZml4ZWQgVVRGLTggZGF0YS5cbiAgICAgIC8vIFRoaXMgaXMgY29udmVuaWVudCBlbm91Z2ggdG8gZGVjb2RlIGluIEphdmFTY3JpcHQuXG4gICAgICBjb25zdCBudW1VdGY4Qnl0ZXMgPSByZWFkTEVCMTI4KHRoaXMuYmF0Y2hEYXRhVWludDgsIHN0cmluZ1RhYmxlRW50cnlQb3MpO1xuICAgICAgY29uc3QgY2hhcnNTdGFydCA9IHN0cmluZ1RhYmxlRW50cnlQb3MgKyBudW1MRUIxMjhCeXRlcyhudW1VdGY4Qnl0ZXMpO1xuICAgICAgY29uc3QgdXRmOERhdGEgPSBuZXcgVWludDhBcnJheShcbiAgICAgICAgdGhpcy5iYXRjaERhdGFVaW50OC5idWZmZXIsXG4gICAgICAgIHRoaXMuYmF0Y2hEYXRhVWludDguYnl0ZU9mZnNldCArIGNoYXJzU3RhcnQsXG4gICAgICAgIG51bVV0ZjhCeXRlc1xuICAgICAgKTtcbiAgICAgIHJldHVybiBkZWNvZGVVdGY4KHV0ZjhEYXRhKTtcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgT3V0T2ZQcm9jZXNzQXJyYXlSYW5nZVJlYWRlciBpbXBsZW1lbnRzIEFycmF5UmFuZ2VSZWFkZXIge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGJhdGNoRGF0YVVpbnQ4OiBVaW50OEFycmF5KSB7XG4gIH1cblxuICBjb3VudDxUPihhcnJheVJhbmdlOiBBcnJheVJhbmdlPFQ+KSB7XG4gICAgLy8gRmlyc3QgaW50IGlzIGNvdW50XG4gICAgcmV0dXJuIHJlYWRJbnQzMkxFKHRoaXMuYmF0Y2hEYXRhVWludDgsIGFycmF5UmFuZ2UgYXMgYW55KTtcbiAgfVxuXG4gIHZhbHVlczxUPihhcnJheVJhbmdlOiBBcnJheVJhbmdlPFQ+KSB7XG4gICAgLy8gRW50cmllcyBkYXRhIHN0YXJ0cyBhZnRlciB0aGUgJ2NvdW50JyBpbnQgKGkuZS4sIGFmdGVyIDQgYnl0ZXMpXG4gICAgcmV0dXJuIGFycmF5UmFuZ2UgYXMgYW55ICsgNDtcbiAgfVxufVxuXG5jbGFzcyBPdXRPZlByb2Nlc3NBcnJheVNlZ21lbnRSZWFkZXIgaW1wbGVtZW50cyBBcnJheVNlZ21lbnRSZWFkZXIge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGJhdGNoRGF0YVVpbnQ4OiBVaW50OEFycmF5KSB7XG4gIH1cblxuICBvZmZzZXQ8VD4oYXJyYXlTZWdtZW50OiBBcnJheVNlZ21lbnQ8VD4pIHtcbiAgICAvLyBOb3QgdXNlZCBieSB0aGUgb3V0LW9mLXByb2Nlc3MgcmVwcmVzZW50YXRpb24gb2YgUmVuZGVyQmF0Y2ggZGF0YS5cbiAgICAvLyBUaGlzIG9ubHkgZXhpc3RzIG9uIHRoZSBBcnJheVNlZ21lbnRSZWFkZXIgZm9yIHRoZSBzaGFyZWQtbWVtb3J5IHJlcHJlc2VudGF0aW9uLlxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgY291bnQ8VD4oYXJyYXlTZWdtZW50OiBBcnJheVNlZ21lbnQ8VD4pIHtcbiAgICAvLyBGaXJzdCBpbnQgaXMgY291bnRcbiAgICByZXR1cm4gcmVhZEludDMyTEUodGhpcy5iYXRjaERhdGFVaW50OCwgYXJyYXlTZWdtZW50IGFzIGFueSk7XG4gIH1cblxuICB2YWx1ZXM8VD4oYXJyYXlTZWdtZW50OiBBcnJheVNlZ21lbnQ8VD4pOiBBcnJheVZhbHVlczxUPiB7XG4gICAgLy8gRW50cmllcyBkYXRhIHN0YXJ0cyBhZnRlciB0aGUgJ2NvdW50JyBpbnQgKGkuZS4sIGFmdGVyIDQgYnl0ZXMpXG4gICAgcmV0dXJuIGFycmF5U2VnbWVudCBhcyBhbnkgKyA0O1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlYWRJbnQzMkxFKGJ1ZmZlcjogVWludDhBcnJheSwgcG9zaXRpb246IG51bWJlcik6IGFueSB7XG4gIHJldHVybiAoYnVmZmVyW3Bvc2l0aW9uXSlcbiAgICB8IChidWZmZXJbcG9zaXRpb24gKyAxXSA8PCA4KVxuICAgIHwgKGJ1ZmZlcltwb3NpdGlvbiArIDJdIDw8IDE2KVxuICAgIHwgKGJ1ZmZlcltwb3NpdGlvbiArIDNdIDw8IDI0KTtcbn1cblxuZnVuY3Rpb24gcmVhZExFQjEyOChidWZmZXI6IFVpbnQ4QXJyYXksIHBvc2l0aW9uOiBudW1iZXIpIHtcbiAgbGV0IHJlc3VsdCA9IDA7XG4gIGxldCBzaGlmdCA9IDA7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCA0OyBpbmRleCsrKSB7XG4gICAgY29uc3QgYnl0ZSA9IGJ1ZmZlcltwb3NpdGlvbiArIGluZGV4XTtcbiAgICByZXN1bHQgfD0gKGJ5dGUgJiAxMjcpIDw8IHNoaWZ0O1xuICAgIGlmIChieXRlIDwgMTI4KSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgc2hpZnQgKz0gNztcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBudW1MRUIxMjhCeXRlcyh2YWx1ZTogbnVtYmVyKSB7XG4gIHJldHVybiB2YWx1ZSA8IDEyOCA/IDFcbiAgICA6IHZhbHVlIDwgMTYzODQgPyAyXG4gICAgICA6IHZhbHVlIDwgMjA5NzE1MiA/IDMgOiA0O1xufVxuIiwiZXhwb3J0IGludGVyZmFjZSBSZW5kZXJCYXRjaCB7XG4gIHVwZGF0ZWRDb21wb25lbnRzKCk6IEFycmF5UmFuZ2U8UmVuZGVyVHJlZURpZmY+O1xuICByZWZlcmVuY2VGcmFtZXMoKTogQXJyYXlSYW5nZTxSZW5kZXJUcmVlRnJhbWU+O1xuICBkaXNwb3NlZENvbXBvbmVudElkcygpOiBBcnJheVJhbmdlPG51bWJlcj47XG4gIGRpc3Bvc2VkRXZlbnRIYW5kbGVySWRzKCk6IEFycmF5UmFuZ2U8bnVtYmVyPjtcblxuICB1cGRhdGVkQ29tcG9uZW50c0VudHJ5KHZhbHVlczogQXJyYXlWYWx1ZXM8UmVuZGVyVHJlZURpZmY+LCBpbmRleDogbnVtYmVyKTogUmVuZGVyVHJlZURpZmY7XG4gIHJlZmVyZW5jZUZyYW1lc0VudHJ5KHZhbHVlczogQXJyYXlWYWx1ZXM8UmVuZGVyVHJlZUZyYW1lPiwgaW5kZXg6IG51bWJlcik6IFJlbmRlclRyZWVGcmFtZTtcbiAgZGlzcG9zZWRDb21wb25lbnRJZHNFbnRyeSh2YWx1ZXM6IEFycmF5VmFsdWVzPG51bWJlcj4sIGluZGV4OiBudW1iZXIpOiBudW1iZXI7XG4gIGRpc3Bvc2VkRXZlbnRIYW5kbGVySWRzRW50cnkodmFsdWVzOiBBcnJheVZhbHVlczxudW1iZXI+LCBpbmRleDogbnVtYmVyKTogbnVtYmVyO1xuXG4gIGRpZmZSZWFkZXI6IFJlbmRlclRyZWVEaWZmUmVhZGVyO1xuICBlZGl0UmVhZGVyOiBSZW5kZXJUcmVlRWRpdFJlYWRlcjtcbiAgZnJhbWVSZWFkZXI6IFJlbmRlclRyZWVGcmFtZVJlYWRlcjtcbiAgYXJyYXlSYW5nZVJlYWRlcjogQXJyYXlSYW5nZVJlYWRlcjtcbiAgYXJyYXlTZWdtZW50UmVhZGVyOiBBcnJheVNlZ21lbnRSZWFkZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXJyYXlSYW5nZVJlYWRlciB7XG4gIGNvdW50PFQ+KGFycmF5UmFuZ2U6IEFycmF5UmFuZ2U8VD4pOiBudW1iZXI7XG4gIHZhbHVlczxUPihhcnJheVJhbmdlOiBBcnJheVJhbmdlPFQ+KTogQXJyYXlWYWx1ZXM8VD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXJyYXlTZWdtZW50UmVhZGVyIHtcbiAgb2Zmc2V0PFQ+KGFycmF5U2VnbWVudDogQXJyYXlTZWdtZW50PFQ+KTogbnVtYmVyO1xuICBjb3VudDxUPihhcnJheVNlZ21lbnQ6IEFycmF5U2VnbWVudDxUPik6IG51bWJlcjtcbiAgdmFsdWVzPFQ+KGFycmF5U2VnbWVudDogQXJyYXlTZWdtZW50PFQ+KTogQXJyYXlWYWx1ZXM8VD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVuZGVyVHJlZURpZmZSZWFkZXIge1xuICBjb21wb25lbnRJZChkaWZmOiBSZW5kZXJUcmVlRGlmZik6IG51bWJlcjtcbiAgZWRpdHMoZGlmZjogUmVuZGVyVHJlZURpZmYpOiBBcnJheVNlZ21lbnQ8UmVuZGVyVHJlZUVkaXQ+O1xuICBlZGl0c0VudHJ5KHZhbHVlczogQXJyYXlWYWx1ZXM8UmVuZGVyVHJlZUVkaXQ+LCBpbmRleDogbnVtYmVyKTogUmVuZGVyVHJlZUVkaXQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVuZGVyVHJlZUVkaXRSZWFkZXIge1xuICBlZGl0VHlwZShlZGl0OiBSZW5kZXJUcmVlRWRpdCk6IEVkaXRUeXBlO1xuICBzaWJsaW5nSW5kZXgoZWRpdDogUmVuZGVyVHJlZUVkaXQpOiBudW1iZXI7XG4gIG5ld1RyZWVJbmRleChlZGl0OiBSZW5kZXJUcmVlRWRpdCk6IG51bWJlcjtcbiAgcmVtb3ZlZEF0dHJpYnV0ZU5hbWUoZWRpdDogUmVuZGVyVHJlZUVkaXQpOiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlclRyZWVGcmFtZVJlYWRlciB7XG4gIGZyYW1lVHlwZShmcmFtZTogUmVuZGVyVHJlZUZyYW1lKTogRnJhbWVUeXBlO1xuICBzdWJ0cmVlTGVuZ3RoKGZyYW1lOiBSZW5kZXJUcmVlRnJhbWUpOiBudW1iZXI7XG4gIGVsZW1lbnRSZWZlcmVuY2VDYXB0dXJlSWQoZnJhbWU6IFJlbmRlclRyZWVGcmFtZSk6IHN0cmluZyB8IG51bGw7XG4gIGNvbXBvbmVudElkKGZyYW1lOiBSZW5kZXJUcmVlRnJhbWUpOiBudW1iZXI7XG4gIGVsZW1lbnROYW1lKGZyYW1lOiBSZW5kZXJUcmVlRnJhbWUpOiBzdHJpbmcgfCBudWxsO1xuICB0ZXh0Q29udGVudChmcmFtZTogUmVuZGVyVHJlZUZyYW1lKTogc3RyaW5nIHwgbnVsbDtcbiAgbWFya3VwQ29udGVudChmcmFtZTogUmVuZGVyVHJlZUZyYW1lKTogc3RyaW5nO1xuICBhdHRyaWJ1dGVOYW1lKGZyYW1lOiBSZW5kZXJUcmVlRnJhbWUpOiBzdHJpbmcgfCBudWxsO1xuICBhdHRyaWJ1dGVWYWx1ZShmcmFtZTogUmVuZGVyVHJlZUZyYW1lKTogc3RyaW5nIHwgbnVsbDtcbiAgYXR0cmlidXRlRXZlbnRIYW5kbGVySWQoZnJhbWU6IFJlbmRlclRyZWVGcmFtZSk6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcnJheVJhbmdlPFQ+IHsgQXJyYXlSYW5nZV9fRE9fTk9UX0lNUExFTUVOVDogYW55IH1cbmV4cG9ydCBpbnRlcmZhY2UgQXJyYXlTZWdtZW50PFQ+IHsgQXJyYXlTZWdtZW50X19ET19OT1RfSU1QTEVNRU5UOiBhbnkgfVxuZXhwb3J0IGludGVyZmFjZSBBcnJheVZhbHVlczxUPiB7IEFycmF5VmFsdWVzX19ET19OT1RfSU1QTEVNRU5UOiBhbnkgfVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlclRyZWVEaWZmIHsgUmVuZGVyVHJlZURpZmZfX0RPX05PVF9JTVBMRU1FTlQ6IGFueSB9XG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlclRyZWVGcmFtZSB7IFJlbmRlclRyZWVGcmFtZV9fRE9fTk9UX0lNUExFTUVOVDogYW55IH1cbmV4cG9ydCBpbnRlcmZhY2UgUmVuZGVyVHJlZUVkaXQgeyBSZW5kZXJUcmVlRWRpdF9fRE9fTk9UX0lNUExFTUVOVDogYW55IH1cblxuZXhwb3J0IGVudW0gRWRpdFR5cGUge1xuICAvLyBUaGUgdmFsdWVzIG11c3QgYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIC5ORVQgZXF1aXZhbGVudCBpbiBSZW5kZXJUcmVlRWRpdFR5cGUuY3NcbiAgcHJlcGVuZEZyYW1lID0gMSxcbiAgcmVtb3ZlRnJhbWUgPSAyLFxuICBzZXRBdHRyaWJ1dGUgPSAzLFxuICByZW1vdmVBdHRyaWJ1dGUgPSA0LFxuICB1cGRhdGVUZXh0ID0gNSxcbiAgc3RlcEluID0gNixcbiAgc3RlcE91dCA9IDcsXG4gIHVwZGF0ZU1hcmt1cCA9IDgsXG59XG5cbmV4cG9ydCBlbnVtIEZyYW1lVHlwZSB7XG4gIC8vIFRoZSB2YWx1ZXMgbXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgLk5FVCBlcXVpdmFsZW50IGluIFJlbmRlclRyZWVGcmFtZVR5cGUuY3NcbiAgZWxlbWVudCA9IDEsXG4gIHRleHQgPSAyLFxuICBhdHRyaWJ1dGUgPSAzLFxuICBjb21wb25lbnQgPSA0LFxuICByZWdpb24gPSA1LFxuICBlbGVtZW50UmVmZXJlbmNlQ2FwdHVyZSA9IDYsXG4gIG1hcmt1cCA9IDgsXG59XG4iLCJjb25zdCBuYXRpdmVEZWNvZGVyID0gdHlwZW9mIFRleHREZWNvZGVyID09PSAnZnVuY3Rpb24nXG4gID8gbmV3IFRleHREZWNvZGVyKCd1dGYtOCcpXG4gIDogbnVsbDtcblxuZXhwb3J0IGNvbnN0IGRlY29kZVV0Zjg6IChieXRlczogVWludDhBcnJheSkgPT4gc3RyaW5nXG4gID0gbmF0aXZlRGVjb2RlciA/IG5hdGl2ZURlY29kZXIuZGVjb2RlLmJpbmQobmF0aXZlRGVjb2RlcikgOiBkZWNvZGVJbXBsO1xuXG4vKiFcbkxvZ2ljIGluIGRlY29kZUltcGwgaXMgZGVyaXZlZCBmcm9tIGZhc3QtdGV4dC1lbmNvZGluZ1xuaHR0cHM6Ly9naXRodWIuY29tL3NhbXRob3IvZmFzdC10ZXh0LWVuY29kaW5nXG5cbkxpY2Vuc2UgZm9yIGZhc3QtdGV4dC1lbmNvZGluZzogQXBhY2hlIDIuMFxuaHR0cHM6Ly9naXRodWIuY29tL3NhbXRob3IvZmFzdC10ZXh0LWVuY29kaW5nL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiovXG5cbmZ1bmN0aW9uIGRlY29kZUltcGwoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBzdHJpbmcge1xuICBsZXQgcG9zID0gMDtcbiAgY29uc3QgbGVuID0gYnl0ZXMubGVuZ3RoO1xuICBjb25zdCBvdXQ6IG51bWJlcltdID0gW107XG4gIGNvbnN0IHN1YnN0cmluZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgd2hpbGUgKHBvcyA8IGxlbikge1xuICAgIGNvbnN0IGJ5dGUxID0gYnl0ZXNbcG9zKytdO1xuICAgIGlmIChieXRlMSA9PT0gMCkge1xuICAgICAgYnJlYWs7ICAvLyBOVUxMXG4gICAgfVxuXG4gICAgaWYgKChieXRlMSAmIDB4ODApID09PSAwKSB7ICAvLyAxLWJ5dGVcbiAgICAgIG91dC5wdXNoKGJ5dGUxKTtcbiAgICB9IGVsc2UgaWYgKChieXRlMSAmIDB4ZTApID09PSAweGMwKSB7ICAvLyAyLWJ5dGVcbiAgICAgIGNvbnN0IGJ5dGUyID0gYnl0ZXNbcG9zKytdICYgMHgzZjtcbiAgICAgIG91dC5wdXNoKCgoYnl0ZTEgJiAweDFmKSA8PCA2KSB8IGJ5dGUyKTtcbiAgICB9IGVsc2UgaWYgKChieXRlMSAmIDB4ZjApID09PSAweGUwKSB7XG4gICAgICBjb25zdCBieXRlMiA9IGJ5dGVzW3BvcysrXSAmIDB4M2Y7XG4gICAgICBjb25zdCBieXRlMyA9IGJ5dGVzW3BvcysrXSAmIDB4M2Y7XG4gICAgICBvdXQucHVzaCgoKGJ5dGUxICYgMHgxZikgPDwgMTIpIHwgKGJ5dGUyIDw8IDYpIHwgYnl0ZTMpO1xuICAgIH0gZWxzZSBpZiAoKGJ5dGUxICYgMHhmOCkgPT09IDB4ZjApIHtcbiAgICAgIGNvbnN0IGJ5dGUyID0gYnl0ZXNbcG9zKytdICYgMHgzZjtcbiAgICAgIGNvbnN0IGJ5dGUzID0gYnl0ZXNbcG9zKytdICYgMHgzZjtcbiAgICAgIGNvbnN0IGJ5dGU0ID0gYnl0ZXNbcG9zKytdICYgMHgzZjtcblxuICAgICAgLy8gdGhpcyBjYW4gYmUgPiAweGZmZmYsIHNvIHBvc3NpYmx5IGdlbmVyYXRlIHN1cnJvZ2F0ZXNcbiAgICAgIGxldCBjb2RlcG9pbnQgPSAoKGJ5dGUxICYgMHgwNykgPDwgMHgxMikgfCAoYnl0ZTIgPDwgMHgwYykgfCAoYnl0ZTMgPDwgMHgwNikgfCBieXRlNDtcbiAgICAgIGlmIChjb2RlcG9pbnQgPiAweGZmZmYpIHtcbiAgICAgICAgLy8gY29kZXBvaW50ICY9IH4weDEwMDAwO1xuICAgICAgICBjb2RlcG9pbnQgLT0gMHgxMDAwMDtcbiAgICAgICAgb3V0LnB1c2goKGNvZGVwb2ludCA+Pj4gMTApICYgMHgzZmYgfCAweGQ4MDApXG4gICAgICAgIGNvZGVwb2ludCA9IDB4ZGMwMCB8IGNvZGVwb2ludCAmIDB4M2ZmO1xuICAgICAgfVxuICAgICAgb3V0LnB1c2goY29kZXBvaW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRklYTUU6IHdlJ3JlIGlnbm9yaW5nIHRoaXNcbiAgICB9XG5cbiAgICAvLyBBcyBhIHdvcmthcm91bmQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9zYW10aG9yL2Zhc3QtdGV4dC1lbmNvZGluZy9pc3N1ZXMvMSxcbiAgICAvLyBtYWtlIHN1cmUgdGhlICdvdXQnIGFycmF5IG5ldmVyIGdldHMgdG9vIGxvbmcuIFdoZW4gaXQgcmVhY2hlcyBhIGxpbWl0LCB3ZVxuICAgIC8vIHN0cmluZ2lmeSB3aGF0IHdlIGhhdmUgc28gZmFyIGFuZCBhcHBlbmQgdG8gYSBsaXN0IG9mIG91dHB1dHMuXG4gICAgaWYgKG91dC5sZW5ndGggPiAxMDI0KSB7XG4gICAgICBzdWJzdHJpbmdzLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBvdXQpKTtcbiAgICAgIG91dC5sZW5ndGggPSAwO1xuICAgIH1cbiAgfVxuXG4gIHN1YnN0cmluZ3MucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIG91dCkpO1xuICByZXR1cm4gc3Vic3RyaW5ncy5qb2luKCcnKTtcbn1cbiIsImltcG9ydCB7IFN5c3RlbV9PYmplY3QsIFN5c3RlbV9TdHJpbmcsIFN5c3RlbV9BcnJheSwgTWV0aG9kSGFuZGxlLCBQb2ludGVyIH0gZnJvbSAnLi4vUGxhdGZvcm0vUGxhdGZvcm0nO1xuaW1wb3J0IHsgcGxhdGZvcm0gfSBmcm9tICcuLi9FbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBSZW5kZXJCYXRjaCB9IGZyb20gJy4vUmVuZGVyQmF0Y2gvUmVuZGVyQmF0Y2gnO1xuaW1wb3J0IHsgQnJvd3NlclJlbmRlcmVyIH0gZnJvbSAnLi9Ccm93c2VyUmVuZGVyZXInO1xuXG50eXBlIEJyb3dzZXJSZW5kZXJlclJlZ2lzdHJ5ID0geyBbYnJvd3NlclJlbmRlcmVySWQ6IG51bWJlcl06IEJyb3dzZXJSZW5kZXJlciB9O1xuY29uc3QgYnJvd3NlclJlbmRlcmVyczogQnJvd3NlclJlbmRlcmVyUmVnaXN0cnkgPSB7fTtcblxuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaFJvb3RDb21wb25lbnRUb0VsZW1lbnQoYnJvd3NlclJlbmRlcmVySWQ6IG51bWJlciwgZWxlbWVudFNlbGVjdG9yOiBzdHJpbmcsIGNvbXBvbmVudElkOiBudW1iZXIpIHtcbiAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZWxlbWVudFNlbGVjdG9yKTtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBhbnkgZWxlbWVudCBtYXRjaGluZyBzZWxlY3RvciAnJHtlbGVtZW50U2VsZWN0b3J9Jy5gKTtcbiAgfVxuXG4gIGxldCBicm93c2VyUmVuZGVyZXIgPSBicm93c2VyUmVuZGVyZXJzW2Jyb3dzZXJSZW5kZXJlcklkXTtcbiAgaWYgKCFicm93c2VyUmVuZGVyZXIpIHtcbiAgICBicm93c2VyUmVuZGVyZXIgPSBicm93c2VyUmVuZGVyZXJzW2Jyb3dzZXJSZW5kZXJlcklkXSA9IG5ldyBCcm93c2VyUmVuZGVyZXIoYnJvd3NlclJlbmRlcmVySWQpO1xuICB9XG4gIGJyb3dzZXJSZW5kZXJlci5hdHRhY2hSb290Q29tcG9uZW50VG9FbGVtZW50KGNvbXBvbmVudElkLCBlbGVtZW50KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckJhdGNoKGJyb3dzZXJSZW5kZXJlcklkOiBudW1iZXIsIGJhdGNoOiBSZW5kZXJCYXRjaCkge1xuICBjb25zdCBicm93c2VyUmVuZGVyZXIgPSBicm93c2VyUmVuZGVyZXJzW2Jyb3dzZXJSZW5kZXJlcklkXTtcbiAgaWYgKCFicm93c2VyUmVuZGVyZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZXJlIGlzIG5vIGJyb3dzZXIgcmVuZGVyZXIgd2l0aCBJRCAke2Jyb3dzZXJSZW5kZXJlcklkfS5gKTtcbiAgfVxuXG4gIGNvbnN0IGFycmF5UmFuZ2VSZWFkZXIgPSBiYXRjaC5hcnJheVJhbmdlUmVhZGVyO1xuICBjb25zdCB1cGRhdGVkQ29tcG9uZW50c1JhbmdlID0gYmF0Y2gudXBkYXRlZENvbXBvbmVudHMoKTtcbiAgY29uc3QgdXBkYXRlZENvbXBvbmVudHNWYWx1ZXMgPSBhcnJheVJhbmdlUmVhZGVyLnZhbHVlcyh1cGRhdGVkQ29tcG9uZW50c1JhbmdlKTtcbiAgY29uc3QgdXBkYXRlZENvbXBvbmVudHNMZW5ndGggPSBhcnJheVJhbmdlUmVhZGVyLmNvdW50KHVwZGF0ZWRDb21wb25lbnRzUmFuZ2UpO1xuICBjb25zdCByZWZlcmVuY2VGcmFtZXMgPSBiYXRjaC5yZWZlcmVuY2VGcmFtZXMoKTtcbiAgY29uc3QgcmVmZXJlbmNlRnJhbWVzVmFsdWVzID0gYXJyYXlSYW5nZVJlYWRlci52YWx1ZXMocmVmZXJlbmNlRnJhbWVzKTtcbiAgY29uc3QgZGlmZlJlYWRlciA9IGJhdGNoLmRpZmZSZWFkZXI7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB1cGRhdGVkQ29tcG9uZW50c0xlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZGlmZiA9IGJhdGNoLnVwZGF0ZWRDb21wb25lbnRzRW50cnkodXBkYXRlZENvbXBvbmVudHNWYWx1ZXMsIGkpO1xuICAgIGNvbnN0IGNvbXBvbmVudElkID0gZGlmZlJlYWRlci5jb21wb25lbnRJZChkaWZmKTtcbiAgICBjb25zdCBlZGl0cyA9IGRpZmZSZWFkZXIuZWRpdHMoZGlmZik7XG4gICAgYnJvd3NlclJlbmRlcmVyLnVwZGF0ZUNvbXBvbmVudChiYXRjaCwgY29tcG9uZW50SWQsIGVkaXRzLCByZWZlcmVuY2VGcmFtZXNWYWx1ZXMpO1xuICB9XG5cbiAgY29uc3QgZGlzcG9zZWRDb21wb25lbnRJZHNSYW5nZSA9IGJhdGNoLmRpc3Bvc2VkQ29tcG9uZW50SWRzKCk7XG4gIGNvbnN0IGRpc3Bvc2VkQ29tcG9uZW50SWRzVmFsdWVzID0gYXJyYXlSYW5nZVJlYWRlci52YWx1ZXMoZGlzcG9zZWRDb21wb25lbnRJZHNSYW5nZSk7XG4gIGNvbnN0IGRpc3Bvc2VkQ29tcG9uZW50SWRzTGVuZ3RoID0gYXJyYXlSYW5nZVJlYWRlci5jb3VudChkaXNwb3NlZENvbXBvbmVudElkc1JhbmdlKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaXNwb3NlZENvbXBvbmVudElkc0xlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgY29tcG9uZW50SWQgPSBiYXRjaC5kaXNwb3NlZENvbXBvbmVudElkc0VudHJ5KGRpc3Bvc2VkQ29tcG9uZW50SWRzVmFsdWVzLCBpKTtcbiAgICBicm93c2VyUmVuZGVyZXIuZGlzcG9zZUNvbXBvbmVudChjb21wb25lbnRJZCk7XG4gIH1cblxuICBjb25zdCBkaXNwb3NlZEV2ZW50SGFuZGxlcklkc1JhbmdlID0gYmF0Y2guZGlzcG9zZWRFdmVudEhhbmRsZXJJZHMoKTtcbiAgY29uc3QgZGlzcG9zZWRFdmVudEhhbmRsZXJJZHNWYWx1ZXMgPSBhcnJheVJhbmdlUmVhZGVyLnZhbHVlcyhkaXNwb3NlZEV2ZW50SGFuZGxlcklkc1JhbmdlKTtcbiAgY29uc3QgZGlzcG9zZWRFdmVudEhhbmRsZXJJZHNMZW5ndGggPSBhcnJheVJhbmdlUmVhZGVyLmNvdW50KGRpc3Bvc2VkRXZlbnRIYW5kbGVySWRzUmFuZ2UpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGRpc3Bvc2VkRXZlbnRIYW5kbGVySWRzTGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBldmVudEhhbmRsZXJJZCA9IGJhdGNoLmRpc3Bvc2VkRXZlbnRIYW5kbGVySWRzRW50cnkoZGlzcG9zZWRFdmVudEhhbmRsZXJJZHNWYWx1ZXMsIGkpO1xuICAgIGJyb3dzZXJSZW5kZXJlci5kaXNwb3NlRXZlbnRIYW5kbGVyKGV2ZW50SGFuZGxlcklkKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgcGxhdGZvcm0gfSBmcm9tICcuLi9FbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBNZXRob2RIYW5kbGUsIFN5c3RlbV9TdHJpbmcsIFN5c3RlbV9BcnJheSB9IGZyb20gJy4uL1BsYXRmb3JtL1BsYXRmb3JtJztcbmNvbnN0IGh0dHBDbGllbnRBc3NlbWJseSA9ICdNaWNyb3NvZnQuQXNwTmV0Q29yZS5CbGF6b3InO1xuY29uc3QgaHR0cENsaWVudE5hbWVzcGFjZSA9IGAke2h0dHBDbGllbnRBc3NlbWJseX0uSHR0cGA7XG5jb25zdCBodHRwQ2xpZW50VHlwZU5hbWUgPSAnV2ViQXNzZW1ibHlIdHRwTWVzc2FnZUhhbmRsZXInO1xubGV0IHJlY2VpdmVSZXNwb25zZU1ldGhvZDogTWV0aG9kSGFuZGxlO1xubGV0IGFsbG9jYXRlQXJyYXlNZXRob2Q6IE1ldGhvZEhhbmRsZTtcblxuLy8gVGhlc2UgYXJlIHRoZSBmdW5jdGlvbnMgd2UncmUgbWFraW5nIGF2YWlsYWJsZSBmb3IgaW52b2NhdGlvbiBmcm9tIC5ORVRcbmV4cG9ydCBjb25zdCBpbnRlcm5hbEZ1bmN0aW9ucyA9IHtcbiAgc2VuZEFzeW5jXG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNlbmRBc3luYyhpZDogbnVtYmVyLCBib2R5OiBTeXN0ZW1fQXJyYXk8YW55PiwganNvbkZldGNoQXJnczogU3lzdGVtX1N0cmluZykge1xuICBsZXQgcmVzcG9uc2U6IFJlc3BvbnNlO1xuICBsZXQgcmVzcG9uc2VEYXRhOiBBcnJheUJ1ZmZlcjtcblxuICBjb25zdCBmZXRjaE9wdGlvbnM6IEZldGNoT3B0aW9ucyA9IEpTT04ucGFyc2UocGxhdGZvcm0udG9KYXZhU2NyaXB0U3RyaW5nKGpzb25GZXRjaEFyZ3MpKTtcbiAgY29uc3QgcmVxdWVzdEluaXQ6IFJlcXVlc3RJbml0ID0gT2JqZWN0LmFzc2lnbihmZXRjaE9wdGlvbnMucmVxdWVzdEluaXQsIGZldGNoT3B0aW9ucy5yZXF1ZXN0SW5pdE92ZXJyaWRlcyk7XG5cbiAgaWYgKGJvZHkpIHtcbiAgICByZXF1ZXN0SW5pdC5ib2R5ID0gcGxhdGZvcm0udG9VaW50OEFycmF5KGJvZHkpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXNwb25zZSA9IGF3YWl0IGZldGNoKGZldGNoT3B0aW9ucy5yZXF1ZXN0VXJpLCByZXF1ZXN0SW5pdCk7XG4gICAgcmVzcG9uc2VEYXRhID0gYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKTtcbiAgfSBjYXRjaCAoZXgpIHtcbiAgICBkaXNwYXRjaEVycm9yUmVzcG9uc2UoaWQsIGV4LnRvU3RyaW5nKCkpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGRpc3BhdGNoU3VjY2Vzc1Jlc3BvbnNlKGlkLCByZXNwb25zZSwgcmVzcG9uc2VEYXRhKTtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hTdWNjZXNzUmVzcG9uc2UoaWQ6IG51bWJlciwgcmVzcG9uc2U6IFJlc3BvbnNlLCByZXNwb25zZURhdGE6IEFycmF5QnVmZmVyKSB7XG4gIGNvbnN0IHJlc3BvbnNlRGVzY3JpcHRvcjogUmVzcG9uc2VEZXNjcmlwdG9yID0ge1xuICAgIHN0YXR1c0NvZGU6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgIGhlYWRlcnM6IFtdXG4gIH07XG4gIHJlc3BvbnNlLmhlYWRlcnMuZm9yRWFjaCgodmFsdWUsIG5hbWUpID0+IHtcbiAgICByZXNwb25zZURlc2NyaXB0b3IuaGVhZGVycy5wdXNoKFtuYW1lLCB2YWx1ZV0pO1xuICB9KTtcblxuICBpZiAoIWFsbG9jYXRlQXJyYXlNZXRob2QpIHtcbiAgICBhbGxvY2F0ZUFycmF5TWV0aG9kID0gcGxhdGZvcm0uZmluZE1ldGhvZChcbiAgICAgIGh0dHBDbGllbnRBc3NlbWJseSxcbiAgICAgIGh0dHBDbGllbnROYW1lc3BhY2UsXG4gICAgICBodHRwQ2xpZW50VHlwZU5hbWUsXG4gICAgICAnQWxsb2NhdGVBcnJheSdcbiAgICApO1xuICB9XG5cbiAgLy8gYWxsb2NhdGUgYSBtYW5hZ2VkIGJ5dGVbXSBvZiB0aGUgcmlnaHQgc2l6ZVxuICBjb25zdCBkb3ROZXRBcnJheSA9IHBsYXRmb3JtLmNhbGxNZXRob2QoYWxsb2NhdGVBcnJheU1ldGhvZCwgbnVsbCwgW3BsYXRmb3JtLnRvRG90TmV0U3RyaW5nKHJlc3BvbnNlRGF0YS5ieXRlTGVuZ3RoLnRvU3RyaW5nKCkpXSkgYXMgU3lzdGVtX0FycmF5PGFueT47XG5cbiAgLy8gZ2V0IGFuIFVpbnQ4QXJyYXkgdmlldyBvZiBpdFxuICBjb25zdCBhcnJheSA9IHBsYXRmb3JtLnRvVWludDhBcnJheShkb3ROZXRBcnJheSk7XG5cbiAgLy8gY29weSB0aGUgcmVzcG9uc2VEYXRhIHRvIG91ciBtYW5hZ2VkIGJ5dGVbXVxuICBhcnJheS5zZXQobmV3IFVpbnQ4QXJyYXkocmVzcG9uc2VEYXRhKSk7XG5cbiAgZGlzcGF0Y2hSZXNwb25zZShcbiAgICBpZCxcbiAgICBwbGF0Zm9ybS50b0RvdE5ldFN0cmluZyhKU09OLnN0cmluZ2lmeShyZXNwb25zZURlc2NyaXB0b3IpKSxcbiAgICBkb3ROZXRBcnJheSxcbiAgICAvKiBlcnJvck1lc3NhZ2UgKi8gbnVsbFxuICApO1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaEVycm9yUmVzcG9uc2UoaWQ6IG51bWJlciwgZXJyb3JNZXNzYWdlOiBzdHJpbmcpIHtcbiAgZGlzcGF0Y2hSZXNwb25zZShcbiAgICBpZCxcbiAgICAvKiByZXNwb25zZURlc2NyaXB0b3IgKi8gbnVsbCxcbiAgICAvKiByZXNwb25zZVRleHQgKi8gbnVsbCxcbiAgICBwbGF0Zm9ybS50b0RvdE5ldFN0cmluZyhlcnJvck1lc3NhZ2UpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoUmVzcG9uc2UoaWQ6IG51bWJlciwgcmVzcG9uc2VEZXNjcmlwdG9yOiBTeXN0ZW1fU3RyaW5nIHwgbnVsbCwgcmVzcG9uc2VEYXRhOiBTeXN0ZW1fQXJyYXk8YW55PiB8IG51bGwsIGVycm9yTWVzc2FnZTogU3lzdGVtX1N0cmluZyB8IG51bGwpIHtcbiAgaWYgKCFyZWNlaXZlUmVzcG9uc2VNZXRob2QpIHtcbiAgICByZWNlaXZlUmVzcG9uc2VNZXRob2QgPSBwbGF0Zm9ybS5maW5kTWV0aG9kKFxuICAgICAgaHR0cENsaWVudEFzc2VtYmx5LFxuICAgICAgaHR0cENsaWVudE5hbWVzcGFjZSxcbiAgICAgIGh0dHBDbGllbnRUeXBlTmFtZSxcbiAgICAgICdSZWNlaXZlUmVzcG9uc2UnXG4gICAgKTtcbiAgfVxuXG4gIHBsYXRmb3JtLmNhbGxNZXRob2QocmVjZWl2ZVJlc3BvbnNlTWV0aG9kLCBudWxsLCBbXG4gICAgcGxhdGZvcm0udG9Eb3ROZXRTdHJpbmcoaWQudG9TdHJpbmcoKSksXG4gICAgcmVzcG9uc2VEZXNjcmlwdG9yLFxuICAgIHJlc3BvbnNlRGF0YSxcbiAgICBlcnJvck1lc3NhZ2UsXG4gIF0pO1xufVxuXG4vLyBLZWVwIHRoZXNlIGluIHN5bmMgd2l0aCB0aGUgLk5FVCBlcXVpdmFsZW50IGluIFdlYkFzc2VtYmx5SHR0cE1lc3NhZ2VIYW5kbGVyLmNzXG5pbnRlcmZhY2UgRmV0Y2hPcHRpb25zIHtcbiAgcmVxdWVzdFVyaTogc3RyaW5nO1xuICByZXF1ZXN0SW5pdDogUmVxdWVzdEluaXQ7XG4gIHJlcXVlc3RJbml0T3ZlcnJpZGVzOiBSZXF1ZXN0SW5pdDtcbn1cblxuaW50ZXJmYWNlIFJlc3BvbnNlRGVzY3JpcHRvciB7XG4gIC8vIFdlIGRvbid0IGhhdmUgQm9keVRleHQgaW4gaGVyZSBiZWNhdXNlIGlmIHdlIGRpZCwgdGhlbiBpbiB0aGUgSlNPTi1yZXNwb25zZSBjYXNlICh3aGljaFxuICAvLyBpcyB0aGUgbW9zdCBjb21tb24gY2FzZSksIHdlJ2QgYmUgZG91YmxlLWVuY29kaW5nIGl0LCBzaW5jZSB0aGUgZW50aXJlIFJlc3BvbnNlRGVzY3JpcHRvclxuICAvLyBhbHNvIGdldHMgSlNPTiBlbmNvZGVkLiBJdCB3b3VsZCB3b3JrIGJ1dCBpcyB0d2ljZSB0aGUgYW1vdW50IG9mIHN0cmluZyBwcm9jZXNzaW5nLlxuICBzdGF0dXNDb2RlOiBudW1iZXI7XG4gIHN0YXR1c1RleHQ6IHN0cmluZztcbiAgaGVhZGVyczogc3RyaW5nW11bXTtcbn1cbiIsImltcG9ydCAnQGRvdG5ldC9qc2ludGVyb3AnO1xuXG5sZXQgaGFzUmVnaXN0ZXJlZEV2ZW50TGlzdGVuZXJzID0gZmFsc2U7XG5cbi8vIFdpbGwgYmUgaW5pdGlhbGl6ZWQgb25jZSBzb21lb25lIHJlZ2lzdGVyc1xubGV0IG5vdGlmeUxvY2F0aW9uQ2hhbmdlZENhbGxiYWNrOiB7IGFzc2VtYmx5TmFtZTogc3RyaW5nLCBmdW5jdGlvbk5hbWU6IHN0cmluZyB9IHwgbnVsbCA9IG51bGw7XG5cbi8vIFRoZXNlIGFyZSB0aGUgZnVuY3Rpb25zIHdlJ3JlIG1ha2luZyBhdmFpbGFibGUgZm9yIGludm9jYXRpb24gZnJvbSAuTkVUXG5leHBvcnQgY29uc3QgaW50ZXJuYWxGdW5jdGlvbnMgPSB7XG4gIGVuYWJsZU5hdmlnYXRpb25JbnRlcmNlcHRpb24sXG4gIG5hdmlnYXRlVG8sXG4gIGdldEJhc2VVUkk6ICgpID0+IGRvY3VtZW50LmJhc2VVUkksXG4gIGdldExvY2F0aW9uSHJlZjogKCkgPT4gbG9jYXRpb24uaHJlZixcbn1cblxuZnVuY3Rpb24gZW5hYmxlTmF2aWdhdGlvbkludGVyY2VwdGlvbihhc3NlbWJseU5hbWU6IHN0cmluZywgZnVuY3Rpb25OYW1lOiBzdHJpbmcpIHtcbiAgaWYgKGhhc1JlZ2lzdGVyZWRFdmVudExpc3RlbmVycyB8fCBhc3NlbWJseU5hbWUgPT09IHVuZGVmaW5lZCB8fCBmdW5jdGlvbk5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIG5vdGlmeUxvY2F0aW9uQ2hhbmdlZENhbGxiYWNrID0geyBhc3NlbWJseU5hbWUsIGZ1bmN0aW9uTmFtZSB9O1xuICBoYXNSZWdpc3RlcmVkRXZlbnRMaXN0ZW5lcnMgPSB0cnVlO1xuXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXZlbnQgPT4ge1xuICAgIC8vIEludGVyY2VwdCBjbGlja3Mgb24gYWxsIDxhPiBlbGVtZW50cyB3aGVyZSB0aGUgaHJlZiBpcyB3aXRoaW4gdGhlIDxiYXNlIGhyZWY+IFVSSSBzcGFjZVxuICAgIC8vIFdlIG11c3QgZXhwbGljaXRseSBjaGVjayBpZiBpdCBoYXMgYW4gJ2hyZWYnIGF0dHJpYnV0ZSwgYmVjYXVzZSBpZiBpdCBkb2Vzbid0LCB0aGUgcmVzdWx0IG1pZ2h0IGJlIG51bGwgb3IgYW4gZW1wdHkgc3RyaW5nIGRlcGVuZGluZyBvbiB0aGUgYnJvd3NlclxuICAgIGNvbnN0IGFuY2hvclRhcmdldCA9IGZpbmRDbG9zZXN0QW5jZXN0b3IoZXZlbnQudGFyZ2V0IGFzIEVsZW1lbnQgfCBudWxsLCAnQScpIGFzIEhUTUxBbmNob3JFbGVtZW50O1xuICAgIGNvbnN0IGhyZWZBdHRyaWJ1dGVOYW1lID0gJ2hyZWYnO1xuICAgIGlmIChhbmNob3JUYXJnZXQgJiYgYW5jaG9yVGFyZ2V0Lmhhc0F0dHJpYnV0ZShocmVmQXR0cmlidXRlTmFtZSkgJiYgZXZlbnQuYnV0dG9uID09PSAwKSB7XG4gICAgICBjb25zdCBocmVmID0gYW5jaG9yVGFyZ2V0LmdldEF0dHJpYnV0ZShocmVmQXR0cmlidXRlTmFtZSkhO1xuICAgICAgY29uc3QgYWJzb2x1dGVIcmVmID0gdG9BYnNvbHV0ZVVyaShocmVmKTtcbiAgICAgIGNvbnN0IHRhcmdldEF0dHJpYnV0ZVZhbHVlID0gYW5jaG9yVGFyZ2V0LmdldEF0dHJpYnV0ZSgndGFyZ2V0Jyk7XG4gICAgICBjb25zdCBvcGVuc0luU2FtZUZyYW1lID0gIXRhcmdldEF0dHJpYnV0ZVZhbHVlIHx8IHRhcmdldEF0dHJpYnV0ZVZhbHVlID09PSAnX3NlbGYnO1xuXG4gICAgICAvLyBEb24ndCBzdG9wIGN0cmwvbWV0YS1jbGljayAoZXRjKSBmcm9tIG9wZW5pbmcgbGlua3MgaW4gbmV3IHRhYnMvd2luZG93c1xuICAgICAgaWYgKGlzV2l0aGluQmFzZVVyaVNwYWNlKGFic29sdXRlSHJlZikgJiYgIWV2ZW50SGFzU3BlY2lhbEtleShldmVudCkgJiYgb3BlbnNJblNhbWVGcmFtZSkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBwZXJmb3JtSW50ZXJuYWxOYXZpZ2F0aW9uKGFic29sdXRlSHJlZik7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncG9wc3RhdGUnLCBoYW5kbGVJbnRlcm5hbE5hdmlnYXRpb24pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbmF2aWdhdGVUbyh1cmk6IHN0cmluZywgZm9yY2VMb2FkOiBib29sZWFuKSB7XG4gIGNvbnN0IGFic29sdXRlVXJpID0gdG9BYnNvbHV0ZVVyaSh1cmkpO1xuXG4gIGlmICghZm9yY2VMb2FkICYmIGlzV2l0aGluQmFzZVVyaVNwYWNlKGFic29sdXRlVXJpKSkge1xuICAgIHBlcmZvcm1JbnRlcm5hbE5hdmlnYXRpb24oYWJzb2x1dGVVcmkpO1xuICB9IGVsc2Uge1xuICAgIGxvY2F0aW9uLmhyZWYgPSB1cmk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGVyZm9ybUludGVybmFsTmF2aWdhdGlvbihhYnNvbHV0ZUludGVybmFsSHJlZjogc3RyaW5nKSB7XG4gIGhpc3RvcnkucHVzaFN0YXRlKG51bGwsIC8qIGlnbm9yZWQgdGl0bGUgKi8gJycsIGFic29sdXRlSW50ZXJuYWxIcmVmKTtcbiAgaGFuZGxlSW50ZXJuYWxOYXZpZ2F0aW9uKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZUludGVybmFsTmF2aWdhdGlvbigpIHtcbiAgaWYgKG5vdGlmeUxvY2F0aW9uQ2hhbmdlZENhbGxiYWNrKSB7XG4gICAgYXdhaXQgRG90TmV0Lmludm9rZU1ldGhvZEFzeW5jKFxuICAgICAgbm90aWZ5TG9jYXRpb25DaGFuZ2VkQ2FsbGJhY2suYXNzZW1ibHlOYW1lLFxuICAgICAgbm90aWZ5TG9jYXRpb25DaGFuZ2VkQ2FsbGJhY2suZnVuY3Rpb25OYW1lLFxuICAgICAgbG9jYXRpb24uaHJlZlxuICAgICk7XG4gIH1cbn1cblxubGV0IHRlc3RBbmNob3I6IEhUTUxBbmNob3JFbGVtZW50O1xuZnVuY3Rpb24gdG9BYnNvbHV0ZVVyaShyZWxhdGl2ZVVyaTogc3RyaW5nKSB7XG4gIHRlc3RBbmNob3IgPSB0ZXN0QW5jaG9yIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgdGVzdEFuY2hvci5ocmVmID0gcmVsYXRpdmVVcmk7XG4gIHJldHVybiB0ZXN0QW5jaG9yLmhyZWY7XG59XG5cbmZ1bmN0aW9uIGZpbmRDbG9zZXN0QW5jZXN0b3IoZWxlbWVudDogRWxlbWVudCB8IG51bGwsIHRhZ05hbWU6IHN0cmluZykge1xuICByZXR1cm4gIWVsZW1lbnRcbiAgICA/IG51bGxcbiAgICA6IGVsZW1lbnQudGFnTmFtZSA9PT0gdGFnTmFtZVxuICAgICAgPyBlbGVtZW50XG4gICAgICA6IGZpbmRDbG9zZXN0QW5jZXN0b3IoZWxlbWVudC5wYXJlbnRFbGVtZW50LCB0YWdOYW1lKVxufVxuXG5mdW5jdGlvbiBpc1dpdGhpbkJhc2VVcmlTcGFjZShocmVmOiBzdHJpbmcpIHtcbiAgY29uc3QgYmFzZVVyaVdpdGhUcmFpbGluZ1NsYXNoID0gdG9CYXNlVXJpV2l0aFRyYWlsaW5nU2xhc2goZG9jdW1lbnQuYmFzZVVSSSEpOyAvLyBUT0RPOiBNaWdodCBiYXNlVVJJIHJlYWxseSBiZSBudWxsP1xuICByZXR1cm4gaHJlZi5zdGFydHNXaXRoKGJhc2VVcmlXaXRoVHJhaWxpbmdTbGFzaCk7XG59XG5cbmZ1bmN0aW9uIHRvQmFzZVVyaVdpdGhUcmFpbGluZ1NsYXNoKGJhc2VVcmk6IHN0cmluZykge1xuICByZXR1cm4gYmFzZVVyaS5zdWJzdHIoMCwgYmFzZVVyaS5sYXN0SW5kZXhPZignLycpICsgMSk7XG59XG5cbmZ1bmN0aW9uIGV2ZW50SGFzU3BlY2lhbEtleShldmVudDogTW91c2VFdmVudCkge1xuICByZXR1cm4gZXZlbnQuY3RybEtleSB8fCBldmVudC5zaGlmdEtleSB8fCBldmVudC5hbHRLZXkgfHwgZXZlbnQubWV0YUtleTtcbn1cbiIsIi8vIENvcHlyaWdodCAoYykgLk5FVCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuLy8gTm90IGV4cG9ydGVkIGZyb20gaW5kZXguXHJcbnZhciBCaW5hcnlNZXNzYWdlRm9ybWF0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gQmluYXJ5TWVzc2FnZUZvcm1hdCgpIHtcclxuICAgIH1cclxuICAgIC8vIFRoZSBsZW5ndGggcHJlZml4IG9mIGJpbmFyeSBtZXNzYWdlcyBpcyBlbmNvZGVkIGFzIFZhckludC4gUmVhZCB0aGUgY29tbWVudCBpblxyXG4gICAgLy8gdGhlIEJpbmFyeU1lc3NhZ2VQYXJzZXIuVHJ5UGFyc2VNZXNzYWdlIGZvciBkZXRhaWxzLlxyXG4gICAgQmluYXJ5TWVzc2FnZUZvcm1hdC53cml0ZSA9IGZ1bmN0aW9uIChvdXRwdXQpIHtcclxuICAgICAgICAvLyBtc2dwYWNrNSB1c2VzIHJldHVybnMgQnVmZmVyIGluc3RlYWQgb2YgVWludDhBcnJheSBvbiBJRTEwIGFuZCBzb21lIG90aGVyIGJyb3dzZXJcclxuICAgICAgICAvLyAgaW4gd2hpY2ggY2FzZSAuYnl0ZUxlbmd0aCBkb2VzIHdpbGwgYmUgdW5kZWZpbmVkXHJcbiAgICAgICAgdmFyIHNpemUgPSBvdXRwdXQuYnl0ZUxlbmd0aCB8fCBvdXRwdXQubGVuZ3RoO1xyXG4gICAgICAgIHZhciBsZW5CdWZmZXIgPSBbXTtcclxuICAgICAgICBkbyB7XHJcbiAgICAgICAgICAgIHZhciBzaXplUGFydCA9IHNpemUgJiAweDdmO1xyXG4gICAgICAgICAgICBzaXplID0gc2l6ZSA+PiA3O1xyXG4gICAgICAgICAgICBpZiAoc2l6ZSA+IDApIHtcclxuICAgICAgICAgICAgICAgIHNpemVQYXJ0IHw9IDB4ODA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGVuQnVmZmVyLnB1c2goc2l6ZVBhcnQpO1xyXG4gICAgICAgIH0gd2hpbGUgKHNpemUgPiAwKTtcclxuICAgICAgICAvLyBtc2dwYWNrNSB1c2VzIHJldHVybnMgQnVmZmVyIGluc3RlYWQgb2YgVWludDhBcnJheSBvbiBJRTEwIGFuZCBzb21lIG90aGVyIGJyb3dzZXJcclxuICAgICAgICAvLyAgaW4gd2hpY2ggY2FzZSAuYnl0ZUxlbmd0aCBkb2VzIHdpbGwgYmUgdW5kZWZpbmVkXHJcbiAgICAgICAgc2l6ZSA9IG91dHB1dC5ieXRlTGVuZ3RoIHx8IG91dHB1dC5sZW5ndGg7XHJcbiAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KGxlbkJ1ZmZlci5sZW5ndGggKyBzaXplKTtcclxuICAgICAgICBidWZmZXIuc2V0KGxlbkJ1ZmZlciwgMCk7XHJcbiAgICAgICAgYnVmZmVyLnNldChvdXRwdXQsIGxlbkJ1ZmZlci5sZW5ndGgpO1xyXG4gICAgICAgIHJldHVybiBidWZmZXIuYnVmZmVyO1xyXG4gICAgfTtcclxuICAgIEJpbmFyeU1lc3NhZ2VGb3JtYXQucGFyc2UgPSBmdW5jdGlvbiAoaW5wdXQpIHtcclxuICAgICAgICB2YXIgcmVzdWx0ID0gW107XHJcbiAgICAgICAgdmFyIHVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheShpbnB1dCk7XHJcbiAgICAgICAgdmFyIG1heExlbmd0aFByZWZpeFNpemUgPSA1O1xyXG4gICAgICAgIHZhciBudW1CaXRzVG9TaGlmdCA9IFswLCA3LCAxNCwgMjEsIDI4XTtcclxuICAgICAgICBmb3IgKHZhciBvZmZzZXQgPSAwOyBvZmZzZXQgPCBpbnB1dC5ieXRlTGVuZ3RoOykge1xyXG4gICAgICAgICAgICB2YXIgbnVtQnl0ZXMgPSAwO1xyXG4gICAgICAgICAgICB2YXIgc2l6ZSA9IDA7XHJcbiAgICAgICAgICAgIHZhciBieXRlUmVhZCA9IHZvaWQgMDtcclxuICAgICAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICAgICAgYnl0ZVJlYWQgPSB1aW50OEFycmF5W29mZnNldCArIG51bUJ5dGVzXTtcclxuICAgICAgICAgICAgICAgIHNpemUgPSBzaXplIHwgKChieXRlUmVhZCAmIDB4N2YpIDw8IChudW1CaXRzVG9TaGlmdFtudW1CeXRlc10pKTtcclxuICAgICAgICAgICAgICAgIG51bUJ5dGVzKys7XHJcbiAgICAgICAgICAgIH0gd2hpbGUgKG51bUJ5dGVzIDwgTWF0aC5taW4obWF4TGVuZ3RoUHJlZml4U2l6ZSwgaW5wdXQuYnl0ZUxlbmd0aCAtIG9mZnNldCkgJiYgKGJ5dGVSZWFkICYgMHg4MCkgIT09IDApO1xyXG4gICAgICAgICAgICBpZiAoKGJ5dGVSZWFkICYgMHg4MCkgIT09IDAgJiYgbnVtQnl0ZXMgPCBtYXhMZW5ndGhQcmVmaXhTaXplKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgcmVhZCBtZXNzYWdlIHNpemUuXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChudW1CeXRlcyA9PT0gbWF4TGVuZ3RoUHJlZml4U2l6ZSAmJiBieXRlUmVhZCA+IDcpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1lc3NhZ2VzIGJpZ2dlciB0aGFuIDJHQiBhcmUgbm90IHN1cHBvcnRlZC5cIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHVpbnQ4QXJyYXkuYnl0ZUxlbmd0aCA+PSAob2Zmc2V0ICsgbnVtQnl0ZXMgKyBzaXplKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gSUUgZG9lcyBub3Qgc3VwcG9ydCAuc2xpY2UoKSBzbyB1c2Ugc3ViYXJyYXlcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHVpbnQ4QXJyYXkuc2xpY2VcclxuICAgICAgICAgICAgICAgICAgICA/IHVpbnQ4QXJyYXkuc2xpY2Uob2Zmc2V0ICsgbnVtQnl0ZXMsIG9mZnNldCArIG51bUJ5dGVzICsgc2l6ZSlcclxuICAgICAgICAgICAgICAgICAgICA6IHVpbnQ4QXJyYXkuc3ViYXJyYXkob2Zmc2V0ICsgbnVtQnl0ZXMsIG9mZnNldCArIG51bUJ5dGVzICsgc2l6ZSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW5jb21wbGV0ZSBtZXNzYWdlLlwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvZmZzZXQgPSBvZmZzZXQgKyBudW1CeXRlcyArIHNpemU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIEJpbmFyeU1lc3NhZ2VGb3JtYXQ7XHJcbn0oKSk7XHJcbmV4cG9ydCB7IEJpbmFyeU1lc3NhZ2VGb3JtYXQgfTtcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QmluYXJ5TWVzc2FnZUZvcm1hdC5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIC5ORVQgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gXCJidWZmZXJcIjtcclxuaW1wb3J0ICogYXMgbXNncGFjazUgZnJvbSBcIm1zZ3BhY2s1XCI7XHJcbmltcG9ydCB7IExvZ0xldmVsLCBNZXNzYWdlVHlwZSwgTnVsbExvZ2dlciwgVHJhbnNmZXJGb3JtYXQgfSBmcm9tIFwiQGFzcG5ldC9zaWduYWxyXCI7XHJcbmltcG9ydCB7IEJpbmFyeU1lc3NhZ2VGb3JtYXQgfSBmcm9tIFwiLi9CaW5hcnlNZXNzYWdlRm9ybWF0XCI7XHJcbi8vIFR5cGVEb2MncyBAaW5oZXJpdERvYyBhbmQgQGxpbmsgZG9uJ3Qgd29yayBhY3Jvc3MgbW9kdWxlcyA6KFxyXG4vKiogSW1wbGVtZW50cyB0aGUgTWVzc2FnZVBhY2sgSHViIFByb3RvY29sICovXHJcbnZhciBNZXNzYWdlUGFja0h1YlByb3RvY29sID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gTWVzc2FnZVBhY2tIdWJQcm90b2NvbCgpIHtcclxuICAgICAgICAvKiogVGhlIG5hbWUgb2YgdGhlIHByb3RvY29sLiBUaGlzIGlzIHVzZWQgYnkgU2lnbmFsUiB0byByZXNvbHZlIHRoZSBwcm90b2NvbCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHNlcnZlci4gKi9cclxuICAgICAgICB0aGlzLm5hbWUgPSBcIm1lc3NhZ2VwYWNrXCI7XHJcbiAgICAgICAgLyoqIFRoZSB2ZXJzaW9uIG9mIHRoZSBwcm90b2NvbC4gKi9cclxuICAgICAgICB0aGlzLnZlcnNpb24gPSAxO1xyXG4gICAgICAgIC8qKiBUaGUgVHJhbnNmZXJGb3JtYXQgb2YgdGhlIHByb3RvY29sLiAqL1xyXG4gICAgICAgIHRoaXMudHJhbnNmZXJGb3JtYXQgPSBUcmFuc2ZlckZvcm1hdC5CaW5hcnk7XHJcbiAgICB9XHJcbiAgICAvKiogQ3JlYXRlcyBhbiBhcnJheSBvZiBIdWJNZXNzYWdlIG9iamVjdHMgZnJvbSB0aGUgc3BlY2lmaWVkIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gaW5wdXQgQW4gQXJyYXlCdWZmZXIgY29udGFpbmluZyB0aGUgc2VyaWFsaXplZCByZXByZXNlbnRhdGlvbi5cclxuICAgICAqIEBwYXJhbSB7SUxvZ2dlcn0gbG9nZ2VyIEEgbG9nZ2VyIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGxvZyBtZXNzYWdlcyB0aGF0IG9jY3VyIGR1cmluZyBwYXJzaW5nLlxyXG4gICAgICovXHJcbiAgICBNZXNzYWdlUGFja0h1YlByb3RvY29sLnByb3RvdHlwZS5wYXJzZU1lc3NhZ2VzID0gZnVuY3Rpb24gKGlucHV0LCBsb2dnZXIpIHtcclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIC8vIFRoZSBpbnRlcmZhY2UgZG9lcyBhbGxvdyBcInN0cmluZ1wiIHRvIGJlIHBhc3NlZCBpbiwgYnV0IHRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyBub3QuIFNvIGxldCdzIHRocm93IGEgdXNlZnVsIGVycm9yLlxyXG4gICAgICAgIGlmICghKGlucHV0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgaW5wdXQgZm9yIE1lc3NhZ2VQYWNrIGh1YiBwcm90b2NvbC4gRXhwZWN0ZWQgYW4gQXJyYXlCdWZmZXIuXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobG9nZ2VyID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGxvZ2dlciA9IE51bGxMb2dnZXIuaW5zdGFuY2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBCaW5hcnlNZXNzYWdlRm9ybWF0LnBhcnNlKGlucHV0KS5tYXAoZnVuY3Rpb24gKG0pIHsgcmV0dXJuIF90aGlzLnBhcnNlTWVzc2FnZShtLCBsb2dnZXIpOyB9KTtcclxuICAgIH07XHJcbiAgICAvKiogV3JpdGVzIHRoZSBzcGVjaWZpZWQgSHViTWVzc2FnZSB0byBhbiBBcnJheUJ1ZmZlciBhbmQgcmV0dXJucyBpdC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0h1Yk1lc3NhZ2V9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gd3JpdGUuXHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXlCdWZmZXJ9IEFuIEFycmF5QnVmZmVyIGNvbnRhaW5pbmcgdGhlIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1lc3NhZ2UuXHJcbiAgICAgKi9cclxuICAgIE1lc3NhZ2VQYWNrSHViUHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWVzc2FnZSA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7XHJcbiAgICAgICAgc3dpdGNoIChtZXNzYWdlLnR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBNZXNzYWdlVHlwZS5JbnZvY2F0aW9uOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JpdGVJbnZvY2F0aW9uKG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICBjYXNlIE1lc3NhZ2VUeXBlLlN0cmVhbUludm9jYXRpb246XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy53cml0ZVN0cmVhbUludm9jYXRpb24obWVzc2FnZSk7XHJcbiAgICAgICAgICAgIGNhc2UgTWVzc2FnZVR5cGUuU3RyZWFtSXRlbTpcclxuICAgICAgICAgICAgY2FzZSBNZXNzYWdlVHlwZS5Db21wbGV0aW9uOlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV3JpdGluZyBtZXNzYWdlcyBvZiB0eXBlICdcIiArIG1lc3NhZ2UudHlwZSArIFwiJyBpcyBub3Qgc3VwcG9ydGVkLlwiKTtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgbWVzc2FnZSB0eXBlLlwiKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgTWVzc2FnZVBhY2tIdWJQcm90b2NvbC5wcm90b3R5cGUucGFyc2VNZXNzYWdlID0gZnVuY3Rpb24gKGlucHV0LCBsb2dnZXIpIHtcclxuICAgICAgICBpZiAoaW5wdXQubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGF5bG9hZC5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBtc2dwYWNrID0gbXNncGFjazUoKTtcclxuICAgICAgICB2YXIgcHJvcGVydGllcyA9IG1zZ3BhY2suZGVjb2RlKG5ldyBCdWZmZXIoaW5wdXQpKTtcclxuICAgICAgICBpZiAocHJvcGVydGllcy5sZW5ndGggPT09IDAgfHwgIShwcm9wZXJ0aWVzIGluc3RhbmNlb2YgQXJyYXkpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGF5bG9hZC5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBtZXNzYWdlVHlwZSA9IHByb3BlcnRpZXNbMF07XHJcbiAgICAgICAgc3dpdGNoIChtZXNzYWdlVHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIE1lc3NhZ2VUeXBlLkludm9jYXRpb246XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVJbnZvY2F0aW9uTWVzc2FnZSh0aGlzLnJlYWRIZWFkZXJzKHByb3BlcnRpZXMpLCBwcm9wZXJ0aWVzKTtcclxuICAgICAgICAgICAgY2FzZSBNZXNzYWdlVHlwZS5TdHJlYW1JdGVtOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlU3RyZWFtSXRlbU1lc3NhZ2UodGhpcy5yZWFkSGVhZGVycyhwcm9wZXJ0aWVzKSwgcHJvcGVydGllcyk7XHJcbiAgICAgICAgICAgIGNhc2UgTWVzc2FnZVR5cGUuQ29tcGxldGlvbjpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUNvbXBsZXRpb25NZXNzYWdlKHRoaXMucmVhZEhlYWRlcnMocHJvcGVydGllcyksIHByb3BlcnRpZXMpO1xyXG4gICAgICAgICAgICBjYXNlIE1lc3NhZ2VUeXBlLlBpbmc6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVQaW5nTWVzc2FnZShwcm9wZXJ0aWVzKTtcclxuICAgICAgICAgICAgY2FzZSBNZXNzYWdlVHlwZS5DbG9zZTpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUNsb3NlTWVzc2FnZShwcm9wZXJ0aWVzKTtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIC8vIEZ1dHVyZSBwcm90b2NvbCBjaGFuZ2VzIGNhbiBhZGQgbWVzc2FnZSB0eXBlcywgb2xkIGNsaWVudHMgY2FuIGlnbm9yZSB0aGVtXHJcbiAgICAgICAgICAgICAgICBsb2dnZXIubG9nKExvZ0xldmVsLkluZm9ybWF0aW9uLCBcIlVua25vd24gbWVzc2FnZSB0eXBlICdcIiArIG1lc3NhZ2VUeXBlICsgXCInIGlnbm9yZWQuXCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIE1lc3NhZ2VQYWNrSHViUHJvdG9jb2wucHJvdG90eXBlLmNyZWF0ZUNsb3NlTWVzc2FnZSA9IGZ1bmN0aW9uIChwcm9wZXJ0aWVzKSB7XHJcbiAgICAgICAgLy8gY2hlY2sgbWluaW11bSBsZW5ndGggdG8gYWxsb3cgcHJvdG9jb2wgdG8gYWRkIGl0ZW1zIHRvIHRoZSBlbmQgb2Ygb2JqZWN0cyBpbiBmdXR1cmUgcmVsZWFzZXNcclxuICAgICAgICBpZiAocHJvcGVydGllcy5sZW5ndGggPCAyKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGF5bG9hZCBmb3IgQ2xvc2UgbWVzc2FnZS5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC8vIENsb3NlIG1lc3NhZ2VzIGhhdmUgbm8gaGVhZGVycy5cclxuICAgICAgICAgICAgZXJyb3I6IHByb3BlcnRpZXNbMV0sXHJcbiAgICAgICAgICAgIHR5cGU6IE1lc3NhZ2VUeXBlLkNsb3NlLFxyXG4gICAgICAgIH07XHJcbiAgICB9O1xyXG4gICAgTWVzc2FnZVBhY2tIdWJQcm90b2NvbC5wcm90b3R5cGUuY3JlYXRlUGluZ01lc3NhZ2UgPSBmdW5jdGlvbiAocHJvcGVydGllcykge1xyXG4gICAgICAgIC8vIGNoZWNrIG1pbmltdW0gbGVuZ3RoIHRvIGFsbG93IHByb3RvY29sIHRvIGFkZCBpdGVtcyB0byB0aGUgZW5kIG9mIG9iamVjdHMgaW4gZnV0dXJlIHJlbGVhc2VzXHJcbiAgICAgICAgaWYgKHByb3BlcnRpZXMubGVuZ3RoIDwgMSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBheWxvYWQgZm9yIFBpbmcgbWVzc2FnZS5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC8vIFBpbmcgbWVzc2FnZXMgaGF2ZSBubyBoZWFkZXJzLlxyXG4gICAgICAgICAgICB0eXBlOiBNZXNzYWdlVHlwZS5QaW5nLFxyXG4gICAgICAgIH07XHJcbiAgICB9O1xyXG4gICAgTWVzc2FnZVBhY2tIdWJQcm90b2NvbC5wcm90b3R5cGUuY3JlYXRlSW52b2NhdGlvbk1lc3NhZ2UgPSBmdW5jdGlvbiAoaGVhZGVycywgcHJvcGVydGllcykge1xyXG4gICAgICAgIC8vIGNoZWNrIG1pbmltdW0gbGVuZ3RoIHRvIGFsbG93IHByb3RvY29sIHRvIGFkZCBpdGVtcyB0byB0aGUgZW5kIG9mIG9iamVjdHMgaW4gZnV0dXJlIHJlbGVhc2VzXHJcbiAgICAgICAgaWYgKHByb3BlcnRpZXMubGVuZ3RoIDwgNSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBheWxvYWQgZm9yIEludm9jYXRpb24gbWVzc2FnZS5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBpbnZvY2F0aW9uSWQgPSBwcm9wZXJ0aWVzWzJdO1xyXG4gICAgICAgIGlmIChpbnZvY2F0aW9uSWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGFyZ3VtZW50czogcHJvcGVydGllc1s0XSxcclxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXHJcbiAgICAgICAgICAgICAgICBpbnZvY2F0aW9uSWQ6IGludm9jYXRpb25JZCxcclxuICAgICAgICAgICAgICAgIHRhcmdldDogcHJvcGVydGllc1szXSxcclxuICAgICAgICAgICAgICAgIHR5cGU6IE1lc3NhZ2VUeXBlLkludm9jYXRpb24sXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgYXJndW1lbnRzOiBwcm9wZXJ0aWVzWzRdLFxyXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcclxuICAgICAgICAgICAgICAgIHRhcmdldDogcHJvcGVydGllc1szXSxcclxuICAgICAgICAgICAgICAgIHR5cGU6IE1lc3NhZ2VUeXBlLkludm9jYXRpb24sXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIE1lc3NhZ2VQYWNrSHViUHJvdG9jb2wucHJvdG90eXBlLmNyZWF0ZVN0cmVhbUl0ZW1NZXNzYWdlID0gZnVuY3Rpb24gKGhlYWRlcnMsIHByb3BlcnRpZXMpIHtcclxuICAgICAgICAvLyBjaGVjayBtaW5pbXVtIGxlbmd0aCB0byBhbGxvdyBwcm90b2NvbCB0byBhZGQgaXRlbXMgdG8gdGhlIGVuZCBvZiBvYmplY3RzIGluIGZ1dHVyZSByZWxlYXNlc1xyXG4gICAgICAgIGlmIChwcm9wZXJ0aWVzLmxlbmd0aCA8IDQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYXlsb2FkIGZvciBTdHJlYW1JdGVtIG1lc3NhZ2UuXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxyXG4gICAgICAgICAgICBpbnZvY2F0aW9uSWQ6IHByb3BlcnRpZXNbMl0sXHJcbiAgICAgICAgICAgIGl0ZW06IHByb3BlcnRpZXNbM10sXHJcbiAgICAgICAgICAgIHR5cGU6IE1lc3NhZ2VUeXBlLlN0cmVhbUl0ZW0sXHJcbiAgICAgICAgfTtcclxuICAgIH07XHJcbiAgICBNZXNzYWdlUGFja0h1YlByb3RvY29sLnByb3RvdHlwZS5jcmVhdGVDb21wbGV0aW9uTWVzc2FnZSA9IGZ1bmN0aW9uIChoZWFkZXJzLCBwcm9wZXJ0aWVzKSB7XHJcbiAgICAgICAgLy8gY2hlY2sgbWluaW11bSBsZW5ndGggdG8gYWxsb3cgcHJvdG9jb2wgdG8gYWRkIGl0ZW1zIHRvIHRoZSBlbmQgb2Ygb2JqZWN0cyBpbiBmdXR1cmUgcmVsZWFzZXNcclxuICAgICAgICBpZiAocHJvcGVydGllcy5sZW5ndGggPCA0KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGF5bG9hZCBmb3IgQ29tcGxldGlvbiBtZXNzYWdlLlwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGVycm9yUmVzdWx0ID0gMTtcclxuICAgICAgICB2YXIgdm9pZFJlc3VsdCA9IDI7XHJcbiAgICAgICAgdmFyIG5vblZvaWRSZXN1bHQgPSAzO1xyXG4gICAgICAgIHZhciByZXN1bHRLaW5kID0gcHJvcGVydGllc1szXTtcclxuICAgICAgICBpZiAocmVzdWx0S2luZCAhPT0gdm9pZFJlc3VsdCAmJiBwcm9wZXJ0aWVzLmxlbmd0aCA8IDUpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYXlsb2FkIGZvciBDb21wbGV0aW9uIG1lc3NhZ2UuXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgY29tcGxldGlvbk1lc3NhZ2UgPSB7XHJcbiAgICAgICAgICAgIGVycm9yOiBudWxsLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxyXG4gICAgICAgICAgICBpbnZvY2F0aW9uSWQ6IHByb3BlcnRpZXNbMl0sXHJcbiAgICAgICAgICAgIHJlc3VsdDogbnVsbCxcclxuICAgICAgICAgICAgdHlwZTogTWVzc2FnZVR5cGUuQ29tcGxldGlvbixcclxuICAgICAgICB9O1xyXG4gICAgICAgIHN3aXRjaCAocmVzdWx0S2luZCkge1xyXG4gICAgICAgICAgICBjYXNlIGVycm9yUmVzdWx0OlxyXG4gICAgICAgICAgICAgICAgY29tcGxldGlvbk1lc3NhZ2UuZXJyb3IgPSBwcm9wZXJ0aWVzWzRdO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2Ugbm9uVm9pZFJlc3VsdDpcclxuICAgICAgICAgICAgICAgIGNvbXBsZXRpb25NZXNzYWdlLnJlc3VsdCA9IHByb3BlcnRpZXNbNF07XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNvbXBsZXRpb25NZXNzYWdlO1xyXG4gICAgfTtcclxuICAgIE1lc3NhZ2VQYWNrSHViUHJvdG9jb2wucHJvdG90eXBlLndyaXRlSW52b2NhdGlvbiA9IGZ1bmN0aW9uIChpbnZvY2F0aW9uTWVzc2FnZSkge1xyXG4gICAgICAgIHZhciBtc2dwYWNrID0gbXNncGFjazUoKTtcclxuICAgICAgICB2YXIgcGF5bG9hZCA9IG1zZ3BhY2suZW5jb2RlKFtNZXNzYWdlVHlwZS5JbnZvY2F0aW9uLCBpbnZvY2F0aW9uTWVzc2FnZS5oZWFkZXJzIHx8IHt9LCBpbnZvY2F0aW9uTWVzc2FnZS5pbnZvY2F0aW9uSWQgfHwgbnVsbCxcclxuICAgICAgICAgICAgaW52b2NhdGlvbk1lc3NhZ2UudGFyZ2V0LCBpbnZvY2F0aW9uTWVzc2FnZS5hcmd1bWVudHNdKTtcclxuICAgICAgICByZXR1cm4gQmluYXJ5TWVzc2FnZUZvcm1hdC53cml0ZShwYXlsb2FkLnNsaWNlKCkpO1xyXG4gICAgfTtcclxuICAgIE1lc3NhZ2VQYWNrSHViUHJvdG9jb2wucHJvdG90eXBlLndyaXRlU3RyZWFtSW52b2NhdGlvbiA9IGZ1bmN0aW9uIChzdHJlYW1JbnZvY2F0aW9uTWVzc2FnZSkge1xyXG4gICAgICAgIHZhciBtc2dwYWNrID0gbXNncGFjazUoKTtcclxuICAgICAgICB2YXIgcGF5bG9hZCA9IG1zZ3BhY2suZW5jb2RlKFtNZXNzYWdlVHlwZS5TdHJlYW1JbnZvY2F0aW9uLCBzdHJlYW1JbnZvY2F0aW9uTWVzc2FnZS5oZWFkZXJzIHx8IHt9LCBzdHJlYW1JbnZvY2F0aW9uTWVzc2FnZS5pbnZvY2F0aW9uSWQsXHJcbiAgICAgICAgICAgIHN0cmVhbUludm9jYXRpb25NZXNzYWdlLnRhcmdldCwgc3RyZWFtSW52b2NhdGlvbk1lc3NhZ2UuYXJndW1lbnRzXSk7XHJcbiAgICAgICAgcmV0dXJuIEJpbmFyeU1lc3NhZ2VGb3JtYXQud3JpdGUocGF5bG9hZC5zbGljZSgpKTtcclxuICAgIH07XHJcbiAgICBNZXNzYWdlUGFja0h1YlByb3RvY29sLnByb3RvdHlwZS5yZWFkSGVhZGVycyA9IGZ1bmN0aW9uIChwcm9wZXJ0aWVzKSB7XHJcbiAgICAgICAgdmFyIGhlYWRlcnMgPSBwcm9wZXJ0aWVzWzFdO1xyXG4gICAgICAgIGlmICh0eXBlb2YgaGVhZGVycyAhPT0gXCJvYmplY3RcIikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGhlYWRlcnMuXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaGVhZGVycztcclxuICAgIH07XHJcbiAgICByZXR1cm4gTWVzc2FnZVBhY2tIdWJQcm90b2NvbDtcclxufSgpKTtcclxuZXhwb3J0IHsgTWVzc2FnZVBhY2tIdWJQcm90b2NvbCB9O1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1NZXNzYWdlUGFja0h1YlByb3RvY29sLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgLk5FVCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuLy8gVmVyc2lvbiB0b2tlbiB0aGF0IHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIHByZXBhY2sgY29tbWFuZFxyXG4vKiogVGhlIHZlcnNpb24gb2YgdGhlIFNpZ25hbFIgTWVzc2FnZSBQYWNrIHByb3RvY29sIGxpYnJhcnkuICovXHJcbmV4cG9ydCB2YXIgVkVSU0lPTiA9IFwiMS4wLjJcIjtcclxuZXhwb3J0IHsgTWVzc2FnZVBhY2tIdWJQcm90b2NvbCB9IGZyb20gXCIuL01lc3NhZ2VQYWNrSHViUHJvdG9jb2xcIjtcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSAuTkVUIEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG4vLyBSb3VnaCBwb2x5ZmlsbCBvZiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQWJvcnRDb250cm9sbGVyXHJcbi8vIFdlIGRvbid0IGFjdHVhbGx5IGV2ZXIgdXNlIHRoZSBBUEkgYmVpbmcgcG9seWZpbGxlZCwgd2UgYWx3YXlzIHVzZSB0aGUgcG9seWZpbGwgYmVjYXVzZVxyXG4vLyBpdCdzIGEgdmVyeSBuZXcgQVBJIHJpZ2h0IG5vdy5cclxuLy8gTm90IGV4cG9ydGVkIGZyb20gaW5kZXguXHJcbnZhciBBYm9ydENvbnRyb2xsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBBYm9ydENvbnRyb2xsZXIoKSB7XHJcbiAgICAgICAgdGhpcy5pc0Fib3J0ZWQgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIEFib3J0Q29udHJvbGxlci5wcm90b3R5cGUuYWJvcnQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzQWJvcnRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmlzQWJvcnRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9uYWJvcnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMub25hYm9ydCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBYm9ydENvbnRyb2xsZXIucHJvdG90eXBlLCBcInNpZ25hbFwiLCB7XHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFib3J0Q29udHJvbGxlci5wcm90b3R5cGUsIFwiYWJvcnRlZFwiLCB7XHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzQWJvcnRlZDtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIHJldHVybiBBYm9ydENvbnRyb2xsZXI7XHJcbn0oKSk7XHJcbmV4cG9ydCB7IEFib3J0Q29udHJvbGxlciB9O1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1BYm9ydENvbnRyb2xsZXIuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSAuTkVUIEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5pbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xyXG4vKiogRXJyb3IgdGhyb3duIHdoZW4gYW4gSFRUUCByZXF1ZXN0IGZhaWxzLiAqL1xyXG52YXIgSHR0cEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xyXG4gICAgdHNsaWJfMS5fX2V4dGVuZHMoSHR0cEVycm9yLCBfc3VwZXIpO1xyXG4gICAgLyoqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2Yge0BsaW5rIEh0dHBFcnJvcn0uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGVycm9yTWVzc2FnZSBBIGRlc2NyaXB0aXZlIGVycm9yIG1lc3NhZ2UuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhdHVzQ29kZSBUaGUgSFRUUCBzdGF0dXMgY29kZSByZXByZXNlbnRlZCBieSB0aGlzIGVycm9yLlxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBIdHRwRXJyb3IoZXJyb3JNZXNzYWdlLCBzdGF0dXNDb2RlKSB7XHJcbiAgICAgICAgdmFyIF9uZXdUYXJnZXQgPSB0aGlzLmNvbnN0cnVjdG9yO1xyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgdmFyIHRydWVQcm90byA9IF9uZXdUYXJnZXQucHJvdG90eXBlO1xyXG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgZXJyb3JNZXNzYWdlKSB8fCB0aGlzO1xyXG4gICAgICAgIF90aGlzLnN0YXR1c0NvZGUgPSBzdGF0dXNDb2RlO1xyXG4gICAgICAgIC8vIFdvcmthcm91bmQgaXNzdWUgaW4gVHlwZXNjcmlwdCBjb21waWxlclxyXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMTM5NjUjaXNzdWVjb21tZW50LTI3ODU3MDIwMFxyXG4gICAgICAgIF90aGlzLl9fcHJvdG9fXyA9IHRydWVQcm90bztcclxuICAgICAgICByZXR1cm4gX3RoaXM7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gSHR0cEVycm9yO1xyXG59KEVycm9yKSk7XHJcbmV4cG9ydCB7IEh0dHBFcnJvciB9O1xyXG4vKiogRXJyb3IgdGhyb3duIHdoZW4gYSB0aW1lb3V0IGVsYXBzZXMuICovXHJcbnZhciBUaW1lb3V0RXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XHJcbiAgICB0c2xpYl8xLl9fZXh0ZW5kcyhUaW1lb3V0RXJyb3IsIF9zdXBlcik7XHJcbiAgICAvKiogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiB7QGxpbmsgVGltZW91dEVycm9yfS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXJyb3JNZXNzYWdlIEEgZGVzY3JpcHRpdmUgZXJyb3IgbWVzc2FnZS5cclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gVGltZW91dEVycm9yKGVycm9yTWVzc2FnZSkge1xyXG4gICAgICAgIHZhciBfbmV3VGFyZ2V0ID0gdGhpcy5jb25zdHJ1Y3RvcjtcclxuICAgICAgICBpZiAoZXJyb3JNZXNzYWdlID09PSB2b2lkIDApIHsgZXJyb3JNZXNzYWdlID0gXCJBIHRpbWVvdXQgb2NjdXJyZWQuXCI7IH1cclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIHZhciB0cnVlUHJvdG8gPSBfbmV3VGFyZ2V0LnByb3RvdHlwZTtcclxuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGVycm9yTWVzc2FnZSkgfHwgdGhpcztcclxuICAgICAgICAvLyBXb3JrYXJvdW5kIGlzc3VlIGluIFR5cGVzY3JpcHQgY29tcGlsZXJcclxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzEzOTY1I2lzc3VlY29tbWVudC0yNzg1NzAyMDBcclxuICAgICAgICBfdGhpcy5fX3Byb3RvX18gPSB0cnVlUHJvdG87XHJcbiAgICAgICAgcmV0dXJuIF90aGlzO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFRpbWVvdXRFcnJvcjtcclxufShFcnJvcikpO1xyXG5leHBvcnQgeyBUaW1lb3V0RXJyb3IgfTtcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RXJyb3JzLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgLk5FVCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuaW1wb3J0IHsgVGV4dE1lc3NhZ2VGb3JtYXQgfSBmcm9tIFwiLi9UZXh0TWVzc2FnZUZvcm1hdFwiO1xyXG52YXIgSGFuZHNoYWtlUHJvdG9jb2wgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBIYW5kc2hha2VQcm90b2NvbCgpIHtcclxuICAgIH1cclxuICAgIC8vIEhhbmRzaGFrZSByZXF1ZXN0IGlzIGFsd2F5cyBKU09OXHJcbiAgICBIYW5kc2hha2VQcm90b2NvbC5wcm90b3R5cGUud3JpdGVIYW5kc2hha2VSZXF1ZXN0ID0gZnVuY3Rpb24gKGhhbmRzaGFrZVJlcXVlc3QpIHtcclxuICAgICAgICByZXR1cm4gVGV4dE1lc3NhZ2VGb3JtYXQud3JpdGUoSlNPTi5zdHJpbmdpZnkoaGFuZHNoYWtlUmVxdWVzdCkpO1xyXG4gICAgfTtcclxuICAgIEhhbmRzaGFrZVByb3RvY29sLnByb3RvdHlwZS5wYXJzZUhhbmRzaGFrZVJlc3BvbnNlID0gZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICB2YXIgcmVzcG9uc2VNZXNzYWdlO1xyXG4gICAgICAgIHZhciBtZXNzYWdlRGF0YTtcclxuICAgICAgICB2YXIgcmVtYWluaW5nRGF0YTtcclxuICAgICAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XHJcbiAgICAgICAgICAgIC8vIEZvcm1hdCBpcyBiaW5hcnkgYnV0IHN0aWxsIG5lZWQgdG8gcmVhZCBKU09OIHRleHQgZnJvbSBoYW5kc2hha2UgcmVzcG9uc2VcclxuICAgICAgICAgICAgdmFyIGJpbmFyeURhdGEgPSBuZXcgVWludDhBcnJheShkYXRhKTtcclxuICAgICAgICAgICAgdmFyIHNlcGFyYXRvckluZGV4ID0gYmluYXJ5RGF0YS5pbmRleE9mKFRleHRNZXNzYWdlRm9ybWF0LlJlY29yZFNlcGFyYXRvckNvZGUpO1xyXG4gICAgICAgICAgICBpZiAoc2VwYXJhdG9ySW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNZXNzYWdlIGlzIGluY29tcGxldGUuXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIGNvbnRlbnQgYmVmb3JlIHNlcGFyYXRvciBpcyBoYW5kc2hha2UgcmVzcG9uc2VcclxuICAgICAgICAgICAgLy8gb3B0aW9uYWwgY29udGVudCBhZnRlciBpcyBhZGRpdGlvbmFsIG1lc3NhZ2VzXHJcbiAgICAgICAgICAgIHZhciByZXNwb25zZUxlbmd0aCA9IHNlcGFyYXRvckluZGV4ICsgMTtcclxuICAgICAgICAgICAgbWVzc2FnZURhdGEgPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGJpbmFyeURhdGEuc2xpY2UoMCwgcmVzcG9uc2VMZW5ndGgpKTtcclxuICAgICAgICAgICAgcmVtYWluaW5nRGF0YSA9IChiaW5hcnlEYXRhLmJ5dGVMZW5ndGggPiByZXNwb25zZUxlbmd0aCkgPyBiaW5hcnlEYXRhLnNsaWNlKHJlc3BvbnNlTGVuZ3RoKS5idWZmZXIgOiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdmFyIHRleHREYXRhID0gZGF0YTtcclxuICAgICAgICAgICAgdmFyIHNlcGFyYXRvckluZGV4ID0gdGV4dERhdGEuaW5kZXhPZihUZXh0TWVzc2FnZUZvcm1hdC5SZWNvcmRTZXBhcmF0b3IpO1xyXG4gICAgICAgICAgICBpZiAoc2VwYXJhdG9ySW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNZXNzYWdlIGlzIGluY29tcGxldGUuXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIGNvbnRlbnQgYmVmb3JlIHNlcGFyYXRvciBpcyBoYW5kc2hha2UgcmVzcG9uc2VcclxuICAgICAgICAgICAgLy8gb3B0aW9uYWwgY29udGVudCBhZnRlciBpcyBhZGRpdGlvbmFsIG1lc3NhZ2VzXHJcbiAgICAgICAgICAgIHZhciByZXNwb25zZUxlbmd0aCA9IHNlcGFyYXRvckluZGV4ICsgMTtcclxuICAgICAgICAgICAgbWVzc2FnZURhdGEgPSB0ZXh0RGF0YS5zdWJzdHJpbmcoMCwgcmVzcG9uc2VMZW5ndGgpO1xyXG4gICAgICAgICAgICByZW1haW5pbmdEYXRhID0gKHRleHREYXRhLmxlbmd0aCA+IHJlc3BvbnNlTGVuZ3RoKSA/IHRleHREYXRhLnN1YnN0cmluZyhyZXNwb25zZUxlbmd0aCkgOiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHdlIHNob3VsZCBoYXZlIGp1c3QgdGhlIHNpbmdsZSBoYW5kc2hha2UgbWVzc2FnZVxyXG4gICAgICAgIHZhciBtZXNzYWdlcyA9IFRleHRNZXNzYWdlRm9ybWF0LnBhcnNlKG1lc3NhZ2VEYXRhKTtcclxuICAgICAgICByZXNwb25zZU1lc3NhZ2UgPSBKU09OLnBhcnNlKG1lc3NhZ2VzWzBdKTtcclxuICAgICAgICAvLyBtdWx0aXBsZSBtZXNzYWdlcyBjb3VsZCBoYXZlIGFycml2ZWQgd2l0aCBoYW5kc2hha2VcclxuICAgICAgICAvLyByZXR1cm4gYWRkaXRpb25hbCBkYXRhIHRvIGJlIHBhcnNlZCBhcyB1c3VhbCwgb3IgbnVsbCBpZiBhbGwgcGFyc2VkXHJcbiAgICAgICAgcmV0dXJuIFtyZW1haW5pbmdEYXRhLCByZXNwb25zZU1lc3NhZ2VdO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBIYW5kc2hha2VQcm90b2NvbDtcclxufSgpKTtcclxuZXhwb3J0IHsgSGFuZHNoYWtlUHJvdG9jb2wgfTtcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SGFuZHNoYWtlUHJvdG9jb2wuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSAuTkVUIEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG5pbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xyXG5pbXBvcnQgeyBIdHRwRXJyb3IsIFRpbWVvdXRFcnJvciB9IGZyb20gXCIuL0Vycm9yc1wiO1xyXG5pbXBvcnQgeyBMb2dMZXZlbCB9IGZyb20gXCIuL0lMb2dnZXJcIjtcclxuLyoqIFJlcHJlc2VudHMgYW4gSFRUUCByZXNwb25zZS4gKi9cclxudmFyIEh0dHBSZXNwb25zZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIGZ1bmN0aW9uIEh0dHBSZXNwb25zZShzdGF0dXNDb2RlLCBzdGF0dXNUZXh0LCBjb250ZW50KSB7XHJcbiAgICAgICAgdGhpcy5zdGF0dXNDb2RlID0gc3RhdHVzQ29kZTtcclxuICAgICAgICB0aGlzLnN0YXR1c1RleHQgPSBzdGF0dXNUZXh0O1xyXG4gICAgICAgIHRoaXMuY29udGVudCA9IGNvbnRlbnQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gSHR0cFJlc3BvbnNlO1xyXG59KCkpO1xyXG5leHBvcnQgeyBIdHRwUmVzcG9uc2UgfTtcclxuLyoqIEFic3RyYWN0aW9uIG92ZXIgYW4gSFRUUCBjbGllbnQuXHJcbiAqXHJcbiAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYW4gYWJzdHJhY3Rpb24gb3ZlciBhbiBIVFRQIGNsaWVudCBzbyB0aGF0IGEgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIGNhbiBiZSBwcm92aWRlZCBvbiBkaWZmZXJlbnQgcGxhdGZvcm1zLlxyXG4gKi9cclxudmFyIEh0dHBDbGllbnQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBIdHRwQ2xpZW50KCkge1xyXG4gICAgfVxyXG4gICAgSHR0cENsaWVudC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKHVybCwgb3B0aW9ucykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQodHNsaWJfMS5fX2Fzc2lnbih7fSwgb3B0aW9ucywgeyBtZXRob2Q6IFwiR0VUXCIsIHVybDogdXJsIH0pKTtcclxuICAgIH07XHJcbiAgICBIdHRwQ2xpZW50LnByb3RvdHlwZS5wb3N0ID0gZnVuY3Rpb24gKHVybCwgb3B0aW9ucykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQodHNsaWJfMS5fX2Fzc2lnbih7fSwgb3B0aW9ucywgeyBtZXRob2Q6IFwiUE9TVFwiLCB1cmw6IHVybCB9KSk7XHJcbiAgICB9O1xyXG4gICAgSHR0cENsaWVudC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKHVybCwgb3B0aW9ucykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQodHNsaWJfMS5fX2Fzc2lnbih7fSwgb3B0aW9ucywgeyBtZXRob2Q6IFwiREVMRVRFXCIsIHVybDogdXJsIH0pKTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gSHR0cENsaWVudDtcclxufSgpKTtcclxuZXhwb3J0IHsgSHR0cENsaWVudCB9O1xyXG4vKiogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSHR0cENsaWVudH0uICovXHJcbnZhciBEZWZhdWx0SHR0cENsaWVudCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcclxuICAgIHRzbGliXzEuX19leHRlbmRzKERlZmF1bHRIdHRwQ2xpZW50LCBfc3VwZXIpO1xyXG4gICAgLyoqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHtAbGluayBEZWZhdWx0SHR0cENsaWVudH0sIHVzaW5nIHRoZSBwcm92aWRlZCB7QGxpbmsgSUxvZ2dlcn0gdG8gbG9nIG1lc3NhZ2VzLiAqL1xyXG4gICAgZnVuY3Rpb24gRGVmYXVsdEh0dHBDbGllbnQobG9nZ2VyKSB7XHJcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcclxuICAgICAgICBfdGhpcy5sb2dnZXIgPSBsb2dnZXI7XHJcbiAgICAgICAgcmV0dXJuIF90aGlzO1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbmhlcml0RG9jICovXHJcbiAgICBEZWZhdWx0SHR0cENsaWVudC5wcm90b3R5cGUuc2VuZCA9IGZ1bmN0aW9uIChyZXF1ZXN0KSB7XHJcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XHJcbiAgICAgICAgICAgIHhoci5vcGVuKHJlcXVlc3QubWV0aG9kLCByZXF1ZXN0LnVybCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSB0cnVlO1xyXG4gICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIlgtUmVxdWVzdGVkLVdpdGhcIiwgXCJYTUxIdHRwUmVxdWVzdFwiKTtcclxuICAgICAgICAgICAgaWYgKHJlcXVlc3QuaGVhZGVycykge1xyXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMocmVxdWVzdC5oZWFkZXJzKVxyXG4gICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChoZWFkZXIpIHsgcmV0dXJuIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciwgcmVxdWVzdC5oZWFkZXJzW2hlYWRlcl0pOyB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocmVxdWVzdC5yZXNwb25zZVR5cGUpIHtcclxuICAgICAgICAgICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSByZXF1ZXN0LnJlc3BvbnNlVHlwZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocmVxdWVzdC5hYm9ydFNpZ25hbCkge1xyXG4gICAgICAgICAgICAgICAgcmVxdWVzdC5hYm9ydFNpZ25hbC5vbmFib3J0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHhoci5hYm9ydCgpO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocmVxdWVzdC50aW1lb3V0KSB7XHJcbiAgICAgICAgICAgICAgICB4aHIudGltZW91dCA9IHJlcXVlc3QudGltZW91dDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB4aHIub25sb2FkID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QuYWJvcnRTaWduYWwpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFib3J0U2lnbmFsLm9uYWJvcnQgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgPj0gMjAwICYmIHhoci5zdGF0dXMgPCAzMDApIHtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG5ldyBIdHRwUmVzcG9uc2UoeGhyLnN0YXR1cywgeGhyLnN0YXR1c1RleHQsIHhoci5yZXNwb25zZSB8fCB4aHIucmVzcG9uc2VUZXh0KSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEh0dHBFcnJvcih4aHIuc3RhdHVzVGV4dCwgeGhyLnN0YXR1cykpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuV2FybmluZywgXCJFcnJvciBmcm9tIEhUVFAgcmVxdWVzdC4gXCIgKyB4aHIuc3RhdHVzICsgXCI6IFwiICsgeGhyLnN0YXR1c1RleHQpO1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBIdHRwRXJyb3IoeGhyLnN0YXR1c1RleHQsIHhoci5zdGF0dXMpKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgeGhyLm9udGltZW91dCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuV2FybmluZywgXCJUaW1lb3V0IGZyb20gSFRUUCByZXF1ZXN0LlwiKTtcclxuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgVGltZW91dEVycm9yKCkpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB4aHIuc2VuZChyZXF1ZXN0LmNvbnRlbnQgfHwgXCJcIik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIERlZmF1bHRIdHRwQ2xpZW50O1xyXG59KEh0dHBDbGllbnQpKTtcclxuZXhwb3J0IHsgRGVmYXVsdEh0dHBDbGllbnQgfTtcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SHR0cENsaWVudC5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIC5ORVQgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcbmltcG9ydCAqIGFzIHRzbGliXzEgZnJvbSBcInRzbGliXCI7XHJcbmltcG9ydCB7IERlZmF1bHRIdHRwQ2xpZW50IH0gZnJvbSBcIi4vSHR0cENsaWVudFwiO1xyXG5pbXBvcnQgeyBMb2dMZXZlbCB9IGZyb20gXCIuL0lMb2dnZXJcIjtcclxuaW1wb3J0IHsgSHR0cFRyYW5zcG9ydFR5cGUsIFRyYW5zZmVyRm9ybWF0IH0gZnJvbSBcIi4vSVRyYW5zcG9ydFwiO1xyXG5pbXBvcnQgeyBMb25nUG9sbGluZ1RyYW5zcG9ydCB9IGZyb20gXCIuL0xvbmdQb2xsaW5nVHJhbnNwb3J0XCI7XHJcbmltcG9ydCB7IFNlcnZlclNlbnRFdmVudHNUcmFuc3BvcnQgfSBmcm9tIFwiLi9TZXJ2ZXJTZW50RXZlbnRzVHJhbnNwb3J0XCI7XHJcbmltcG9ydCB7IEFyZywgY3JlYXRlTG9nZ2VyIH0gZnJvbSBcIi4vVXRpbHNcIjtcclxuaW1wb3J0IHsgV2ViU29ja2V0VHJhbnNwb3J0IH0gZnJvbSBcIi4vV2ViU29ja2V0VHJhbnNwb3J0XCI7XHJcbnZhciBNQVhfUkVESVJFQ1RTID0gMTAwO1xyXG52YXIgSHR0cENvbm5lY3Rpb24gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBIdHRwQ29ubmVjdGlvbih1cmwsIG9wdGlvbnMpIHtcclxuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxyXG4gICAgICAgIHRoaXMuZmVhdHVyZXMgPSB7fTtcclxuICAgICAgICBBcmcuaXNSZXF1aXJlZCh1cmwsIFwidXJsXCIpO1xyXG4gICAgICAgIHRoaXMubG9nZ2VyID0gY3JlYXRlTG9nZ2VyKG9wdGlvbnMubG9nZ2VyKTtcclxuICAgICAgICB0aGlzLmJhc2VVcmwgPSB0aGlzLnJlc29sdmVVcmwodXJsKTtcclxuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcclxuICAgICAgICBvcHRpb25zLmFjY2Vzc1Rva2VuRmFjdG9yeSA9IG9wdGlvbnMuYWNjZXNzVG9rZW5GYWN0b3J5IHx8IChmdW5jdGlvbiAoKSB7IHJldHVybiBudWxsOyB9KTtcclxuICAgICAgICBvcHRpb25zLmxvZ01lc3NhZ2VDb250ZW50ID0gb3B0aW9ucy5sb2dNZXNzYWdlQ29udGVudCB8fCBmYWxzZTtcclxuICAgICAgICB0aGlzLmh0dHBDbGllbnQgPSBvcHRpb25zLmh0dHBDbGllbnQgfHwgbmV3IERlZmF1bHRIdHRwQ2xpZW50KHRoaXMubG9nZ2VyKTtcclxuICAgICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0ZSA9IDIgLyogRGlzY29ubmVjdGVkICovO1xyXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XHJcbiAgICB9XHJcbiAgICBIdHRwQ29ubmVjdGlvbi5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbiAodHJhbnNmZXJGb3JtYXQpIHtcclxuICAgICAgICB0cmFuc2ZlckZvcm1hdCA9IHRyYW5zZmVyRm9ybWF0IHx8IFRyYW5zZmVyRm9ybWF0LkJpbmFyeTtcclxuICAgICAgICBBcmcuaXNJbih0cmFuc2ZlckZvcm1hdCwgVHJhbnNmZXJGb3JtYXQsIFwidHJhbnNmZXJGb3JtYXRcIik7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkRlYnVnLCBcIlN0YXJ0aW5nIGNvbm5lY3Rpb24gd2l0aCB0cmFuc2ZlciBmb3JtYXQgJ1wiICsgVHJhbnNmZXJGb3JtYXRbdHJhbnNmZXJGb3JtYXRdICsgXCInLlwiKTtcclxuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uU3RhdGUgIT09IDIgLyogRGlzY29ubmVjdGVkICovKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJDYW5ub3Qgc3RhcnQgYSBjb25uZWN0aW9uIHRoYXQgaXMgbm90IGluIHRoZSAnRGlzY29ubmVjdGVkJyBzdGF0ZS5cIikpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0ZSA9IDAgLyogQ29ubmVjdGluZyAqLztcclxuICAgICAgICB0aGlzLnN0YXJ0UHJvbWlzZSA9IHRoaXMuc3RhcnRJbnRlcm5hbCh0cmFuc2ZlckZvcm1hdCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRQcm9taXNlO1xyXG4gICAgfTtcclxuICAgIEh0dHBDb25uZWN0aW9uLnByb3RvdHlwZS5zZW5kID0gZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uU3RhdGUgIT09IDEgLyogQ29ubmVjdGVkICovKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBzZW5kIGRhdGEgaWYgdGhlIGNvbm5lY3Rpb24gaXMgbm90IGluIHRoZSAnQ29ubmVjdGVkJyBTdGF0ZS5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zcG9ydC5zZW5kKGRhdGEpO1xyXG4gICAgfTtcclxuICAgIEh0dHBDb25uZWN0aW9uLnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24gKGVycm9yKSB7XHJcbiAgICAgICAgcmV0dXJuIHRzbGliXzEuX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBlXzE7XHJcbiAgICAgICAgICAgIHJldHVybiB0c2xpYl8xLl9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdGUgPSAyIC8qIERpc2Nvbm5lY3RlZCAqLztcclxuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsxLCAzLCAsIDRdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5zdGFydFByb21pc2VdO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfMSA9IF9hLnNlbnQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMudHJhbnNwb3J0KSByZXR1cm4gWzMgLypicmVhayovLCA2XTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9wRXJyb3IgPSBlcnJvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy50cmFuc3BvcnQuc3RvcCgpXTtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc3BvcnQgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDY7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OiByZXR1cm4gWzIgLypyZXR1cm4qL107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuICAgIEh0dHBDb25uZWN0aW9uLnByb3RvdHlwZS5zdGFydEludGVybmFsID0gZnVuY3Rpb24gKHRyYW5zZmVyRm9ybWF0KSB7XHJcbiAgICAgICAgcmV0dXJuIHRzbGliXzEuX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgICAgIHZhciB1cmwsIG5lZ290aWF0ZVJlc3BvbnNlLCByZWRpcmVjdHMsIF9sb29wXzEsIHRoaXNfMSwgc3RhdGVfMSwgZV8yO1xyXG4gICAgICAgICAgICByZXR1cm4gdHNsaWJfMS5fX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IHRoaXMuYmFzZVVybDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hY2Nlc3NUb2tlbkZhY3RvcnkgPSB0aGlzLm9wdGlvbnMuYWNjZXNzVG9rZW5GYWN0b3J5O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzEsIDEyLCAsIDEzXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnNraXBOZWdvdGlhdGlvbikgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRoaXMub3B0aW9ucy50cmFuc3BvcnQgPT09IEh0dHBUcmFuc3BvcnRUeXBlLldlYlNvY2tldHMpKSByZXR1cm4gWzMgLypicmVhayovLCAzXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBhZGQgYSBjb25uZWN0aW9uIElEIGluIHRoaXMgY2FzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zcG9ydCA9IHRoaXMuY29uc3RydWN0VHJhbnNwb3J0KEh0dHBUcmFuc3BvcnRUeXBlLldlYlNvY2tldHMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBzaG91bGQganVzdCBjYWxsIGNvbm5lY3QgZGlyZWN0bHkgaW4gdGhpcyBjYXNlLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBmYWxsYmFjayBvciBuZWdvdGlhdGUgaW4gdGhpcyBjYXNlLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnRyYW5zcG9ydC5jb25uZWN0KHVybCwgdHJhbnNmZXJGb3JtYXQpXTtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIHNob3VsZCBqdXN0IGNhbGwgY29ubmVjdCBkaXJlY3RseSBpbiB0aGlzIGNhc2UuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIGZhbGxiYWNrIG9yIG5lZ290aWF0ZSBpbiB0aGlzIGNhc2UuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiB0aHJvdyBFcnJvcihcIk5lZ290aWF0aW9uIGNhbiBvbmx5IGJlIHNraXBwZWQgd2hlbiB1c2luZyB0aGUgV2ViU29ja2V0IHRyYW5zcG9ydCBkaXJlY3RseS5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzMgLypicmVhayovLCAxMV07XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZWdvdGlhdGVSZXNwb25zZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0cyA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF9sb29wXzEgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWNjZXNzVG9rZW5fMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0c2xpYl8xLl9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzXzEuZ2V0TmVnb3RpYXRpb25SZXNwb25zZSh1cmwpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVnb3RpYXRlUmVzcG9uc2UgPSBfYS5zZW50KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdXNlciB0cmllcyB0byBzdG9wIHRoZSBjb25uZWN0aW9uIHdoZW4gaXQgaXMgYmVpbmcgc3RhcnRlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXNfMS5jb25uZWN0aW9uU3RhdGUgPT09IDIgLyogRGlzY29ubmVjdGVkICovKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHsgdmFsdWU6IHZvaWQgMCB9XTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZWdvdGlhdGVSZXNwb25zZS51cmwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSBuZWdvdGlhdGVSZXNwb25zZS51cmw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmVnb3RpYXRlUmVzcG9uc2UuYWNjZXNzVG9rZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NUb2tlbl8xID0gbmVnb3RpYXRlUmVzcG9uc2UuYWNjZXNzVG9rZW47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc18xLmFjY2Vzc1Rva2VuRmFjdG9yeSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFjY2Vzc1Rva2VuXzE7IH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdHMrKztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc18xID0gdGhpcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSA2O1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjogcmV0dXJuIFs1IC8qeWllbGQqKi8sIF9sb29wXzEoKV07XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV8xID0gX2Euc2VudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHN0YXRlXzEgPT09IFwib2JqZWN0XCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgc3RhdGVfMS52YWx1ZV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gODtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZWdvdGlhdGVSZXNwb25zZS51cmwgJiYgcmVkaXJlY3RzIDwgTUFYX1JFRElSRUNUUykgcmV0dXJuIFszIC8qYnJlYWsqLywgNl07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gOTtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDk6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWRpcmVjdHMgPT09IE1BWF9SRURJUkVDVFMgJiYgbmVnb3RpYXRlUmVzcG9uc2UudXJsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcIk5lZ290aWF0ZSByZWRpcmVjdGlvbiBsaW1pdCBleGNlZWRlZC5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5jcmVhdGVUcmFuc3BvcnQodXJsLCB0aGlzLm9wdGlvbnMudHJhbnNwb3J0LCBuZWdvdGlhdGVSZXNwb25zZSwgdHJhbnNmZXJGb3JtYXQpXTtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTE7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudHJhbnNwb3J0IGluc3RhbmNlb2YgTG9uZ1BvbGxpbmdUcmFuc3BvcnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmVhdHVyZXMuaW5oZXJlbnRLZWVwQWxpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0Lm9ucmVjZWl2ZSA9IHRoaXMub25yZWNlaXZlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zcG9ydC5vbmNsb3NlID0gZnVuY3Rpb24gKGUpIHsgcmV0dXJuIF90aGlzLnN0b3BDb25uZWN0aW9uKGUpOyB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGNoYW5nZSB0aGUgc3RhdGUgaWYgd2Ugd2VyZSBjb25uZWN0aW5nIHRvIG5vdCBvdmVyd3JpdGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0YXRlIGlmIHRoZSBjb25uZWN0aW9uIGlzIGFscmVhZHkgbWFya2VkIGFzIERpc2Nvbm5lY3RlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZVN0YXRlKDAgLyogQ29ubmVjdGluZyAqLywgMSAvKiBDb25uZWN0ZWQgKi8pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxM107XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgZV8yID0gX2Euc2VudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRXJyb3IsIFwiRmFpbGVkIHRvIHN0YXJ0IHRoZSBjb25uZWN0aW9uOiBcIiArIGVfMik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvblN0YXRlID0gMiAvKiBEaXNjb25uZWN0ZWQgKi87XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZV8yO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6IHJldHVybiBbMiAvKnJldHVybiovXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG4gICAgSHR0cENvbm5lY3Rpb24ucHJvdG90eXBlLmdldE5lZ290aWF0aW9uUmVzcG9uc2UgPSBmdW5jdGlvbiAodXJsKSB7XHJcbiAgICAgICAgcmV0dXJuIHRzbGliXzEuX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciB0b2tlbiwgaGVhZGVycywgbmVnb3RpYXRlVXJsLCByZXNwb25zZSwgZV8zLCBfYTtcclxuICAgICAgICAgICAgcmV0dXJuIHRzbGliXzEuX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmFjY2Vzc1Rva2VuRmFjdG9yeSgpXTtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gX2Iuc2VudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMgPSAoX2EgPSB7fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYVtcIkF1dGhvcml6YXRpb25cIl0gPSBcIkJlYXJlciBcIiArIHRva2VuLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZWdvdGlhdGVVcmwgPSB0aGlzLnJlc29sdmVOZWdvdGlhdGVVcmwodXJsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkRlYnVnLCBcIlNlbmRpbmcgbmVnb3RpYXRpb24gcmVxdWVzdDogXCIgKyBuZWdvdGlhdGVVcmwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDI7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBfYi50cnlzLnB1c2goWzIsIDQsICwgNV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmh0dHBDbGllbnQucG9zdChuZWdvdGlhdGVVcmwsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KV07XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IF9iLnNlbnQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDIwMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJVbmV4cGVjdGVkIHN0YXR1cyBjb2RlIHJldHVybmVkIGZyb20gbmVnb3RpYXRlIFwiICsgcmVzcG9uc2Uuc3RhdHVzQ29kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIEpTT04ucGFyc2UocmVzcG9uc2UuY29udGVudCldO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgZV8zID0gX2Iuc2VudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRXJyb3IsIFwiRmFpbGVkIHRvIGNvbXBsZXRlIG5lZ290aWF0aW9uIHdpdGggdGhlIHNlcnZlcjogXCIgKyBlXzMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlXzM7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiByZXR1cm4gWzIgLypyZXR1cm4qL107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuICAgIEh0dHBDb25uZWN0aW9uLnByb3RvdHlwZS5jcmVhdGVDb25uZWN0VXJsID0gZnVuY3Rpb24gKHVybCwgY29ubmVjdGlvbklkKSB7XHJcbiAgICAgICAgcmV0dXJuIHVybCArICh1cmwuaW5kZXhPZihcIj9cIikgPT09IC0xID8gXCI/XCIgOiBcIiZcIikgKyAoXCJpZD1cIiArIGNvbm5lY3Rpb25JZCk7XHJcbiAgICB9O1xyXG4gICAgSHR0cENvbm5lY3Rpb24ucHJvdG90eXBlLmNyZWF0ZVRyYW5zcG9ydCA9IGZ1bmN0aW9uICh1cmwsIHJlcXVlc3RlZFRyYW5zcG9ydCwgbmVnb3RpYXRlUmVzcG9uc2UsIHJlcXVlc3RlZFRyYW5zZmVyRm9ybWF0KSB7XHJcbiAgICAgICAgcmV0dXJuIHRzbGliXzEuX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBjb25uZWN0VXJsLCB0cmFuc3BvcnRzLCBfaSwgdHJhbnNwb3J0c18xLCBlbmRwb2ludCwgdHJhbnNwb3J0LCBleF8xO1xyXG4gICAgICAgICAgICByZXR1cm4gdHNsaWJfMS5fX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RVcmwgPSB0aGlzLmNyZWF0ZUNvbm5lY3RVcmwodXJsLCBuZWdvdGlhdGVSZXNwb25zZS5jb25uZWN0aW9uSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNJVHJhbnNwb3J0KHJlcXVlc3RlZFRyYW5zcG9ydCkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRGVidWcsIFwiQ29ubmVjdGlvbiB3YXMgcHJvdmlkZWQgYW4gaW5zdGFuY2Ugb2YgSVRyYW5zcG9ydCwgdXNpbmcgdGhhdCBkaXJlY3RseS5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0ID0gcmVxdWVzdGVkVHJhbnNwb3J0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnRyYW5zcG9ydC5jb25uZWN0KGNvbm5lY3RVcmwsIHJlcXVlc3RlZFRyYW5zZmVyRm9ybWF0KV07XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgY2hhbmdlIHRoZSBzdGF0ZSBpZiB3ZSB3ZXJlIGNvbm5lY3RpbmcgdG8gbm90IG92ZXJ3cml0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3RhdGUgaWYgdGhlIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBtYXJrZWQgYXMgRGlzY29ubmVjdGVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlU3RhdGUoMCAvKiBDb25uZWN0aW5nICovLCAxIC8qIENvbm5lY3RlZCAqLyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydHMgPSBuZWdvdGlhdGVSZXNwb25zZS5hdmFpbGFibGVUcmFuc3BvcnRzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBfaSA9IDAsIHRyYW5zcG9ydHNfMSA9IHRyYW5zcG9ydHM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKF9pIDwgdHJhbnNwb3J0c18xLmxlbmd0aCkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludCA9IHRyYW5zcG9ydHNfMVtfaV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvblN0YXRlID0gMCAvKiBDb25uZWN0aW5nICovO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQgPSB0aGlzLnJlc29sdmVUcmFuc3BvcnQoZW5kcG9pbnQsIHJlcXVlc3RlZFRyYW5zcG9ydCwgcmVxdWVzdGVkVHJhbnNmZXJGb3JtYXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0eXBlb2YgdHJhbnNwb3J0ID09PSBcIm51bWJlclwiKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0ID0gdGhpcy5jb25zdHJ1Y3RUcmFuc3BvcnQodHJhbnNwb3J0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEobmVnb3RpYXRlUmVzcG9uc2UuY29ubmVjdGlvbklkID09PSBudWxsKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0TmVnb3RpYXRpb25SZXNwb25zZSh1cmwpXTtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5lZ290aWF0ZVJlc3BvbnNlID0gX2Euc2VudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0VXJsID0gdGhpcy5jcmVhdGVDb25uZWN0VXJsKHVybCwgbmVnb3RpYXRlUmVzcG9uc2UuY29ubmVjdGlvbklkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSA1O1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFs1LCA3LCAsIDhdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy50cmFuc3BvcnQuY29ubmVjdChjb25uZWN0VXJsLCByZXF1ZXN0ZWRUcmFuc2ZlckZvcm1hdCldO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZVN0YXRlKDAgLyogQ29ubmVjdGluZyAqLywgMSAvKiBDb25uZWN0ZWQgKi8pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBleF8xID0gX2Euc2VudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRXJyb3IsIFwiRmFpbGVkIHRvIHN0YXJ0IHRoZSB0cmFuc3BvcnQgJ1wiICsgSHR0cFRyYW5zcG9ydFR5cGVbdHJhbnNwb3J0XSArIFwiJzogXCIgKyBleF8xKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdGUgPSAyIC8qIERpc2Nvbm5lY3RlZCAqLztcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmVnb3RpYXRlUmVzcG9uc2UuY29ubmVjdGlvbklkID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBfaSsrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAzXTtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDk6IHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byBpbml0aWFsaXplIGFueSBvZiB0aGUgYXZhaWxhYmxlIHRyYW5zcG9ydHMuXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH07XHJcbiAgICBIdHRwQ29ubmVjdGlvbi5wcm90b3R5cGUuY29uc3RydWN0VHJhbnNwb3J0ID0gZnVuY3Rpb24gKHRyYW5zcG9ydCkge1xyXG4gICAgICAgIHN3aXRjaCAodHJhbnNwb3J0KSB7XHJcbiAgICAgICAgICAgIGNhc2UgSHR0cFRyYW5zcG9ydFR5cGUuV2ViU29ja2V0czpcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgV2ViU29ja2V0VHJhbnNwb3J0KHRoaXMuYWNjZXNzVG9rZW5GYWN0b3J5LCB0aGlzLmxvZ2dlciwgdGhpcy5vcHRpb25zLmxvZ01lc3NhZ2VDb250ZW50KTtcclxuICAgICAgICAgICAgY2FzZSBIdHRwVHJhbnNwb3J0VHlwZS5TZXJ2ZXJTZW50RXZlbnRzOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJ2ZXJTZW50RXZlbnRzVHJhbnNwb3J0KHRoaXMuaHR0cENsaWVudCwgdGhpcy5hY2Nlc3NUb2tlbkZhY3RvcnksIHRoaXMubG9nZ2VyLCB0aGlzLm9wdGlvbnMubG9nTWVzc2FnZUNvbnRlbnQpO1xyXG4gICAgICAgICAgICBjYXNlIEh0dHBUcmFuc3BvcnRUeXBlLkxvbmdQb2xsaW5nOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMb25nUG9sbGluZ1RyYW5zcG9ydCh0aGlzLmh0dHBDbGllbnQsIHRoaXMuYWNjZXNzVG9rZW5GYWN0b3J5LCB0aGlzLmxvZ2dlciwgdGhpcy5vcHRpb25zLmxvZ01lc3NhZ2VDb250ZW50KTtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gdHJhbnNwb3J0OiBcIiArIHRyYW5zcG9ydCArIFwiLlwiKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgSHR0cENvbm5lY3Rpb24ucHJvdG90eXBlLnJlc29sdmVUcmFuc3BvcnQgPSBmdW5jdGlvbiAoZW5kcG9pbnQsIHJlcXVlc3RlZFRyYW5zcG9ydCwgcmVxdWVzdGVkVHJhbnNmZXJGb3JtYXQpIHtcclxuICAgICAgICB2YXIgdHJhbnNwb3J0ID0gSHR0cFRyYW5zcG9ydFR5cGVbZW5kcG9pbnQudHJhbnNwb3J0XTtcclxuICAgICAgICBpZiAodHJhbnNwb3J0ID09PSBudWxsIHx8IHRyYW5zcG9ydCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5EZWJ1ZywgXCJTa2lwcGluZyB0cmFuc3BvcnQgJ1wiICsgZW5kcG9pbnQudHJhbnNwb3J0ICsgXCInIGJlY2F1c2UgaXQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGNsaWVudC5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB2YXIgdHJhbnNmZXJGb3JtYXRzID0gZW5kcG9pbnQudHJhbnNmZXJGb3JtYXRzLm1hcChmdW5jdGlvbiAocykgeyByZXR1cm4gVHJhbnNmZXJGb3JtYXRbc107IH0pO1xyXG4gICAgICAgICAgICBpZiAodHJhbnNwb3J0TWF0Y2hlcyhyZXF1ZXN0ZWRUcmFuc3BvcnQsIHRyYW5zcG9ydCkpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0cmFuc2ZlckZvcm1hdHMuaW5kZXhPZihyZXF1ZXN0ZWRUcmFuc2ZlckZvcm1hdCkgPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICgodHJhbnNwb3J0ID09PSBIdHRwVHJhbnNwb3J0VHlwZS5XZWJTb2NrZXRzICYmIHR5cGVvZiBXZWJTb2NrZXQgPT09IFwidW5kZWZpbmVkXCIpIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICh0cmFuc3BvcnQgPT09IEh0dHBUcmFuc3BvcnRUeXBlLlNlcnZlclNlbnRFdmVudHMgJiYgdHlwZW9mIEV2ZW50U291cmNlID09PSBcInVuZGVmaW5lZFwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRGVidWcsIFwiU2tpcHBpbmcgdHJhbnNwb3J0ICdcIiArIEh0dHBUcmFuc3BvcnRUeXBlW3RyYW5zcG9ydF0gKyBcIicgYmVjYXVzZSBpdCBpcyBub3Qgc3VwcG9ydGVkIGluIHlvdXIgZW52aXJvbm1lbnQuJ1wiKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5EZWJ1ZywgXCJTZWxlY3RpbmcgdHJhbnNwb3J0ICdcIiArIEh0dHBUcmFuc3BvcnRUeXBlW3RyYW5zcG9ydF0gKyBcIidcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc3BvcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkRlYnVnLCBcIlNraXBwaW5nIHRyYW5zcG9ydCAnXCIgKyBIdHRwVHJhbnNwb3J0VHlwZVt0cmFuc3BvcnRdICsgXCInIGJlY2F1c2UgaXQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgcmVxdWVzdGVkIHRyYW5zZmVyIGZvcm1hdCAnXCIgKyBUcmFuc2ZlckZvcm1hdFtyZXF1ZXN0ZWRUcmFuc2ZlckZvcm1hdF0gKyBcIicuXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkRlYnVnLCBcIlNraXBwaW5nIHRyYW5zcG9ydCAnXCIgKyBIdHRwVHJhbnNwb3J0VHlwZVt0cmFuc3BvcnRdICsgXCInIGJlY2F1c2UgaXQgd2FzIGRpc2FibGVkIGJ5IHRoZSBjbGllbnQuXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfTtcclxuICAgIEh0dHBDb25uZWN0aW9uLnByb3RvdHlwZS5pc0lUcmFuc3BvcnQgPSBmdW5jdGlvbiAodHJhbnNwb3J0KSB7XHJcbiAgICAgICAgcmV0dXJuIHRyYW5zcG9ydCAmJiB0eXBlb2YgKHRyYW5zcG9ydCkgPT09IFwib2JqZWN0XCIgJiYgXCJjb25uZWN0XCIgaW4gdHJhbnNwb3J0O1xyXG4gICAgfTtcclxuICAgIEh0dHBDb25uZWN0aW9uLnByb3RvdHlwZS5jaGFuZ2VTdGF0ZSA9IGZ1bmN0aW9uIChmcm9tLCB0bykge1xyXG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25TdGF0ZSA9PT0gZnJvbSkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0ZSA9IHRvO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfTtcclxuICAgIEh0dHBDb25uZWN0aW9uLnByb3RvdHlwZS5zdG9wQ29ubmVjdGlvbiA9IGZ1bmN0aW9uIChlcnJvcikge1xyXG4gICAgICAgIHJldHVybiB0c2xpYl8xLl9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHNsaWJfMS5fX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSBzdG9wRXJyb3IsIGl0IHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGUgZXJyb3IgZnJvbSB0aGUgdHJhbnNwb3J0XHJcbiAgICAgICAgICAgICAgICBlcnJvciA9IHRoaXMuc3RvcEVycm9yIHx8IGVycm9yO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVycm9yLCBcIkNvbm5lY3Rpb24gZGlzY29ubmVjdGVkIHdpdGggZXJyb3IgJ1wiICsgZXJyb3IgKyBcIicuXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkluZm9ybWF0aW9uLCBcIkNvbm5lY3Rpb24gZGlzY29ubmVjdGVkLlwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvblN0YXRlID0gMiAvKiBEaXNjb25uZWN0ZWQgKi87XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vbmNsb3NlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbmNsb3NlKGVycm9yKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG4gICAgSHR0cENvbm5lY3Rpb24ucHJvdG90eXBlLnJlc29sdmVVcmwgPSBmdW5jdGlvbiAodXJsKSB7XHJcbiAgICAgICAgLy8gc3RhcnRzV2l0aCBpcyBub3Qgc3VwcG9ydGVkIGluIElFXHJcbiAgICAgICAgaWYgKHVybC5sYXN0SW5kZXhPZihcImh0dHBzOi8vXCIsIDApID09PSAwIHx8IHVybC5sYXN0SW5kZXhPZihcImh0dHA6Ly9cIiwgMCkgPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVybDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIgfHwgIXdpbmRvdyB8fCAhd2luZG93LmRvY3VtZW50KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCByZXNvbHZlICdcIiArIHVybCArIFwiJy5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFNldHRpbmcgdGhlIHVybCB0byB0aGUgaHJlZiBwcm9wZXJ5IG9mIGFuIGFuY2hvciB0YWcgaGFuZGxlcyBub3JtYWxpemF0aW9uXHJcbiAgICAgICAgLy8gZm9yIHVzLiBUaGVyZSBhcmUgMyBtYWluIGNhc2VzLlxyXG4gICAgICAgIC8vIDEuIFJlbGF0aXZlICBwYXRoIG5vcm1hbGl6YXRpb24gZS5nIFwiYlwiIC0+IFwiaHR0cDovL2xvY2FsaG9zdDo1MDAwL2EvYlwiXHJcbiAgICAgICAgLy8gMi4gQWJzb2x1dGUgcGF0aCBub3JtYWxpemF0aW9uIGUuZyBcIi9hL2JcIiAtPiBcImh0dHA6Ly9sb2NhbGhvc3Q6NTAwMC9hL2JcIlxyXG4gICAgICAgIC8vIDMuIE5ldHdvcmtwYXRoIHJlZmVyZW5jZSBub3JtYWxpemF0aW9uIGUuZyBcIi8vbG9jYWxob3N0OjUwMDAvYS9iXCIgLT4gXCJodHRwOi8vbG9jYWxob3N0OjUwMDAvYS9iXCJcclxuICAgICAgICB2YXIgYVRhZyA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcclxuICAgICAgICBhVGFnLmhyZWYgPSB1cmw7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkluZm9ybWF0aW9uLCBcIk5vcm1hbGl6aW5nICdcIiArIHVybCArIFwiJyB0byAnXCIgKyBhVGFnLmhyZWYgKyBcIicuXCIpO1xyXG4gICAgICAgIHJldHVybiBhVGFnLmhyZWY7XHJcbiAgICB9O1xyXG4gICAgSHR0cENvbm5lY3Rpb24ucHJvdG90eXBlLnJlc29sdmVOZWdvdGlhdGVVcmwgPSBmdW5jdGlvbiAodXJsKSB7XHJcbiAgICAgICAgdmFyIGluZGV4ID0gdXJsLmluZGV4T2YoXCI/XCIpO1xyXG4gICAgICAgIHZhciBuZWdvdGlhdGVVcmwgPSB1cmwuc3Vic3RyaW5nKDAsIGluZGV4ID09PSAtMSA/IHVybC5sZW5ndGggOiBpbmRleCk7XHJcbiAgICAgICAgaWYgKG5lZ290aWF0ZVVybFtuZWdvdGlhdGVVcmwubGVuZ3RoIC0gMV0gIT09IFwiL1wiKSB7XHJcbiAgICAgICAgICAgIG5lZ290aWF0ZVVybCArPSBcIi9cIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgbmVnb3RpYXRlVXJsICs9IFwibmVnb3RpYXRlXCI7XHJcbiAgICAgICAgbmVnb3RpYXRlVXJsICs9IGluZGV4ID09PSAtMSA/IFwiXCIgOiB1cmwuc3Vic3RyaW5nKGluZGV4KTtcclxuICAgICAgICByZXR1cm4gbmVnb3RpYXRlVXJsO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBIdHRwQ29ubmVjdGlvbjtcclxufSgpKTtcclxuZXhwb3J0IHsgSHR0cENvbm5lY3Rpb24gfTtcclxuZnVuY3Rpb24gdHJhbnNwb3J0TWF0Y2hlcyhyZXF1ZXN0ZWRUcmFuc3BvcnQsIGFjdHVhbFRyYW5zcG9ydCkge1xyXG4gICAgcmV0dXJuICFyZXF1ZXN0ZWRUcmFuc3BvcnQgfHwgKChhY3R1YWxUcmFuc3BvcnQgJiByZXF1ZXN0ZWRUcmFuc3BvcnQpICE9PSAwKTtcclxufVxyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1IdHRwQ29ubmVjdGlvbi5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIC5ORVQgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcbmltcG9ydCAqIGFzIHRzbGliXzEgZnJvbSBcInRzbGliXCI7XHJcbmltcG9ydCB7IEhhbmRzaGFrZVByb3RvY29sIH0gZnJvbSBcIi4vSGFuZHNoYWtlUHJvdG9jb2xcIjtcclxuaW1wb3J0IHsgTWVzc2FnZVR5cGUgfSBmcm9tIFwiLi9JSHViUHJvdG9jb2xcIjtcclxuaW1wb3J0IHsgTG9nTGV2ZWwgfSBmcm9tIFwiLi9JTG9nZ2VyXCI7XHJcbmltcG9ydCB7IEFyZywgU3ViamVjdCB9IGZyb20gXCIuL1V0aWxzXCI7XHJcbnZhciBERUZBVUxUX1RJTUVPVVRfSU5fTVMgPSAzMCAqIDEwMDA7XHJcbi8qKiBSZXByZXNlbnRzIGEgY29ubmVjdGlvbiB0byBhIFNpZ25hbFIgSHViLiAqL1xyXG52YXIgSHViQ29ubmVjdGlvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIGZ1bmN0aW9uIEh1YkNvbm5lY3Rpb24oY29ubmVjdGlvbiwgbG9nZ2VyLCBwcm90b2NvbCkge1xyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgQXJnLmlzUmVxdWlyZWQoY29ubmVjdGlvbiwgXCJjb25uZWN0aW9uXCIpO1xyXG4gICAgICAgIEFyZy5pc1JlcXVpcmVkKGxvZ2dlciwgXCJsb2dnZXJcIik7XHJcbiAgICAgICAgQXJnLmlzUmVxdWlyZWQocHJvdG9jb2wsIFwicHJvdG9jb2xcIik7XHJcbiAgICAgICAgdGhpcy5zZXJ2ZXJUaW1lb3V0SW5NaWxsaXNlY29uZHMgPSBERUZBVUxUX1RJTUVPVVRfSU5fTVM7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2dnZXI7XHJcbiAgICAgICAgdGhpcy5wcm90b2NvbCA9IHByb3RvY29sO1xyXG4gICAgICAgIHRoaXMuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247XHJcbiAgICAgICAgdGhpcy5oYW5kc2hha2VQcm90b2NvbCA9IG5ldyBIYW5kc2hha2VQcm90b2NvbCgpO1xyXG4gICAgICAgIHRoaXMuY29ubmVjdGlvbi5vbnJlY2VpdmUgPSBmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4gX3RoaXMucHJvY2Vzc0luY29taW5nRGF0YShkYXRhKTsgfTtcclxuICAgICAgICB0aGlzLmNvbm5lY3Rpb24ub25jbG9zZSA9IGZ1bmN0aW9uIChlcnJvcikgeyByZXR1cm4gX3RoaXMuY29ubmVjdGlvbkNsb3NlZChlcnJvcik7IH07XHJcbiAgICAgICAgdGhpcy5jYWxsYmFja3MgPSB7fTtcclxuICAgICAgICB0aGlzLm1ldGhvZHMgPSB7fTtcclxuICAgICAgICB0aGlzLmNsb3NlZENhbGxiYWNrcyA9IFtdO1xyXG4gICAgICAgIHRoaXMuaWQgPSAwO1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgLy8gVXNpbmcgYSBwdWJsaWMgc3RhdGljIGZhY3RvcnkgbWV0aG9kIG1lYW5zIHdlIGNhbiBoYXZlIGEgcHJpdmF0ZSBjb25zdHJ1Y3RvciBhbmQgYW4gX2ludGVybmFsX1xyXG4gICAgLy8gY3JlYXRlIG1ldGhvZCB0aGF0IGNhbiBiZSB1c2VkIGJ5IEh1YkNvbm5lY3Rpb25CdWlsZGVyLiBBbiBcImludGVybmFsXCIgY29uc3RydWN0b3Igd291bGQganVzdFxyXG4gICAgLy8gYmUgc3RyaXBwZWQgYXdheSBhbmQgdGhlICcuZC50cycgZmlsZSB3b3VsZCBoYXZlIG5vIGNvbnN0cnVjdG9yLCB3aGljaCBpcyBpbnRlcnByZXRlZCBhcyBhXHJcbiAgICAvLyBwdWJsaWMgcGFyYW1ldGVyLWxlc3MgY29uc3RydWN0b3IuXHJcbiAgICBIdWJDb25uZWN0aW9uLmNyZWF0ZSA9IGZ1bmN0aW9uIChjb25uZWN0aW9uLCBsb2dnZXIsIHByb3RvY29sKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBIdWJDb25uZWN0aW9uKGNvbm5lY3Rpb24sIGxvZ2dlciwgcHJvdG9jb2wpO1xyXG4gICAgfTtcclxuICAgIC8qKiBTdGFydHMgdGhlIGNvbm5lY3Rpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNvbm5lY3Rpb24gaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGVzdGFibGlzaGVkLCBvciByZWplY3RzIHdpdGggYW4gZXJyb3IuXHJcbiAgICAgKi9cclxuICAgIEh1YkNvbm5lY3Rpb24ucHJvdG90eXBlLnN0YXJ0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiB0c2xpYl8xLl9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgaGFuZHNoYWtlUmVxdWVzdDtcclxuICAgICAgICAgICAgcmV0dXJuIHRzbGliXzEuX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kc2hha2VSZXF1ZXN0ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2w6IHRoaXMucHJvdG9jb2wubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb246IHRoaXMucHJvdG9jb2wudmVyc2lvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkRlYnVnLCBcIlN0YXJ0aW5nIEh1YkNvbm5lY3Rpb24uXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlY2VpdmVkSGFuZHNoYWtlUmVzcG9uc2UgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5jb25uZWN0aW9uLnN0YXJ0KHRoaXMucHJvdG9jb2wudHJhbnNmZXJGb3JtYXQpXTtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkRlYnVnLCBcIlNlbmRpbmcgaGFuZHNoYWtlIHJlcXVlc3QuXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNvbm5lY3Rpb24uc2VuZCh0aGlzLmhhbmRzaGFrZVByb3RvY29sLndyaXRlSGFuZHNoYWtlUmVxdWVzdChoYW5kc2hha2VSZXF1ZXN0KSldO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSW5mb3JtYXRpb24sIFwiVXNpbmcgSHViUHJvdG9jb2wgJ1wiICsgdGhpcy5wcm90b2NvbC5uYW1lICsgXCInLlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmZW5zaXZlbHkgY2xlYW51cCB0aW1lb3V0IGluIGNhc2Ugd2UgcmVjZWl2ZSBhIG1lc3NhZ2UgZnJvbSB0aGUgc2VydmVyIGJlZm9yZSB3ZSBmaW5pc2ggc3RhcnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhbnVwVGltZW91dCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyZVRpbWVvdXQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH07XHJcbiAgICAvKiogU3RvcHMgdGhlIGNvbm5lY3Rpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNvbm5lY3Rpb24gaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHRlcm1pbmF0ZWQsIG9yIHJlamVjdHMgd2l0aCBhbiBlcnJvci5cclxuICAgICAqL1xyXG4gICAgSHViQ29ubmVjdGlvbi5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRGVidWcsIFwiU3RvcHBpbmcgSHViQ29ubmVjdGlvbi5cIik7XHJcbiAgICAgICAgdGhpcy5jbGVhbnVwVGltZW91dCgpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb24uc3RvcCgpO1xyXG4gICAgfTtcclxuICAgIC8qKiBJbnZva2VzIGEgc3RyZWFtaW5nIGh1YiBtZXRob2Qgb24gdGhlIHNlcnZlciB1c2luZyB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIGFyZ3VtZW50cy5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZXBhcmFtIFQgVGhlIHR5cGUgb2YgdGhlIGl0ZW1zIHJldHVybmVkIGJ5IHRoZSBzZXJ2ZXIuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZSBUaGUgbmFtZSBvZiB0aGUgc2VydmVyIG1ldGhvZCB0byBpbnZva2UuXHJcbiAgICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIFRoZSBhcmd1bWVudHMgdXNlZCB0byBpbnZva2UgdGhlIHNlcnZlciBtZXRob2QuXHJcbiAgICAgKiBAcmV0dXJucyB7SVN0cmVhbVJlc3VsdDxUPn0gQW4gb2JqZWN0IHRoYXQgeWllbGRzIHJlc3VsdHMgZnJvbSB0aGUgc2VydmVyIGFzIHRoZXkgYXJlIHJlY2VpdmVkLlxyXG4gICAgICovXHJcbiAgICBIdWJDb25uZWN0aW9uLnByb3RvdHlwZS5zdHJlYW0gPSBmdW5jdGlvbiAobWV0aG9kTmFtZSkge1xyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcclxuICAgICAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICBhcmdzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgaW52b2NhdGlvbkRlc2NyaXB0b3IgPSB0aGlzLmNyZWF0ZVN0cmVhbUludm9jYXRpb24obWV0aG9kTmFtZSwgYXJncyk7XHJcbiAgICAgICAgdmFyIHN1YmplY3QgPSBuZXcgU3ViamVjdChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBjYW5jZWxJbnZvY2F0aW9uID0gX3RoaXMuY3JlYXRlQ2FuY2VsSW52b2NhdGlvbihpbnZvY2F0aW9uRGVzY3JpcHRvci5pbnZvY2F0aW9uSWQpO1xyXG4gICAgICAgICAgICB2YXIgY2FuY2VsTWVzc2FnZSA9IF90aGlzLnByb3RvY29sLndyaXRlTWVzc2FnZShjYW5jZWxJbnZvY2F0aW9uKTtcclxuICAgICAgICAgICAgZGVsZXRlIF90aGlzLmNhbGxiYWNrc1tpbnZvY2F0aW9uRGVzY3JpcHRvci5pbnZvY2F0aW9uSWRdO1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuY29ubmVjdGlvbi5zZW5kKGNhbmNlbE1lc3NhZ2UpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuY2FsbGJhY2tzW2ludm9jYXRpb25EZXNjcmlwdG9yLmludm9jYXRpb25JZF0gPSBmdW5jdGlvbiAoaW52b2NhdGlvbkV2ZW50LCBlcnJvcikge1xyXG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIHN1YmplY3QuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChpbnZvY2F0aW9uRXZlbnQudHlwZSA9PT0gTWVzc2FnZVR5cGUuQ29tcGxldGlvbikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGludm9jYXRpb25FdmVudC5lcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHN1YmplY3QuZXJyb3IobmV3IEVycm9yKGludm9jYXRpb25FdmVudC5lcnJvcikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3ViamVjdC5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc3ViamVjdC5uZXh0KChpbnZvY2F0aW9uRXZlbnQuaXRlbSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICB2YXIgbWVzc2FnZSA9IHRoaXMucHJvdG9jb2wud3JpdGVNZXNzYWdlKGludm9jYXRpb25EZXNjcmlwdG9yKTtcclxuICAgICAgICB0aGlzLmNvbm5lY3Rpb24uc2VuZChtZXNzYWdlKVxyXG4gICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgc3ViamVjdC5lcnJvcihlKTtcclxuICAgICAgICAgICAgZGVsZXRlIF90aGlzLmNhbGxiYWNrc1tpbnZvY2F0aW9uRGVzY3JpcHRvci5pbnZvY2F0aW9uSWRdO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBzdWJqZWN0O1xyXG4gICAgfTtcclxuICAgIC8qKiBJbnZva2VzIGEgaHViIG1ldGhvZCBvbiB0aGUgc2VydmVyIHVzaW5nIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgYXJndW1lbnRzLiBEb2VzIG5vdCB3YWl0IGZvciBhIHJlc3BvbnNlIGZyb20gdGhlIHJlY2VpdmVyLlxyXG4gICAgICpcclxuICAgICAqIFRoZSBQcm9taXNlIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kIHJlc29sdmVzIHdoZW4gdGhlIGNsaWVudCBoYXMgc2VudCB0aGUgaW52b2NhdGlvbiB0byB0aGUgc2VydmVyLiBUaGUgc2VydmVyIG1heSBzdGlsbFxyXG4gICAgICogYmUgcHJvY2Vzc2luZyB0aGUgaW52b2NhdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZSBUaGUgbmFtZSBvZiB0aGUgc2VydmVyIG1ldGhvZCB0byBpbnZva2UuXHJcbiAgICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIFRoZSBhcmd1bWVudHMgdXNlZCB0byBpbnZva2UgdGhlIHNlcnZlciBtZXRob2QuXHJcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgaW52b2NhdGlvbiBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgc2VudCwgb3IgcmVqZWN0cyB3aXRoIGFuIGVycm9yLlxyXG4gICAgICovXHJcbiAgICBIdWJDb25uZWN0aW9uLnByb3RvdHlwZS5zZW5kID0gZnVuY3Rpb24gKG1ldGhvZE5hbWUpIHtcclxuICAgICAgICB2YXIgYXJncyA9IFtdO1xyXG4gICAgICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgIGFyZ3NbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBpbnZvY2F0aW9uRGVzY3JpcHRvciA9IHRoaXMuY3JlYXRlSW52b2NhdGlvbihtZXRob2ROYW1lLCBhcmdzLCB0cnVlKTtcclxuICAgICAgICB2YXIgbWVzc2FnZSA9IHRoaXMucHJvdG9jb2wud3JpdGVNZXNzYWdlKGludm9jYXRpb25EZXNjcmlwdG9yKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uLnNlbmQobWVzc2FnZSk7XHJcbiAgICB9O1xyXG4gICAgLyoqIEludm9rZXMgYSBodWIgbWV0aG9kIG9uIHRoZSBzZXJ2ZXIgdXNpbmcgdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBhcmd1bWVudHMuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIFByb21pc2UgcmV0dXJuZWQgYnkgdGhpcyBtZXRob2QgcmVzb2x2ZXMgd2hlbiB0aGUgc2VydmVyIGluZGljYXRlcyBpdCBoYXMgZmluaXNoZWQgaW52b2tpbmcgdGhlIG1ldGhvZC4gV2hlbiB0aGUgcHJvbWlzZVxyXG4gICAgICogcmVzb2x2ZXMsIHRoZSBzZXJ2ZXIgaGFzIGZpbmlzaGVkIGludm9raW5nIHRoZSBtZXRob2QuIElmIHRoZSBzZXJ2ZXIgbWV0aG9kIHJldHVybnMgYSByZXN1bHQsIGl0IGlzIHByb2R1Y2VkIGFzIHRoZSByZXN1bHQgb2ZcclxuICAgICAqIHJlc29sdmluZyB0aGUgUHJvbWlzZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZXBhcmFtIFQgVGhlIGV4cGVjdGVkIHJldHVybiB0eXBlLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgVGhlIG5hbWUgb2YgdGhlIHNlcnZlciBtZXRob2QgdG8gaW52b2tlLlxyXG4gICAgICogQHBhcmFtIHthbnlbXX0gYXJncyBUaGUgYXJndW1lbnRzIHVzZWQgdG8gaW52b2tlIHRoZSBzZXJ2ZXIgbWV0aG9kLlxyXG4gICAgICogQHJldHVybnMge1Byb21pc2U8VD59IEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUgc2VydmVyIG1ldGhvZCAoaWYgYW55KSwgb3IgcmVqZWN0cyB3aXRoIGFuIGVycm9yLlxyXG4gICAgICovXHJcbiAgICBIdWJDb25uZWN0aW9uLnByb3RvdHlwZS5pbnZva2UgPSBmdW5jdGlvbiAobWV0aG9kTmFtZSkge1xyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcclxuICAgICAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICBhcmdzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgaW52b2NhdGlvbkRlc2NyaXB0b3IgPSB0aGlzLmNyZWF0ZUludm9jYXRpb24obWV0aG9kTmFtZSwgYXJncywgZmFsc2UpO1xyXG4gICAgICAgIHZhciBwID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgICAgICBfdGhpcy5jYWxsYmFja3NbaW52b2NhdGlvbkRlc2NyaXB0b3IuaW52b2NhdGlvbklkXSA9IGZ1bmN0aW9uIChpbnZvY2F0aW9uRXZlbnQsIGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChpbnZvY2F0aW9uRXZlbnQudHlwZSA9PT0gTWVzc2FnZVR5cGUuQ29tcGxldGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjb21wbGV0aW9uTWVzc2FnZSA9IGludm9jYXRpb25FdmVudDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxldGlvbk1lc3NhZ2UuZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihjb21wbGV0aW9uTWVzc2FnZS5lcnJvcikpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShjb21wbGV0aW9uTWVzc2FnZS5yZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIG1lc3NhZ2UgdHlwZTogXCIgKyBpbnZvY2F0aW9uRXZlbnQudHlwZSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB2YXIgbWVzc2FnZSA9IF90aGlzLnByb3RvY29sLndyaXRlTWVzc2FnZShpbnZvY2F0aW9uRGVzY3JpcHRvcik7XHJcbiAgICAgICAgICAgIF90aGlzLmNvbm5lY3Rpb24uc2VuZChtZXNzYWdlKVxyXG4gICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICAgICByZWplY3QoZSk7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgX3RoaXMuY2FsbGJhY2tzW2ludm9jYXRpb25EZXNjcmlwdG9yLmludm9jYXRpb25JZF07XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBwO1xyXG4gICAgfTtcclxuICAgIC8qKiBSZWdpc3RlcnMgYSBoYW5kbGVyIHRoYXQgd2lsbCBiZSBpbnZva2VkIHdoZW4gdGhlIGh1YiBtZXRob2Qgd2l0aCB0aGUgc3BlY2lmaWVkIG1ldGhvZCBuYW1lIGlzIGludm9rZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgVGhlIG5hbWUgb2YgdGhlIGh1YiBtZXRob2QgdG8gZGVmaW5lLlxyXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbmV3TWV0aG9kIFRoZSBoYW5kbGVyIHRoYXQgd2lsbCBiZSByYWlzZWQgd2hlbiB0aGUgaHViIG1ldGhvZCBpcyBpbnZva2VkLlxyXG4gICAgICovXHJcbiAgICBIdWJDb25uZWN0aW9uLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uIChtZXRob2ROYW1lLCBuZXdNZXRob2QpIHtcclxuICAgICAgICBpZiAoIW1ldGhvZE5hbWUgfHwgIW5ld01ldGhvZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG1ldGhvZE5hbWUgPSBtZXRob2ROYW1lLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCF0aGlzLm1ldGhvZHNbbWV0aG9kTmFtZV0pIHtcclxuICAgICAgICAgICAgdGhpcy5tZXRob2RzW21ldGhvZE5hbWVdID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFByZXZlbnRpbmcgYWRkaW5nIHRoZSBzYW1lIGhhbmRsZXIgbXVsdGlwbGUgdGltZXMuXHJcbiAgICAgICAgaWYgKHRoaXMubWV0aG9kc1ttZXRob2ROYW1lXS5pbmRleE9mKG5ld01ldGhvZCkgIT09IC0xKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5tZXRob2RzW21ldGhvZE5hbWVdLnB1c2gobmV3TWV0aG9kKTtcclxuICAgIH07XHJcbiAgICBIdWJDb25uZWN0aW9uLnByb3RvdHlwZS5vZmYgPSBmdW5jdGlvbiAobWV0aG9kTmFtZSwgbWV0aG9kKSB7XHJcbiAgICAgICAgaWYgKCFtZXRob2ROYW1lKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgbWV0aG9kTmFtZSA9IG1ldGhvZE5hbWUudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICB2YXIgaGFuZGxlcnMgPSB0aGlzLm1ldGhvZHNbbWV0aG9kTmFtZV07XHJcbiAgICAgICAgaWYgKCFoYW5kbGVycykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChtZXRob2QpIHtcclxuICAgICAgICAgICAgdmFyIHJlbW92ZUlkeCA9IGhhbmRsZXJzLmluZGV4T2YobWV0aG9kKTtcclxuICAgICAgICAgICAgaWYgKHJlbW92ZUlkeCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIGhhbmRsZXJzLnNwbGljZShyZW1vdmVJZHgsIDEpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXJzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm1ldGhvZHNbbWV0aG9kTmFtZV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm1ldGhvZHNbbWV0aG9kTmFtZV07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIC8qKiBSZWdpc3RlcnMgYSBoYW5kbGVyIHRoYXQgd2lsbCBiZSBpbnZva2VkIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBoYW5kbGVyIHRoYXQgd2lsbCBiZSBpbnZva2VkIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkLiBPcHRpb25hbGx5IHJlY2VpdmVzIGEgc2luZ2xlIGFyZ3VtZW50IGNvbnRhaW5pbmcgdGhlIGVycm9yIHRoYXQgY2F1c2VkIHRoZSBjb25uZWN0aW9uIHRvIGNsb3NlIChpZiBhbnkpLlxyXG4gICAgICovXHJcbiAgICBIdWJDb25uZWN0aW9uLnByb3RvdHlwZS5vbmNsb3NlID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgaWYgKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2xvc2VkQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBIdWJDb25uZWN0aW9uLnByb3RvdHlwZS5wcm9jZXNzSW5jb21pbmdEYXRhID0gZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICB0aGlzLmNsZWFudXBUaW1lb3V0KCk7XHJcbiAgICAgICAgaWYgKCF0aGlzLnJlY2VpdmVkSGFuZHNoYWtlUmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgZGF0YSA9IHRoaXMucHJvY2Vzc0hhbmRzaGFrZVJlc3BvbnNlKGRhdGEpO1xyXG4gICAgICAgICAgICB0aGlzLnJlY2VpdmVkSGFuZHNoYWtlUmVzcG9uc2UgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBEYXRhIG1heSBoYXZlIGFsbCBiZWVuIHJlYWQgd2hlbiBwcm9jZXNzaW5nIGhhbmRzaGFrZSByZXNwb25zZVxyXG4gICAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgICAgIC8vIFBhcnNlIHRoZSBtZXNzYWdlc1xyXG4gICAgICAgICAgICB2YXIgbWVzc2FnZXMgPSB0aGlzLnByb3RvY29sLnBhcnNlTWVzc2FnZXMoZGF0YSwgdGhpcy5sb2dnZXIpO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBfaSA9IDAsIG1lc3NhZ2VzXzEgPSBtZXNzYWdlczsgX2kgPCBtZXNzYWdlc18xLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBtZXNzYWdlc18xW19pXTtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS50eXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBNZXNzYWdlVHlwZS5JbnZvY2F0aW9uOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmludm9rZUNsaWVudE1ldGhvZChtZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBNZXNzYWdlVHlwZS5TdHJlYW1JdGVtOlxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTWVzc2FnZVR5cGUuQ29tcGxldGlvbjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gdGhpcy5jYWxsYmFja3NbbWVzc2FnZS5pbnZvY2F0aW9uSWRdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gTWVzc2FnZVR5cGUuQ29tcGxldGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNhbGxiYWNrc1ttZXNzYWdlLmludm9jYXRpb25JZF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhtZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIE1lc3NhZ2VUeXBlLlBpbmc6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGNhcmUgYWJvdXQgcGluZ3NcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBNZXNzYWdlVHlwZS5DbG9zZTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkluZm9ybWF0aW9uLCBcIkNsb3NlIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBzZXJ2ZXIuXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24uc3RvcChtZXNzYWdlLmVycm9yID8gbmV3IEVycm9yKFwiU2VydmVyIHJldHVybmVkIGFuIGVycm9yIG9uIGNsb3NlOiBcIiArIG1lc3NhZ2UuZXJyb3IpIDogbnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5XYXJuaW5nLCBcIkludmFsaWQgbWVzc2FnZSB0eXBlOiBcIiArIG1lc3NhZ2UudHlwZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY29uZmlndXJlVGltZW91dCgpO1xyXG4gICAgfTtcclxuICAgIEh1YkNvbm5lY3Rpb24ucHJvdG90eXBlLnByb2Nlc3NIYW5kc2hha2VSZXNwb25zZSA9IGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgdmFyIHJlc3BvbnNlTWVzc2FnZTtcclxuICAgICAgICB2YXIgcmVtYWluaW5nRGF0YTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBfYSA9IHRoaXMuaGFuZHNoYWtlUHJvdG9jb2wucGFyc2VIYW5kc2hha2VSZXNwb25zZShkYXRhKSwgcmVtYWluaW5nRGF0YSA9IF9hWzBdLCByZXNwb25zZU1lc3NhZ2UgPSBfYVsxXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBcIkVycm9yIHBhcnNpbmcgaGFuZHNoYWtlIHJlc3BvbnNlOiBcIiArIGU7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5FcnJvciwgbWVzc2FnZSk7XHJcbiAgICAgICAgICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcihtZXNzYWdlKTtcclxuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLnN0b3AoZXJyb3IpO1xyXG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlTWVzc2FnZS5lcnJvcikge1xyXG4gICAgICAgICAgICB2YXIgbWVzc2FnZSA9IFwiU2VydmVyIHJldHVybmVkIGhhbmRzaGFrZSBlcnJvcjogXCIgKyByZXNwb25zZU1lc3NhZ2UuZXJyb3I7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5FcnJvciwgbWVzc2FnZSk7XHJcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5zdG9wKG5ldyBFcnJvcihtZXNzYWdlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRGVidWcsIFwiU2VydmVyIGhhbmRzaGFrZSBjb21wbGV0ZS5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZW1haW5pbmdEYXRhO1xyXG4gICAgICAgIHZhciBfYTtcclxuICAgIH07XHJcbiAgICBIdWJDb25uZWN0aW9uLnByb3RvdHlwZS5jb25maWd1cmVUaW1lb3V0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNvbm5lY3Rpb24uZmVhdHVyZXMgfHwgIXRoaXMuY29ubmVjdGlvbi5mZWF0dXJlcy5pbmhlcmVudEtlZXBBbGl2ZSkge1xyXG4gICAgICAgICAgICAvLyBTZXQgdGhlIHRpbWVvdXQgdGltZXJcclxuICAgICAgICAgICAgdGhpcy50aW1lb3V0SGFuZGxlID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5zZXJ2ZXJUaW1lb3V0KCk7IH0sIHRoaXMuc2VydmVyVGltZW91dEluTWlsbGlzZWNvbmRzKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgSHViQ29ubmVjdGlvbi5wcm90b3R5cGUuc2VydmVyVGltZW91dCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAvLyBUaGUgc2VydmVyIGhhc24ndCB0YWxrZWQgdG8gdXMgaW4gYSB3aGlsZS4gSXQgZG9lc24ndCBsaWtlIHVzIGFueW1vcmUgLi4uIDooXHJcbiAgICAgICAgLy8gVGVybWluYXRlIHRoZSBjb25uZWN0aW9uXHJcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLnN0b3AobmV3IEVycm9yKFwiU2VydmVyIHRpbWVvdXQgZWxhcHNlZCB3aXRob3V0IHJlY2VpdmluZyBhIG1lc3NhZ2UgZnJvbSB0aGUgc2VydmVyLlwiKSk7XHJcbiAgICB9O1xyXG4gICAgSHViQ29ubmVjdGlvbi5wcm90b3R5cGUuaW52b2tlQ2xpZW50TWV0aG9kID0gZnVuY3Rpb24gKGludm9jYXRpb25NZXNzYWdlKSB7XHJcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICB2YXIgbWV0aG9kcyA9IHRoaXMubWV0aG9kc1tpbnZvY2F0aW9uTWVzc2FnZS50YXJnZXQudG9Mb3dlckNhc2UoKV07XHJcbiAgICAgICAgaWYgKG1ldGhvZHMpIHtcclxuICAgICAgICAgICAgbWV0aG9kcy5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7IHJldHVybiBtLmFwcGx5KF90aGlzLCBpbnZvY2F0aW9uTWVzc2FnZS5hcmd1bWVudHMpOyB9KTtcclxuICAgICAgICAgICAgaWYgKGludm9jYXRpb25NZXNzYWdlLmludm9jYXRpb25JZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBub3Qgc3VwcG9ydGVkIGluIHYxLiBTbyB3ZSByZXR1cm4gYW4gZXJyb3IgdG8gYXZvaWQgYmxvY2tpbmcgdGhlIHNlcnZlciB3YWl0aW5nIGZvciB0aGUgcmVzcG9uc2UuXHJcbiAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZSA9IFwiU2VydmVyIHJlcXVlc3RlZCBhIHJlc3BvbnNlLCB3aGljaCBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgdmVyc2lvbiBvZiB0aGUgY2xpZW50LlwiO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVycm9yLCBtZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5zdG9wKG5ldyBFcnJvcihtZXNzYWdlKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5XYXJuaW5nLCBcIk5vIGNsaWVudCBtZXRob2Qgd2l0aCB0aGUgbmFtZSAnXCIgKyBpbnZvY2F0aW9uTWVzc2FnZS50YXJnZXQgKyBcIicgZm91bmQuXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBIdWJDb25uZWN0aW9uLnByb3RvdHlwZS5jb25uZWN0aW9uQ2xvc2VkID0gZnVuY3Rpb24gKGVycm9yKSB7XHJcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICB2YXIgY2FsbGJhY2tzID0gdGhpcy5jYWxsYmFja3M7XHJcbiAgICAgICAgdGhpcy5jYWxsYmFja3MgPSB7fTtcclxuICAgICAgICBPYmplY3Qua2V5cyhjYWxsYmFja3MpXHJcbiAgICAgICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcclxuICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gY2FsbGJhY2tzW2tleV07XHJcbiAgICAgICAgICAgIGNhbGxiYWNrKHVuZGVmaW5lZCwgZXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihcIkludm9jYXRpb24gY2FuY2VsZWQgZHVlIHRvIGNvbm5lY3Rpb24gYmVpbmcgY2xvc2VkLlwiKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5jbGVhbnVwVGltZW91dCgpO1xyXG4gICAgICAgIHRoaXMuY2xvc2VkQ2FsbGJhY2tzLmZvckVhY2goZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGMuYXBwbHkoX3RoaXMsIFtlcnJvcl0pOyB9KTtcclxuICAgIH07XHJcbiAgICBIdWJDb25uZWN0aW9uLnByb3RvdHlwZS5jbGVhbnVwVGltZW91dCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAodGhpcy50aW1lb3V0SGFuZGxlKSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRIYW5kbGUpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBIdWJDb25uZWN0aW9uLnByb3RvdHlwZS5jcmVhdGVJbnZvY2F0aW9uID0gZnVuY3Rpb24gKG1ldGhvZE5hbWUsIGFyZ3MsIG5vbmJsb2NraW5nKSB7XHJcbiAgICAgICAgaWYgKG5vbmJsb2NraW5nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBhcmd1bWVudHM6IGFyZ3MsXHJcbiAgICAgICAgICAgICAgICB0YXJnZXQ6IG1ldGhvZE5hbWUsXHJcbiAgICAgICAgICAgICAgICB0eXBlOiBNZXNzYWdlVHlwZS5JbnZvY2F0aW9uLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdmFyIGlkID0gdGhpcy5pZDtcclxuICAgICAgICAgICAgdGhpcy5pZCsrO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgYXJndW1lbnRzOiBhcmdzLFxyXG4gICAgICAgICAgICAgICAgaW52b2NhdGlvbklkOiBpZC50b1N0cmluZygpLFxyXG4gICAgICAgICAgICAgICAgdGFyZ2V0OiBtZXRob2ROYW1lLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogTWVzc2FnZVR5cGUuSW52b2NhdGlvbixcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgSHViQ29ubmVjdGlvbi5wcm90b3R5cGUuY3JlYXRlU3RyZWFtSW52b2NhdGlvbiA9IGZ1bmN0aW9uIChtZXRob2ROYW1lLCBhcmdzKSB7XHJcbiAgICAgICAgdmFyIGlkID0gdGhpcy5pZDtcclxuICAgICAgICB0aGlzLmlkKys7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYXJndW1lbnRzOiBhcmdzLFxyXG4gICAgICAgICAgICBpbnZvY2F0aW9uSWQ6IGlkLnRvU3RyaW5nKCksXHJcbiAgICAgICAgICAgIHRhcmdldDogbWV0aG9kTmFtZSxcclxuICAgICAgICAgICAgdHlwZTogTWVzc2FnZVR5cGUuU3RyZWFtSW52b2NhdGlvbixcclxuICAgICAgICB9O1xyXG4gICAgfTtcclxuICAgIEh1YkNvbm5lY3Rpb24ucHJvdG90eXBlLmNyZWF0ZUNhbmNlbEludm9jYXRpb24gPSBmdW5jdGlvbiAoaWQpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBpbnZvY2F0aW9uSWQ6IGlkLFxyXG4gICAgICAgICAgICB0eXBlOiBNZXNzYWdlVHlwZS5DYW5jZWxJbnZvY2F0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIEh1YkNvbm5lY3Rpb247XHJcbn0oKSk7XHJcbmV4cG9ydCB7IEh1YkNvbm5lY3Rpb24gfTtcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SHViQ29ubmVjdGlvbi5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIC5ORVQgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcbmltcG9ydCB7IEh0dHBDb25uZWN0aW9uIH0gZnJvbSBcIi4vSHR0cENvbm5lY3Rpb25cIjtcclxuaW1wb3J0IHsgSHViQ29ubmVjdGlvbiB9IGZyb20gXCIuL0h1YkNvbm5lY3Rpb25cIjtcclxuaW1wb3J0IHsgSnNvbkh1YlByb3RvY29sIH0gZnJvbSBcIi4vSnNvbkh1YlByb3RvY29sXCI7XHJcbmltcG9ydCB7IE51bGxMb2dnZXIgfSBmcm9tIFwiLi9Mb2dnZXJzXCI7XHJcbmltcG9ydCB7IEFyZywgQ29uc29sZUxvZ2dlciB9IGZyb20gXCIuL1V0aWxzXCI7XHJcbi8qKiBBIGJ1aWxkZXIgZm9yIGNvbmZpZ3VyaW5nIHtAbGluayBIdWJDb25uZWN0aW9ufSBpbnN0YW5jZXMuICovXHJcbnZhciBIdWJDb25uZWN0aW9uQnVpbGRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIGZ1bmN0aW9uIEh1YkNvbm5lY3Rpb25CdWlsZGVyKCkge1xyXG4gICAgfVxyXG4gICAgSHViQ29ubmVjdGlvbkJ1aWxkZXIucHJvdG90eXBlLmNvbmZpZ3VyZUxvZ2dpbmcgPSBmdW5jdGlvbiAobG9nZ2luZykge1xyXG4gICAgICAgIEFyZy5pc1JlcXVpcmVkKGxvZ2dpbmcsIFwibG9nZ2luZ1wiKTtcclxuICAgICAgICBpZiAoaXNMb2dnZXIobG9nZ2luZykpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2dnaW5nO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIgPSBuZXcgQ29uc29sZUxvZ2dlcihsb2dnaW5nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9O1xyXG4gICAgSHViQ29ubmVjdGlvbkJ1aWxkZXIucHJvdG90eXBlLndpdGhVcmwgPSBmdW5jdGlvbiAodXJsLCB0cmFuc3BvcnRUeXBlT3JPcHRpb25zKSB7XHJcbiAgICAgICAgQXJnLmlzUmVxdWlyZWQodXJsLCBcInVybFwiKTtcclxuICAgICAgICB0aGlzLnVybCA9IHVybDtcclxuICAgICAgICAvLyBGbG93LXR5cGluZyBrbm93cyB3aGVyZSBpdCdzIGF0LiBTaW5jZSBIdHRwVHJhbnNwb3J0VHlwZSBpcyBhIG51bWJlciBhbmQgSUh0dHBDb25uZWN0aW9uT3B0aW9ucyBpcyBndWFyYW50ZWVkXHJcbiAgICAgICAgLy8gdG8gYmUgYW4gb2JqZWN0LCB3ZSBrbm93IChhcyBkb2VzIFR5cGVTY3JpcHQpIHRoaXMgY29tcGFyaXNvbiBpcyBhbGwgd2UgbmVlZCB0byBmaWd1cmUgb3V0IHdoaWNoIG92ZXJsb2FkIHdhcyBjYWxsZWQuXHJcbiAgICAgICAgaWYgKHR5cGVvZiB0cmFuc3BvcnRUeXBlT3JPcHRpb25zID09PSBcIm9iamVjdFwiKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaHR0cENvbm5lY3Rpb25PcHRpb25zID0gdHJhbnNwb3J0VHlwZU9yT3B0aW9ucztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuaHR0cENvbm5lY3Rpb25PcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgdHJhbnNwb3J0OiB0cmFuc3BvcnRUeXBlT3JPcHRpb25zLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcbiAgICAvKiogQ29uZmlndXJlcyB0aGUge0BsaW5rIEh1YkNvbm5lY3Rpb259IHRvIHVzZSB0aGUgc3BlY2lmaWVkIEh1YiBQcm90b2NvbC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0lIdWJQcm90b2NvbH0gcHJvdG9jb2wgVGhlIHtAbGluayBJSHViUHJvdG9jb2x9IGltcGxlbWVudGF0aW9uIHRvIHVzZS5cclxuICAgICAqL1xyXG4gICAgSHViQ29ubmVjdGlvbkJ1aWxkZXIucHJvdG90eXBlLndpdGhIdWJQcm90b2NvbCA9IGZ1bmN0aW9uIChwcm90b2NvbCkge1xyXG4gICAgICAgIEFyZy5pc1JlcXVpcmVkKHByb3RvY29sLCBcInByb3RvY29sXCIpO1xyXG4gICAgICAgIHRoaXMucHJvdG9jb2wgPSBwcm90b2NvbDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcbiAgICAvKiogQ3JlYXRlcyBhIHtAbGluayBIdWJDb25uZWN0aW9ufSBmcm9tIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgc3BlY2lmaWVkIGluIHRoaXMgYnVpbGRlci5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7SHViQ29ubmVjdGlvbn0gVGhlIGNvbmZpZ3VyZWQge0BsaW5rIEh1YkNvbm5lY3Rpb259LlxyXG4gICAgICovXHJcbiAgICBIdWJDb25uZWN0aW9uQnVpbGRlci5wcm90b3R5cGUuYnVpbGQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgLy8gSWYgaHR0cENvbm5lY3Rpb25PcHRpb25zIGhhcyBhIGxvZ2dlciwgdXNlIGl0LiBPdGhlcndpc2UsIG92ZXJyaWRlIGl0IHdpdGggdGhlIG9uZVxyXG4gICAgICAgIC8vIHByb3ZpZGVkIHRvIGNvbmZpZ3VyZUxvZ2dlclxyXG4gICAgICAgIHZhciBodHRwQ29ubmVjdGlvbk9wdGlvbnMgPSB0aGlzLmh0dHBDb25uZWN0aW9uT3B0aW9ucyB8fCB7fTtcclxuICAgICAgICAvLyBJZiBpdCdzICdudWxsJywgdGhlIHVzZXIgKipleHBsaWNpdGx5KiogYXNrZWQgZm9yIG51bGwsIGRvbid0IG1lc3Mgd2l0aCBpdC5cclxuICAgICAgICBpZiAoaHR0cENvbm5lY3Rpb25PcHRpb25zLmxvZ2dlciA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIC8vIElmIG91ciBsb2dnZXIgaXMgdW5kZWZpbmVkIG9yIG51bGwsIHRoYXQncyBPSywgdGhlIEh0dHBDb25uZWN0aW9uIGNvbnN0cnVjdG9yIHdpbGwgaGFuZGxlIGl0LlxyXG4gICAgICAgICAgICBodHRwQ29ubmVjdGlvbk9wdGlvbnMubG9nZ2VyID0gdGhpcy5sb2dnZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIE5vdyBjcmVhdGUgdGhlIGNvbm5lY3Rpb25cclxuICAgICAgICBpZiAoIXRoaXMudXJsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSAnSHViQ29ubmVjdGlvbkJ1aWxkZXIud2l0aFVybCcgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBidWlsZGluZyB0aGUgY29ubmVjdGlvbi5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBjb25uZWN0aW9uID0gbmV3IEh0dHBDb25uZWN0aW9uKHRoaXMudXJsLCBodHRwQ29ubmVjdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgIHJldHVybiBIdWJDb25uZWN0aW9uLmNyZWF0ZShjb25uZWN0aW9uLCB0aGlzLmxvZ2dlciB8fCBOdWxsTG9nZ2VyLmluc3RhbmNlLCB0aGlzLnByb3RvY29sIHx8IG5ldyBKc29uSHViUHJvdG9jb2woKSk7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIEh1YkNvbm5lY3Rpb25CdWlsZGVyO1xyXG59KCkpO1xyXG5leHBvcnQgeyBIdWJDb25uZWN0aW9uQnVpbGRlciB9O1xyXG5mdW5jdGlvbiBpc0xvZ2dlcihsb2dnZXIpIHtcclxuICAgIHJldHVybiBsb2dnZXIubG9nICE9PSB1bmRlZmluZWQ7XHJcbn1cclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SHViQ29ubmVjdGlvbkJ1aWxkZXIuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSAuTkVUIEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG4vKiogRGVmaW5lcyB0aGUgdHlwZSBvZiBhIEh1YiBNZXNzYWdlLiAqL1xyXG5leHBvcnQgdmFyIE1lc3NhZ2VUeXBlO1xyXG4oZnVuY3Rpb24gKE1lc3NhZ2VUeXBlKSB7XHJcbiAgICAvKiogSW5kaWNhdGVzIHRoZSBtZXNzYWdlIGlzIGFuIEludm9jYXRpb24gbWVzc2FnZSBhbmQgaW1wbGVtZW50cyB0aGUge0BsaW5rIEludm9jYXRpb25NZXNzYWdlfSBpbnRlcmZhY2UuICovXHJcbiAgICBNZXNzYWdlVHlwZVtNZXNzYWdlVHlwZVtcIkludm9jYXRpb25cIl0gPSAxXSA9IFwiSW52b2NhdGlvblwiO1xyXG4gICAgLyoqIEluZGljYXRlcyB0aGUgbWVzc2FnZSBpcyBhIFN0cmVhbUl0ZW0gbWVzc2FnZSBhbmQgaW1wbGVtZW50cyB0aGUge0BsaW5rIFN0cmVhbUl0ZW1NZXNzYWdlfSBpbnRlcmZhY2UuICovXHJcbiAgICBNZXNzYWdlVHlwZVtNZXNzYWdlVHlwZVtcIlN0cmVhbUl0ZW1cIl0gPSAyXSA9IFwiU3RyZWFtSXRlbVwiO1xyXG4gICAgLyoqIEluZGljYXRlcyB0aGUgbWVzc2FnZSBpcyBhIENvbXBsZXRpb24gbWVzc2FnZSBhbmQgaW1wbGVtZW50cyB0aGUge0BsaW5rIENvbXBsZXRpb25NZXNzYWdlfSBpbnRlcmZhY2UuICovXHJcbiAgICBNZXNzYWdlVHlwZVtNZXNzYWdlVHlwZVtcIkNvbXBsZXRpb25cIl0gPSAzXSA9IFwiQ29tcGxldGlvblwiO1xyXG4gICAgLyoqIEluZGljYXRlcyB0aGUgbWVzc2FnZSBpcyBhIFN0cmVhbSBJbnZvY2F0aW9uIG1lc3NhZ2UgYW5kIGltcGxlbWVudHMgdGhlIHtAbGluayBTdHJlYW1JbnZvY2F0aW9uTWVzc2FnZX0gaW50ZXJmYWNlLiAqL1xyXG4gICAgTWVzc2FnZVR5cGVbTWVzc2FnZVR5cGVbXCJTdHJlYW1JbnZvY2F0aW9uXCJdID0gNF0gPSBcIlN0cmVhbUludm9jYXRpb25cIjtcclxuICAgIC8qKiBJbmRpY2F0ZXMgdGhlIG1lc3NhZ2UgaXMgYSBDYW5jZWwgSW52b2NhdGlvbiBtZXNzYWdlIGFuZCBpbXBsZW1lbnRzIHRoZSB7QGxpbmsgQ2FuY2VsSW52b2NhdGlvbk1lc3NhZ2V9IGludGVyZmFjZS4gKi9cclxuICAgIE1lc3NhZ2VUeXBlW01lc3NhZ2VUeXBlW1wiQ2FuY2VsSW52b2NhdGlvblwiXSA9IDVdID0gXCJDYW5jZWxJbnZvY2F0aW9uXCI7XHJcbiAgICAvKiogSW5kaWNhdGVzIHRoZSBtZXNzYWdlIGlzIGEgUGluZyBtZXNzYWdlIGFuZCBpbXBsZW1lbnRzIHRoZSB7QGxpbmsgUGluZ01lc3NhZ2V9IGludGVyZmFjZS4gKi9cclxuICAgIE1lc3NhZ2VUeXBlW01lc3NhZ2VUeXBlW1wiUGluZ1wiXSA9IDZdID0gXCJQaW5nXCI7XHJcbiAgICAvKiogSW5kaWNhdGVzIHRoZSBtZXNzYWdlIGlzIGEgQ2xvc2UgbWVzc2FnZSBhbmQgaW1wbGVtZW50cyB0aGUge0BsaW5rIENsb3NlTWVzc2FnZX0gaW50ZXJmYWNlLiAqL1xyXG4gICAgTWVzc2FnZVR5cGVbTWVzc2FnZVR5cGVbXCJDbG9zZVwiXSA9IDddID0gXCJDbG9zZVwiO1xyXG59KShNZXNzYWdlVHlwZSB8fCAoTWVzc2FnZVR5cGUgPSB7fSkpO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1JSHViUHJvdG9jb2wuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSAuTkVUIEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG4vLyBUaGVzZSB2YWx1ZXMgYXJlIGRlc2lnbmVkIHRvIG1hdGNoIHRoZSBBU1AuTkVUIExvZyBMZXZlbHMgc2luY2UgdGhhdCdzIHRoZSBwYXR0ZXJuIHdlJ3JlIGVtdWxhdGluZyBoZXJlLlxyXG4vKiogSW5kaWNhdGVzIHRoZSBzZXZlcml0eSBvZiBhIGxvZyBtZXNzYWdlLlxyXG4gKlxyXG4gKiBMb2cgTGV2ZWxzIGFyZSBvcmRlcmVkIGluIGluY3JlYXNpbmcgc2V2ZXJpdHkuIFNvIGBEZWJ1Z2AgaXMgbW9yZSBzZXZlcmUgdGhhbiBgVHJhY2VgLCBldGMuXHJcbiAqL1xyXG5leHBvcnQgdmFyIExvZ0xldmVsO1xyXG4oZnVuY3Rpb24gKExvZ0xldmVsKSB7XHJcbiAgICAvKiogTG9nIGxldmVsIGZvciB2ZXJ5IGxvdyBzZXZlcml0eSBkaWFnbm9zdGljIG1lc3NhZ2VzLiAqL1xyXG4gICAgTG9nTGV2ZWxbTG9nTGV2ZWxbXCJUcmFjZVwiXSA9IDBdID0gXCJUcmFjZVwiO1xyXG4gICAgLyoqIExvZyBsZXZlbCBmb3IgbG93IHNldmVyaXR5IGRpYWdub3N0aWMgbWVzc2FnZXMuICovXHJcbiAgICBMb2dMZXZlbFtMb2dMZXZlbFtcIkRlYnVnXCJdID0gMV0gPSBcIkRlYnVnXCI7XHJcbiAgICAvKiogTG9nIGxldmVsIGZvciBpbmZvcm1hdGlvbmFsIGRpYWdub3N0aWMgbWVzc2FnZXMuICovXHJcbiAgICBMb2dMZXZlbFtMb2dMZXZlbFtcIkluZm9ybWF0aW9uXCJdID0gMl0gPSBcIkluZm9ybWF0aW9uXCI7XHJcbiAgICAvKiogTG9nIGxldmVsIGZvciBkaWFnbm9zdGljIG1lc3NhZ2VzIHRoYXQgaW5kaWNhdGUgYSBub24tZmF0YWwgcHJvYmxlbS4gKi9cclxuICAgIExvZ0xldmVsW0xvZ0xldmVsW1wiV2FybmluZ1wiXSA9IDNdID0gXCJXYXJuaW5nXCI7XHJcbiAgICAvKiogTG9nIGxldmVsIGZvciBkaWFnbm9zdGljIG1lc3NhZ2VzIHRoYXQgaW5kaWNhdGUgYSBmYWlsdXJlIGluIHRoZSBjdXJyZW50IG9wZXJhdGlvbi4gKi9cclxuICAgIExvZ0xldmVsW0xvZ0xldmVsW1wiRXJyb3JcIl0gPSA0XSA9IFwiRXJyb3JcIjtcclxuICAgIC8qKiBMb2cgbGV2ZWwgZm9yIGRpYWdub3N0aWMgbWVzc2FnZXMgdGhhdCBpbmRpY2F0ZSBhIGZhaWx1cmUgdGhhdCB3aWxsIHRlcm1pbmF0ZSB0aGUgZW50aXJlIGFwcGxpY2F0aW9uLiAqL1xyXG4gICAgTG9nTGV2ZWxbTG9nTGV2ZWxbXCJDcml0aWNhbFwiXSA9IDVdID0gXCJDcml0aWNhbFwiO1xyXG4gICAgLyoqIFRoZSBoaWdoZXN0IHBvc3NpYmxlIGxvZyBsZXZlbC4gVXNlZCB3aGVuIGNvbmZpZ3VyaW5nIGxvZ2dpbmcgdG8gaW5kaWNhdGUgdGhhdCBubyBsb2cgbWVzc2FnZXMgc2hvdWxkIGJlIGVtaXR0ZWQuICovXHJcbiAgICBMb2dMZXZlbFtMb2dMZXZlbFtcIk5vbmVcIl0gPSA2XSA9IFwiTm9uZVwiO1xyXG59KShMb2dMZXZlbCB8fCAoTG9nTGV2ZWwgPSB7fSkpO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1JTG9nZ2VyLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgLk5FVCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuLy8gVGhpcyB3aWxsIGJlIHRyZWF0ZWQgYXMgYSBiaXQgZmxhZyBpbiB0aGUgZnV0dXJlLCBzbyB3ZSBrZWVwIGl0IHVzaW5nIHBvd2VyLW9mLXR3byB2YWx1ZXMuXHJcbi8qKiBTcGVjaWZpZXMgYSBzcGVjaWZpYyBIVFRQIHRyYW5zcG9ydCB0eXBlLiAqL1xyXG5leHBvcnQgdmFyIEh0dHBUcmFuc3BvcnRUeXBlO1xyXG4oZnVuY3Rpb24gKEh0dHBUcmFuc3BvcnRUeXBlKSB7XHJcbiAgICAvKiogU3BlY2lmaWVzIG5vIHRyYW5zcG9ydCBwcmVmZXJlbmNlLiAqL1xyXG4gICAgSHR0cFRyYW5zcG9ydFR5cGVbSHR0cFRyYW5zcG9ydFR5cGVbXCJOb25lXCJdID0gMF0gPSBcIk5vbmVcIjtcclxuICAgIC8qKiBTcGVjaWZpZXMgdGhlIFdlYlNvY2tldHMgdHJhbnNwb3J0LiAqL1xyXG4gICAgSHR0cFRyYW5zcG9ydFR5cGVbSHR0cFRyYW5zcG9ydFR5cGVbXCJXZWJTb2NrZXRzXCJdID0gMV0gPSBcIldlYlNvY2tldHNcIjtcclxuICAgIC8qKiBTcGVjaWZpZXMgdGhlIFNlcnZlci1TZW50IEV2ZW50cyB0cmFuc3BvcnQuICovXHJcbiAgICBIdHRwVHJhbnNwb3J0VHlwZVtIdHRwVHJhbnNwb3J0VHlwZVtcIlNlcnZlclNlbnRFdmVudHNcIl0gPSAyXSA9IFwiU2VydmVyU2VudEV2ZW50c1wiO1xyXG4gICAgLyoqIFNwZWNpZmllcyB0aGUgTG9uZyBQb2xsaW5nIHRyYW5zcG9ydC4gKi9cclxuICAgIEh0dHBUcmFuc3BvcnRUeXBlW0h0dHBUcmFuc3BvcnRUeXBlW1wiTG9uZ1BvbGxpbmdcIl0gPSA0XSA9IFwiTG9uZ1BvbGxpbmdcIjtcclxufSkoSHR0cFRyYW5zcG9ydFR5cGUgfHwgKEh0dHBUcmFuc3BvcnRUeXBlID0ge30pKTtcclxuLyoqIFNwZWNpZmllcyB0aGUgdHJhbnNmZXIgZm9ybWF0IGZvciBhIGNvbm5lY3Rpb24uICovXHJcbmV4cG9ydCB2YXIgVHJhbnNmZXJGb3JtYXQ7XHJcbihmdW5jdGlvbiAoVHJhbnNmZXJGb3JtYXQpIHtcclxuICAgIC8qKiBTcGVjaWZpZXMgdGhhdCBvbmx5IHRleHQgZGF0YSB3aWxsIGJlIHRyYW5zbWl0dGVkIG92ZXIgdGhlIGNvbm5lY3Rpb24uICovXHJcbiAgICBUcmFuc2ZlckZvcm1hdFtUcmFuc2ZlckZvcm1hdFtcIlRleHRcIl0gPSAxXSA9IFwiVGV4dFwiO1xyXG4gICAgLyoqIFNwZWNpZmllcyB0aGF0IGJpbmFyeSBkYXRhIHdpbGwgYmUgdHJhbnNtaXR0ZWQgb3ZlciB0aGUgY29ubmVjdGlvbi4gKi9cclxuICAgIFRyYW5zZmVyRm9ybWF0W1RyYW5zZmVyRm9ybWF0W1wiQmluYXJ5XCJdID0gMl0gPSBcIkJpbmFyeVwiO1xyXG59KShUcmFuc2ZlckZvcm1hdCB8fCAoVHJhbnNmZXJGb3JtYXQgPSB7fSkpO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1JVHJhbnNwb3J0LmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgLk5FVCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuaW1wb3J0IHsgTWVzc2FnZVR5cGUgfSBmcm9tIFwiLi9JSHViUHJvdG9jb2xcIjtcclxuaW1wb3J0IHsgTG9nTGV2ZWwgfSBmcm9tIFwiLi9JTG9nZ2VyXCI7XHJcbmltcG9ydCB7IFRyYW5zZmVyRm9ybWF0IH0gZnJvbSBcIi4vSVRyYW5zcG9ydFwiO1xyXG5pbXBvcnQgeyBOdWxsTG9nZ2VyIH0gZnJvbSBcIi4vTG9nZ2Vyc1wiO1xyXG5pbXBvcnQgeyBUZXh0TWVzc2FnZUZvcm1hdCB9IGZyb20gXCIuL1RleHRNZXNzYWdlRm9ybWF0XCI7XHJcbnZhciBKU09OX0hVQl9QUk9UT0NPTF9OQU1FID0gXCJqc29uXCI7XHJcbi8qKiBJbXBsZW1lbnRzIHRoZSBKU09OIEh1YiBQcm90b2NvbC4gKi9cclxudmFyIEpzb25IdWJQcm90b2NvbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIGZ1bmN0aW9uIEpzb25IdWJQcm90b2NvbCgpIHtcclxuICAgICAgICAvKiogQGluaGVyaXREb2MgKi9cclxuICAgICAgICB0aGlzLm5hbWUgPSBKU09OX0hVQl9QUk9UT0NPTF9OQU1FO1xyXG4gICAgICAgIC8qKiBAaW5oZXJpdERvYyAqL1xyXG4gICAgICAgIHRoaXMudmVyc2lvbiA9IDE7XHJcbiAgICAgICAgLyoqIEBpbmhlcml0RG9jICovXHJcbiAgICAgICAgdGhpcy50cmFuc2ZlckZvcm1hdCA9IFRyYW5zZmVyRm9ybWF0LlRleHQ7XHJcbiAgICB9XHJcbiAgICAvKiogQ3JlYXRlcyBhbiBhcnJheSBvZiB7QGxpbmsgSHViTWVzc2FnZX0gb2JqZWN0cyBmcm9tIHRoZSBzcGVjaWZpZWQgc2VyaWFsaXplZCByZXByZXNlbnRhdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQgQSBzdHJpbmcgY29udGFpbmluZyB0aGUgc2VyaWFsaXplZCByZXByZXNlbnRhdGlvbi5cclxuICAgICAqIEBwYXJhbSB7SUxvZ2dlcn0gbG9nZ2VyIEEgbG9nZ2VyIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGxvZyBtZXNzYWdlcyB0aGF0IG9jY3VyIGR1cmluZyBwYXJzaW5nLlxyXG4gICAgICovXHJcbiAgICBKc29uSHViUHJvdG9jb2wucHJvdG90eXBlLnBhcnNlTWVzc2FnZXMgPSBmdW5jdGlvbiAoaW5wdXQsIGxvZ2dlcikge1xyXG4gICAgICAgIC8vIFRoZSBpbnRlcmZhY2UgZG9lcyBhbGxvdyBcIkFycmF5QnVmZmVyXCIgdG8gYmUgcGFzc2VkIGluLCBidXQgdGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdC4gU28gbGV0J3MgdGhyb3cgYSB1c2VmdWwgZXJyb3IuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGlucHV0IGZvciBKU09OIGh1YiBwcm90b2NvbC4gRXhwZWN0ZWQgYSBzdHJpbmcuXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWlucHV0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGxvZ2dlciA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBsb2dnZXIgPSBOdWxsTG9nZ2VyLmluc3RhbmNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBQYXJzZSB0aGUgbWVzc2FnZXNcclxuICAgICAgICB2YXIgbWVzc2FnZXMgPSBUZXh0TWVzc2FnZUZvcm1hdC5wYXJzZShpbnB1dCk7XHJcbiAgICAgICAgdmFyIGh1Yk1lc3NhZ2VzID0gW107XHJcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBtZXNzYWdlc18xID0gbWVzc2FnZXM7IF9pIDwgbWVzc2FnZXNfMS5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBtZXNzYWdlc18xW19pXTtcclxuICAgICAgICAgICAgdmFyIHBhcnNlZE1lc3NhZ2UgPSBKU09OLnBhcnNlKG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHBhcnNlZE1lc3NhZ2UudHlwZSAhPT0gXCJudW1iZXJcIikge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYXlsb2FkLlwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzd2l0Y2ggKHBhcnNlZE1lc3NhZ2UudHlwZSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBNZXNzYWdlVHlwZS5JbnZvY2F0aW9uOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNJbnZvY2F0aW9uTWVzc2FnZShwYXJzZWRNZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgTWVzc2FnZVR5cGUuU3RyZWFtSXRlbTpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU3RyZWFtSXRlbU1lc3NhZ2UocGFyc2VkTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIE1lc3NhZ2VUeXBlLkNvbXBsZXRpb246XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0NvbXBsZXRpb25NZXNzYWdlKHBhcnNlZE1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBNZXNzYWdlVHlwZS5QaW5nOlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFNpbmdsZSB2YWx1ZSwgbm8gbmVlZCB0byB2YWxpZGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBNZXNzYWdlVHlwZS5DbG9zZTpcclxuICAgICAgICAgICAgICAgICAgICAvLyBBbGwgb3B0aW9uYWwgdmFsdWVzLCBubyBuZWVkIHRvIHZhbGlkYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIEZ1dHVyZSBwcm90b2NvbCBjaGFuZ2VzIGNhbiBhZGQgbWVzc2FnZSB0eXBlcywgb2xkIGNsaWVudHMgY2FuIGlnbm9yZSB0aGVtXHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhMb2dMZXZlbC5JbmZvcm1hdGlvbiwgXCJVbmtub3duIG1lc3NhZ2UgdHlwZSAnXCIgKyBwYXJzZWRNZXNzYWdlLnR5cGUgKyBcIicgaWdub3JlZC5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaHViTWVzc2FnZXMucHVzaChwYXJzZWRNZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGh1Yk1lc3NhZ2VzO1xyXG4gICAgfTtcclxuICAgIC8qKiBXcml0ZXMgdGhlIHNwZWNpZmllZCB7QGxpbmsgSHViTWVzc2FnZX0gdG8gYSBzdHJpbmcgYW5kIHJldHVybnMgaXQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtIdWJNZXNzYWdlfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIHdyaXRlLlxyXG4gICAgICogQHJldHVybnMge3N0cmluZ30gQSBzdHJpbmcgY29udGFpbmluZyB0aGUgc2VyaWFsaXplZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWVzc2FnZS5cclxuICAgICAqL1xyXG4gICAgSnNvbkh1YlByb3RvY29sLnByb3RvdHlwZS53cml0ZU1lc3NhZ2UgPSBmdW5jdGlvbiAobWVzc2FnZSkge1xyXG4gICAgICAgIHJldHVybiBUZXh0TWVzc2FnZUZvcm1hdC53cml0ZShKU09OLnN0cmluZ2lmeShtZXNzYWdlKSk7XHJcbiAgICB9O1xyXG4gICAgSnNvbkh1YlByb3RvY29sLnByb3RvdHlwZS5pc0ludm9jYXRpb25NZXNzYWdlID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHtcclxuICAgICAgICB0aGlzLmFzc2VydE5vdEVtcHR5U3RyaW5nKG1lc3NhZ2UudGFyZ2V0LCBcIkludmFsaWQgcGF5bG9hZCBmb3IgSW52b2NhdGlvbiBtZXNzYWdlLlwiKTtcclxuICAgICAgICBpZiAobWVzc2FnZS5pbnZvY2F0aW9uSWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLmFzc2VydE5vdEVtcHR5U3RyaW5nKG1lc3NhZ2UuaW52b2NhdGlvbklkLCBcIkludmFsaWQgcGF5bG9hZCBmb3IgSW52b2NhdGlvbiBtZXNzYWdlLlwiKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgSnNvbkh1YlByb3RvY29sLnByb3RvdHlwZS5pc1N0cmVhbUl0ZW1NZXNzYWdlID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHtcclxuICAgICAgICB0aGlzLmFzc2VydE5vdEVtcHR5U3RyaW5nKG1lc3NhZ2UuaW52b2NhdGlvbklkLCBcIkludmFsaWQgcGF5bG9hZCBmb3IgU3RyZWFtSXRlbSBtZXNzYWdlLlwiKTtcclxuICAgICAgICBpZiAobWVzc2FnZS5pdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYXlsb2FkIGZvciBTdHJlYW1JdGVtIG1lc3NhZ2UuXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBKc29uSHViUHJvdG9jb2wucHJvdG90eXBlLmlzQ29tcGxldGlvbk1lc3NhZ2UgPSBmdW5jdGlvbiAobWVzc2FnZSkge1xyXG4gICAgICAgIGlmIChtZXNzYWdlLnJlc3VsdCAmJiBtZXNzYWdlLmVycm9yKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGF5bG9hZCBmb3IgQ29tcGxldGlvbiBtZXNzYWdlLlwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFtZXNzYWdlLnJlc3VsdCAmJiBtZXNzYWdlLmVycm9yKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0Tm90RW1wdHlTdHJpbmcobWVzc2FnZS5lcnJvciwgXCJJbnZhbGlkIHBheWxvYWQgZm9yIENvbXBsZXRpb24gbWVzc2FnZS5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90RW1wdHlTdHJpbmcobWVzc2FnZS5pbnZvY2F0aW9uSWQsIFwiSW52YWxpZCBwYXlsb2FkIGZvciBDb21wbGV0aW9uIG1lc3NhZ2UuXCIpO1xyXG4gICAgfTtcclxuICAgIEpzb25IdWJQcm90b2NvbC5wcm90b3R5cGUuYXNzZXJ0Tm90RW1wdHlTdHJpbmcgPSBmdW5jdGlvbiAodmFsdWUsIGVycm9yTWVzc2FnZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIgfHwgdmFsdWUgPT09IFwiXCIpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHJldHVybiBKc29uSHViUHJvdG9jb2w7XHJcbn0oKSk7XHJcbmV4cG9ydCB7IEpzb25IdWJQcm90b2NvbCB9O1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1Kc29uSHViUHJvdG9jb2wuanMubWFwIiwiLy8gQ29weXJpZ2h0IChjKSAuTkVUIEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG4vKiogQSBsb2dnZXIgdGhhdCBkb2VzIG5vdGhpbmcgd2hlbiBsb2cgbWVzc2FnZXMgYXJlIHNlbnQgdG8gaXQuICovXHJcbnZhciBOdWxsTG9nZ2VyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gTnVsbExvZ2dlcigpIHtcclxuICAgIH1cclxuICAgIC8qKiBAaW5oZXJpdERvYyAqL1xyXG4gICAgTnVsbExvZ2dlci5wcm90b3R5cGUubG9nID0gZnVuY3Rpb24gKGxvZ0xldmVsLCBtZXNzYWdlKSB7XHJcbiAgICB9O1xyXG4gICAgLyoqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHtAbGluayBOdWxsTG9nZ2VyfS4gKi9cclxuICAgIE51bGxMb2dnZXIuaW5zdGFuY2UgPSBuZXcgTnVsbExvZ2dlcigpO1xyXG4gICAgcmV0dXJuIE51bGxMb2dnZXI7XHJcbn0oKSk7XHJcbmV4cG9ydCB7IE51bGxMb2dnZXIgfTtcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TG9nZ2Vycy5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIC5ORVQgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcbmltcG9ydCAqIGFzIHRzbGliXzEgZnJvbSBcInRzbGliXCI7XHJcbmltcG9ydCB7IEFib3J0Q29udHJvbGxlciB9IGZyb20gXCIuL0Fib3J0Q29udHJvbGxlclwiO1xyXG5pbXBvcnQgeyBIdHRwRXJyb3IsIFRpbWVvdXRFcnJvciB9IGZyb20gXCIuL0Vycm9yc1wiO1xyXG5pbXBvcnQgeyBMb2dMZXZlbCB9IGZyb20gXCIuL0lMb2dnZXJcIjtcclxuaW1wb3J0IHsgVHJhbnNmZXJGb3JtYXQgfSBmcm9tIFwiLi9JVHJhbnNwb3J0XCI7XHJcbmltcG9ydCB7IEFyZywgZ2V0RGF0YURldGFpbCwgc2VuZE1lc3NhZ2UgfSBmcm9tIFwiLi9VdGlsc1wiO1xyXG52YXIgU0hVVERPV05fVElNRU9VVCA9IDUgKiAxMDAwO1xyXG4vLyBOb3QgZXhwb3J0ZWQgZnJvbSAnaW5kZXgnLCB0aGlzIHR5cGUgaXMgaW50ZXJuYWwuXHJcbnZhciBMb25nUG9sbGluZ1RyYW5zcG9ydCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIGZ1bmN0aW9uIExvbmdQb2xsaW5nVHJhbnNwb3J0KGh0dHBDbGllbnQsIGFjY2Vzc1Rva2VuRmFjdG9yeSwgbG9nZ2VyLCBsb2dNZXNzYWdlQ29udGVudCwgc2h1dGRvd25UaW1lb3V0KSB7XHJcbiAgICAgICAgdGhpcy5odHRwQ2xpZW50ID0gaHR0cENsaWVudDtcclxuICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuRmFjdG9yeSA9IGFjY2Vzc1Rva2VuRmFjdG9yeSB8fCAoZnVuY3Rpb24gKCkgeyByZXR1cm4gbnVsbDsgfSk7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2dnZXI7XHJcbiAgICAgICAgdGhpcy5wb2xsQWJvcnQgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XHJcbiAgICAgICAgdGhpcy5sb2dNZXNzYWdlQ29udGVudCA9IGxvZ01lc3NhZ2VDb250ZW50O1xyXG4gICAgICAgIHRoaXMuc2h1dGRvd25UaW1lb3V0ID0gc2h1dGRvd25UaW1lb3V0IHx8IFNIVVRET1dOX1RJTUVPVVQ7XHJcbiAgICB9XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTG9uZ1BvbGxpbmdUcmFuc3BvcnQucHJvdG90eXBlLCBcInBvbGxBYm9ydGVkXCIsIHtcclxuICAgICAgICAvLyBUaGlzIGlzIGFuIGludGVybmFsIHR5cGUsIG5vdCBleHBvcnRlZCBmcm9tICdpbmRleCcgc28gdGhpcyBpcyByZWFsbHkganVzdCBpbnRlcm5hbC5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9sbEFib3J0LmFib3J0ZWQ7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBMb25nUG9sbGluZ1RyYW5zcG9ydC5wcm90b3R5cGUuY29ubmVjdCA9IGZ1bmN0aW9uICh1cmwsIHRyYW5zZmVyRm9ybWF0KSB7XHJcbiAgICAgICAgcmV0dXJuIHRzbGliXzEuX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBwb2xsT3B0aW9ucywgdG9rZW4sIGNsb3NlRXJyb3IsIHBvbGxVcmwsIHJlc3BvbnNlO1xyXG4gICAgICAgICAgICByZXR1cm4gdHNsaWJfMS5fX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEFyZy5pc1JlcXVpcmVkKHVybCwgXCJ1cmxcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEFyZy5pc1JlcXVpcmVkKHRyYW5zZmVyRm9ybWF0LCBcInRyYW5zZmVyRm9ybWF0XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBBcmcuaXNJbih0cmFuc2ZlckZvcm1hdCwgVHJhbnNmZXJGb3JtYXQsIFwidHJhbnNmZXJGb3JtYXRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXJsID0gdXJsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuVHJhY2UsIFwiKExvbmdQb2xsaW5nIHRyYW5zcG9ydCkgQ29ubmVjdGluZ1wiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZmVyRm9ybWF0ID09PSBUcmFuc2ZlckZvcm1hdC5CaW5hcnkgJiYgKHR5cGVvZiBuZXcgWE1MSHR0cFJlcXVlc3QoKS5yZXNwb25zZVR5cGUgIT09IFwic3RyaW5nXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgd29yayBpZiB3ZSBmaXg6IGh0dHBzOi8vZ2l0aHViLmNvbS9hc3BuZXQvU2lnbmFsUi9pc3N1ZXMvNzQyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCaW5hcnkgcHJvdG9jb2xzIG92ZXIgWG1sSHR0cFJlcXVlc3Qgbm90IGltcGxlbWVudGluZyBhZHZhbmNlZCBmZWF0dXJlcyBhcmUgbm90IHN1cHBvcnRlZC5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcG9sbE9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydFNpZ25hbDogdGhpcy5wb2xsQWJvcnQuc2lnbmFsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge30sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0OiA5MDAwMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZmVyRm9ybWF0ID09PSBUcmFuc2ZlckZvcm1hdC5CaW5hcnkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbGxPcHRpb25zLnJlc3BvbnNlVHlwZSA9IFwiYXJyYXlidWZmZXJcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmFjY2Vzc1Rva2VuRmFjdG9yeSgpXTtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gX2Euc2VudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUhlYWRlclRva2VuKHBvbGxPcHRpb25zLCB0b2tlbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvbGxVcmwgPSB1cmwgKyBcIiZfPVwiICsgRGF0ZS5ub3coKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLlRyYWNlLCBcIihMb25nUG9sbGluZyB0cmFuc3BvcnQpIHBvbGxpbmc6IFwiICsgcG9sbFVybCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuaHR0cENsaWVudC5nZXQocG9sbFVybCwgcG9sbE9wdGlvbnMpXTtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gX2Euc2VudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSAhPT0gMjAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRXJyb3IsIFwiKExvbmdQb2xsaW5nIHRyYW5zcG9ydCkgVW5leHBlY3RlZCByZXNwb25zZSBjb2RlOiBcIiArIHJlc3BvbnNlLnN0YXR1c0NvZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFyayBydW5uaW5nIGFzIGZhbHNlIHNvIHRoYXQgdGhlIHBvbGwgaW1tZWRpYXRlbHkgZW5kcyBhbmQgcnVucyB0aGUgY2xvc2UgbG9naWNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlRXJyb3IgPSBuZXcgSHR0cEVycm9yKHJlc3BvbnNlLnN0YXR1c1RleHQsIHJlc3BvbnNlLnN0YXR1c0NvZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJ1bm5pbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucG9sbCh0aGlzLnVybCwgcG9sbE9wdGlvbnMsIGNsb3NlRXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgUHJvbWlzZS5yZXNvbHZlKCldO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH07XHJcbiAgICBMb25nUG9sbGluZ1RyYW5zcG9ydC5wcm90b3R5cGUudXBkYXRlSGVhZGVyVG9rZW4gPSBmdW5jdGlvbiAocmVxdWVzdCwgdG9rZW4pIHtcclxuICAgICAgICBpZiAodG9rZW4pIHtcclxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXN0cmluZy1saXRlcmFsXHJcbiAgICAgICAgICAgIHJlcXVlc3QuaGVhZGVyc1tcIkF1dGhvcml6YXRpb25cIl0gPSBcIkJlYXJlciBcIiArIHRva2VuO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1zdHJpbmctbGl0ZXJhbFxyXG4gICAgICAgIGlmIChyZXF1ZXN0LmhlYWRlcnNbXCJBdXRob3JpemF0aW9uXCJdKSB7XHJcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1zdHJpbmctbGl0ZXJhbFxyXG4gICAgICAgICAgICBkZWxldGUgcmVxdWVzdC5oZWFkZXJzW1wiQXV0aG9yaXphdGlvblwiXTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgTG9uZ1BvbGxpbmdUcmFuc3BvcnQucHJvdG90eXBlLnBvbGwgPSBmdW5jdGlvbiAodXJsLCBwb2xsT3B0aW9ucywgY2xvc2VFcnJvcikge1xyXG4gICAgICAgIHJldHVybiB0c2xpYl8xLl9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgdG9rZW4sIHBvbGxVcmwsIHJlc3BvbnNlLCBlXzE7XHJcbiAgICAgICAgICAgIHJldHVybiB0c2xpYl8xLl9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFswLCAsIDgsIDldKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnJ1bm5pbmcpIHJldHVybiBbMyAvKmJyZWFrKi8sIDddO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmFjY2Vzc1Rva2VuRmFjdG9yeSgpXTtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gX2Euc2VudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUhlYWRlclRva2VuKHBvbGxPcHRpb25zLCB0b2tlbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMywgNSwgLCA2XSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvbGxVcmwgPSB1cmwgKyBcIiZfPVwiICsgRGF0ZS5ub3coKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLlRyYWNlLCBcIihMb25nUG9sbGluZyB0cmFuc3BvcnQpIHBvbGxpbmc6IFwiICsgcG9sbFVybCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuaHR0cENsaWVudC5nZXQocG9sbFVybCwgcG9sbE9wdGlvbnMpXTtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gX2Euc2VudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gMjA0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSW5mb3JtYXRpb24sIFwiKExvbmdQb2xsaW5nIHRyYW5zcG9ydCkgUG9sbCB0ZXJtaW5hdGVkIGJ5IHNlcnZlclwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucnVubmluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDIwMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVycm9yLCBcIihMb25nUG9sbGluZyB0cmFuc3BvcnQpIFVuZXhwZWN0ZWQgcmVzcG9uc2UgY29kZTogXCIgKyByZXNwb25zZS5zdGF0dXNDb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVuZXhwZWN0ZWQgc3RhdHVzIGNvZGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlRXJyb3IgPSBuZXcgSHR0cEVycm9yKHJlc3BvbnNlLnN0YXR1c1RleHQsIHJlc3BvbnNlLnN0YXR1c0NvZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIHRoZSByZXNwb25zZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmNvbnRlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuVHJhY2UsIFwiKExvbmdQb2xsaW5nIHRyYW5zcG9ydCkgZGF0YSByZWNlaXZlZC4gXCIgKyBnZXREYXRhRGV0YWlsKHJlc3BvbnNlLmNvbnRlbnQsIHRoaXMubG9nTWVzc2FnZUNvbnRlbnQpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vbnJlY2VpdmUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbnJlY2VpdmUocmVzcG9uc2UuY29udGVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhbm90aGVyIHdheSB0aW1lb3V0IG1hbmlmZXN0LlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5UcmFjZSwgXCIoTG9uZ1BvbGxpbmcgdHJhbnNwb3J0KSBQb2xsIHRpbWVkIG91dCwgcmVpc3N1aW5nLlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA2XTtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfMSA9IF9hLnNlbnQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnJ1bm5pbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvZyBidXQgZGlzcmVnYXJkIGVycm9ycyB0aGF0IG9jY3VyIGFmdGVyIHdlIHdlcmUgc3RvcHBlZCBieSBERUxFVEVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5UcmFjZSwgXCIoTG9uZ1BvbGxpbmcgdHJhbnNwb3J0KSBQb2xsIGVycm9yZWQgYWZ0ZXIgc2h1dGRvd246IFwiICsgZV8xLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVfMSBpbnN0YW5jZW9mIFRpbWVvdXRFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSB0aW1lb3V0cyBhbmQgcmVpc3N1ZSB0aGUgcG9sbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuVHJhY2UsIFwiKExvbmdQb2xsaW5nIHRyYW5zcG9ydCkgUG9sbCB0aW1lZCBvdXQsIHJlaXNzdWluZy5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbG9zZSB0aGUgY29ubmVjdGlvbiB3aXRoIHRoZSBlcnJvciBhcyB0aGUgcmVzdWx0LlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlRXJyb3IgPSBlXzE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNl07XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OiByZXR1cm4gWzMgLypicmVhayovLCAxXTtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6IHJldHVybiBbMyAvKmJyZWFrKi8sIDldO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODpcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5kaWNhdGUgdGhhdCB3ZSd2ZSBzdG9wcGVkIHNvIHRoZSBzaHV0ZG93biB0aW1lciBkb2Vzbid0IGdldCByZWdpc3RlcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3BwZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGVhbiB1cCB0aGUgc2h1dGRvd24gdGltZXIgaWYgaXQgd2FzIHJlZ2lzdGVyZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2h1dGRvd25UaW1lcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc2h1dGRvd25UaW1lcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlyZSBvdXIgb25jbG9zZWQgZXZlbnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub25jbG9zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLlRyYWNlLCBcIihMb25nUG9sbGluZyB0cmFuc3BvcnQpIEZpcmluZyBvbmNsb3NlIGV2ZW50LiBFcnJvcjogXCIgKyAoY2xvc2VFcnJvciB8fCBcIjx1bmRlZmluZWQ+XCIpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25jbG9zZShjbG9zZUVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuVHJhY2UsIFwiKExvbmdQb2xsaW5nIHRyYW5zcG9ydCkgVHJhbnNwb3J0IGZpbmlzaGVkLlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDk6IHJldHVybiBbMiAvKnJldHVybiovXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG4gICAgTG9uZ1BvbGxpbmdUcmFuc3BvcnQucHJvdG90eXBlLnNlbmQgPSBmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgIHJldHVybiB0c2xpYl8xLl9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHNsaWJfMS5fX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5ydW5uaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkNhbm5vdCBzZW5kIHVudGlsIHRoZSB0cmFuc3BvcnQgaXMgY29ubmVjdGVkXCIpKV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgc2VuZE1lc3NhZ2UodGhpcy5sb2dnZXIsIFwiTG9uZ1BvbGxpbmdcIiwgdGhpcy5odHRwQ2xpZW50LCB0aGlzLnVybCwgdGhpcy5hY2Nlc3NUb2tlbkZhY3RvcnksIGRhdGEsIHRoaXMubG9nTWVzc2FnZUNvbnRlbnQpXTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG4gICAgTG9uZ1BvbGxpbmdUcmFuc3BvcnQucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRzbGliXzEuX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgICAgIHZhciBkZWxldGVPcHRpb25zLCB0b2tlbiwgcmVzcG9uc2U7XHJcbiAgICAgICAgICAgIHJldHVybiB0c2xpYl8xLl9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFswLCAsIDMsIDRdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5UcmFjZSwgXCIoTG9uZ1BvbGxpbmcgdHJhbnNwb3J0KSBzZW5kaW5nIERFTEVURSByZXF1ZXN0IHRvIFwiICsgdGhpcy51cmwgKyBcIi5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZU9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5hY2Nlc3NUb2tlbkZhY3RvcnkoKV07XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IF9hLnNlbnQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVIZWFkZXJUb2tlbihkZWxldGVPcHRpb25zLCB0b2tlbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuaHR0cENsaWVudC5kZWxldGUodGhpcy51cmwsIGRlbGV0ZU9wdGlvbnMpXTtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gX2Euc2VudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuVHJhY2UsIFwiKExvbmdQb2xsaW5nIHRyYW5zcG9ydCkgREVMRVRFIHJlcXVlc3QgYWNjZXB0ZWQuXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFib3J0IHRoZSBwb2xsIGFmdGVyIHRoZSBzaHV0ZG93biB0aW1lb3V0IGlmIHRoZSBzZXJ2ZXIgZG9lc24ndCBzdG9wIHRoZSBwb2xsLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc3RvcHBlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaHV0ZG93blRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5XYXJuaW5nLCBcIihMb25nUG9sbGluZyB0cmFuc3BvcnQpIHNlcnZlciBkaWQgbm90IHRlcm1pbmF0ZSBhZnRlciBERUxFVEUgcmVxdWVzdCwgY2FuY2VsaW5nIHBvbGwuXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFib3J0IGFueSBvdXRzdGFuZGluZyBwb2xsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMucG9sbEFib3J0LmFib3J0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLnNodXRkb3duVGltZW91dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbMiAvKnJldHVybiovXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIExvbmdQb2xsaW5nVHJhbnNwb3J0O1xyXG59KCkpO1xyXG5leHBvcnQgeyBMb25nUG9sbGluZ1RyYW5zcG9ydCB9O1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1Mb25nUG9sbGluZ1RyYW5zcG9ydC5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIC5ORVQgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcbmltcG9ydCAqIGFzIHRzbGliXzEgZnJvbSBcInRzbGliXCI7XHJcbmltcG9ydCB7IExvZ0xldmVsIH0gZnJvbSBcIi4vSUxvZ2dlclwiO1xyXG5pbXBvcnQgeyBUcmFuc2ZlckZvcm1hdCB9IGZyb20gXCIuL0lUcmFuc3BvcnRcIjtcclxuaW1wb3J0IHsgQXJnLCBnZXREYXRhRGV0YWlsLCBzZW5kTWVzc2FnZSB9IGZyb20gXCIuL1V0aWxzXCI7XHJcbnZhciBTZXJ2ZXJTZW50RXZlbnRzVHJhbnNwb3J0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gU2VydmVyU2VudEV2ZW50c1RyYW5zcG9ydChodHRwQ2xpZW50LCBhY2Nlc3NUb2tlbkZhY3RvcnksIGxvZ2dlciwgbG9nTWVzc2FnZUNvbnRlbnQpIHtcclxuICAgICAgICB0aGlzLmh0dHBDbGllbnQgPSBodHRwQ2xpZW50O1xyXG4gICAgICAgIHRoaXMuYWNjZXNzVG9rZW5GYWN0b3J5ID0gYWNjZXNzVG9rZW5GYWN0b3J5IHx8IChmdW5jdGlvbiAoKSB7IHJldHVybiBudWxsOyB9KTtcclxuICAgICAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlcjtcclxuICAgICAgICB0aGlzLmxvZ01lc3NhZ2VDb250ZW50ID0gbG9nTWVzc2FnZUNvbnRlbnQ7XHJcbiAgICB9XHJcbiAgICBTZXJ2ZXJTZW50RXZlbnRzVHJhbnNwb3J0LnByb3RvdHlwZS5jb25uZWN0ID0gZnVuY3Rpb24gKHVybCwgdHJhbnNmZXJGb3JtYXQpIHtcclxuICAgICAgICByZXR1cm4gdHNsaWJfMS5fX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICAgICAgdmFyIHRva2VuO1xyXG4gICAgICAgICAgICByZXR1cm4gdHNsaWJfMS5fX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEFyZy5pc1JlcXVpcmVkKHVybCwgXCJ1cmxcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEFyZy5pc1JlcXVpcmVkKHRyYW5zZmVyRm9ybWF0LCBcInRyYW5zZmVyRm9ybWF0XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBBcmcuaXNJbih0cmFuc2ZlckZvcm1hdCwgVHJhbnNmZXJGb3JtYXQsIFwidHJhbnNmZXJGb3JtYXRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKEV2ZW50U291cmNlKSA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiJ0V2ZW50U291cmNlJyBpcyBub3Qgc3VwcG9ydGVkIGluIHlvdXIgZW52aXJvbm1lbnQuXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5UcmFjZSwgXCIoU1NFIHRyYW5zcG9ydCkgQ29ubmVjdGluZ1wiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5hY2Nlc3NUb2tlbkZhY3RvcnkoKV07XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IF9hLnNlbnQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwgKz0gKHVybC5pbmRleE9mKFwiP1wiKSA8IDAgPyBcIj9cIiA6IFwiJlwiKSArIChcImFjY2Vzc190b2tlbj1cIiArIGVuY29kZVVSSUNvbXBvbmVudCh0b2tlbikpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXJsID0gdXJsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcGVuZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmZXJGb3JtYXQgIT09IFRyYW5zZmVyRm9ybWF0LlRleHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIlRoZSBTZXJ2ZXItU2VudCBFdmVudHMgdHJhbnNwb3J0IG9ubHkgc3VwcG9ydHMgdGhlICdUZXh0JyB0cmFuc2ZlciBmb3JtYXRcIikpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXZlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UodXJsLCB7IHdpdGhDcmVkZW50aWFsczogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFNvdXJjZS5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF90aGlzLm9ucmVjZWl2ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuVHJhY2UsIFwiKFNTRSB0cmFuc3BvcnQpIGRhdGEgcmVjZWl2ZWQuIFwiICsgZ2V0RGF0YURldGFpbChlLmRhdGEsIF90aGlzLmxvZ01lc3NhZ2VDb250ZW50KSArIFwiLlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMub25yZWNlaXZlKGUuZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMub25jbG9zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMub25jbG9zZShlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRTb3VyY2Uub25lcnJvciA9IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoZS5tZXNzYWdlIHx8IFwiRXJyb3Igb2NjdXJyZWRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3BlbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuY2xvc2UoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRTb3VyY2Uub25vcGVuID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JbmZvcm1hdGlvbiwgXCJTU0UgY29ubmVjdGVkIHRvIFwiICsgX3RoaXMudXJsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmV2ZW50U291cmNlID0gZXZlbnRTb3VyY2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSldO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH07XHJcbiAgICBTZXJ2ZXJTZW50RXZlbnRzVHJhbnNwb3J0LnByb3RvdHlwZS5zZW5kID0gZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICByZXR1cm4gdHNsaWJfMS5fX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRzbGliXzEuX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZXZlbnRTb3VyY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiQ2Fubm90IHNlbmQgdW50aWwgdGhlIHRyYW5zcG9ydCBpcyBjb25uZWN0ZWRcIikpXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBzZW5kTWVzc2FnZSh0aGlzLmxvZ2dlciwgXCJTU0VcIiwgdGhpcy5odHRwQ2xpZW50LCB0aGlzLnVybCwgdGhpcy5hY2Nlc3NUb2tlbkZhY3RvcnksIGRhdGEsIHRoaXMubG9nTWVzc2FnZUNvbnRlbnQpXTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG4gICAgU2VydmVyU2VudEV2ZW50c1RyYW5zcG9ydC5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgfTtcclxuICAgIFNlcnZlclNlbnRFdmVudHNUcmFuc3BvcnQucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICBpZiAodGhpcy5ldmVudFNvdXJjZSkge1xyXG4gICAgICAgICAgICB0aGlzLmV2ZW50U291cmNlLmNsb3NlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnRTb3VyY2UgPSBudWxsO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vbmNsb3NlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uY2xvc2UoZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIFNlcnZlclNlbnRFdmVudHNUcmFuc3BvcnQ7XHJcbn0oKSk7XHJcbmV4cG9ydCB7IFNlcnZlclNlbnRFdmVudHNUcmFuc3BvcnQgfTtcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2VydmVyU2VudEV2ZW50c1RyYW5zcG9ydC5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIC5ORVQgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcbi8vIE5vdCBleHBvcnRlZCBmcm9tIGluZGV4XHJcbnZhciBUZXh0TWVzc2FnZUZvcm1hdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIGZ1bmN0aW9uIFRleHRNZXNzYWdlRm9ybWF0KCkge1xyXG4gICAgfVxyXG4gICAgVGV4dE1lc3NhZ2VGb3JtYXQud3JpdGUgPSBmdW5jdGlvbiAob3V0cHV0KSB7XHJcbiAgICAgICAgcmV0dXJuIFwiXCIgKyBvdXRwdXQgKyBUZXh0TWVzc2FnZUZvcm1hdC5SZWNvcmRTZXBhcmF0b3I7XHJcbiAgICB9O1xyXG4gICAgVGV4dE1lc3NhZ2VGb3JtYXQucGFyc2UgPSBmdW5jdGlvbiAoaW5wdXQpIHtcclxuICAgICAgICBpZiAoaW5wdXRbaW5wdXQubGVuZ3RoIC0gMV0gIT09IFRleHRNZXNzYWdlRm9ybWF0LlJlY29yZFNlcGFyYXRvcikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNZXNzYWdlIGlzIGluY29tcGxldGUuXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgbWVzc2FnZXMgPSBpbnB1dC5zcGxpdChUZXh0TWVzc2FnZUZvcm1hdC5SZWNvcmRTZXBhcmF0b3IpO1xyXG4gICAgICAgIG1lc3NhZ2VzLnBvcCgpO1xyXG4gICAgICAgIHJldHVybiBtZXNzYWdlcztcclxuICAgIH07XHJcbiAgICBUZXh0TWVzc2FnZUZvcm1hdC5SZWNvcmRTZXBhcmF0b3JDb2RlID0gMHgxZTtcclxuICAgIFRleHRNZXNzYWdlRm9ybWF0LlJlY29yZFNlcGFyYXRvciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoVGV4dE1lc3NhZ2VGb3JtYXQuUmVjb3JkU2VwYXJhdG9yQ29kZSk7XHJcbiAgICByZXR1cm4gVGV4dE1lc3NhZ2VGb3JtYXQ7XHJcbn0oKSk7XHJcbmV4cG9ydCB7IFRleHRNZXNzYWdlRm9ybWF0IH07XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRleHRNZXNzYWdlRm9ybWF0LmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgLk5FVCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuaW1wb3J0ICogYXMgdHNsaWJfMSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsgTG9nTGV2ZWwgfSBmcm9tIFwiLi9JTG9nZ2VyXCI7XHJcbmltcG9ydCB7IE51bGxMb2dnZXIgfSBmcm9tIFwiLi9Mb2dnZXJzXCI7XHJcbnZhciBBcmcgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBBcmcoKSB7XHJcbiAgICB9XHJcbiAgICBBcmcuaXNSZXF1aXJlZCA9IGZ1bmN0aW9uICh2YWwsIG5hbWUpIHtcclxuICAgICAgICBpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSAnXCIgKyBuYW1lICsgXCInIGFyZ3VtZW50IGlzIHJlcXVpcmVkLlwiKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgQXJnLmlzSW4gPSBmdW5jdGlvbiAodmFsLCB2YWx1ZXMsIG5hbWUpIHtcclxuICAgICAgICAvLyBUeXBlU2NyaXB0IGVudW1zIGhhdmUga2V5cyBmb3IgKipib3RoKiogdGhlIG5hbWUgYW5kIHRoZSB2YWx1ZSBvZiBlYWNoIGVudW0gbWVtYmVyIG9uIHRoZSB0eXBlIGl0c2VsZi5cclxuICAgICAgICBpZiAoISh2YWwgaW4gdmFsdWVzKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIFwiICsgbmFtZSArIFwiIHZhbHVlOiBcIiArIHZhbCArIFwiLlwiKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIEFyZztcclxufSgpKTtcclxuZXhwb3J0IHsgQXJnIH07XHJcbmV4cG9ydCBmdW5jdGlvbiBnZXREYXRhRGV0YWlsKGRhdGEsIGluY2x1ZGVDb250ZW50KSB7XHJcbiAgICB2YXIgbGVuZ3RoID0gbnVsbDtcclxuICAgIGlmIChkYXRhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcclxuICAgICAgICBsZW5ndGggPSBcIkJpbmFyeSBkYXRhIG9mIGxlbmd0aCBcIiArIGRhdGEuYnl0ZUxlbmd0aDtcclxuICAgICAgICBpZiAoaW5jbHVkZUNvbnRlbnQpIHtcclxuICAgICAgICAgICAgbGVuZ3RoICs9IFwiLiBDb250ZW50OiAnXCIgKyBmb3JtYXRBcnJheUJ1ZmZlcihkYXRhKSArIFwiJ1wiO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgbGVuZ3RoID0gXCJTdHJpbmcgZGF0YSBvZiBsZW5ndGggXCIgKyBkYXRhLmxlbmd0aDtcclxuICAgICAgICBpZiAoaW5jbHVkZUNvbnRlbnQpIHtcclxuICAgICAgICAgICAgbGVuZ3RoICs9IFwiLiBDb250ZW50OiAnXCIgKyBkYXRhICsgXCInLlwiO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBsZW5ndGg7XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEFycmF5QnVmZmVyKGRhdGEpIHtcclxuICAgIHZhciB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7XHJcbiAgICAvLyBVaW50OEFycmF5Lm1hcCBvbmx5IHN1cHBvcnRzIHJldHVybmluZyBhbm90aGVyIFVpbnQ4QXJyYXk/XHJcbiAgICB2YXIgc3RyID0gXCJcIjtcclxuICAgIHZpZXcuZm9yRWFjaChmdW5jdGlvbiAobnVtKSB7XHJcbiAgICAgICAgdmFyIHBhZCA9IG51bSA8IDE2ID8gXCIwXCIgOiBcIlwiO1xyXG4gICAgICAgIHN0ciArPSBcIjB4XCIgKyBwYWQgKyBudW0udG9TdHJpbmcoMTYpICsgXCIgXCI7XHJcbiAgICB9KTtcclxuICAgIC8vIFRyaW0gb2YgdHJhaWxpbmcgc3BhY2UuXHJcbiAgICByZXR1cm4gc3RyLnN1YnN0cigwLCBzdHIubGVuZ3RoIC0gMSk7XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIHNlbmRNZXNzYWdlKGxvZ2dlciwgdHJhbnNwb3J0TmFtZSwgaHR0cENsaWVudCwgdXJsLCBhY2Nlc3NUb2tlbkZhY3RvcnksIGNvbnRlbnQsIGxvZ01lc3NhZ2VDb250ZW50KSB7XHJcbiAgICByZXR1cm4gdHNsaWJfMS5fX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgaGVhZGVycywgdG9rZW4sIHJlc3BvbnNlLCBfYTtcclxuICAgICAgICByZXR1cm4gdHNsaWJfMS5fX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcclxuICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCBhY2Nlc3NUb2tlbkZhY3RvcnkoKV07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBfYi5zZW50KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMgPSAoX2EgPSB7fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hW1wiQXV0aG9yaXphdGlvblwiXSA9IFwiQmVhcmVyIFwiICsgdG9rZW4sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5sb2coTG9nTGV2ZWwuVHJhY2UsIFwiKFwiICsgdHJhbnNwb3J0TmFtZSArIFwiIHRyYW5zcG9ydCkgc2VuZGluZyBkYXRhLiBcIiArIGdldERhdGFEZXRhaWwoY29udGVudCwgbG9nTWVzc2FnZUNvbnRlbnQpICsgXCIuXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGh0dHBDbGllbnQucG9zdCh1cmwsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KV07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBfYi5zZW50KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhMb2dMZXZlbC5UcmFjZSwgXCIoXCIgKyB0cmFuc3BvcnROYW1lICsgXCIgdHJhbnNwb3J0KSByZXF1ZXN0IGNvbXBsZXRlLiBSZXNwb25zZSBzdGF0dXM6IFwiICsgcmVzcG9uc2Uuc3RhdHVzQ29kZSArIFwiLlwiKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMb2dnZXIobG9nZ2VyKSB7XHJcbiAgICBpZiAobG9nZ2VyID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZXR1cm4gbmV3IENvbnNvbGVMb2dnZXIoTG9nTGV2ZWwuSW5mb3JtYXRpb24pO1xyXG4gICAgfVxyXG4gICAgaWYgKGxvZ2dlciA9PT0gbnVsbCkge1xyXG4gICAgICAgIHJldHVybiBOdWxsTG9nZ2VyLmluc3RhbmNlO1xyXG4gICAgfVxyXG4gICAgaWYgKGxvZ2dlci5sb2cpIHtcclxuICAgICAgICByZXR1cm4gbG9nZ2VyO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBDb25zb2xlTG9nZ2VyKGxvZ2dlcik7XHJcbn1cclxudmFyIFN1YmplY3QgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBTdWJqZWN0KGNhbmNlbENhbGxiYWNrKSB7XHJcbiAgICAgICAgdGhpcy5vYnNlcnZlcnMgPSBbXTtcclxuICAgICAgICB0aGlzLmNhbmNlbENhbGxiYWNrID0gY2FuY2VsQ2FsbGJhY2s7XHJcbiAgICB9XHJcbiAgICBTdWJqZWN0LnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICBmb3IgKHZhciBfaSA9IDAsIF9hID0gdGhpcy5vYnNlcnZlcnM7IF9pIDwgX2EubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBvYnNlcnZlciA9IF9hW19pXTtcclxuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChpdGVtKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgU3ViamVjdC5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYSA9IHRoaXMub2JzZXJ2ZXJzOyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICB2YXIgb2JzZXJ2ZXIgPSBfYVtfaV07XHJcbiAgICAgICAgICAgIGlmIChvYnNlcnZlci5lcnJvcikge1xyXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZXJyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBTdWJqZWN0LnByb3RvdHlwZS5jb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBmb3IgKHZhciBfaSA9IDAsIF9hID0gdGhpcy5vYnNlcnZlcnM7IF9pIDwgX2EubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBvYnNlcnZlciA9IF9hW19pXTtcclxuICAgICAgICAgICAgaWYgKG9ic2VydmVyLmNvbXBsZXRlKSB7XHJcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIFN1YmplY3QucHJvdG90eXBlLnN1YnNjcmliZSA9IGZ1bmN0aW9uIChvYnNlcnZlcikge1xyXG4gICAgICAgIHRoaXMub2JzZXJ2ZXJzLnB1c2gob2JzZXJ2ZXIpO1xyXG4gICAgICAgIHJldHVybiBuZXcgU3ViamVjdFN1YnNjcmlwdGlvbih0aGlzLCBvYnNlcnZlcik7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIFN1YmplY3Q7XHJcbn0oKSk7XHJcbmV4cG9ydCB7IFN1YmplY3QgfTtcclxudmFyIFN1YmplY3RTdWJzY3JpcHRpb24gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBTdWJqZWN0U3Vic2NyaXB0aW9uKHN1YmplY3QsIG9ic2VydmVyKSB7XHJcbiAgICAgICAgdGhpcy5zdWJqZWN0ID0gc3ViamVjdDtcclxuICAgICAgICB0aGlzLm9ic2VydmVyID0gb2JzZXJ2ZXI7XHJcbiAgICB9XHJcbiAgICBTdWJqZWN0U3Vic2NyaXB0aW9uLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMuc3ViamVjdC5vYnNlcnZlcnMuaW5kZXhPZih0aGlzLm9ic2VydmVyKTtcclxuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLnN1YmplY3Qub2JzZXJ2ZXJzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnN1YmplY3Qub2JzZXJ2ZXJzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnN1YmplY3QuY2FuY2VsQ2FsbGJhY2soKS5jYXRjaChmdW5jdGlvbiAoXykgeyB9KTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIFN1YmplY3RTdWJzY3JpcHRpb247XHJcbn0oKSk7XHJcbmV4cG9ydCB7IFN1YmplY3RTdWJzY3JpcHRpb24gfTtcclxudmFyIENvbnNvbGVMb2dnZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBDb25zb2xlTG9nZ2VyKG1pbmltdW1Mb2dMZXZlbCkge1xyXG4gICAgICAgIHRoaXMubWluaW11bUxvZ0xldmVsID0gbWluaW11bUxvZ0xldmVsO1xyXG4gICAgfVxyXG4gICAgQ29uc29sZUxvZ2dlci5wcm90b3R5cGUubG9nID0gZnVuY3Rpb24gKGxvZ0xldmVsLCBtZXNzYWdlKSB7XHJcbiAgICAgICAgaWYgKGxvZ0xldmVsID49IHRoaXMubWluaW11bUxvZ0xldmVsKSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAobG9nTGV2ZWwpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgTG9nTGV2ZWwuQ3JpdGljYWw6XHJcbiAgICAgICAgICAgICAgICBjYXNlIExvZ0xldmVsLkVycm9yOlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoTG9nTGV2ZWxbbG9nTGV2ZWxdICsgXCI6IFwiICsgbWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIExvZ0xldmVsLldhcm5pbmc6XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKExvZ0xldmVsW2xvZ0xldmVsXSArIFwiOiBcIiArIG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBMb2dMZXZlbC5JbmZvcm1hdGlvbjpcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oTG9nTGV2ZWxbbG9nTGV2ZWxdICsgXCI6IFwiICsgbWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUuZGVidWcgb25seSBnb2VzIHRvIGF0dGFjaGVkIGRlYnVnZ2VycyBpbiBOb2RlLCBzbyB3ZSB1c2UgY29uc29sZS5sb2cgZm9yIFRyYWNlIGFuZCBEZWJ1Z1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKExvZ0xldmVsW2xvZ0xldmVsXSArIFwiOiBcIiArIG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHJldHVybiBDb25zb2xlTG9nZ2VyO1xyXG59KCkpO1xyXG5leHBvcnQgeyBDb25zb2xlTG9nZ2VyIH07XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVV0aWxzLmpzLm1hcCIsIi8vIENvcHlyaWdodCAoYykgLk5FVCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuaW1wb3J0ICogYXMgdHNsaWJfMSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsgTG9nTGV2ZWwgfSBmcm9tIFwiLi9JTG9nZ2VyXCI7XHJcbmltcG9ydCB7IFRyYW5zZmVyRm9ybWF0IH0gZnJvbSBcIi4vSVRyYW5zcG9ydFwiO1xyXG5pbXBvcnQgeyBBcmcsIGdldERhdGFEZXRhaWwgfSBmcm9tIFwiLi9VdGlsc1wiO1xyXG52YXIgV2ViU29ja2V0VHJhbnNwb3J0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gV2ViU29ja2V0VHJhbnNwb3J0KGFjY2Vzc1Rva2VuRmFjdG9yeSwgbG9nZ2VyLCBsb2dNZXNzYWdlQ29udGVudCkge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyO1xyXG4gICAgICAgIHRoaXMuYWNjZXNzVG9rZW5GYWN0b3J5ID0gYWNjZXNzVG9rZW5GYWN0b3J5IHx8IChmdW5jdGlvbiAoKSB7IHJldHVybiBudWxsOyB9KTtcclxuICAgICAgICB0aGlzLmxvZ01lc3NhZ2VDb250ZW50ID0gbG9nTWVzc2FnZUNvbnRlbnQ7XHJcbiAgICB9XHJcbiAgICBXZWJTb2NrZXRUcmFuc3BvcnQucHJvdG90eXBlLmNvbm5lY3QgPSBmdW5jdGlvbiAodXJsLCB0cmFuc2ZlckZvcm1hdCkge1xyXG4gICAgICAgIHJldHVybiB0c2xpYl8xLl9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgICAgICB2YXIgdG9rZW47XHJcbiAgICAgICAgICAgIHJldHVybiB0c2xpYl8xLl9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgQXJnLmlzUmVxdWlyZWQodXJsLCBcInVybFwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgQXJnLmlzUmVxdWlyZWQodHJhbnNmZXJGb3JtYXQsIFwidHJhbnNmZXJGb3JtYXRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEFyZy5pc0luKHRyYW5zZmVyRm9ybWF0LCBUcmFuc2ZlckZvcm1hdCwgXCJ0cmFuc2ZlckZvcm1hdFwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAoV2ViU29ja2V0KSA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiJ1dlYlNvY2tldCcgaXMgbm90IHN1cHBvcnRlZCBpbiB5b3VyIGVudmlyb25tZW50LlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuVHJhY2UsIFwiKFdlYlNvY2tldHMgdHJhbnNwb3J0KSBDb25uZWN0aW5nXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmFjY2Vzc1Rva2VuRmFjdG9yeSgpXTtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gX2Euc2VudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCArPSAodXJsLmluZGV4T2YoXCI/XCIpIDwgMCA/IFwiP1wiIDogXCImXCIpICsgKFwiYWNjZXNzX3Rva2VuPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHRva2VuKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSB1cmwucmVwbGFjZSgvXmh0dHAvLCBcIndzXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3ZWJTb2NrZXQgPSBuZXcgV2ViU29ja2V0KHVybCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZmVyRm9ybWF0ID09PSBUcmFuc2ZlckZvcm1hdC5CaW5hcnkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2ViU29ja2V0LmJpbmFyeVR5cGUgPSBcImFycmF5YnVmZmVyXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlYlNvY2tldC5vbm9wZW4gPSBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JbmZvcm1hdGlvbiwgXCJXZWJTb2NrZXQgY29ubmVjdGVkIHRvIFwiICsgdXJsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMud2ViU29ja2V0ID0gd2ViU29ja2V0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWJTb2NrZXQub25lcnJvciA9IGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXZlbnQuZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2ViU29ja2V0Lm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuVHJhY2UsIFwiKFdlYlNvY2tldHMgdHJhbnNwb3J0KSBkYXRhIHJlY2VpdmVkLiBcIiArIGdldERhdGFEZXRhaWwobWVzc2FnZS5kYXRhLCBfdGhpcy5sb2dNZXNzYWdlQ29udGVudCkgKyBcIi5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfdGhpcy5vbnJlY2VpdmUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLm9ucmVjZWl2ZShtZXNzYWdlLmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWJTb2NrZXQub25jbG9zZSA9IGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZWJTb2NrZXQgd2lsbCBiZSBudWxsIGlmIHRoZSB0cmFuc3BvcnQgZGlkIG5vdCBzdGFydCBzdWNjZXNzZnVsbHlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5UcmFjZSwgXCIoV2ViU29ja2V0cyB0cmFuc3BvcnQpIHNvY2tldCBjbG9zZWQuXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMub25jbG9zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50Lndhc0NsZWFuID09PSBmYWxzZSB8fCBldmVudC5jb2RlICE9PSAxMDAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMub25jbG9zZShuZXcgRXJyb3IoXCJXZWJzb2NrZXQgY2xvc2VkIHdpdGggc3RhdHVzIGNvZGU6IFwiICsgZXZlbnQuY29kZSArIFwiIChcIiArIGV2ZW50LnJlYXNvbiArIFwiKVwiKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5vbmNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSldO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH07XHJcbiAgICBXZWJTb2NrZXRUcmFuc3BvcnQucHJvdG90eXBlLnNlbmQgPSBmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgIGlmICh0aGlzLndlYlNvY2tldCAmJiB0aGlzLndlYlNvY2tldC5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTikge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuVHJhY2UsIFwiKFdlYlNvY2tldHMgdHJhbnNwb3J0KSBzZW5kaW5nIGRhdGEuIFwiICsgZ2V0RGF0YURldGFpbChkYXRhLCB0aGlzLmxvZ01lc3NhZ2VDb250ZW50KSArIFwiLlwiKTtcclxuICAgICAgICAgICAgdGhpcy53ZWJTb2NrZXQuc2VuZChkYXRhKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJXZWJTb2NrZXQgaXMgbm90IGluIHRoZSBPUEVOIHN0YXRlXCIpO1xyXG4gICAgfTtcclxuICAgIFdlYlNvY2tldFRyYW5zcG9ydC5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAodGhpcy53ZWJTb2NrZXQpIHtcclxuICAgICAgICAgICAgdGhpcy53ZWJTb2NrZXQuY2xvc2UoKTtcclxuICAgICAgICAgICAgdGhpcy53ZWJTb2NrZXQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIFdlYlNvY2tldFRyYW5zcG9ydDtcclxufSgpKTtcclxuZXhwb3J0IHsgV2ViU29ja2V0VHJhbnNwb3J0IH07XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVdlYlNvY2tldFRyYW5zcG9ydC5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIC5ORVQgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcbi8vIFZlcnNpb24gdG9rZW4gdGhhdCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBwcmVwYWNrIGNvbW1hbmRcclxuLyoqIFRoZSB2ZXJzaW9uIG9mIHRoZSBTaWduYWxSIGNsaWVudC4gKi9cclxuZXhwb3J0IHZhciBWRVJTSU9OID0gXCIxLjAuMFwiO1xyXG5leHBvcnQgeyBIdHRwRXJyb3IsIFRpbWVvdXRFcnJvciB9IGZyb20gXCIuL0Vycm9yc1wiO1xyXG5leHBvcnQgeyBEZWZhdWx0SHR0cENsaWVudCwgSHR0cENsaWVudCwgSHR0cFJlc3BvbnNlIH0gZnJvbSBcIi4vSHR0cENsaWVudFwiO1xyXG5leHBvcnQgeyBIdWJDb25uZWN0aW9uIH0gZnJvbSBcIi4vSHViQ29ubmVjdGlvblwiO1xyXG5leHBvcnQgeyBIdWJDb25uZWN0aW9uQnVpbGRlciB9IGZyb20gXCIuL0h1YkNvbm5lY3Rpb25CdWlsZGVyXCI7XHJcbmV4cG9ydCB7IE1lc3NhZ2VUeXBlIH0gZnJvbSBcIi4vSUh1YlByb3RvY29sXCI7XHJcbmV4cG9ydCB7IExvZ0xldmVsIH0gZnJvbSBcIi4vSUxvZ2dlclwiO1xyXG5leHBvcnQgeyBIdHRwVHJhbnNwb3J0VHlwZSwgVHJhbnNmZXJGb3JtYXQgfSBmcm9tIFwiLi9JVHJhbnNwb3J0XCI7XHJcbmV4cG9ydCB7IE51bGxMb2dnZXIgfSBmcm9tIFwiLi9Mb2dnZXJzXCI7XHJcbmV4cG9ydCB7IEpzb25IdWJQcm90b2NvbCB9IGZyb20gXCIuL0pzb25IdWJQcm90b2NvbFwiO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcclxuLy8gVGhpcyBpcyBhIHNpbmdsZS1maWxlIHNlbGYtY29udGFpbmVkIG1vZHVsZSB0byBhdm9pZCB0aGUgbmVlZCBmb3IgYSBXZWJwYWNrIGJ1aWxkXHJcbnZhciBEb3ROZXQ7XHJcbihmdW5jdGlvbiAoRG90TmV0KSB7XHJcbiAgICB3aW5kb3cuRG90TmV0ID0gRG90TmV0OyAvLyBFbnN1cmUgcmVhY2hhYmxlIGZyb20gYW55d2hlcmVcclxuICAgIHZhciBqc29uUmV2aXZlcnMgPSBbXTtcclxuICAgIHZhciBwZW5kaW5nQXN5bmNDYWxscyA9IHt9O1xyXG4gICAgdmFyIGNhY2hlZEpTRnVuY3Rpb25zID0ge307XHJcbiAgICB2YXIgbmV4dEFzeW5jQ2FsbElkID0gMTsgLy8gU3RhcnQgYXQgMSBiZWNhdXNlIHplcm8gc2lnbmFscyBcIm5vIHJlc3BvbnNlIG5lZWRlZFwiXHJcbiAgICB2YXIgZG90TmV0RGlzcGF0Y2hlciA9IG51bGw7XHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHNwZWNpZmllZCAuTkVUIGNhbGwgZGlzcGF0Y2hlciBhcyB0aGUgY3VycmVudCBpbnN0YW5jZSBzbyB0aGF0IGl0IHdpbGwgYmUgdXNlZFxyXG4gICAgICogZm9yIGZ1dHVyZSBpbnZvY2F0aW9ucy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZGlzcGF0Y2hlciBBbiBvYmplY3QgdGhhdCBjYW4gZGlzcGF0Y2ggY2FsbHMgZnJvbSBKYXZhU2NyaXB0IHRvIGEgLk5FVCBydW50aW1lLlxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBhdHRhY2hEaXNwYXRjaGVyKGRpc3BhdGNoZXIpIHtcclxuICAgICAgICBkb3ROZXREaXNwYXRjaGVyID0gZGlzcGF0Y2hlcjtcclxuICAgIH1cclxuICAgIERvdE5ldC5hdHRhY2hEaXNwYXRjaGVyID0gYXR0YWNoRGlzcGF0Y2hlcjtcclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIEpTT04gcmV2aXZlciBjYWxsYmFjayB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHBhcnNpbmcgYXJndW1lbnRzIHJlY2VpdmVkIGZyb20gLk5FVC5cclxuICAgICAqIEBwYXJhbSByZXZpdmVyIFRoZSByZXZpdmVyIHRvIGFkZC5cclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gYXR0YWNoUmV2aXZlcihyZXZpdmVyKSB7XHJcbiAgICAgICAganNvblJldml2ZXJzLnB1c2gocmV2aXZlcik7XHJcbiAgICB9XHJcbiAgICBEb3ROZXQuYXR0YWNoUmV2aXZlciA9IGF0dGFjaFJldml2ZXI7XHJcbiAgICAvKipcclxuICAgICAqIEludm9rZXMgdGhlIHNwZWNpZmllZCAuTkVUIHB1YmxpYyBtZXRob2Qgc3luY2hyb25vdXNseS4gTm90IGFsbCBob3N0aW5nIHNjZW5hcmlvcyBzdXBwb3J0XHJcbiAgICAgKiBzeW5jaHJvbm91cyBpbnZvY2F0aW9uLCBzbyBpZiBwb3NzaWJsZSB1c2UgaW52b2tlTWV0aG9kQXN5bmMgaW5zdGVhZC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gYXNzZW1ibHlOYW1lIFRoZSBzaG9ydCBuYW1lICh3aXRob3V0IGtleS92ZXJzaW9uIG9yIC5kbGwgZXh0ZW5zaW9uKSBvZiB0aGUgLk5FVCBhc3NlbWJseSBjb250YWluaW5nIHRoZSBtZXRob2QuXHJcbiAgICAgKiBAcGFyYW0gbWV0aG9kSWRlbnRpZmllciBUaGUgaWRlbnRpZmllciBvZiB0aGUgbWV0aG9kIHRvIGludm9rZS4gVGhlIG1ldGhvZCBtdXN0IGhhdmUgYSBbSlNJbnZva2FibGVdIGF0dHJpYnV0ZSBzcGVjaWZ5aW5nIHRoaXMgaWRlbnRpZmllci5cclxuICAgICAqIEBwYXJhbSBhcmdzIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBtZXRob2QsIGVhY2ggb2Ygd2hpY2ggbXVzdCBiZSBKU09OLXNlcmlhbGl6YWJsZS5cclxuICAgICAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi5cclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gaW52b2tlTWV0aG9kKGFzc2VtYmx5TmFtZSwgbWV0aG9kSWRlbnRpZmllcikge1xyXG4gICAgICAgIHZhciBhcmdzID0gW107XHJcbiAgICAgICAgZm9yICh2YXIgX2kgPSAyOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgYXJnc1tfaSAtIDJdID0gYXJndW1lbnRzW19pXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGludm9rZVBvc3NpYmxlSW5zdGFuY2VNZXRob2QoYXNzZW1ibHlOYW1lLCBtZXRob2RJZGVudGlmaWVyLCBudWxsLCBhcmdzKTtcclxuICAgIH1cclxuICAgIERvdE5ldC5pbnZva2VNZXRob2QgPSBpbnZva2VNZXRob2Q7XHJcbiAgICAvKipcclxuICAgICAqIEludm9rZXMgdGhlIHNwZWNpZmllZCAuTkVUIHB1YmxpYyBtZXRob2QgYXN5bmNocm9ub3VzbHkuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGFzc2VtYmx5TmFtZSBUaGUgc2hvcnQgbmFtZSAod2l0aG91dCBrZXkvdmVyc2lvbiBvciAuZGxsIGV4dGVuc2lvbikgb2YgdGhlIC5ORVQgYXNzZW1ibHkgY29udGFpbmluZyB0aGUgbWV0aG9kLlxyXG4gICAgICogQHBhcmFtIG1ldGhvZElkZW50aWZpZXIgVGhlIGlkZW50aWZpZXIgb2YgdGhlIG1ldGhvZCB0byBpbnZva2UuIFRoZSBtZXRob2QgbXVzdCBoYXZlIGEgW0pTSW52b2thYmxlXSBhdHRyaWJ1dGUgc3BlY2lmeWluZyB0aGlzIGlkZW50aWZpZXIuXHJcbiAgICAgKiBAcGFyYW0gYXJncyBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbWV0aG9kLCBlYWNoIG9mIHdoaWNoIG11c3QgYmUgSlNPTi1zZXJpYWxpemFibGUuXHJcbiAgICAgKiBAcmV0dXJucyBBIHByb21pc2UgcmVwcmVzZW50aW5nIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi5cclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gaW52b2tlTWV0aG9kQXN5bmMoYXNzZW1ibHlOYW1lLCBtZXRob2RJZGVudGlmaWVyKSB7XHJcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcclxuICAgICAgICBmb3IgKHZhciBfaSA9IDI7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICBhcmdzW19pIC0gMl0gPSBhcmd1bWVudHNbX2ldO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaW52b2tlUG9zc2libGVJbnN0YW5jZU1ldGhvZEFzeW5jKGFzc2VtYmx5TmFtZSwgbWV0aG9kSWRlbnRpZmllciwgbnVsbCwgYXJncyk7XHJcbiAgICB9XHJcbiAgICBEb3ROZXQuaW52b2tlTWV0aG9kQXN5bmMgPSBpbnZva2VNZXRob2RBc3luYztcclxuICAgIGZ1bmN0aW9uIGludm9rZVBvc3NpYmxlSW5zdGFuY2VNZXRob2QoYXNzZW1ibHlOYW1lLCBtZXRob2RJZGVudGlmaWVyLCBkb3ROZXRPYmplY3RJZCwgYXJncykge1xyXG4gICAgICAgIHZhciBkaXNwYXRjaGVyID0gZ2V0UmVxdWlyZWREaXNwYXRjaGVyKCk7XHJcbiAgICAgICAgaWYgKGRpc3BhdGNoZXIuaW52b2tlRG90TmV0RnJvbUpTKSB7XHJcbiAgICAgICAgICAgIHZhciBhcmdzSnNvbiA9IEpTT04uc3RyaW5naWZ5KGFyZ3MsIGFyZ1JlcGxhY2VyKTtcclxuICAgICAgICAgICAgdmFyIHJlc3VsdEpzb24gPSBkaXNwYXRjaGVyLmludm9rZURvdE5ldEZyb21KUyhhc3NlbWJseU5hbWUsIG1ldGhvZElkZW50aWZpZXIsIGRvdE5ldE9iamVjdElkLCBhcmdzSnNvbik7XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHRKc29uID8gcGFyc2VKc29uV2l0aFJldml2ZXJzKHJlc3VsdEpzb24pIDogbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGN1cnJlbnQgZGlzcGF0Y2hlciBkb2VzIG5vdCBzdXBwb3J0IHN5bmNocm9ub3VzIGNhbGxzIGZyb20gSlMgdG8gLk5FVC4gVXNlIGludm9rZU1ldGhvZEFzeW5jIGluc3RlYWQuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaW52b2tlUG9zc2libGVJbnN0YW5jZU1ldGhvZEFzeW5jKGFzc2VtYmx5TmFtZSwgbWV0aG9kSWRlbnRpZmllciwgZG90TmV0T2JqZWN0SWQsIGFyZ3MpIHtcclxuICAgICAgICB2YXIgYXN5bmNDYWxsSWQgPSBuZXh0QXN5bmNDYWxsSWQrKztcclxuICAgICAgICB2YXIgcmVzdWx0UHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICAgICAgcGVuZGluZ0FzeW5jQ2FsbHNbYXN5bmNDYWxsSWRdID0geyByZXNvbHZlOiByZXNvbHZlLCByZWplY3Q6IHJlamVjdCB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBhcmdzSnNvbiA9IEpTT04uc3RyaW5naWZ5KGFyZ3MsIGFyZ1JlcGxhY2VyKTtcclxuICAgICAgICAgICAgZ2V0UmVxdWlyZWREaXNwYXRjaGVyKCkuYmVnaW5JbnZva2VEb3ROZXRGcm9tSlMoYXN5bmNDYWxsSWQsIGFzc2VtYmx5TmFtZSwgbWV0aG9kSWRlbnRpZmllciwgZG90TmV0T2JqZWN0SWQsIGFyZ3NKc29uKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIC8vIFN5bmNocm9ub3VzIGZhaWx1cmVcclxuICAgICAgICAgICAgY29tcGxldGVQZW5kaW5nQ2FsbChhc3luY0NhbGxJZCwgZmFsc2UsIGV4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdFByb21pc2U7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBnZXRSZXF1aXJlZERpc3BhdGNoZXIoKSB7XHJcbiAgICAgICAgaWYgKGRvdE5ldERpc3BhdGNoZXIgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGRvdE5ldERpc3BhdGNoZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gLk5FVCBjYWxsIGRpc3BhdGNoZXIgaGFzIGJlZW4gc2V0LicpO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gY29tcGxldGVQZW5kaW5nQ2FsbChhc3luY0NhbGxJZCwgc3VjY2VzcywgcmVzdWx0T3JFcnJvcikge1xyXG4gICAgICAgIGlmICghcGVuZGluZ0FzeW5jQ2FsbHMuaGFzT3duUHJvcGVydHkoYXN5bmNDYWxsSWQpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZXJlIGlzIG5vIHBlbmRpbmcgYXN5bmMgY2FsbCB3aXRoIElEIFwiICsgYXN5bmNDYWxsSWQgKyBcIi5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBhc3luY0NhbGwgPSBwZW5kaW5nQXN5bmNDYWxsc1thc3luY0NhbGxJZF07XHJcbiAgICAgICAgZGVsZXRlIHBlbmRpbmdBc3luY0NhbGxzW2FzeW5jQ2FsbElkXTtcclxuICAgICAgICBpZiAoc3VjY2Vzcykge1xyXG4gICAgICAgICAgICBhc3luY0NhbGwucmVzb2x2ZShyZXN1bHRPckVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGFzeW5jQ2FsbC5yZWplY3QocmVzdWx0T3JFcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWNlaXZlcyBpbmNvbWluZyBjYWxscyBmcm9tIC5ORVQgYW5kIGRpc3BhdGNoZXMgdGhlbSB0byBKYXZhU2NyaXB0LlxyXG4gICAgICovXHJcbiAgICBEb3ROZXQuanNDYWxsRGlzcGF0Y2hlciA9IHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBGaW5kcyB0aGUgSmF2YVNjcmlwdCBmdW5jdGlvbiBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIGlkZW50aWZpZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAcGFyYW0gaWRlbnRpZmllciBJZGVudGlmaWVzIHRoZSBnbG9iYWxseS1yZWFjaGFibGUgZnVuY3Rpb24gdG8gYmUgcmV0dXJuZWQuXHJcbiAgICAgICAgICogQHJldHVybnMgQSBGdW5jdGlvbiBpbnN0YW5jZS5cclxuICAgICAgICAgKi9cclxuICAgICAgICBmaW5kSlNGdW5jdGlvbjogZmluZEpTRnVuY3Rpb24sXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSW52b2tlcyB0aGUgc3BlY2lmaWVkIHN5bmNocm9ub3VzIEphdmFTY3JpcHQgZnVuY3Rpb24uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAcGFyYW0gaWRlbnRpZmllciBJZGVudGlmaWVzIHRoZSBnbG9iYWxseS1yZWFjaGFibGUgZnVuY3Rpb24gdG8gaW52b2tlLlxyXG4gICAgICAgICAqIEBwYXJhbSBhcmdzSnNvbiBKU09OIHJlcHJlc2VudGF0aW9uIG9mIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uLlxyXG4gICAgICAgICAqIEByZXR1cm5zIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIGludm9jYXRpb24gcmVzdWx0LlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGludm9rZUpTRnJvbURvdE5ldDogZnVuY3Rpb24gKGlkZW50aWZpZXIsIGFyZ3NKc29uKSB7XHJcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBmaW5kSlNGdW5jdGlvbihpZGVudGlmaWVyKS5hcHBseShudWxsLCBwYXJzZUpzb25XaXRoUmV2aXZlcnMoYXJnc0pzb24pKTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgPyBudWxsXHJcbiAgICAgICAgICAgICAgICA6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgYXJnUmVwbGFjZXIpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSW52b2tlcyB0aGUgc3BlY2lmaWVkIHN5bmNocm9ub3VzIG9yIGFzeW5jaHJvbm91cyBKYXZhU2NyaXB0IGZ1bmN0aW9uLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQHBhcmFtIGFzeW5jSGFuZGxlIEEgdmFsdWUgaWRlbnRpZnlpbmcgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24uIFRoaXMgdmFsdWUgd2lsbCBiZSBwYXNzZWQgYmFjayBpbiBhIGxhdGVyIGNhbGwgdG8gZW5kSW52b2tlSlNGcm9tRG90TmV0LlxyXG4gICAgICAgICAqIEBwYXJhbSBpZGVudGlmaWVyIElkZW50aWZpZXMgdGhlIGdsb2JhbGx5LXJlYWNoYWJsZSBmdW5jdGlvbiB0byBpbnZva2UuXHJcbiAgICAgICAgICogQHBhcmFtIGFyZ3NKc29uIEpTT04gcmVwcmVzZW50YXRpb24gb2YgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24uXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgYmVnaW5JbnZva2VKU0Zyb21Eb3ROZXQ6IGZ1bmN0aW9uIChhc3luY0hhbmRsZSwgaWRlbnRpZmllciwgYXJnc0pzb24pIHtcclxuICAgICAgICAgICAgLy8gQ29lcmNlIHN5bmNocm9ub3VzIGZ1bmN0aW9ucyBpbnRvIGFzeW5jIG9uZXMsIHBsdXMgdHJlYXRcclxuICAgICAgICAgICAgLy8gc3luY2hyb25vdXMgZXhjZXB0aW9ucyB0aGUgc2FtZSBhcyBhc3luYyBvbmVzXHJcbiAgICAgICAgICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcclxuICAgICAgICAgICAgICAgIHZhciBzeW5jaHJvbm91c1Jlc3VsdE9yUHJvbWlzZSA9IGZpbmRKU0Z1bmN0aW9uKGlkZW50aWZpZXIpLmFwcGx5KG51bGwsIHBhcnNlSnNvbldpdGhSZXZpdmVycyhhcmdzSnNvbikpO1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShzeW5jaHJvbm91c1Jlc3VsdE9yUHJvbWlzZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAvLyBXZSBvbmx5IGxpc3RlbiBmb3IgYSByZXN1bHQgaWYgdGhlIGNhbGxlciB3YW50cyB0byBiZSBub3RpZmllZCBhYm91dCBpdFxyXG4gICAgICAgICAgICBpZiAoYXN5bmNIYW5kbGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIE9uIGNvbXBsZXRpb24sIGRpc3BhdGNoIHJlc3VsdCBiYWNrIHRvIC5ORVRcclxuICAgICAgICAgICAgICAgIC8vIE5vdCB1c2luZyBcImF3YWl0XCIgYmVjYXVzZSBpdCBjb2RlZ2VucyBhIGxvdCBvZiBib2lsZXJwbGF0ZVxyXG4gICAgICAgICAgICAgICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsgcmV0dXJuIGdldFJlcXVpcmVkRGlzcGF0Y2hlcigpLmJlZ2luSW52b2tlRG90TmV0RnJvbUpTKDAsICdNaWNyb3NvZnQuSlNJbnRlcm9wJywgJ0RvdE5ldERpc3BhdGNoZXIuRW5kSW52b2tlJywgbnVsbCwgSlNPTi5zdHJpbmdpZnkoW2FzeW5jSGFuZGxlLCB0cnVlLCByZXN1bHRdLCBhcmdSZXBsYWNlcikpOyB9LCBmdW5jdGlvbiAoZXJyb3IpIHsgcmV0dXJuIGdldFJlcXVpcmVkRGlzcGF0Y2hlcigpLmJlZ2luSW52b2tlRG90TmV0RnJvbUpTKDAsICdNaWNyb3NvZnQuSlNJbnRlcm9wJywgJ0RvdE5ldERpc3BhdGNoZXIuRW5kSW52b2tlJywgbnVsbCwgSlNPTi5zdHJpbmdpZnkoW2FzeW5jSGFuZGxlLCBmYWxzZSwgZm9ybWF0RXJyb3IoZXJyb3IpXSkpOyB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogUmVjZWl2ZXMgbm90aWZpY2F0aW9uIHRoYXQgYW4gYXN5bmMgY2FsbCBmcm9tIEpTIHRvIC5ORVQgaGFzIGNvbXBsZXRlZC5cclxuICAgICAgICAgKiBAcGFyYW0gYXN5bmNDYWxsSWQgVGhlIGlkZW50aWZpZXIgc3VwcGxpZWQgaW4gYW4gZWFybGllciBjYWxsIHRvIGJlZ2luSW52b2tlRG90TmV0RnJvbUpTLlxyXG4gICAgICAgICAqIEBwYXJhbSBzdWNjZXNzIEEgZmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS5cclxuICAgICAgICAgKiBAcGFyYW0gcmVzdWx0T3JFeGNlcHRpb25NZXNzYWdlIEVpdGhlciB0aGUgb3BlcmF0aW9uIHJlc3VsdCBvciBhbiBlcnJvciBtZXNzYWdlLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGVuZEludm9rZURvdE5ldEZyb21KUzogZnVuY3Rpb24gKGFzeW5jQ2FsbElkLCBzdWNjZXNzLCByZXN1bHRPckV4Y2VwdGlvbk1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgdmFyIHJlc3VsdE9yRXJyb3IgPSBzdWNjZXNzID8gcmVzdWx0T3JFeGNlcHRpb25NZXNzYWdlIDogbmV3IEVycm9yKHJlc3VsdE9yRXhjZXB0aW9uTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIGNvbXBsZXRlUGVuZGluZ0NhbGwocGFyc2VJbnQoYXN5bmNDYWxsSWQpLCBzdWNjZXNzLCByZXN1bHRPckVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgZnVuY3Rpb24gcGFyc2VKc29uV2l0aFJldml2ZXJzKGpzb24pIHtcclxuICAgICAgICByZXR1cm4ganNvbiA/IEpTT04ucGFyc2UoanNvbiwgZnVuY3Rpb24gKGtleSwgaW5pdGlhbFZhbHVlKSB7XHJcbiAgICAgICAgICAgIC8vIEludm9rZSBlYWNoIHJldml2ZXIgaW4gb3JkZXIsIHBhc3NpbmcgdGhlIG91dHB1dCBmcm9tIHRoZSBwcmV2aW91cyByZXZpdmVyLFxyXG4gICAgICAgICAgICAvLyBzbyB0aGF0IGVhY2ggb25lIGdldHMgYSBjaGFuY2UgdG8gdHJhbnNmb3JtIHRoZSB2YWx1ZVxyXG4gICAgICAgICAgICByZXR1cm4ganNvblJldml2ZXJzLnJlZHVjZShmdW5jdGlvbiAobGF0ZXN0VmFsdWUsIHJldml2ZXIpIHsgcmV0dXJuIHJldml2ZXIoa2V5LCBsYXRlc3RWYWx1ZSk7IH0sIGluaXRpYWxWYWx1ZSk7XHJcbiAgICAgICAgfSkgOiBudWxsO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gZm9ybWF0RXJyb3IoZXJyb3IpIHtcclxuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xyXG4gICAgICAgICAgICByZXR1cm4gZXJyb3IubWVzc2FnZSArIFwiXFxuXCIgKyBlcnJvci5zdGFjaztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBlcnJvciA/IGVycm9yLnRvU3RyaW5nKCkgOiAnbnVsbCc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gZmluZEpTRnVuY3Rpb24oaWRlbnRpZmllcikge1xyXG4gICAgICAgIGlmIChjYWNoZWRKU0Z1bmN0aW9ucy5oYXNPd25Qcm9wZXJ0eShpZGVudGlmaWVyKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkSlNGdW5jdGlvbnNbaWRlbnRpZmllcl07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciByZXN1bHQgPSB3aW5kb3c7XHJcbiAgICAgICAgdmFyIHJlc3VsdElkZW50aWZpZXIgPSAnd2luZG93JztcclxuICAgICAgICBpZGVudGlmaWVyLnNwbGl0KCcuJykuZm9yRWFjaChmdW5jdGlvbiAoc2VnbWVudCkge1xyXG4gICAgICAgICAgICBpZiAoc2VnbWVudCBpbiByZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdFtzZWdtZW50XTtcclxuICAgICAgICAgICAgICAgIHJlc3VsdElkZW50aWZpZXIgKz0gJy4nICsgc2VnbWVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kICdcIiArIHNlZ21lbnQgKyBcIicgaW4gJ1wiICsgcmVzdWx0SWRlbnRpZmllciArIFwiJy5cIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSB2YWx1ZSAnXCIgKyByZXN1bHRJZGVudGlmaWVyICsgXCInIGlzIG5vdCBhIGZ1bmN0aW9uLlwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICB2YXIgRG90TmV0T2JqZWN0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIERvdE5ldE9iamVjdChfaWQpIHtcclxuICAgICAgICAgICAgdGhpcy5faWQgPSBfaWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIERvdE5ldE9iamVjdC5wcm90b3R5cGUuaW52b2tlTWV0aG9kID0gZnVuY3Rpb24gKG1ldGhvZElkZW50aWZpZXIpIHtcclxuICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgICAgIGFyZ3NbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGludm9rZVBvc3NpYmxlSW5zdGFuY2VNZXRob2QobnVsbCwgbWV0aG9kSWRlbnRpZmllciwgdGhpcy5faWQsIGFyZ3MpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgRG90TmV0T2JqZWN0LnByb3RvdHlwZS5pbnZva2VNZXRob2RBc3luYyA9IGZ1bmN0aW9uIChtZXRob2RJZGVudGlmaWVyKSB7XHJcbiAgICAgICAgICAgIHZhciBhcmdzID0gW107XHJcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBhcmdzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBpbnZva2VQb3NzaWJsZUluc3RhbmNlTWV0aG9kQXN5bmMobnVsbCwgbWV0aG9kSWRlbnRpZmllciwgdGhpcy5faWQsIGFyZ3MpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgRG90TmV0T2JqZWN0LnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgcHJvbWlzZSA9IGludm9rZU1ldGhvZEFzeW5jKCdNaWNyb3NvZnQuSlNJbnRlcm9wJywgJ0RvdE5ldERpc3BhdGNoZXIuUmVsZWFzZURvdE5ldE9iamVjdCcsIHRoaXMuX2lkKTtcclxuICAgICAgICAgICAgcHJvbWlzZS5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHsgcmV0dXJuIGNvbnNvbGUuZXJyb3IoZXJyb3IpOyB9KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIERvdE5ldE9iamVjdC5wcm90b3R5cGUuc2VyaWFsaXplQXNBcmcgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBcIl9fZG90TmV0T2JqZWN0OlwiICsgdGhpcy5faWQ7XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gRG90TmV0T2JqZWN0O1xyXG4gICAgfSgpKTtcclxuICAgIHZhciBkb3ROZXRPYmplY3RWYWx1ZUZvcm1hdCA9IC9eX19kb3ROZXRPYmplY3RcXDooXFxkKykkLztcclxuICAgIGF0dGFjaFJldml2ZXIoZnVuY3Rpb24gcmV2aXZlRG90TmV0T2JqZWN0KGtleSwgdmFsdWUpIHtcclxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICB2YXIgbWF0Y2ggPSB2YWx1ZS5tYXRjaChkb3ROZXRPYmplY3RWYWx1ZUZvcm1hdCk7XHJcbiAgICAgICAgICAgIGlmIChtYXRjaCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEb3ROZXRPYmplY3QocGFyc2VJbnQobWF0Y2hbMV0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBVbnJlY29nbml6ZWQgLSBsZXQgYW5vdGhlciByZXZpdmVyIGhhbmRsZSBpdFxyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH0pO1xyXG4gICAgZnVuY3Rpb24gYXJnUmVwbGFjZXIoa2V5LCB2YWx1ZSkge1xyXG4gICAgICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIERvdE5ldE9iamVjdCA/IHZhbHVlLnNlcmlhbGl6ZUFzQXJnKCkgOiB2YWx1ZTtcclxuICAgIH1cclxufSkoRG90TmV0IHx8IChEb3ROZXQgPSB7fSkpO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1NaWNyb3NvZnQuSlNJbnRlcm9wLmpzLm1hcCIsIid1c2Ugc3RyaWN0JztcblxuLy8gY29tcGFyZSBhbmQgaXNCdWZmZXIgdGFrZW4gZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9ibG9iLzY4MGU5ZTVlNDg4ZjIyYWFjMjc1OTlhNTdkYzg0NGE2MzE1OTI4ZGQvaW5kZXguanNcbi8vIG9yaWdpbmFsIG5vdGljZTpcblxuLyohXG4gKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci5cbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8ZmVyb3NzQGZlcm9zcy5vcmc+IDxodHRwOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuZnVuY3Rpb24gY29tcGFyZShhLCBiKSB7XG4gIGlmIChhID09PSBiKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICB2YXIgeCA9IGEubGVuZ3RoO1xuICB2YXIgeSA9IGIubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBNYXRoLm1pbih4LCB5KTsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKGFbaV0gIT09IGJbaV0pIHtcbiAgICAgIHggPSBhW2ldO1xuICAgICAgeSA9IGJbaV07XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cbiAgaWYgKHkgPCB4KSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5mdW5jdGlvbiBpc0J1ZmZlcihiKSB7XG4gIGlmIChnbG9iYWwuQnVmZmVyICYmIHR5cGVvZiBnbG9iYWwuQnVmZmVyLmlzQnVmZmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGdsb2JhbC5CdWZmZXIuaXNCdWZmZXIoYik7XG4gIH1cbiAgcmV0dXJuICEhKGIgIT0gbnVsbCAmJiBiLl9pc0J1ZmZlcik7XG59XG5cbi8vIGJhc2VkIG9uIG5vZGUgYXNzZXJ0LCBvcmlnaW5hbCBub3RpY2U6XG5cbi8vIGh0dHA6Ly93aWtpLmNvbW1vbmpzLm9yZy93aWtpL1VuaXRfVGVzdGluZy8xLjBcbi8vXG4vLyBUSElTIElTIE5PVCBURVNURUQgTk9SIExJS0VMWSBUTyBXT1JLIE9VVFNJREUgVjghXG4vL1xuLy8gT3JpZ2luYWxseSBmcm9tIG5hcndoYWwuanMgKGh0dHA6Ly9uYXJ3aGFsanMub3JnKVxuLy8gQ29weXJpZ2h0IChjKSAyMDA5IFRob21hcyBSb2JpbnNvbiA8Mjgwbm9ydGguY29tPlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICdTb2Z0d2FyZScpLCB0b1xuLy8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbi8vIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuLy8gc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAnQVMgSVMnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU5cbi8vIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT05cbi8vIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwvJyk7XG52YXIgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBwU2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgZnVuY3Rpb25zSGF2ZU5hbWVzID0gKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGZvbygpIHt9Lm5hbWUgPT09ICdmb28nO1xufSgpKTtcbmZ1bmN0aW9uIHBUb1N0cmluZyAob2JqKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKTtcbn1cbmZ1bmN0aW9uIGlzVmlldyhhcnJidWYpIHtcbiAgaWYgKGlzQnVmZmVyKGFycmJ1ZikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHR5cGVvZiBnbG9iYWwuQXJyYXlCdWZmZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gQXJyYXlCdWZmZXIuaXNWaWV3KGFycmJ1Zik7XG4gIH1cbiAgaWYgKCFhcnJidWYpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGFycmJ1ZiBpbnN0YW5jZW9mIERhdGFWaWV3KSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKGFycmJ1Zi5idWZmZXIgJiYgYXJyYnVmLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuLy8gMS4gVGhlIGFzc2VydCBtb2R1bGUgcHJvdmlkZXMgZnVuY3Rpb25zIHRoYXQgdGhyb3dcbi8vIEFzc2VydGlvbkVycm9yJ3Mgd2hlbiBwYXJ0aWN1bGFyIGNvbmRpdGlvbnMgYXJlIG5vdCBtZXQuIFRoZVxuLy8gYXNzZXJ0IG1vZHVsZSBtdXN0IGNvbmZvcm0gdG8gdGhlIGZvbGxvd2luZyBpbnRlcmZhY2UuXG5cbnZhciBhc3NlcnQgPSBtb2R1bGUuZXhwb3J0cyA9IG9rO1xuXG4vLyAyLiBUaGUgQXNzZXJ0aW9uRXJyb3IgaXMgZGVmaW5lZCBpbiBhc3NlcnQuXG4vLyBuZXcgYXNzZXJ0LkFzc2VydGlvbkVycm9yKHsgbWVzc2FnZTogbWVzc2FnZSxcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWw6IGFjdHVhbCxcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZDogZXhwZWN0ZWQgfSlcblxudmFyIHJlZ2V4ID0gL1xccypmdW5jdGlvblxccysoW15cXChcXHNdKilcXHMqLztcbi8vIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9samhhcmIvZnVuY3Rpb24ucHJvdG90eXBlLm5hbWUvYmxvYi9hZGVlZWVjOGJmY2M2MDY4YjE4N2Q3ZDlmYjNkNWJiMWQzYTMwODk5L2ltcGxlbWVudGF0aW9uLmpzXG5mdW5jdGlvbiBnZXROYW1lKGZ1bmMpIHtcbiAgaWYgKCF1dGlsLmlzRnVuY3Rpb24oZnVuYykpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGZ1bmN0aW9uc0hhdmVOYW1lcykge1xuICAgIHJldHVybiBmdW5jLm5hbWU7XG4gIH1cbiAgdmFyIHN0ciA9IGZ1bmMudG9TdHJpbmcoKTtcbiAgdmFyIG1hdGNoID0gc3RyLm1hdGNoKHJlZ2V4KTtcbiAgcmV0dXJuIG1hdGNoICYmIG1hdGNoWzFdO1xufVxuYXNzZXJ0LkFzc2VydGlvbkVycm9yID0gZnVuY3Rpb24gQXNzZXJ0aW9uRXJyb3Iob3B0aW9ucykge1xuICB0aGlzLm5hbWUgPSAnQXNzZXJ0aW9uRXJyb3InO1xuICB0aGlzLmFjdHVhbCA9IG9wdGlvbnMuYWN0dWFsO1xuICB0aGlzLmV4cGVjdGVkID0gb3B0aW9ucy5leHBlY3RlZDtcbiAgdGhpcy5vcGVyYXRvciA9IG9wdGlvbnMub3BlcmF0b3I7XG4gIGlmIChvcHRpb25zLm1lc3NhZ2UpIHtcbiAgICB0aGlzLm1lc3NhZ2UgPSBvcHRpb25zLm1lc3NhZ2U7XG4gICAgdGhpcy5nZW5lcmF0ZWRNZXNzYWdlID0gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5tZXNzYWdlID0gZ2V0TWVzc2FnZSh0aGlzKTtcbiAgICB0aGlzLmdlbmVyYXRlZE1lc3NhZ2UgPSB0cnVlO1xuICB9XG4gIHZhciBzdGFja1N0YXJ0RnVuY3Rpb24gPSBvcHRpb25zLnN0YWNrU3RhcnRGdW5jdGlvbiB8fCBmYWlsO1xuICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBzdGFja1N0YXJ0RnVuY3Rpb24pO1xuICB9IGVsc2Uge1xuICAgIC8vIG5vbiB2OCBicm93c2VycyBzbyB3ZSBjYW4gaGF2ZSBhIHN0YWNrdHJhY2VcbiAgICB2YXIgZXJyID0gbmV3IEVycm9yKCk7XG4gICAgaWYgKGVyci5zdGFjaykge1xuICAgICAgdmFyIG91dCA9IGVyci5zdGFjaztcblxuICAgICAgLy8gdHJ5IHRvIHN0cmlwIHVzZWxlc3MgZnJhbWVzXG4gICAgICB2YXIgZm5fbmFtZSA9IGdldE5hbWUoc3RhY2tTdGFydEZ1bmN0aW9uKTtcbiAgICAgIHZhciBpZHggPSBvdXQuaW5kZXhPZignXFxuJyArIGZuX25hbWUpO1xuICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgIC8vIG9uY2Ugd2UgaGF2ZSBsb2NhdGVkIHRoZSBmdW5jdGlvbiBmcmFtZVxuICAgICAgICAvLyB3ZSBuZWVkIHRvIHN0cmlwIG91dCBldmVyeXRoaW5nIGJlZm9yZSBpdCAoYW5kIGl0cyBsaW5lKVxuICAgICAgICB2YXIgbmV4dF9saW5lID0gb3V0LmluZGV4T2YoJ1xcbicsIGlkeCArIDEpO1xuICAgICAgICBvdXQgPSBvdXQuc3Vic3RyaW5nKG5leHRfbGluZSArIDEpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnN0YWNrID0gb3V0O1xuICAgIH1cbiAgfVxufTtcblxuLy8gYXNzZXJ0LkFzc2VydGlvbkVycm9yIGluc3RhbmNlb2YgRXJyb3JcbnV0aWwuaW5oZXJpdHMoYXNzZXJ0LkFzc2VydGlvbkVycm9yLCBFcnJvcik7XG5cbmZ1bmN0aW9uIHRydW5jYXRlKHMsIG4pIHtcbiAgaWYgKHR5cGVvZiBzID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBzLmxlbmd0aCA8IG4gPyBzIDogcy5zbGljZSgwLCBuKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcztcbiAgfVxufVxuZnVuY3Rpb24gaW5zcGVjdChzb21ldGhpbmcpIHtcbiAgaWYgKGZ1bmN0aW9uc0hhdmVOYW1lcyB8fCAhdXRpbC5pc0Z1bmN0aW9uKHNvbWV0aGluZykpIHtcbiAgICByZXR1cm4gdXRpbC5pbnNwZWN0KHNvbWV0aGluZyk7XG4gIH1cbiAgdmFyIHJhd25hbWUgPSBnZXROYW1lKHNvbWV0aGluZyk7XG4gIHZhciBuYW1lID0gcmF3bmFtZSA/ICc6ICcgKyByYXduYW1lIDogJyc7XG4gIHJldHVybiAnW0Z1bmN0aW9uJyArICBuYW1lICsgJ10nO1xufVxuZnVuY3Rpb24gZ2V0TWVzc2FnZShzZWxmKSB7XG4gIHJldHVybiB0cnVuY2F0ZShpbnNwZWN0KHNlbGYuYWN0dWFsKSwgMTI4KSArICcgJyArXG4gICAgICAgICBzZWxmLm9wZXJhdG9yICsgJyAnICtcbiAgICAgICAgIHRydW5jYXRlKGluc3BlY3Qoc2VsZi5leHBlY3RlZCksIDEyOCk7XG59XG5cbi8vIEF0IHByZXNlbnQgb25seSB0aGUgdGhyZWUga2V5cyBtZW50aW9uZWQgYWJvdmUgYXJlIHVzZWQgYW5kXG4vLyB1bmRlcnN0b29kIGJ5IHRoZSBzcGVjLiBJbXBsZW1lbnRhdGlvbnMgb3Igc3ViIG1vZHVsZXMgY2FuIHBhc3Ncbi8vIG90aGVyIGtleXMgdG8gdGhlIEFzc2VydGlvbkVycm9yJ3MgY29uc3RydWN0b3IgLSB0aGV5IHdpbGwgYmVcbi8vIGlnbm9yZWQuXG5cbi8vIDMuIEFsbCBvZiB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBtdXN0IHRocm93IGFuIEFzc2VydGlvbkVycm9yXG4vLyB3aGVuIGEgY29ycmVzcG9uZGluZyBjb25kaXRpb24gaXMgbm90IG1ldCwgd2l0aCBhIG1lc3NhZ2UgdGhhdFxuLy8gbWF5IGJlIHVuZGVmaW5lZCBpZiBub3QgcHJvdmlkZWQuICBBbGwgYXNzZXJ0aW9uIG1ldGhvZHMgcHJvdmlkZVxuLy8gYm90aCB0aGUgYWN0dWFsIGFuZCBleHBlY3RlZCB2YWx1ZXMgdG8gdGhlIGFzc2VydGlvbiBlcnJvciBmb3Jcbi8vIGRpc3BsYXkgcHVycG9zZXMuXG5cbmZ1bmN0aW9uIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgb3BlcmF0b3IsIHN0YWNrU3RhcnRGdW5jdGlvbikge1xuICB0aHJvdyBuZXcgYXNzZXJ0LkFzc2VydGlvbkVycm9yKHtcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgIGFjdHVhbDogYWN0dWFsLFxuICAgIGV4cGVjdGVkOiBleHBlY3RlZCxcbiAgICBvcGVyYXRvcjogb3BlcmF0b3IsXG4gICAgc3RhY2tTdGFydEZ1bmN0aW9uOiBzdGFja1N0YXJ0RnVuY3Rpb25cbiAgfSk7XG59XG5cbi8vIEVYVEVOU0lPTiEgYWxsb3dzIGZvciB3ZWxsIGJlaGF2ZWQgZXJyb3JzIGRlZmluZWQgZWxzZXdoZXJlLlxuYXNzZXJ0LmZhaWwgPSBmYWlsO1xuXG4vLyA0LiBQdXJlIGFzc2VydGlvbiB0ZXN0cyB3aGV0aGVyIGEgdmFsdWUgaXMgdHJ1dGh5LCBhcyBkZXRlcm1pbmVkXG4vLyBieSAhIWd1YXJkLlxuLy8gYXNzZXJ0Lm9rKGd1YXJkLCBtZXNzYWdlX29wdCk7XG4vLyBUaGlzIHN0YXRlbWVudCBpcyBlcXVpdmFsZW50IHRvIGFzc2VydC5lcXVhbCh0cnVlLCAhIWd1YXJkLFxuLy8gbWVzc2FnZV9vcHQpOy4gVG8gdGVzdCBzdHJpY3RseSBmb3IgdGhlIHZhbHVlIHRydWUsIHVzZVxuLy8gYXNzZXJ0LnN0cmljdEVxdWFsKHRydWUsIGd1YXJkLCBtZXNzYWdlX29wdCk7LlxuXG5mdW5jdGlvbiBvayh2YWx1ZSwgbWVzc2FnZSkge1xuICBpZiAoIXZhbHVlKSBmYWlsKHZhbHVlLCB0cnVlLCBtZXNzYWdlLCAnPT0nLCBhc3NlcnQub2spO1xufVxuYXNzZXJ0Lm9rID0gb2s7XG5cbi8vIDUuIFRoZSBlcXVhbGl0eSBhc3NlcnRpb24gdGVzdHMgc2hhbGxvdywgY29lcmNpdmUgZXF1YWxpdHkgd2l0aFxuLy8gPT0uXG4vLyBhc3NlcnQuZXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuXG5hc3NlcnQuZXF1YWwgPSBmdW5jdGlvbiBlcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmIChhY3R1YWwgIT0gZXhwZWN0ZWQpIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJz09JywgYXNzZXJ0LmVxdWFsKTtcbn07XG5cbi8vIDYuIFRoZSBub24tZXF1YWxpdHkgYXNzZXJ0aW9uIHRlc3RzIGZvciB3aGV0aGVyIHR3byBvYmplY3RzIGFyZSBub3QgZXF1YWxcbi8vIHdpdGggIT0gYXNzZXJ0Lm5vdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0Lm5vdEVxdWFsID0gZnVuY3Rpb24gbm90RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoYWN0dWFsID09IGV4cGVjdGVkKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnIT0nLCBhc3NlcnQubm90RXF1YWwpO1xuICB9XG59O1xuXG4vLyA3LiBUaGUgZXF1aXZhbGVuY2UgYXNzZXJ0aW9uIHRlc3RzIGEgZGVlcCBlcXVhbGl0eSByZWxhdGlvbi5cbi8vIGFzc2VydC5kZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuXG5hc3NlcnQuZGVlcEVxdWFsID0gZnVuY3Rpb24gZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKCFfZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIGZhbHNlKSkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJ2RlZXBFcXVhbCcsIGFzc2VydC5kZWVwRXF1YWwpO1xuICB9XG59O1xuXG5hc3NlcnQuZGVlcFN0cmljdEVxdWFsID0gZnVuY3Rpb24gZGVlcFN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKCFfZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIHRydWUpKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnZGVlcFN0cmljdEVxdWFsJywgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbCk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIF9kZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgc3RyaWN0LCBtZW1vcykge1xuICAvLyA3LjEuIEFsbCBpZGVudGljYWwgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBhcyBkZXRlcm1pbmVkIGJ5ID09PS5cbiAgaWYgKGFjdHVhbCA9PT0gZXhwZWN0ZWQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIGlmIChpc0J1ZmZlcihhY3R1YWwpICYmIGlzQnVmZmVyKGV4cGVjdGVkKSkge1xuICAgIHJldHVybiBjb21wYXJlKGFjdHVhbCwgZXhwZWN0ZWQpID09PSAwO1xuXG4gIC8vIDcuMi4gSWYgdGhlIGV4cGVjdGVkIHZhbHVlIGlzIGEgRGF0ZSBvYmplY3QsIHRoZSBhY3R1YWwgdmFsdWUgaXNcbiAgLy8gZXF1aXZhbGVudCBpZiBpdCBpcyBhbHNvIGEgRGF0ZSBvYmplY3QgdGhhdCByZWZlcnMgdG8gdGhlIHNhbWUgdGltZS5cbiAgfSBlbHNlIGlmICh1dGlsLmlzRGF0ZShhY3R1YWwpICYmIHV0aWwuaXNEYXRlKGV4cGVjdGVkKSkge1xuICAgIHJldHVybiBhY3R1YWwuZ2V0VGltZSgpID09PSBleHBlY3RlZC5nZXRUaW1lKCk7XG5cbiAgLy8gNy4zIElmIHRoZSBleHBlY3RlZCB2YWx1ZSBpcyBhIFJlZ0V4cCBvYmplY3QsIHRoZSBhY3R1YWwgdmFsdWUgaXNcbiAgLy8gZXF1aXZhbGVudCBpZiBpdCBpcyBhbHNvIGEgUmVnRXhwIG9iamVjdCB3aXRoIHRoZSBzYW1lIHNvdXJjZSBhbmRcbiAgLy8gcHJvcGVydGllcyAoYGdsb2JhbGAsIGBtdWx0aWxpbmVgLCBgbGFzdEluZGV4YCwgYGlnbm9yZUNhc2VgKS5cbiAgfSBlbHNlIGlmICh1dGlsLmlzUmVnRXhwKGFjdHVhbCkgJiYgdXRpbC5pc1JlZ0V4cChleHBlY3RlZCkpIHtcbiAgICByZXR1cm4gYWN0dWFsLnNvdXJjZSA9PT0gZXhwZWN0ZWQuc291cmNlICYmXG4gICAgICAgICAgIGFjdHVhbC5nbG9iYWwgPT09IGV4cGVjdGVkLmdsb2JhbCAmJlxuICAgICAgICAgICBhY3R1YWwubXVsdGlsaW5lID09PSBleHBlY3RlZC5tdWx0aWxpbmUgJiZcbiAgICAgICAgICAgYWN0dWFsLmxhc3RJbmRleCA9PT0gZXhwZWN0ZWQubGFzdEluZGV4ICYmXG4gICAgICAgICAgIGFjdHVhbC5pZ25vcmVDYXNlID09PSBleHBlY3RlZC5pZ25vcmVDYXNlO1xuXG4gIC8vIDcuNC4gT3RoZXIgcGFpcnMgdGhhdCBkbyBub3QgYm90aCBwYXNzIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JyxcbiAgLy8gZXF1aXZhbGVuY2UgaXMgZGV0ZXJtaW5lZCBieSA9PS5cbiAgfSBlbHNlIGlmICgoYWN0dWFsID09PSBudWxsIHx8IHR5cGVvZiBhY3R1YWwgIT09ICdvYmplY3QnKSAmJlxuICAgICAgICAgICAgIChleHBlY3RlZCA9PT0gbnVsbCB8fCB0eXBlb2YgZXhwZWN0ZWQgIT09ICdvYmplY3QnKSkge1xuICAgIHJldHVybiBzdHJpY3QgPyBhY3R1YWwgPT09IGV4cGVjdGVkIDogYWN0dWFsID09IGV4cGVjdGVkO1xuXG4gIC8vIElmIGJvdGggdmFsdWVzIGFyZSBpbnN0YW5jZXMgb2YgdHlwZWQgYXJyYXlzLCB3cmFwIHRoZWlyIHVuZGVybHlpbmdcbiAgLy8gQXJyYXlCdWZmZXJzIGluIGEgQnVmZmVyIGVhY2ggdG8gaW5jcmVhc2UgcGVyZm9ybWFuY2VcbiAgLy8gVGhpcyBvcHRpbWl6YXRpb24gcmVxdWlyZXMgdGhlIGFycmF5cyB0byBoYXZlIHRoZSBzYW1lIHR5cGUgYXMgY2hlY2tlZCBieVxuICAvLyBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nIChha2EgcFRvU3RyaW5nKS4gTmV2ZXIgcGVyZm9ybSBiaW5hcnlcbiAgLy8gY29tcGFyaXNvbnMgZm9yIEZsb2F0KkFycmF5cywgdGhvdWdoLCBzaW5jZSBlLmcuICswID09PSAtMCBidXQgdGhlaXJcbiAgLy8gYml0IHBhdHRlcm5zIGFyZSBub3QgaWRlbnRpY2FsLlxuICB9IGVsc2UgaWYgKGlzVmlldyhhY3R1YWwpICYmIGlzVmlldyhleHBlY3RlZCkgJiZcbiAgICAgICAgICAgICBwVG9TdHJpbmcoYWN0dWFsKSA9PT0gcFRvU3RyaW5nKGV4cGVjdGVkKSAmJlxuICAgICAgICAgICAgICEoYWN0dWFsIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5IHx8XG4gICAgICAgICAgICAgICBhY3R1YWwgaW5zdGFuY2VvZiBGbG9hdDY0QXJyYXkpKSB7XG4gICAgcmV0dXJuIGNvbXBhcmUobmV3IFVpbnQ4QXJyYXkoYWN0dWFsLmJ1ZmZlciksXG4gICAgICAgICAgICAgICAgICAgbmV3IFVpbnQ4QXJyYXkoZXhwZWN0ZWQuYnVmZmVyKSkgPT09IDA7XG5cbiAgLy8gNy41IEZvciBhbGwgb3RoZXIgT2JqZWN0IHBhaXJzLCBpbmNsdWRpbmcgQXJyYXkgb2JqZWN0cywgZXF1aXZhbGVuY2UgaXNcbiAgLy8gZGV0ZXJtaW5lZCBieSBoYXZpbmcgdGhlIHNhbWUgbnVtYmVyIG9mIG93bmVkIHByb3BlcnRpZXMgKGFzIHZlcmlmaWVkXG4gIC8vIHdpdGggT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKSwgdGhlIHNhbWUgc2V0IG9mIGtleXNcbiAgLy8gKGFsdGhvdWdoIG5vdCBuZWNlc3NhcmlseSB0aGUgc2FtZSBvcmRlciksIGVxdWl2YWxlbnQgdmFsdWVzIGZvciBldmVyeVxuICAvLyBjb3JyZXNwb25kaW5nIGtleSwgYW5kIGFuIGlkZW50aWNhbCAncHJvdG90eXBlJyBwcm9wZXJ0eS4gTm90ZTogdGhpc1xuICAvLyBhY2NvdW50cyBmb3IgYm90aCBuYW1lZCBhbmQgaW5kZXhlZCBwcm9wZXJ0aWVzIG9uIEFycmF5cy5cbiAgfSBlbHNlIGlmIChpc0J1ZmZlcihhY3R1YWwpICE9PSBpc0J1ZmZlcihleHBlY3RlZCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgbWVtb3MgPSBtZW1vcyB8fCB7YWN0dWFsOiBbXSwgZXhwZWN0ZWQ6IFtdfTtcblxuICAgIHZhciBhY3R1YWxJbmRleCA9IG1lbW9zLmFjdHVhbC5pbmRleE9mKGFjdHVhbCk7XG4gICAgaWYgKGFjdHVhbEluZGV4ICE9PSAtMSkge1xuICAgICAgaWYgKGFjdHVhbEluZGV4ID09PSBtZW1vcy5leHBlY3RlZC5pbmRleE9mKGV4cGVjdGVkKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBtZW1vcy5hY3R1YWwucHVzaChhY3R1YWwpO1xuICAgIG1lbW9zLmV4cGVjdGVkLnB1c2goZXhwZWN0ZWQpO1xuXG4gICAgcmV0dXJuIG9iakVxdWl2KGFjdHVhbCwgZXhwZWN0ZWQsIHN0cmljdCwgbWVtb3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzQXJndW1lbnRzKG9iamVjdCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkgPT0gJ1tvYmplY3QgQXJndW1lbnRzXSc7XG59XG5cbmZ1bmN0aW9uIG9iakVxdWl2KGEsIGIsIHN0cmljdCwgYWN0dWFsVmlzaXRlZE9iamVjdHMpIHtcbiAgaWYgKGEgPT09IG51bGwgfHwgYSA9PT0gdW5kZWZpbmVkIHx8IGIgPT09IG51bGwgfHwgYiA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBmYWxzZTtcbiAgLy8gaWYgb25lIGlzIGEgcHJpbWl0aXZlLCB0aGUgb3RoZXIgbXVzdCBiZSBzYW1lXG4gIGlmICh1dGlsLmlzUHJpbWl0aXZlKGEpIHx8IHV0aWwuaXNQcmltaXRpdmUoYikpXG4gICAgcmV0dXJuIGEgPT09IGI7XG4gIGlmIChzdHJpY3QgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKGEpICE9PSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoYikpXG4gICAgcmV0dXJuIGZhbHNlO1xuICB2YXIgYUlzQXJncyA9IGlzQXJndW1lbnRzKGEpO1xuICB2YXIgYklzQXJncyA9IGlzQXJndW1lbnRzKGIpO1xuICBpZiAoKGFJc0FyZ3MgJiYgIWJJc0FyZ3MpIHx8ICghYUlzQXJncyAmJiBiSXNBcmdzKSlcbiAgICByZXR1cm4gZmFsc2U7XG4gIGlmIChhSXNBcmdzKSB7XG4gICAgYSA9IHBTbGljZS5jYWxsKGEpO1xuICAgIGIgPSBwU2xpY2UuY2FsbChiKTtcbiAgICByZXR1cm4gX2RlZXBFcXVhbChhLCBiLCBzdHJpY3QpO1xuICB9XG4gIHZhciBrYSA9IG9iamVjdEtleXMoYSk7XG4gIHZhciBrYiA9IG9iamVjdEtleXMoYik7XG4gIHZhciBrZXksIGk7XG4gIC8vIGhhdmluZyB0aGUgc2FtZSBudW1iZXIgb2Ygb3duZWQgcHJvcGVydGllcyAoa2V5cyBpbmNvcnBvcmF0ZXNcbiAgLy8gaGFzT3duUHJvcGVydHkpXG4gIGlmIChrYS5sZW5ndGggIT09IGtiLmxlbmd0aClcbiAgICByZXR1cm4gZmFsc2U7XG4gIC8vdGhlIHNhbWUgc2V0IG9mIGtleXMgKGFsdGhvdWdoIG5vdCBuZWNlc3NhcmlseSB0aGUgc2FtZSBvcmRlciksXG4gIGthLnNvcnQoKTtcbiAga2Iuc29ydCgpO1xuICAvL35+fmNoZWFwIGtleSB0ZXN0XG4gIGZvciAoaSA9IGthLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgaWYgKGthW2ldICE9PSBrYltpXSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvL2VxdWl2YWxlbnQgdmFsdWVzIGZvciBldmVyeSBjb3JyZXNwb25kaW5nIGtleSwgYW5kXG4gIC8vfn5+cG9zc2libHkgZXhwZW5zaXZlIGRlZXAgdGVzdFxuICBmb3IgKGkgPSBrYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGtleSA9IGthW2ldO1xuICAgIGlmICghX2RlZXBFcXVhbChhW2tleV0sIGJba2V5XSwgc3RyaWN0LCBhY3R1YWxWaXNpdGVkT2JqZWN0cykpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8vIDguIFRoZSBub24tZXF1aXZhbGVuY2UgYXNzZXJ0aW9uIHRlc3RzIGZvciBhbnkgZGVlcCBpbmVxdWFsaXR5LlxuLy8gYXNzZXJ0Lm5vdERlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlX29wdCk7XG5cbmFzc2VydC5ub3REZWVwRXF1YWwgPSBmdW5jdGlvbiBub3REZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoX2RlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBmYWxzZSkpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICdub3REZWVwRXF1YWwnLCBhc3NlcnQubm90RGVlcEVxdWFsKTtcbiAgfVxufTtcblxuYXNzZXJ0Lm5vdERlZXBTdHJpY3RFcXVhbCA9IG5vdERlZXBTdHJpY3RFcXVhbDtcbmZ1bmN0aW9uIG5vdERlZXBTdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmIChfZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIHRydWUpKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnbm90RGVlcFN0cmljdEVxdWFsJywgbm90RGVlcFN0cmljdEVxdWFsKTtcbiAgfVxufVxuXG5cbi8vIDkuIFRoZSBzdHJpY3QgZXF1YWxpdHkgYXNzZXJ0aW9uIHRlc3RzIHN0cmljdCBlcXVhbGl0eSwgYXMgZGV0ZXJtaW5lZCBieSA9PT0uXG4vLyBhc3NlcnQuc3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuXG5hc3NlcnQuc3RyaWN0RXF1YWwgPSBmdW5jdGlvbiBzdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmIChhY3R1YWwgIT09IGV4cGVjdGVkKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnPT09JywgYXNzZXJ0LnN0cmljdEVxdWFsKTtcbiAgfVxufTtcblxuLy8gMTAuIFRoZSBzdHJpY3Qgbm9uLWVxdWFsaXR5IGFzc2VydGlvbiB0ZXN0cyBmb3Igc3RyaWN0IGluZXF1YWxpdHksIGFzXG4vLyBkZXRlcm1pbmVkIGJ5ICE9PS4gIGFzc2VydC5ub3RTdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlX29wdCk7XG5cbmFzc2VydC5ub3RTdHJpY3RFcXVhbCA9IGZ1bmN0aW9uIG5vdFN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKGFjdHVhbCA9PT0gZXhwZWN0ZWQpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICchPT0nLCBhc3NlcnQubm90U3RyaWN0RXF1YWwpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBleHBlY3RlZEV4Y2VwdGlvbihhY3R1YWwsIGV4cGVjdGVkKSB7XG4gIGlmICghYWN0dWFsIHx8ICFleHBlY3RlZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZXhwZWN0ZWQpID09ICdbb2JqZWN0IFJlZ0V4cF0nKSB7XG4gICAgcmV0dXJuIGV4cGVjdGVkLnRlc3QoYWN0dWFsKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgaWYgKGFjdHVhbCBpbnN0YW5jZW9mIGV4cGVjdGVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBJZ25vcmUuICBUaGUgaW5zdGFuY2VvZiBjaGVjayBkb2Vzbid0IHdvcmsgZm9yIGFycm93IGZ1bmN0aW9ucy5cbiAgfVxuXG4gIGlmIChFcnJvci5pc1Byb3RvdHlwZU9mKGV4cGVjdGVkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBleHBlY3RlZC5jYWxsKHt9LCBhY3R1YWwpID09PSB0cnVlO1xufVxuXG5mdW5jdGlvbiBfdHJ5QmxvY2soYmxvY2spIHtcbiAgdmFyIGVycm9yO1xuICB0cnkge1xuICAgIGJsb2NrKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBlcnJvciA9IGU7XG4gIH1cbiAgcmV0dXJuIGVycm9yO1xufVxuXG5mdW5jdGlvbiBfdGhyb3dzKHNob3VsZFRocm93LCBibG9jaywgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgdmFyIGFjdHVhbDtcblxuICBpZiAodHlwZW9mIGJsb2NrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJibG9ja1wiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBleHBlY3RlZCA9PT0gJ3N0cmluZycpIHtcbiAgICBtZXNzYWdlID0gZXhwZWN0ZWQ7XG4gICAgZXhwZWN0ZWQgPSBudWxsO1xuICB9XG5cbiAgYWN0dWFsID0gX3RyeUJsb2NrKGJsb2NrKTtcblxuICBtZXNzYWdlID0gKGV4cGVjdGVkICYmIGV4cGVjdGVkLm5hbWUgPyAnICgnICsgZXhwZWN0ZWQubmFtZSArICcpLicgOiAnLicpICtcbiAgICAgICAgICAgIChtZXNzYWdlID8gJyAnICsgbWVzc2FnZSA6ICcuJyk7XG5cbiAgaWYgKHNob3VsZFRocm93ICYmICFhY3R1YWwpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsICdNaXNzaW5nIGV4cGVjdGVkIGV4Y2VwdGlvbicgKyBtZXNzYWdlKTtcbiAgfVxuXG4gIHZhciB1c2VyUHJvdmlkZWRNZXNzYWdlID0gdHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnO1xuICB2YXIgaXNVbndhbnRlZEV4Y2VwdGlvbiA9ICFzaG91bGRUaHJvdyAmJiB1dGlsLmlzRXJyb3IoYWN0dWFsKTtcbiAgdmFyIGlzVW5leHBlY3RlZEV4Y2VwdGlvbiA9ICFzaG91bGRUaHJvdyAmJiBhY3R1YWwgJiYgIWV4cGVjdGVkO1xuXG4gIGlmICgoaXNVbndhbnRlZEV4Y2VwdGlvbiAmJlxuICAgICAgdXNlclByb3ZpZGVkTWVzc2FnZSAmJlxuICAgICAgZXhwZWN0ZWRFeGNlcHRpb24oYWN0dWFsLCBleHBlY3RlZCkpIHx8XG4gICAgICBpc1VuZXhwZWN0ZWRFeGNlcHRpb24pIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsICdHb3QgdW53YW50ZWQgZXhjZXB0aW9uJyArIG1lc3NhZ2UpO1xuICB9XG5cbiAgaWYgKChzaG91bGRUaHJvdyAmJiBhY3R1YWwgJiYgZXhwZWN0ZWQgJiZcbiAgICAgICFleHBlY3RlZEV4Y2VwdGlvbihhY3R1YWwsIGV4cGVjdGVkKSkgfHwgKCFzaG91bGRUaHJvdyAmJiBhY3R1YWwpKSB7XG4gICAgdGhyb3cgYWN0dWFsO1xuICB9XG59XG5cbi8vIDExLiBFeHBlY3RlZCB0byB0aHJvdyBhbiBlcnJvcjpcbi8vIGFzc2VydC50aHJvd3MoYmxvY2ssIEVycm9yX29wdCwgbWVzc2FnZV9vcHQpO1xuXG5hc3NlcnQudGhyb3dzID0gZnVuY3Rpb24oYmxvY2ssIC8qb3B0aW9uYWwqL2Vycm9yLCAvKm9wdGlvbmFsKi9tZXNzYWdlKSB7XG4gIF90aHJvd3ModHJ1ZSwgYmxvY2ssIGVycm9yLCBtZXNzYWdlKTtcbn07XG5cbi8vIEVYVEVOU0lPTiEgVGhpcyBpcyBhbm5veWluZyB0byB3cml0ZSBvdXRzaWRlIHRoaXMgbW9kdWxlLlxuYXNzZXJ0LmRvZXNOb3RUaHJvdyA9IGZ1bmN0aW9uKGJsb2NrLCAvKm9wdGlvbmFsKi9lcnJvciwgLypvcHRpb25hbCovbWVzc2FnZSkge1xuICBfdGhyb3dzKGZhbHNlLCBibG9jaywgZXJyb3IsIG1lc3NhZ2UpO1xufTtcblxuYXNzZXJ0LmlmRXJyb3IgPSBmdW5jdGlvbihlcnIpIHsgaWYgKGVycikgdGhyb3cgZXJyOyB9O1xuXG52YXIgb2JqZWN0S2V5cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIChvYmopIHtcbiAgdmFyIGtleXMgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIGlmIChoYXNPd24uY2FsbChvYmosIGtleSkpIGtleXMucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiBrZXlzO1xufTtcbiIsIid1c2Ugc3RyaWN0J1xuXG5leHBvcnRzLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5leHBvcnRzLnRvQnl0ZUFycmF5ID0gdG9CeXRlQXJyYXlcbmV4cG9ydHMuZnJvbUJ5dGVBcnJheSA9IGZyb21CeXRlQXJyYXlcblxudmFyIGxvb2t1cCA9IFtdXG52YXIgcmV2TG9va3VwID0gW11cbnZhciBBcnIgPSB0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBVaW50OEFycmF5IDogQXJyYXlcblxudmFyIGNvZGUgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLydcbmZvciAodmFyIGkgPSAwLCBsZW4gPSBjb2RlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gIGxvb2t1cFtpXSA9IGNvZGVbaV1cbiAgcmV2TG9va3VwW2NvZGUuY2hhckNvZGVBdChpKV0gPSBpXG59XG5cbi8vIFN1cHBvcnQgZGVjb2RpbmcgVVJMLXNhZmUgYmFzZTY0IHN0cmluZ3MsIGFzIE5vZGUuanMgZG9lcy5cbi8vIFNlZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmFzZTY0I1VSTF9hcHBsaWNhdGlvbnNcbnJldkxvb2t1cFsnLScuY2hhckNvZGVBdCgwKV0gPSA2MlxucmV2TG9va3VwWydfJy5jaGFyQ29kZUF0KDApXSA9IDYzXG5cbmZ1bmN0aW9uIGdldExlbnMgKGI2NCkge1xuICB2YXIgbGVuID0gYjY0Lmxlbmd0aFxuXG4gIGlmIChsZW4gJSA0ID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG4gIH1cblxuICAvLyBUcmltIG9mZiBleHRyYSBieXRlcyBhZnRlciBwbGFjZWhvbGRlciBieXRlcyBhcmUgZm91bmRcbiAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vYmVhdGdhbW1pdC9iYXNlNjQtanMvaXNzdWVzLzQyXG4gIHZhciB2YWxpZExlbiA9IGI2NC5pbmRleE9mKCc9JylcbiAgaWYgKHZhbGlkTGVuID09PSAtMSkgdmFsaWRMZW4gPSBsZW5cblxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gdmFsaWRMZW4gPT09IGxlblxuICAgID8gMFxuICAgIDogNCAtICh2YWxpZExlbiAlIDQpXG5cbiAgcmV0dXJuIFt2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuXVxufVxuXG4vLyBiYXNlNjQgaXMgNC8zICsgdXAgdG8gdHdvIGNoYXJhY3RlcnMgb2YgdGhlIG9yaWdpbmFsIGRhdGFcbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKGI2NCkge1xuICB2YXIgbGVucyA9IGdldExlbnMoYjY0KVxuICB2YXIgdmFsaWRMZW4gPSBsZW5zWzBdXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSBsZW5zWzFdXG4gIHJldHVybiAoKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0xlblxufVxuXG5mdW5jdGlvbiBfYnl0ZUxlbmd0aCAoYjY0LCB2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuKSB7XG4gIHJldHVybiAoKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0xlblxufVxuXG5mdW5jdGlvbiB0b0J5dGVBcnJheSAoYjY0KSB7XG4gIHZhciB0bXBcbiAgdmFyIGxlbnMgPSBnZXRMZW5zKGI2NClcbiAgdmFyIHZhbGlkTGVuID0gbGVuc1swXVxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gbGVuc1sxXVxuXG4gIHZhciBhcnIgPSBuZXcgQXJyKF9ieXRlTGVuZ3RoKGI2NCwgdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbikpXG5cbiAgdmFyIGN1ckJ5dGUgPSAwXG5cbiAgLy8gaWYgdGhlcmUgYXJlIHBsYWNlaG9sZGVycywgb25seSBnZXQgdXAgdG8gdGhlIGxhc3QgY29tcGxldGUgNCBjaGFyc1xuICB2YXIgbGVuID0gcGxhY2VIb2xkZXJzTGVuID4gMFxuICAgID8gdmFsaWRMZW4gLSA0XG4gICAgOiB2YWxpZExlblxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTgpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCAxMikgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildIDw8IDYpIHxcbiAgICAgIHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMyldXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDE2KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gOCkgJiAweEZGXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzTGVuID09PSAyKSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDIpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA+PiA0KVxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVyc0xlbiA9PT0gMSkge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxMCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDQpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA+PiAyKVxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBhcnJcbn1cblxuZnVuY3Rpb24gdHJpcGxldFRvQmFzZTY0IChudW0pIHtcbiAgcmV0dXJuIGxvb2t1cFtudW0gPj4gMTggJiAweDNGXSArXG4gICAgbG9va3VwW251bSA+PiAxMiAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtID4+IDYgJiAweDNGXSArXG4gICAgbG9va3VwW251bSAmIDB4M0ZdXG59XG5cbmZ1bmN0aW9uIGVuY29kZUNodW5rICh1aW50OCwgc3RhcnQsIGVuZCkge1xuICB2YXIgdG1wXG4gIHZhciBvdXRwdXQgPSBbXVxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gMykge1xuICAgIHRtcCA9XG4gICAgICAoKHVpbnQ4W2ldIDw8IDE2KSAmIDB4RkYwMDAwKSArXG4gICAgICAoKHVpbnQ4W2kgKyAxXSA8PCA4KSAmIDB4RkYwMCkgK1xuICAgICAgKHVpbnQ4W2kgKyAyXSAmIDB4RkYpXG4gICAgb3V0cHV0LnB1c2godHJpcGxldFRvQmFzZTY0KHRtcCkpXG4gIH1cbiAgcmV0dXJuIG91dHB1dC5qb2luKCcnKVxufVxuXG5mdW5jdGlvbiBmcm9tQnl0ZUFycmF5ICh1aW50OCkge1xuICB2YXIgdG1wXG4gIHZhciBsZW4gPSB1aW50OC5sZW5ndGhcbiAgdmFyIGV4dHJhQnl0ZXMgPSBsZW4gJSAzIC8vIGlmIHdlIGhhdmUgMSBieXRlIGxlZnQsIHBhZCAyIGJ5dGVzXG4gIHZhciBwYXJ0cyA9IFtdXG4gIHZhciBtYXhDaHVua0xlbmd0aCA9IDE2MzgzIC8vIG11c3QgYmUgbXVsdGlwbGUgb2YgM1xuXG4gIC8vIGdvIHRocm91Z2ggdGhlIGFycmF5IGV2ZXJ5IHRocmVlIGJ5dGVzLCB3ZSdsbCBkZWFsIHdpdGggdHJhaWxpbmcgc3R1ZmYgbGF0ZXJcbiAgZm9yICh2YXIgaSA9IDAsIGxlbjIgPSBsZW4gLSBleHRyYUJ5dGVzOyBpIDwgbGVuMjsgaSArPSBtYXhDaHVua0xlbmd0aCkge1xuICAgIHBhcnRzLnB1c2goZW5jb2RlQ2h1bmsoXG4gICAgICB1aW50OCwgaSwgKGkgKyBtYXhDaHVua0xlbmd0aCkgPiBsZW4yID8gbGVuMiA6IChpICsgbWF4Q2h1bmtMZW5ndGgpXG4gICAgKSlcbiAgfVxuXG4gIC8vIHBhZCB0aGUgZW5kIHdpdGggemVyb3MsIGJ1dCBtYWtlIHN1cmUgdG8gbm90IGZvcmdldCB0aGUgZXh0cmEgYnl0ZXNcbiAgaWYgKGV4dHJhQnl0ZXMgPT09IDEpIHtcbiAgICB0bXAgPSB1aW50OFtsZW4gLSAxXVxuICAgIHBhcnRzLnB1c2goXG4gICAgICBsb29rdXBbdG1wID4+IDJdICtcbiAgICAgIGxvb2t1cFsodG1wIDw8IDQpICYgMHgzRl0gK1xuICAgICAgJz09J1xuICAgIClcbiAgfSBlbHNlIGlmIChleHRyYUJ5dGVzID09PSAyKSB7XG4gICAgdG1wID0gKHVpbnQ4W2xlbiAtIDJdIDw8IDgpICsgdWludDhbbGVuIC0gMV1cbiAgICBwYXJ0cy5wdXNoKFxuICAgICAgbG9va3VwW3RtcCA+PiAxMF0gK1xuICAgICAgbG9va3VwWyh0bXAgPj4gNCkgJiAweDNGXSArXG4gICAgICBsb29rdXBbKHRtcCA8PCAyKSAmIDB4M0ZdICtcbiAgICAgICc9J1xuICAgIClcbiAgfVxuXG4gIHJldHVybiBwYXJ0cy5qb2luKCcnKVxufVxuIiwidmFyIER1cGxleFN0cmVhbSA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbScpLkR1cGxleFxuICAsIHV0aWwgICAgICAgICA9IHJlcXVpcmUoJ3V0aWwnKVxuICAsIEJ1ZmZlciAgICAgICA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyXG5cbnZhciB0ZW1wQnVmZmVyID0gQnVmZmVyLmFsbG9jKDEpXG5cbmZ1bmN0aW9uIEJ1ZmZlckxpc3QgKGNhbGxiYWNrKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBCdWZmZXJMaXN0KSlcbiAgICByZXR1cm4gbmV3IEJ1ZmZlckxpc3QoY2FsbGJhY2spXG5cbiAgdGhpcy5fYnVmcyAgPSBbXVxuICB0aGlzLmxlbmd0aCA9IDBcblxuICBpZiAodHlwZW9mIGNhbGxiYWNrID09ICdmdW5jdGlvbicpIHtcbiAgICB0aGlzLl9jYWxsYmFjayA9IGNhbGxiYWNrXG5cbiAgICB2YXIgcGlwZXIgPSBmdW5jdGlvbiBwaXBlciAoZXJyKSB7XG4gICAgICBpZiAodGhpcy5fY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fY2FsbGJhY2soZXJyKVxuICAgICAgICB0aGlzLl9jYWxsYmFjayA9IG51bGxcbiAgICAgIH1cbiAgICB9LmJpbmQodGhpcylcblxuICAgIHRoaXMub24oJ3BpcGUnLCBmdW5jdGlvbiBvblBpcGUgKHNyYykge1xuICAgICAgc3JjLm9uKCdlcnJvcicsIHBpcGVyKVxuICAgIH0pXG4gICAgdGhpcy5vbigndW5waXBlJywgZnVuY3Rpb24gb25VbnBpcGUgKHNyYykge1xuICAgICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIHBpcGVyKVxuICAgIH0pXG4gIH0gZWxzZSB7XG4gICAgdGhpcy5hcHBlbmQoY2FsbGJhY2spXG4gIH1cblxuICBEdXBsZXhTdHJlYW0uY2FsbCh0aGlzKVxufVxuXG5cbnV0aWwuaW5oZXJpdHMoQnVmZmVyTGlzdCwgRHVwbGV4U3RyZWFtKVxuXG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLl9vZmZzZXQgPSBmdW5jdGlvbiBfb2Zmc2V0IChvZmZzZXQpIHtcbiAgdmFyIHRvdCA9IDAsIGkgPSAwLCBfdFxuICBpZiAob2Zmc2V0ID09PSAwKSByZXR1cm4gWyAwLCAwIF1cbiAgZm9yICg7IGkgPCB0aGlzLl9idWZzLmxlbmd0aDsgaSsrKSB7XG4gICAgX3QgPSB0b3QgKyB0aGlzLl9idWZzW2ldLmxlbmd0aFxuICAgIGlmIChvZmZzZXQgPCBfdCB8fCBpID09IHRoaXMuX2J1ZnMubGVuZ3RoIC0gMSlcbiAgICAgIHJldHVybiBbIGksIG9mZnNldCAtIHRvdCBdXG4gICAgdG90ID0gX3RcbiAgfVxufVxuXG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uIGFwcGVuZCAoYnVmKSB7XG4gIHZhciBpID0gMFxuXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoYnVmKSkge1xuICAgIHRoaXMuX2FwcGVuZEJ1ZmZlcihidWYpO1xuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoYnVmKSkge1xuICAgIGZvciAoOyBpIDwgYnVmLmxlbmd0aDsgaSsrKVxuICAgICAgdGhpcy5hcHBlbmQoYnVmW2ldKVxuICB9IGVsc2UgaWYgKGJ1ZiBpbnN0YW5jZW9mIEJ1ZmZlckxpc3QpIHtcbiAgICAvLyB1bndyYXAgYXJndW1lbnQgaW50byBpbmRpdmlkdWFsIEJ1ZmZlckxpc3RzXG4gICAgZm9yICg7IGkgPCBidWYuX2J1ZnMubGVuZ3RoOyBpKyspXG4gICAgICB0aGlzLmFwcGVuZChidWYuX2J1ZnNbaV0pXG4gIH0gZWxzZSBpZiAoYnVmICE9IG51bGwpIHtcbiAgICAvLyBjb2VyY2UgbnVtYmVyIGFyZ3VtZW50cyB0byBzdHJpbmdzLCBzaW5jZSBCdWZmZXIobnVtYmVyKSBkb2VzXG4gICAgLy8gdW5pbml0aWFsaXplZCBtZW1vcnkgYWxsb2NhdGlvblxuICAgIGlmICh0eXBlb2YgYnVmID09ICdudW1iZXInKVxuICAgICAgYnVmID0gYnVmLnRvU3RyaW5nKClcblxuICAgIHRoaXMuX2FwcGVuZEJ1ZmZlcihCdWZmZXIuZnJvbShidWYpKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cblxuQnVmZmVyTGlzdC5wcm90b3R5cGUuX2FwcGVuZEJ1ZmZlciA9IGZ1bmN0aW9uIGFwcGVuZEJ1ZmZlciAoYnVmKSB7XG4gIHRoaXMuX2J1ZnMucHVzaChidWYpXG4gIHRoaXMubGVuZ3RoICs9IGJ1Zi5sZW5ndGhcbn1cblxuXG5CdWZmZXJMaXN0LnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiBfd3JpdGUgKGJ1ZiwgZW5jb2RpbmcsIGNhbGxiYWNrKSB7XG4gIHRoaXMuX2FwcGVuZEJ1ZmZlcihidWYpXG5cbiAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PSAnZnVuY3Rpb24nKVxuICAgIGNhbGxiYWNrKClcbn1cblxuXG5CdWZmZXJMaXN0LnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uIF9yZWFkIChzaXplKSB7XG4gIGlmICghdGhpcy5sZW5ndGgpXG4gICAgcmV0dXJuIHRoaXMucHVzaChudWxsKVxuXG4gIHNpemUgPSBNYXRoLm1pbihzaXplLCB0aGlzLmxlbmd0aClcbiAgdGhpcy5wdXNoKHRoaXMuc2xpY2UoMCwgc2l6ZSkpXG4gIHRoaXMuY29uc3VtZShzaXplKVxufVxuXG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIGVuZCAoY2h1bmspIHtcbiAgRHVwbGV4U3RyZWFtLnByb3RvdHlwZS5lbmQuY2FsbCh0aGlzLCBjaHVuaylcblxuICBpZiAodGhpcy5fY2FsbGJhY2spIHtcbiAgICB0aGlzLl9jYWxsYmFjayhudWxsLCB0aGlzLnNsaWNlKCkpXG4gICAgdGhpcy5fY2FsbGJhY2sgPSBudWxsXG4gIH1cbn1cblxuXG5CdWZmZXJMaXN0LnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiBnZXQgKGluZGV4KSB7XG4gIHRoaXMuY29weSh0ZW1wQnVmZmVyLCAwLCBpbmRleCwgaW5kZXggKyAxKVxuICByZXR1cm4gdGVtcEJ1ZmZlclswXVxufVxuXG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKHN0YXJ0LCBlbmQpIHtcbiAgaWYgKHR5cGVvZiBzdGFydCA9PSAnbnVtYmVyJyAmJiBzdGFydCA8IDApXG4gICAgc3RhcnQgKz0gdGhpcy5sZW5ndGhcbiAgaWYgKHR5cGVvZiBlbmQgPT0gJ251bWJlcicgJiYgZW5kIDwgMClcbiAgICBlbmQgKz0gdGhpcy5sZW5ndGhcbiAgcmV0dXJuIHRoaXMuY29weShudWxsLCAwLCBzdGFydCwgZW5kKVxufVxuXG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5IChkc3QsIGRzdFN0YXJ0LCBzcmNTdGFydCwgc3JjRW5kKSB7XG4gIGlmICh0eXBlb2Ygc3JjU3RhcnQgIT0gJ251bWJlcicgfHwgc3JjU3RhcnQgPCAwKVxuICAgIHNyY1N0YXJ0ID0gMFxuICBpZiAodHlwZW9mIHNyY0VuZCAhPSAnbnVtYmVyJyB8fCBzcmNFbmQgPiB0aGlzLmxlbmd0aClcbiAgICBzcmNFbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAoc3JjU3RhcnQgPj0gdGhpcy5sZW5ndGgpXG4gICAgcmV0dXJuIGRzdCB8fCBCdWZmZXIuYWxsb2MoMClcbiAgaWYgKHNyY0VuZCA8PSAwKVxuICAgIHJldHVybiBkc3QgfHwgQnVmZmVyLmFsbG9jKDApXG5cbiAgdmFyIGNvcHkgICA9ICEhZHN0XG4gICAgLCBvZmYgICAgPSB0aGlzLl9vZmZzZXQoc3JjU3RhcnQpXG4gICAgLCBsZW4gICAgPSBzcmNFbmQgLSBzcmNTdGFydFxuICAgICwgYnl0ZXMgID0gbGVuXG4gICAgLCBidWZvZmYgPSAoY29weSAmJiBkc3RTdGFydCkgfHwgMFxuICAgICwgc3RhcnQgID0gb2ZmWzFdXG4gICAgLCBsXG4gICAgLCBpXG5cbiAgLy8gY29weS9zbGljZSBldmVyeXRoaW5nXG4gIGlmIChzcmNTdGFydCA9PT0gMCAmJiBzcmNFbmQgPT0gdGhpcy5sZW5ndGgpIHtcbiAgICBpZiAoIWNvcHkpIHsgLy8gc2xpY2UsIGJ1dCBmdWxsIGNvbmNhdCBpZiBtdWx0aXBsZSBidWZmZXJzXG4gICAgICByZXR1cm4gdGhpcy5fYnVmcy5sZW5ndGggPT09IDFcbiAgICAgICAgPyB0aGlzLl9idWZzWzBdXG4gICAgICAgIDogQnVmZmVyLmNvbmNhdCh0aGlzLl9idWZzLCB0aGlzLmxlbmd0aClcbiAgICB9XG5cbiAgICAvLyBjb3B5LCBuZWVkIHRvIGNvcHkgaW5kaXZpZHVhbCBidWZmZXJzXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMuX2J1ZnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuX2J1ZnNbaV0uY29weShkc3QsIGJ1Zm9mZilcbiAgICAgIGJ1Zm9mZiArPSB0aGlzLl9idWZzW2ldLmxlbmd0aFxuICAgIH1cblxuICAgIHJldHVybiBkc3RcbiAgfVxuXG4gIC8vIGVhc3ksIGNoZWFwIGNhc2Ugd2hlcmUgaXQncyBhIHN1YnNldCBvZiBvbmUgb2YgdGhlIGJ1ZmZlcnNcbiAgaWYgKGJ5dGVzIDw9IHRoaXMuX2J1ZnNbb2ZmWzBdXS5sZW5ndGggLSBzdGFydCkge1xuICAgIHJldHVybiBjb3B5XG4gICAgICA/IHRoaXMuX2J1ZnNbb2ZmWzBdXS5jb3B5KGRzdCwgZHN0U3RhcnQsIHN0YXJ0LCBzdGFydCArIGJ5dGVzKVxuICAgICAgOiB0aGlzLl9idWZzW29mZlswXV0uc2xpY2Uoc3RhcnQsIHN0YXJ0ICsgYnl0ZXMpXG4gIH1cblxuICBpZiAoIWNvcHkpIC8vIGEgc2xpY2UsIHdlIG5lZWQgc29tZXRoaW5nIHRvIGNvcHkgaW4gdG9cbiAgICBkc3QgPSBCdWZmZXIuYWxsb2NVbnNhZmUobGVuKVxuXG4gIGZvciAoaSA9IG9mZlswXTsgaSA8IHRoaXMuX2J1ZnMubGVuZ3RoOyBpKyspIHtcbiAgICBsID0gdGhpcy5fYnVmc1tpXS5sZW5ndGggLSBzdGFydFxuXG4gICAgaWYgKGJ5dGVzID4gbCkge1xuICAgICAgdGhpcy5fYnVmc1tpXS5jb3B5KGRzdCwgYnVmb2ZmLCBzdGFydClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fYnVmc1tpXS5jb3B5KGRzdCwgYnVmb2ZmLCBzdGFydCwgc3RhcnQgKyBieXRlcylcbiAgICAgIGJyZWFrXG4gICAgfVxuXG4gICAgYnVmb2ZmICs9IGxcbiAgICBieXRlcyAtPSBsXG5cbiAgICBpZiAoc3RhcnQpXG4gICAgICBzdGFydCA9IDBcbiAgfVxuXG4gIHJldHVybiBkc3Rcbn1cblxuQnVmZmVyTGlzdC5wcm90b3R5cGUuc2hhbGxvd1NsaWNlID0gZnVuY3Rpb24gc2hhbGxvd1NsaWNlIChzdGFydCwgZW5kKSB7XG4gIHN0YXJ0ID0gc3RhcnQgfHwgMFxuICBlbmQgPSBlbmQgfHwgdGhpcy5sZW5ndGhcblxuICBpZiAoc3RhcnQgPCAwKVxuICAgIHN0YXJ0ICs9IHRoaXMubGVuZ3RoXG4gIGlmIChlbmQgPCAwKVxuICAgIGVuZCArPSB0aGlzLmxlbmd0aFxuXG4gIHZhciBzdGFydE9mZnNldCA9IHRoaXMuX29mZnNldChzdGFydClcbiAgICAsIGVuZE9mZnNldCA9IHRoaXMuX29mZnNldChlbmQpXG4gICAgLCBidWZmZXJzID0gdGhpcy5fYnVmcy5zbGljZShzdGFydE9mZnNldFswXSwgZW5kT2Zmc2V0WzBdICsgMSlcblxuICBpZiAoZW5kT2Zmc2V0WzFdID09IDApXG4gICAgYnVmZmVycy5wb3AoKVxuICBlbHNlXG4gICAgYnVmZmVyc1tidWZmZXJzLmxlbmd0aC0xXSA9IGJ1ZmZlcnNbYnVmZmVycy5sZW5ndGgtMV0uc2xpY2UoMCwgZW5kT2Zmc2V0WzFdKVxuXG4gIGlmIChzdGFydE9mZnNldFsxXSAhPSAwKVxuICAgIGJ1ZmZlcnNbMF0gPSBidWZmZXJzWzBdLnNsaWNlKHN0YXJ0T2Zmc2V0WzFdKVxuXG4gIHJldHVybiBuZXcgQnVmZmVyTGlzdChidWZmZXJzKVxufVxuXG5CdWZmZXJMaXN0LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nIChlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICByZXR1cm4gdGhpcy5zbGljZShzdGFydCwgZW5kKS50b1N0cmluZyhlbmNvZGluZylcbn1cblxuQnVmZmVyTGlzdC5wcm90b3R5cGUuY29uc3VtZSA9IGZ1bmN0aW9uIGNvbnN1bWUgKGJ5dGVzKSB7XG4gIHdoaWxlICh0aGlzLl9idWZzLmxlbmd0aCkge1xuICAgIGlmIChieXRlcyA+PSB0aGlzLl9idWZzWzBdLmxlbmd0aCkge1xuICAgICAgYnl0ZXMgLT0gdGhpcy5fYnVmc1swXS5sZW5ndGhcbiAgICAgIHRoaXMubGVuZ3RoIC09IHRoaXMuX2J1ZnNbMF0ubGVuZ3RoXG4gICAgICB0aGlzLl9idWZzLnNoaWZ0KClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fYnVmc1swXSA9IHRoaXMuX2J1ZnNbMF0uc2xpY2UoYnl0ZXMpXG4gICAgICB0aGlzLmxlbmd0aCAtPSBieXRlc1xuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuXG5CdWZmZXJMaXN0LnByb3RvdHlwZS5kdXBsaWNhdGUgPSBmdW5jdGlvbiBkdXBsaWNhdGUgKCkge1xuICB2YXIgaSA9IDBcbiAgICAsIGNvcHkgPSBuZXcgQnVmZmVyTGlzdCgpXG5cbiAgZm9yICg7IGkgPCB0aGlzLl9idWZzLmxlbmd0aDsgaSsrKVxuICAgIGNvcHkuYXBwZW5kKHRoaXMuX2J1ZnNbaV0pXG5cbiAgcmV0dXJuIGNvcHlcbn1cblxuXG5CdWZmZXJMaXN0LnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gZGVzdHJveSAoKSB7XG4gIHRoaXMuX2J1ZnMubGVuZ3RoID0gMFxuICB0aGlzLmxlbmd0aCA9IDBcbiAgdGhpcy5wdXNoKG51bGwpXG59XG5cblxuOyhmdW5jdGlvbiAoKSB7XG4gIHZhciBtZXRob2RzID0ge1xuICAgICAgJ3JlYWREb3VibGVCRScgOiA4XG4gICAgLCAncmVhZERvdWJsZUxFJyA6IDhcbiAgICAsICdyZWFkRmxvYXRCRScgIDogNFxuICAgICwgJ3JlYWRGbG9hdExFJyAgOiA0XG4gICAgLCAncmVhZEludDMyQkUnICA6IDRcbiAgICAsICdyZWFkSW50MzJMRScgIDogNFxuICAgICwgJ3JlYWRVSW50MzJCRScgOiA0XG4gICAgLCAncmVhZFVJbnQzMkxFJyA6IDRcbiAgICAsICdyZWFkSW50MTZCRScgIDogMlxuICAgICwgJ3JlYWRJbnQxNkxFJyAgOiAyXG4gICAgLCAncmVhZFVJbnQxNkJFJyA6IDJcbiAgICAsICdyZWFkVUludDE2TEUnIDogMlxuICAgICwgJ3JlYWRJbnQ4JyAgICAgOiAxXG4gICAgLCAncmVhZFVJbnQ4JyAgICA6IDFcbiAgICAsICdyZWFkSW50QkUnICAgIDogbnVsbFxuICAgICwgJ3JlYWRJbnRMRScgICAgOiBudWxsXG4gICAgLCAncmVhZFVJbnRCRScgICA6IG51bGxcbiAgICAsICdyZWFkVUludExFJyAgIDogbnVsbFxuICB9XG5cbiAgZm9yICh2YXIgbSBpbiBtZXRob2RzKSB7XG4gICAgKGZ1bmN0aW9uIChtKSB7XG4gICAgICBpZiAobWV0aG9kc1ttXSA9PT0gbnVsbCkge1xuICAgICAgICBCdWZmZXJMaXN0LnByb3RvdHlwZVttXSA9IGZ1bmN0aW9uIChvZmZzZXQsIGJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zbGljZShvZmZzZXQsIG9mZnNldCArIGJ5dGVMZW5ndGgpW21dKDAsIGJ5dGVMZW5ndGgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBCdWZmZXJMaXN0LnByb3RvdHlwZVttXSA9IGZ1bmN0aW9uIChvZmZzZXQpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zbGljZShvZmZzZXQsIG9mZnNldCArIG1ldGhvZHNbbV0pW21dKDApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KG0pKVxuICB9XG59KCkpXG5cblxubW9kdWxlLmV4cG9ydHMgPSBCdWZmZXJMaXN0XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBub2RlL25vLWRlcHJlY2F0ZWQtYXBpICovXG52YXIgYnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJylcbnZhciBCdWZmZXIgPSBidWZmZXIuQnVmZmVyXG5cbi8vIGFsdGVybmF0aXZlIHRvIHVzaW5nIE9iamVjdC5rZXlzIGZvciBvbGQgYnJvd3NlcnNcbmZ1bmN0aW9uIGNvcHlQcm9wcyAoc3JjLCBkc3QpIHtcbiAgZm9yICh2YXIga2V5IGluIHNyYykge1xuICAgIGRzdFtrZXldID0gc3JjW2tleV1cbiAgfVxufVxuaWYgKEJ1ZmZlci5mcm9tICYmIEJ1ZmZlci5hbGxvYyAmJiBCdWZmZXIuYWxsb2NVbnNhZmUgJiYgQnVmZmVyLmFsbG9jVW5zYWZlU2xvdykge1xuICBtb2R1bGUuZXhwb3J0cyA9IGJ1ZmZlclxufSBlbHNlIHtcbiAgLy8gQ29weSBwcm9wZXJ0aWVzIGZyb20gcmVxdWlyZSgnYnVmZmVyJylcbiAgY29weVByb3BzKGJ1ZmZlciwgZXhwb3J0cylcbiAgZXhwb3J0cy5CdWZmZXIgPSBTYWZlQnVmZmVyXG59XG5cbmZ1bmN0aW9uIFNhZmVCdWZmZXIgKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBCdWZmZXIoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbi8vIENvcHkgc3RhdGljIG1ldGhvZHMgZnJvbSBCdWZmZXJcbmNvcHlQcm9wcyhCdWZmZXIsIFNhZmVCdWZmZXIpXG5cblNhZmVCdWZmZXIuZnJvbSA9IGZ1bmN0aW9uIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgcmV0dXJuIEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuU2FmZUJ1ZmZlci5hbGxvYyA9IGZ1bmN0aW9uIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgdmFyIGJ1ZiA9IEJ1ZmZlcihzaXplKVxuICBpZiAoZmlsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGJ1Zi5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgIH0gZWxzZSB7XG4gICAgICBidWYuZmlsbChmaWxsKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBidWYuZmlsbCgwKVxuICB9XG4gIHJldHVybiBidWZcbn1cblxuU2FmZUJ1ZmZlci5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfVxuICByZXR1cm4gQnVmZmVyKHNpemUpXG59XG5cblNhZmVCdWZmZXIuYWxsb2NVbnNhZmVTbG93ID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHJldHVybiBidWZmZXIuU2xvd0J1ZmZlcihzaXplKVxufVxuIiwiLyohXG4gKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci5cbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8ZmVyb3NzQGZlcm9zcy5vcmc+IDxodHRwOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbnZhciBiYXNlNjQgPSByZXF1aXJlKCdiYXNlNjQtanMnKVxudmFyIGllZWU3NTQgPSByZXF1aXJlKCdpZWVlNzU0JylcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnaXNhcnJheScpXG5cbmV4cG9ydHMuQnVmZmVyID0gQnVmZmVyXG5leHBvcnRzLlNsb3dCdWZmZXIgPSBTbG93QnVmZmVyXG5leHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTID0gNTBcblxuLyoqXG4gKiBJZiBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgOlxuICogICA9PT0gdHJ1ZSAgICBVc2UgVWludDhBcnJheSBpbXBsZW1lbnRhdGlvbiAoZmFzdGVzdClcbiAqICAgPT09IGZhbHNlICAgVXNlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiAobW9zdCBjb21wYXRpYmxlLCBldmVuIElFNilcbiAqXG4gKiBCcm93c2VycyB0aGF0IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGFyZSBJRSAxMCssIEZpcmVmb3ggNCssIENocm9tZSA3KywgU2FmYXJpIDUuMSssXG4gKiBPcGVyYSAxMS42KywgaU9TIDQuMisuXG4gKlxuICogRHVlIHRvIHZhcmlvdXMgYnJvd3NlciBidWdzLCBzb21ldGltZXMgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIHVzZWQgZXZlblxuICogd2hlbiB0aGUgYnJvd3NlciBzdXBwb3J0cyB0eXBlZCBhcnJheXMuXG4gKlxuICogTm90ZTpcbiAqXG4gKiAgIC0gRmlyZWZveCA0LTI5IGxhY2tzIHN1cHBvcnQgZm9yIGFkZGluZyBuZXcgcHJvcGVydGllcyB0byBgVWludDhBcnJheWAgaW5zdGFuY2VzLFxuICogICAgIFNlZTogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk1NDM4LlxuICpcbiAqICAgLSBDaHJvbWUgOS0xMCBpcyBtaXNzaW5nIHRoZSBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uLlxuICpcbiAqICAgLSBJRTEwIGhhcyBhIGJyb2tlbiBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYXJyYXlzIG9mXG4gKiAgICAgaW5jb3JyZWN0IGxlbmd0aCBpbiBzb21lIHNpdHVhdGlvbnMuXG5cbiAqIFdlIGRldGVjdCB0aGVzZSBidWdneSBicm93c2VycyBhbmQgc2V0IGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGAgdG8gYGZhbHNlYCBzbyB0aGV5XG4gKiBnZXQgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaXMgc2xvd2VyIGJ1dCBiZWhhdmVzIGNvcnJlY3RseS5cbiAqL1xuQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgPSBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVCAhPT0gdW5kZWZpbmVkXG4gID8gZ2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgOiB0eXBlZEFycmF5U3VwcG9ydCgpXG5cbi8qXG4gKiBFeHBvcnQga01heExlbmd0aCBhZnRlciB0eXBlZCBhcnJheSBzdXBwb3J0IGlzIGRldGVybWluZWQuXG4gKi9cbmV4cG9ydHMua01heExlbmd0aCA9IGtNYXhMZW5ndGgoKVxuXG5mdW5jdGlvbiB0eXBlZEFycmF5U3VwcG9ydCAoKSB7XG4gIHRyeSB7XG4gICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KDEpXG4gICAgYXJyLl9fcHJvdG9fXyA9IHtfX3Byb3RvX186IFVpbnQ4QXJyYXkucHJvdG90eXBlLCBmb286IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDQyIH19XG4gICAgcmV0dXJuIGFyci5mb28oKSA9PT0gNDIgJiYgLy8gdHlwZWQgYXJyYXkgaW5zdGFuY2VzIGNhbiBiZSBhdWdtZW50ZWRcbiAgICAgICAgdHlwZW9mIGFyci5zdWJhcnJheSA9PT0gJ2Z1bmN0aW9uJyAmJiAvLyBjaHJvbWUgOS0xMCBsYWNrIGBzdWJhcnJheWBcbiAgICAgICAgYXJyLnN1YmFycmF5KDEsIDEpLmJ5dGVMZW5ndGggPT09IDAgLy8gaWUxMCBoYXMgYnJva2VuIGBzdWJhcnJheWBcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmZ1bmN0aW9uIGtNYXhMZW5ndGggKCkge1xuICByZXR1cm4gQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgICA/IDB4N2ZmZmZmZmZcbiAgICA6IDB4M2ZmZmZmZmZcbn1cblxuZnVuY3Rpb24gY3JlYXRlQnVmZmVyICh0aGF0LCBsZW5ndGgpIHtcbiAgaWYgKGtNYXhMZW5ndGgoKSA8IGxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aCcpXG4gIH1cbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aClcbiAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjazogUmV0dXJuIGFuIG9iamVjdCBpbnN0YW5jZSBvZiB0aGUgQnVmZmVyIGNsYXNzXG4gICAgaWYgKHRoYXQgPT09IG51bGwpIHtcbiAgICAgIHRoYXQgPSBuZXcgQnVmZmVyKGxlbmd0aClcbiAgICB9XG4gICAgdGhhdC5sZW5ndGggPSBsZW5ndGhcbiAgfVxuXG4gIHJldHVybiB0aGF0XG59XG5cbi8qKlxuICogVGhlIEJ1ZmZlciBjb25zdHJ1Y3RvciByZXR1cm5zIGluc3RhbmNlcyBvZiBgVWludDhBcnJheWAgdGhhdCBoYXZlIHRoZWlyXG4gKiBwcm90b3R5cGUgY2hhbmdlZCB0byBgQnVmZmVyLnByb3RvdHlwZWAuIEZ1cnRoZXJtb3JlLCBgQnVmZmVyYCBpcyBhIHN1YmNsYXNzIG9mXG4gKiBgVWludDhBcnJheWAsIHNvIHRoZSByZXR1cm5lZCBpbnN0YW5jZXMgd2lsbCBoYXZlIGFsbCB0aGUgbm9kZSBgQnVmZmVyYCBtZXRob2RzXG4gKiBhbmQgdGhlIGBVaW50OEFycmF5YCBtZXRob2RzLiBTcXVhcmUgYnJhY2tldCBub3RhdGlvbiB3b3JrcyBhcyBleHBlY3RlZCAtLSBpdFxuICogcmV0dXJucyBhIHNpbmdsZSBvY3RldC5cbiAqXG4gKiBUaGUgYFVpbnQ4QXJyYXlgIHByb3RvdHlwZSByZW1haW5zIHVubW9kaWZpZWQuXG4gKi9cblxuZnVuY3Rpb24gQnVmZmVyIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmICEodGhpcyBpbnN0YW5jZW9mIEJ1ZmZlcikpIHtcbiAgICByZXR1cm4gbmV3IEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIC8vIENvbW1vbiBjYXNlLlxuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nT3JPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZydcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIGFsbG9jVW5zYWZlKHRoaXMsIGFyZylcbiAgfVxuICByZXR1cm4gZnJvbSh0aGlzLCBhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnBvb2xTaXplID0gODE5MiAvLyBub3QgdXNlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uXG5cbi8vIFRPRE86IExlZ2FjeSwgbm90IG5lZWRlZCBhbnltb3JlLiBSZW1vdmUgaW4gbmV4dCBtYWpvciB2ZXJzaW9uLlxuQnVmZmVyLl9hdWdtZW50ID0gZnVuY3Rpb24gKGFycikge1xuICBhcnIuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICByZXR1cm4gYXJyXG59XG5cbmZ1bmN0aW9uIGZyb20gKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZyb21TdHJpbmcodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQpXG4gIH1cblxuICByZXR1cm4gZnJvbU9iamVjdCh0aGF0LCB2YWx1ZSlcbn1cblxuLyoqXG4gKiBGdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBCdWZmZXIoYXJnLCBlbmNvZGluZykgYnV0IHRocm93cyBhIFR5cGVFcnJvclxuICogaWYgdmFsdWUgaXMgYSBudW1iZXIuXG4gKiBCdWZmZXIuZnJvbShzdHJbLCBlbmNvZGluZ10pXG4gKiBCdWZmZXIuZnJvbShhcnJheSlcbiAqIEJ1ZmZlci5mcm9tKGJ1ZmZlcilcbiAqIEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyWywgYnl0ZU9mZnNldFssIGxlbmd0aF1dKVxuICoqL1xuQnVmZmVyLmZyb20gPSBmdW5jdGlvbiAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gZnJvbShudWxsLCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5pZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgQnVmZmVyLnByb3RvdHlwZS5fX3Byb3RvX18gPSBVaW50OEFycmF5LnByb3RvdHlwZVxuICBCdWZmZXIuX19wcm90b19fID0gVWludDhBcnJheVxuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnNwZWNpZXMgJiZcbiAgICAgIEJ1ZmZlcltTeW1ib2wuc3BlY2llc10gPT09IEJ1ZmZlcikge1xuICAgIC8vIEZpeCBzdWJhcnJheSgpIGluIEVTMjAxNi4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9wdWxsLzk3XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlciwgU3ltYm9sLnNwZWNpZXMsIHtcbiAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSlcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRTaXplIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfSBlbHNlIGlmIChzaXplIDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWxsb2MgKHRoYXQsIHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgaWYgKHNpemUgPD0gMCkge1xuICAgIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSlcbiAgfVxuICBpZiAoZmlsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT25seSBwYXkgYXR0ZW50aW9uIHRvIGVuY29kaW5nIGlmIGl0J3MgYSBzdHJpbmcuIFRoaXNcbiAgICAvLyBwcmV2ZW50cyBhY2NpZGVudGFsbHkgc2VuZGluZyBpbiBhIG51bWJlciB0aGF0IHdvdWxkXG4gICAgLy8gYmUgaW50ZXJwcmV0dGVkIGFzIGEgc3RhcnQgb2Zmc2V0LlxuICAgIHJldHVybiB0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnXG4gICAgICA/IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKS5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgICAgOiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSkuZmlsbChmaWxsKVxuICB9XG4gIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSlcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiBhbGxvYyhzaXplWywgZmlsbFssIGVuY29kaW5nXV0pXG4gKiovXG5CdWZmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGFsbG9jKG51bGwsIHNpemUsIGZpbGwsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBhbGxvY1Vuc2FmZSAodGhhdCwgc2l6ZSkge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSA8IDAgPyAwIDogY2hlY2tlZChzaXplKSB8IDApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7ICsraSkge1xuICAgICAgdGhhdFtpXSA9IDBcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIEJ1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufVxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIFNsb3dCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufVxuXG5mdW5jdGlvbiBmcm9tU3RyaW5nICh0aGF0LCBzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnIHx8IGVuY29kaW5nID09PSAnJykge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gIH1cblxuICBpZiAoIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiZW5jb2RpbmdcIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJylcbiAgfVxuXG4gIHZhciBsZW5ndGggPSBieXRlTGVuZ3RoKHN0cmluZywgZW5jb2RpbmcpIHwgMFxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aClcblxuICB2YXIgYWN0dWFsID0gdGhhdC53cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuXG4gIGlmIChhY3R1YWwgIT09IGxlbmd0aCkge1xuICAgIC8vIFdyaXRpbmcgYSBoZXggc3RyaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMgd2lsbFxuICAgIC8vIGNhdXNlIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGZpcnN0IGludmFsaWQgY2hhcmFjdGVyIHRvIGJlIGlnbm9yZWQuIChlLmcuXG4gICAgLy8gJ2FieHhjZCcgd2lsbCBiZSB0cmVhdGVkIGFzICdhYicpXG4gICAgdGhhdCA9IHRoYXQuc2xpY2UoMCwgYWN0dWFsKVxuICB9XG5cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5TGlrZSAodGhhdCwgYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCA8IDAgPyAwIDogY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMFxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aClcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIHRoYXRbaV0gPSBhcnJheVtpXSAmIDI1NVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUJ1ZmZlciAodGhhdCwgYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICBhcnJheS5ieXRlTGVuZ3RoIC8vIHRoaXMgdGhyb3dzIGlmIGBhcnJheWAgaXMgbm90IGEgdmFsaWQgQXJyYXlCdWZmZXJcblxuICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXFwnb2Zmc2V0XFwnIGlzIG91dCBvZiBib3VuZHMnKVxuICB9XG5cbiAgaWYgKGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0ICsgKGxlbmd0aCB8fCAwKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcXCdsZW5ndGhcXCcgaXMgb3V0IG9mIGJvdW5kcycpXG4gIH1cblxuICBpZiAoYnl0ZU9mZnNldCA9PT0gdW5kZWZpbmVkICYmIGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSlcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQpXG4gIH0gZWxzZSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IGFycmF5XG4gICAgdGhhdC5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIHRoYXQgPSBmcm9tQXJyYXlMaWtlKHRoYXQsIGFycmF5KVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21PYmplY3QgKHRoYXQsIG9iaikge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKG9iaikpIHtcbiAgICB2YXIgbGVuID0gY2hlY2tlZChvYmoubGVuZ3RoKSB8IDBcbiAgICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbilcblxuICAgIGlmICh0aGF0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoYXRcbiAgICB9XG5cbiAgICBvYmouY29weSh0aGF0LCAwLCAwLCBsZW4pXG4gICAgcmV0dXJuIHRoYXRcbiAgfVxuXG4gIGlmIChvYmopIHtcbiAgICBpZiAoKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgb2JqLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB8fCAnbGVuZ3RoJyBpbiBvYmopIHtcbiAgICAgIGlmICh0eXBlb2Ygb2JqLmxlbmd0aCAhPT0gJ251bWJlcicgfHwgaXNuYW4ob2JqLmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCAwKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UodGhhdCwgb2JqKVxuICAgIH1cblxuICAgIGlmIChvYmoudHlwZSA9PT0gJ0J1ZmZlcicgJiYgaXNBcnJheShvYmouZGF0YSkpIHtcbiAgICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKHRoYXQsIG9iai5kYXRhKVxuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBhcnJheS1saWtlIG9iamVjdC4nKVxufVxuXG5mdW5jdGlvbiBjaGVja2VkIChsZW5ndGgpIHtcbiAgLy8gTm90ZTogY2Fubm90IHVzZSBgbGVuZ3RoIDwga01heExlbmd0aCgpYCBoZXJlIGJlY2F1c2UgdGhhdCBmYWlscyB3aGVuXG4gIC8vIGxlbmd0aCBpcyBOYU4gKHdoaWNoIGlzIG90aGVyd2lzZSBjb2VyY2VkIHRvIHplcm8uKVxuICBpZiAobGVuZ3RoID49IGtNYXhMZW5ndGgoKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICdzaXplOiAweCcgKyBrTWF4TGVuZ3RoKCkudG9TdHJpbmcoMTYpICsgJyBieXRlcycpXG4gIH1cbiAgcmV0dXJuIGxlbmd0aCB8IDBcbn1cblxuZnVuY3Rpb24gU2xvd0J1ZmZlciAobGVuZ3RoKSB7XG4gIGlmICgrbGVuZ3RoICE9IGxlbmd0aCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcVxuICAgIGxlbmd0aCA9IDBcbiAgfVxuICByZXR1cm4gQnVmZmVyLmFsbG9jKCtsZW5ndGgpXG59XG5cbkJ1ZmZlci5pc0J1ZmZlciA9IGZ1bmN0aW9uIGlzQnVmZmVyIChiKSB7XG4gIHJldHVybiAhIShiICE9IG51bGwgJiYgYi5faXNCdWZmZXIpXG59XG5cbkJ1ZmZlci5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAoYSwgYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihhKSB8fCAhQnVmZmVyLmlzQnVmZmVyKGIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIG11c3QgYmUgQnVmZmVycycpXG4gIH1cblxuICBpZiAoYSA9PT0gYikgcmV0dXJuIDBcblxuICB2YXIgeCA9IGEubGVuZ3RoXG4gIHZhciB5ID0gYi5sZW5ndGhcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICB4ID0gYVtpXVxuICAgICAgeSA9IGJbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG5CdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgY2FzZSAnYXNjaWknOlxuICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5CdWZmZXIuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0IChsaXN0LCBsZW5ndGgpIHtcbiAgaWYgKCFpc0FycmF5KGxpc3QpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBCdWZmZXIuYWxsb2MoMClcbiAgfVxuXG4gIHZhciBpXG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGxlbmd0aCA9IDBcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgbGVuZ3RoICs9IGxpc3RbaV0ubGVuZ3RoXG4gICAgfVxuICB9XG5cbiAgdmFyIGJ1ZmZlciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShsZW5ndGgpXG4gIHZhciBwb3MgPSAwXG4gIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGJ1ZiA9IGxpc3RbaV1cbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICAgIH1cbiAgICBidWYuY29weShidWZmZXIsIHBvcylcbiAgICBwb3MgKz0gYnVmLmxlbmd0aFxuICB9XG4gIHJldHVybiBidWZmZXJcbn1cblxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHN0cmluZykpIHtcbiAgICByZXR1cm4gc3RyaW5nLmxlbmd0aFxuICB9XG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgIChBcnJheUJ1ZmZlci5pc1ZpZXcoc3RyaW5nKSB8fCBzdHJpbmcgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpIHtcbiAgICByZXR1cm4gc3RyaW5nLmJ5dGVMZW5ndGhcbiAgfVxuICBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICBzdHJpbmcgPSAnJyArIHN0cmluZ1xuICB9XG5cbiAgdmFyIGxlbiA9IHN0cmluZy5sZW5ndGhcbiAgaWYgKGxlbiA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBVc2UgYSBmb3IgbG9vcCB0byBhdm9pZCByZWN1cnNpb25cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGVuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiBsZW4gKiAyXG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gbGVuID4+PiAxXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGggLy8gYXNzdW1lIHV0ZjhcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuXG5mdW5jdGlvbiBzbG93VG9TdHJpbmcgKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG5cbiAgLy8gTm8gbmVlZCB0byB2ZXJpZnkgdGhhdCBcInRoaXMubGVuZ3RoIDw9IE1BWF9VSU5UMzJcIiBzaW5jZSBpdCdzIGEgcmVhZC1vbmx5XG4gIC8vIHByb3BlcnR5IG9mIGEgdHlwZWQgYXJyYXkuXG5cbiAgLy8gVGhpcyBiZWhhdmVzIG5laXRoZXIgbGlrZSBTdHJpbmcgbm9yIFVpbnQ4QXJyYXkgaW4gdGhhdCB3ZSBzZXQgc3RhcnQvZW5kXG4gIC8vIHRvIHRoZWlyIHVwcGVyL2xvd2VyIGJvdW5kcyBpZiB0aGUgdmFsdWUgcGFzc2VkIGlzIG91dCBvZiByYW5nZS5cbiAgLy8gdW5kZWZpbmVkIGlzIGhhbmRsZWQgc3BlY2lhbGx5IGFzIHBlciBFQ01BLTI2MiA2dGggRWRpdGlvbixcbiAgLy8gU2VjdGlvbiAxMy4zLjMuNyBSdW50aW1lIFNlbWFudGljczogS2V5ZWRCaW5kaW5nSW5pdGlhbGl6YXRpb24uXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkIHx8IHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIC8vIFJldHVybiBlYXJseSBpZiBzdGFydCA+IHRoaXMubGVuZ3RoLiBEb25lIGhlcmUgdG8gcHJldmVudCBwb3RlbnRpYWwgdWludDMyXG4gIC8vIGNvZXJjaW9uIGZhaWwgYmVsb3cuXG4gIGlmIChzdGFydCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKGVuZCA8PSAwKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICAvLyBGb3JjZSBjb2Vyc2lvbiB0byB1aW50MzIuIFRoaXMgd2lsbCBhbHNvIGNvZXJjZSBmYWxzZXkvTmFOIHZhbHVlcyB0byAwLlxuICBlbmQgPj4+PSAwXG4gIHN0YXJ0ID4+Pj0gMFxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9IChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG4vLyBUaGUgcHJvcGVydHkgaXMgdXNlZCBieSBgQnVmZmVyLmlzQnVmZmVyYCBhbmQgYGlzLWJ1ZmZlcmAgKGluIFNhZmFyaSA1LTcpIHRvIGRldGVjdFxuLy8gQnVmZmVyIGluc3RhbmNlcy5cbkJ1ZmZlci5wcm90b3R5cGUuX2lzQnVmZmVyID0gdHJ1ZVxuXG5mdW5jdGlvbiBzd2FwIChiLCBuLCBtKSB7XG4gIHZhciBpID0gYltuXVxuICBiW25dID0gYlttXVxuICBiW21dID0gaVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAxNiA9IGZ1bmN0aW9uIHN3YXAxNiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgMiAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gMikge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDEpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMzIgPSBmdW5jdGlvbiBzd2FwMzIgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDQgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAzKVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyAyKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDY0ID0gZnVuY3Rpb24gc3dhcDY0ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA4ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA4KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgNylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgNilcbiAgICBzd2FwKHRoaXMsIGkgKyAyLCBpICsgNSlcbiAgICBzd2FwKHRoaXMsIGkgKyAzLCBpICsgNClcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGggfCAwXG4gIGlmIChsZW5ndGggPT09IDApIHJldHVybiAnJ1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCAwLCBsZW5ndGgpXG4gIHJldHVybiBzbG93VG9TdHJpbmcuYXBwbHkodGhpcywgYXJndW1lbnRzKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyAoYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIGlmICh0aGlzID09PSBiKSByZXR1cm4gdHJ1ZVxuICByZXR1cm4gQnVmZmVyLmNvbXBhcmUodGhpcywgYikgPT09IDBcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCAoKSB7XG4gIHZhciBzdHIgPSAnJ1xuICB2YXIgbWF4ID0gZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFU1xuICBpZiAodGhpcy5sZW5ndGggPiAwKSB7XG4gICAgc3RyID0gdGhpcy50b1N0cmluZygnaGV4JywgMCwgbWF4KS5tYXRjaCgvLnsyfS9nKS5qb2luKCcgJylcbiAgICBpZiAodGhpcy5sZW5ndGggPiBtYXgpIHN0ciArPSAnIC4uLiAnXG4gIH1cbiAgcmV0dXJuICc8QnVmZmVyICcgKyBzdHIgKyAnPidcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAodGFyZ2V0LCBzdGFydCwgZW5kLCB0aGlzU3RhcnQsIHRoaXNFbmQpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGFyZ2V0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICB9XG5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmQgPSB0YXJnZXQgPyB0YXJnZXQubGVuZ3RoIDogMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNTdGFydCA9IDBcbiAgfVxuICBpZiAodGhpc0VuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc0VuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoc3RhcnQgPCAwIHx8IGVuZCA+IHRhcmdldC5sZW5ndGggfHwgdGhpc1N0YXJ0IDwgMCB8fCB0aGlzRW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCAmJiBzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCkge1xuICAgIHJldHVybiAtMVxuICB9XG4gIGlmIChzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMVxuICB9XG5cbiAgc3RhcnQgPj4+PSAwXG4gIGVuZCA+Pj49IDBcbiAgdGhpc1N0YXJ0ID4+Pj0gMFxuICB0aGlzRW5kID4+Pj0gMFxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQpIHJldHVybiAwXG5cbiAgdmFyIHggPSB0aGlzRW5kIC0gdGhpc1N0YXJ0XG4gIHZhciB5ID0gZW5kIC0gc3RhcnRcbiAgdmFyIGxlbiA9IE1hdGgubWluKHgsIHkpXG5cbiAgdmFyIHRoaXNDb3B5ID0gdGhpcy5zbGljZSh0aGlzU3RhcnQsIHRoaXNFbmQpXG4gIHZhciB0YXJnZXRDb3B5ID0gdGFyZ2V0LnNsaWNlKHN0YXJ0LCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgIGlmICh0aGlzQ29weVtpXSAhPT0gdGFyZ2V0Q29weVtpXSkge1xuICAgICAgeCA9IHRoaXNDb3B5W2ldXG4gICAgICB5ID0gdGFyZ2V0Q29weVtpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbi8vIEZpbmRzIGVpdGhlciB0aGUgZmlyc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0ID49IGBieXRlT2Zmc2V0YCxcbi8vIE9SIHRoZSBsYXN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA8PSBgYnl0ZU9mZnNldGAuXG4vL1xuLy8gQXJndW1lbnRzOlxuLy8gLSBidWZmZXIgLSBhIEJ1ZmZlciB0byBzZWFyY2hcbi8vIC0gdmFsIC0gYSBzdHJpbmcsIEJ1ZmZlciwgb3IgbnVtYmVyXG4vLyAtIGJ5dGVPZmZzZXQgLSBhbiBpbmRleCBpbnRvIGBidWZmZXJgOyB3aWxsIGJlIGNsYW1wZWQgdG8gYW4gaW50MzJcbi8vIC0gZW5jb2RpbmcgLSBhbiBvcHRpb25hbCBlbmNvZGluZywgcmVsZXZhbnQgaXMgdmFsIGlzIGEgc3RyaW5nXG4vLyAtIGRpciAtIHRydWUgZm9yIGluZGV4T2YsIGZhbHNlIGZvciBsYXN0SW5kZXhPZlxuZnVuY3Rpb24gYmlkaXJlY3Rpb25hbEluZGV4T2YgKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIC8vIEVtcHR5IGJ1ZmZlciBtZWFucyBubyBtYXRjaFxuICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIC0xXG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXRcbiAgaWYgKHR5cGVvZiBieXRlT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gYnl0ZU9mZnNldFxuICAgIGJ5dGVPZmZzZXQgPSAwXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA+IDB4N2ZmZmZmZmYpIHtcbiAgICBieXRlT2Zmc2V0ID0gMHg3ZmZmZmZmZlxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAtMHg4MDAwMDAwMCkge1xuICAgIGJ5dGVPZmZzZXQgPSAtMHg4MDAwMDAwMFxuICB9XG4gIGJ5dGVPZmZzZXQgPSArYnl0ZU9mZnNldCAgLy8gQ29lcmNlIHRvIE51bWJlci5cbiAgaWYgKGlzTmFOKGJ5dGVPZmZzZXQpKSB7XG4gICAgLy8gYnl0ZU9mZnNldDogaXQgaXQncyB1bmRlZmluZWQsIG51bGwsIE5hTiwgXCJmb29cIiwgZXRjLCBzZWFyY2ggd2hvbGUgYnVmZmVyXG4gICAgYnl0ZU9mZnNldCA9IGRpciA/IDAgOiAoYnVmZmVyLmxlbmd0aCAtIDEpXG4gIH1cblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldDogbmVnYXRpdmUgb2Zmc2V0cyBzdGFydCBmcm9tIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlclxuICBpZiAoYnl0ZU9mZnNldCA8IDApIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoICsgYnl0ZU9mZnNldFxuICBpZiAoYnl0ZU9mZnNldCA+PSBidWZmZXIubGVuZ3RoKSB7XG4gICAgaWYgKGRpcikgcmV0dXJuIC0xXG4gICAgZWxzZSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCAtIDFcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgMCkge1xuICAgIGlmIChkaXIpIGJ5dGVPZmZzZXQgPSAwXG4gICAgZWxzZSByZXR1cm4gLTFcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSB2YWxcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFsID0gQnVmZmVyLmZyb20odmFsLCBlbmNvZGluZylcbiAgfVxuXG4gIC8vIEZpbmFsbHksIHNlYXJjaCBlaXRoZXIgaW5kZXhPZiAoaWYgZGlyIGlzIHRydWUpIG9yIGxhc3RJbmRleE9mXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsKSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogbG9va2luZyBmb3IgZW1wdHkgc3RyaW5nL2J1ZmZlciBhbHdheXMgZmFpbHNcbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAweEZGIC8vIFNlYXJjaCBmb3IgYSBieXRlIHZhbHVlIFswLTI1NV1cbiAgICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiZcbiAgICAgICAgdHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmIChkaXIpIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgWyB2YWwgXSwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlcicpXG59XG5cbmZ1bmN0aW9uIGFycmF5SW5kZXhPZiAoYXJyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgdmFyIGluZGV4U2l6ZSA9IDFcbiAgdmFyIGFyckxlbmd0aCA9IGFyci5sZW5ndGhcbiAgdmFyIHZhbExlbmd0aCA9IHZhbC5sZW5ndGhcblxuICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgaWYgKGVuY29kaW5nID09PSAndWNzMicgfHwgZW5jb2RpbmcgPT09ICd1Y3MtMicgfHxcbiAgICAgICAgZW5jb2RpbmcgPT09ICd1dGYxNmxlJyB8fCBlbmNvZGluZyA9PT0gJ3V0Zi0xNmxlJykge1xuICAgICAgaWYgKGFyci5sZW5ndGggPCAyIHx8IHZhbC5sZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfVxuICAgICAgaW5kZXhTaXplID0gMlxuICAgICAgYXJyTGVuZ3RoIC89IDJcbiAgICAgIHZhbExlbmd0aCAvPSAyXG4gICAgICBieXRlT2Zmc2V0IC89IDJcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWFkIChidWYsIGkpIHtcbiAgICBpZiAoaW5kZXhTaXplID09PSAxKSB7XG4gICAgICByZXR1cm4gYnVmW2ldXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBidWYucmVhZFVJbnQxNkJFKGkgKiBpbmRleFNpemUpXG4gICAgfVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGRpcikge1xuICAgIHZhciBmb3VuZEluZGV4ID0gLTFcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpIDwgYXJyTGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChyZWFkKGFyciwgaSkgPT09IHJlYWQodmFsLCBmb3VuZEluZGV4ID09PSAtMSA/IDAgOiBpIC0gZm91bmRJbmRleCkpIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggPT09IC0xKSBmb3VuZEluZGV4ID0gaVxuICAgICAgICBpZiAoaSAtIGZvdW5kSW5kZXggKyAxID09PSB2YWxMZW5ndGgpIHJldHVybiBmb3VuZEluZGV4ICogaW5kZXhTaXplXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZm91bmRJbmRleCAhPT0gLTEpIGkgLT0gaSAtIGZvdW5kSW5kZXhcbiAgICAgICAgZm91bmRJbmRleCA9IC0xXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChieXRlT2Zmc2V0ICsgdmFsTGVuZ3RoID4gYXJyTGVuZ3RoKSBieXRlT2Zmc2V0ID0gYXJyTGVuZ3RoIC0gdmFsTGVuZ3RoXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBmb3VuZCA9IHRydWVcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmFsTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKHJlYWQoYXJyLCBpICsgaikgIT09IHJlYWQodmFsLCBqKSkge1xuICAgICAgICAgIGZvdW5kID0gZmFsc2VcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZm91bmQpIHJldHVybiBpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gdGhpcy5pbmRleE9mKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpICE9PSAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCB0cnVlKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmxhc3RJbmRleE9mID0gZnVuY3Rpb24gbGFzdEluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGZhbHNlKVxufVxuXG5mdW5jdGlvbiBoZXhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIG9mZnNldCA9IE51bWJlcihvZmZzZXQpIHx8IDBcbiAgdmFyIHJlbWFpbmluZyA9IGJ1Zi5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKVxuICAgIGlmIChsZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICAgIH1cbiAgfVxuXG4gIC8vIG11c3QgYmUgYW4gZXZlbiBudW1iZXIgb2YgZGlnaXRzXG4gIHZhciBzdHJMZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGlmIChzdHJMZW4gJSAyICE9PSAwKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGhleCBzdHJpbmcnKVxuXG4gIGlmIChsZW5ndGggPiBzdHJMZW4gLyAyKSB7XG4gICAgbGVuZ3RoID0gc3RyTGVuIC8gMlxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nLnN1YnN0cihpICogMiwgMiksIDE2KVxuICAgIGlmIChpc05hTihwYXJzZWQpKSByZXR1cm4gaVxuICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHBhcnNlZFxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIHV0ZjhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjhUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGFzY2lpV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihhc2NpaVRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gbGF0aW4xV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYXNjaWlXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGJhc2U2NFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYmFzZTY0VG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiB1Y3MyV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGYxNmxlVG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gd3JpdGUgKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKSB7XG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcpXG4gIGlmIChvZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBvZmZzZXRcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgb2Zmc2V0WywgbGVuZ3RoXVssIGVuY29kaW5nXSlcbiAgfSBlbHNlIGlmIChpc0Zpbml0ZShvZmZzZXQpKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICAgIGlmIChpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICBsZW5ndGggPSBsZW5ndGggfCAwXG4gICAgICBpZiAoZW5jb2RpbmcgPT09IHVuZGVmaW5lZCkgZW5jb2RpbmcgPSAndXRmOCdcbiAgICB9IGVsc2Uge1xuICAgICAgZW5jb2RpbmcgPSBsZW5ndGhcbiAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZFxuICAgIH1cbiAgLy8gbGVnYWN5IHdyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldCwgbGVuZ3RoKSAtIHJlbW92ZSBpbiB2MC4xM1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCdcbiAgICApXG4gIH1cblxuICB2YXIgcmVtYWluaW5nID0gdGhpcy5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IGxlbmd0aCA+IHJlbWFpbmluZykgbGVuZ3RoID0gcmVtYWluaW5nXG5cbiAgaWYgKChzdHJpbmcubGVuZ3RoID4gMCAmJiAobGVuZ3RoIDwgMCB8fCBvZmZzZXQgPCAwKSkgfHwgb2Zmc2V0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsYXRpbjFXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICAvLyBXYXJuaW5nOiBtYXhMZW5ndGggbm90IHRha2VuIGludG8gYWNjb3VudCBpbiBiYXNlNjRXcml0ZVxuICAgICAgICByZXR1cm4gYmFzZTY0V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHVjczJXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04gKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdCdWZmZXInLFxuICAgIGRhdGE6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2FyciB8fCB0aGlzLCAwKVxuICB9XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKHN0YXJ0ID09PSAwICYmIGVuZCA9PT0gYnVmLmxlbmd0aCkge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1Zi5zbGljZShzdGFydCwgZW5kKSlcbiAgfVxufVxuXG5mdW5jdGlvbiB1dGY4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG4gIHZhciByZXMgPSBbXVxuXG4gIHZhciBpID0gc3RhcnRcbiAgd2hpbGUgKGkgPCBlbmQpIHtcbiAgICB2YXIgZmlyc3RCeXRlID0gYnVmW2ldXG4gICAgdmFyIGNvZGVQb2ludCA9IG51bGxcbiAgICB2YXIgYnl0ZXNQZXJTZXF1ZW5jZSA9IChmaXJzdEJ5dGUgPiAweEVGKSA/IDRcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4REYpID8gM1xuICAgICAgOiAoZmlyc3RCeXRlID4gMHhCRikgPyAyXG4gICAgICA6IDFcblxuICAgIGlmIChpICsgYnl0ZXNQZXJTZXF1ZW5jZSA8PSBlbmQpIHtcbiAgICAgIHZhciBzZWNvbmRCeXRlLCB0aGlyZEJ5dGUsIGZvdXJ0aEJ5dGUsIHRlbXBDb2RlUG9pbnRcblxuICAgICAgc3dpdGNoIChieXRlc1BlclNlcXVlbmNlKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBpZiAoZmlyc3RCeXRlIDwgMHg4MCkge1xuICAgICAgICAgICAgY29kZVBvaW50ID0gZmlyc3RCeXRlXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4MUYpIDw8IDB4NiB8IChzZWNvbmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3Rikge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweEMgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4NiB8ICh0aGlyZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGRiAmJiAodGVtcENvZGVQb2ludCA8IDB4RDgwMCB8fCB0ZW1wQ29kZVBvaW50ID4gMHhERkZGKSkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBmb3VydGhCeXRlID0gYnVmW2kgKyAzXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAoZm91cnRoQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHgxMiB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHhDIHwgKHRoaXJkQnl0ZSAmIDB4M0YpIDw8IDB4NiB8IChmb3VydGhCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHhGRkZGICYmIHRlbXBDb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb2RlUG9pbnQgPT09IG51bGwpIHtcbiAgICAgIC8vIHdlIGRpZCBub3QgZ2VuZXJhdGUgYSB2YWxpZCBjb2RlUG9pbnQgc28gaW5zZXJ0IGFcbiAgICAgIC8vIHJlcGxhY2VtZW50IGNoYXIgKFUrRkZGRCkgYW5kIGFkdmFuY2Ugb25seSAxIGJ5dGVcbiAgICAgIGNvZGVQb2ludCA9IDB4RkZGRFxuICAgICAgYnl0ZXNQZXJTZXF1ZW5jZSA9IDFcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA+IDB4RkZGRikge1xuICAgICAgLy8gZW5jb2RlIHRvIHV0ZjE2IChzdXJyb2dhdGUgcGFpciBkYW5jZSlcbiAgICAgIGNvZGVQb2ludCAtPSAweDEwMDAwXG4gICAgICByZXMucHVzaChjb2RlUG9pbnQgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApXG4gICAgICBjb2RlUG9pbnQgPSAweERDMDAgfCBjb2RlUG9pbnQgJiAweDNGRlxuICAgIH1cblxuICAgIHJlcy5wdXNoKGNvZGVQb2ludClcbiAgICBpICs9IGJ5dGVzUGVyU2VxdWVuY2VcbiAgfVxuXG4gIHJldHVybiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkocmVzKVxufVxuXG4vLyBCYXNlZCBvbiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMjc0NzI3Mi82ODA3NDIsIHRoZSBicm93c2VyIHdpdGhcbi8vIHRoZSBsb3dlc3QgbGltaXQgaXMgQ2hyb21lLCB3aXRoIDB4MTAwMDAgYXJncy5cbi8vIFdlIGdvIDEgbWFnbml0dWRlIGxlc3MsIGZvciBzYWZldHlcbnZhciBNQVhfQVJHVU1FTlRTX0xFTkdUSCA9IDB4MTAwMFxuXG5mdW5jdGlvbiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkgKGNvZGVQb2ludHMpIHtcbiAgdmFyIGxlbiA9IGNvZGVQb2ludHMubGVuZ3RoXG4gIGlmIChsZW4gPD0gTUFYX0FSR1VNRU5UU19MRU5HVEgpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGNvZGVQb2ludHMpIC8vIGF2b2lkIGV4dHJhIHNsaWNlKClcbiAgfVxuXG4gIC8vIERlY29kZSBpbiBjaHVua3MgdG8gYXZvaWQgXCJjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIi5cbiAgdmFyIHJlcyA9ICcnXG4gIHZhciBpID0gMFxuICB3aGlsZSAoaSA8IGxlbikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFxuICAgICAgU3RyaW5nLFxuICAgICAgY29kZVBvaW50cy5zbGljZShpLCBpICs9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKVxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldICYgMHg3RilcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGxhdGluMVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGhleFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGhcblxuICBpZiAoIXN0YXJ0IHx8IHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIGlmICghZW5kIHx8IGVuZCA8IDAgfHwgZW5kID4gbGVuKSBlbmQgPSBsZW5cblxuICB2YXIgb3V0ID0gJydcbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICBvdXQgKz0gdG9IZXgoYnVmW2ldKVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGJ5dGVzID0gYnVmLnNsaWNlKHN0YXJ0LCBlbmQpXG4gIHZhciByZXMgPSAnJ1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0gKyBieXRlc1tpICsgMV0gKiAyNTYpXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIHN0YXJ0ID0gfn5zdGFydFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IH5+ZW5kXG5cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ICs9IGxlblxuICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMFxuICB9IGVsc2UgaWYgKHN0YXJ0ID4gbGVuKSB7XG4gICAgc3RhcnQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCAwKSB7XG4gICAgZW5kICs9IGxlblxuICAgIGlmIChlbmQgPCAwKSBlbmQgPSAwXG4gIH0gZWxzZSBpZiAoZW5kID4gbGVuKSB7XG4gICAgZW5kID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgdmFyIG5ld0J1ZlxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBuZXdCdWYgPSB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpXG4gICAgbmV3QnVmLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICB2YXIgc2xpY2VMZW4gPSBlbmQgLSBzdGFydFxuICAgIG5ld0J1ZiA9IG5ldyBCdWZmZXIoc2xpY2VMZW4sIHVuZGVmaW5lZClcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWNlTGVuOyArK2kpIHtcbiAgICAgIG5ld0J1ZltpXSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdCdWZcbn1cblxuLypcbiAqIE5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYnVmZmVyIGlzbid0IHRyeWluZyB0byB3cml0ZSBvdXQgb2YgYm91bmRzLlxuICovXG5mdW5jdGlvbiBjaGVja09mZnNldCAob2Zmc2V0LCBleHQsIGxlbmd0aCkge1xuICBpZiAoKG9mZnNldCAlIDEpICE9PSAwIHx8IG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdvZmZzZXQgaXMgbm90IHVpbnQnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gbGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRMRSA9IGZ1bmN0aW9uIHJlYWRVSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRCRSA9IGZ1bmN0aW9uIHJlYWRVSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG4gIH1cblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdXG4gIHZhciBtdWwgPSAxXG4gIHdoaWxlIChieXRlTGVuZ3RoID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDggPSBmdW5jdGlvbiByZWFkVUludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2QkUgPSBmdW5jdGlvbiByZWFkVUludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgOCkgfCB0aGlzW29mZnNldCArIDFdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkxFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICgodGhpc1tvZmZzZXRdKSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikpICtcbiAgICAgICh0aGlzW29mZnNldCArIDNdICogMHgxMDAwMDAwKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdICogMHgxMDAwMDAwKSArXG4gICAgKCh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgIHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludExFID0gZnVuY3Rpb24gcmVhZEludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludEJFID0gZnVuY3Rpb24gcmVhZEludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoXG4gIHZhciBtdWwgPSAxXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0taV1cbiAgd2hpbGUgKGkgPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1pXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDggPSBmdW5jdGlvbiByZWFkSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICBpZiAoISh0aGlzW29mZnNldF0gJiAweDgwKSkgcmV0dXJuICh0aGlzW29mZnNldF0pXG4gIHJldHVybiAoKDB4ZmYgLSB0aGlzW29mZnNldF0gKyAxKSAqIC0xKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkxFID0gZnVuY3Rpb24gcmVhZEludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIDFdIHwgKHRoaXNbb2Zmc2V0XSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbiByZWFkSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdKSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10gPDwgMjQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyQkUgPSBmdW5jdGlvbiByZWFkSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDI0KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0TEUgPSBmdW5jdGlvbiByZWFkRmxvYXRMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0QkUgPSBmdW5jdGlvbiByZWFkRmxvYXRCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVMRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgNTIsIDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUJFID0gZnVuY3Rpb24gcmVhZERvdWJsZUJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgNTIsIDgpXG59XG5cbmZ1bmN0aW9uIGNoZWNrSW50IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJidWZmZXJcIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJylcbiAgaWYgKHZhbHVlID4gbWF4IHx8IHZhbHVlIDwgbWluKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50OCA9IGZ1bmN0aW9uIHdyaXRlVUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHhmZiwgMClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQxNiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmYgKyB2YWx1ZSArIDFcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCAyKTsgaSA8IGo7ICsraSkge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9ICh2YWx1ZSAmICgweGZmIDw8ICg4ICogKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkpKSkgPj4+XG4gICAgICAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSAqIDhcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQzMiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgNCk7IGkgPCBqOyArK2kpIHtcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSAodmFsdWUgPj4+IChsaXR0bGVFbmRpYW4gPyBpIDogMyAtIGkpICogOCkgJiAweGZmXG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50TEUgPSBmdW5jdGlvbiB3cml0ZUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gMFxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgLSAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50QkUgPSBmdW5jdGlvbiB3cml0ZUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IDBcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgKyAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50OCA9IGZ1bmN0aW9uIHdyaXRlSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweDdmLCAtMHg4MClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmYgKyB2YWx1ZSArIDFcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuZnVuY3Rpb24gY2hlY2tJRUVFNzU0IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxuICBpZiAob2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRmxvYXQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgNCwgMy40MDI4MjM0NjYzODUyODg2ZSszOCwgLTMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgMjMsIDQpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdExFID0gZnVuY3Rpb24gd3JpdGVGbG9hdExFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0QkUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuZnVuY3Rpb24gd3JpdGVEb3VibGUgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgOCwgMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgsIC0xLjc5NzY5MzEzNDg2MjMxNTdFKzMwOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCA1MiwgOClcbiAgcmV0dXJuIG9mZnNldCArIDhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUxFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlQkUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG4vLyBjb3B5KHRhcmdldEJ1ZmZlciwgdGFyZ2V0U3RhcnQ9MCwgc291cmNlU3RhcnQ9MCwgc291cmNlRW5kPWJ1ZmZlci5sZW5ndGgpXG5CdWZmZXIucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5ICh0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKSB7XG4gIGlmICghc3RhcnQpIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCAmJiBlbmQgIT09IDApIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXRTdGFydCA+PSB0YXJnZXQubGVuZ3RoKSB0YXJnZXRTdGFydCA9IHRhcmdldC5sZW5ndGhcbiAgaWYgKCF0YXJnZXRTdGFydCkgdGFyZ2V0U3RhcnQgPSAwXG4gIGlmIChlbmQgPiAwICYmIGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIC8vIENvcHkgMCBieXRlczsgd2UncmUgZG9uZVxuICBpZiAoZW5kID09PSBzdGFydCkgcmV0dXJuIDBcbiAgaWYgKHRhcmdldC5sZW5ndGggPT09IDAgfHwgdGhpcy5sZW5ndGggPT09IDApIHJldHVybiAwXG5cbiAgLy8gRmF0YWwgZXJyb3IgY29uZGl0aW9uc1xuICBpZiAodGFyZ2V0U3RhcnQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3RhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICB9XG4gIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgaWYgKGVuZCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcycpXG5cbiAgLy8gQXJlIHdlIG9vYj9cbiAgaWYgKGVuZCA+IHRoaXMubGVuZ3RoKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0IDwgZW5kIC0gc3RhcnQpIHtcbiAgICBlbmQgPSB0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgKyBzdGFydFxuICB9XG5cbiAgdmFyIGxlbiA9IGVuZCAtIHN0YXJ0XG4gIHZhciBpXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCAmJiBzdGFydCA8IHRhcmdldFN0YXJ0ICYmIHRhcmdldFN0YXJ0IDwgZW5kKSB7XG4gICAgLy8gZGVzY2VuZGluZyBjb3B5IGZyb20gZW5kXG4gICAgZm9yIChpID0gbGVuIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2UgaWYgKGxlbiA8IDEwMDAgfHwgIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gYXNjZW5kaW5nIGNvcHkgZnJvbSBzdGFydFxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoXG4gICAgICB0YXJnZXQsXG4gICAgICB0aGlzLnN1YmFycmF5KHN0YXJ0LCBzdGFydCArIGxlbiksXG4gICAgICB0YXJnZXRTdGFydFxuICAgIClcbiAgfVxuXG4gIHJldHVybiBsZW5cbn1cblxuLy8gVXNhZ2U6XG4vLyAgICBidWZmZXIuZmlsbChudW1iZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKGJ1ZmZlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoc3RyaW5nWywgb2Zmc2V0WywgZW5kXV1bLCBlbmNvZGluZ10pXG5CdWZmZXIucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbiBmaWxsICh2YWwsIHN0YXJ0LCBlbmQsIGVuY29kaW5nKSB7XG4gIC8vIEhhbmRsZSBzdHJpbmcgY2FzZXM6XG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIGlmICh0eXBlb2Ygc3RhcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IHN0YXJ0XG4gICAgICBzdGFydCA9IDBcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZW5kID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBlbmRcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfVxuICAgIGlmICh2YWwubGVuZ3RoID09PSAxKSB7XG4gICAgICB2YXIgY29kZSA9IHZhbC5jaGFyQ29kZUF0KDApXG4gICAgICBpZiAoY29kZSA8IDI1Nikge1xuICAgICAgICB2YWwgPSBjb2RlXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2VuY29kaW5nIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJyAmJiAhQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMjU1XG4gIH1cblxuICAvLyBJbnZhbGlkIHJhbmdlcyBhcmUgbm90IHNldCB0byBhIGRlZmF1bHQsIHNvIGNhbiByYW5nZSBjaGVjayBlYXJseS5cbiAgaWYgKHN0YXJ0IDwgMCB8fCB0aGlzLmxlbmd0aCA8IHN0YXJ0IHx8IHRoaXMubGVuZ3RoIDwgZW5kKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ091dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHN0YXJ0ID0gc3RhcnQgPj4+IDBcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyB0aGlzLmxlbmd0aCA6IGVuZCA+Pj4gMFxuXG4gIGlmICghdmFsKSB2YWwgPSAwXG5cbiAgdmFyIGlcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgdGhpc1tpXSA9IHZhbFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgYnl0ZXMgPSBCdWZmZXIuaXNCdWZmZXIodmFsKVxuICAgICAgPyB2YWxcbiAgICAgIDogdXRmOFRvQnl0ZXMobmV3IEJ1ZmZlcih2YWwsIGVuY29kaW5nKS50b1N0cmluZygpKVxuICAgIHZhciBsZW4gPSBieXRlcy5sZW5ndGhcbiAgICBmb3IgKGkgPSAwOyBpIDwgZW5kIC0gc3RhcnQ7ICsraSkge1xuICAgICAgdGhpc1tpICsgc3RhcnRdID0gYnl0ZXNbaSAlIGxlbl1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpc1xufVxuXG4vLyBIRUxQRVIgRlVOQ1RJT05TXG4vLyA9PT09PT09PT09PT09PT09XG5cbnZhciBJTlZBTElEX0JBU0U2NF9SRSA9IC9bXitcXC8wLTlBLVphLXotX10vZ1xuXG5mdW5jdGlvbiBiYXNlNjRjbGVhbiAoc3RyKSB7XG4gIC8vIE5vZGUgc3RyaXBzIG91dCBpbnZhbGlkIGNoYXJhY3RlcnMgbGlrZSBcXG4gYW5kIFxcdCBmcm9tIHRoZSBzdHJpbmcsIGJhc2U2NC1qcyBkb2VzIG5vdFxuICBzdHIgPSBzdHJpbmd0cmltKHN0cikucmVwbGFjZShJTlZBTElEX0JBU0U2NF9SRSwgJycpXG4gIC8vIE5vZGUgY29udmVydHMgc3RyaW5ncyB3aXRoIGxlbmd0aCA8IDIgdG8gJydcbiAgaWYgKHN0ci5sZW5ndGggPCAyKSByZXR1cm4gJydcbiAgLy8gTm9kZSBhbGxvd3MgZm9yIG5vbi1wYWRkZWQgYmFzZTY0IHN0cmluZ3MgKG1pc3NpbmcgdHJhaWxpbmcgPT09KSwgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHdoaWxlIChzdHIubGVuZ3RoICUgNCAhPT0gMCkge1xuICAgIHN0ciA9IHN0ciArICc9J1xuICB9XG4gIHJldHVybiBzdHJcbn1cblxuZnVuY3Rpb24gc3RyaW5ndHJpbSAoc3RyKSB7XG4gIGlmIChzdHIudHJpbSkgcmV0dXJuIHN0ci50cmltKClcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJylcbn1cblxuZnVuY3Rpb24gdG9IZXggKG4pIHtcbiAgaWYgKG4gPCAxNikgcmV0dXJuICcwJyArIG4udG9TdHJpbmcoMTYpXG4gIHJldHVybiBuLnRvU3RyaW5nKDE2KVxufVxuXG5mdW5jdGlvbiB1dGY4VG9CeXRlcyAoc3RyaW5nLCB1bml0cykge1xuICB1bml0cyA9IHVuaXRzIHx8IEluZmluaXR5XG4gIHZhciBjb2RlUG9pbnRcbiAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGhcbiAgdmFyIGxlYWRTdXJyb2dhdGUgPSBudWxsXG4gIHZhciBieXRlcyA9IFtdXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGNvZGVQb2ludCA9IHN0cmluZy5jaGFyQ29kZUF0KGkpXG5cbiAgICAvLyBpcyBzdXJyb2dhdGUgY29tcG9uZW50XG4gICAgaWYgKGNvZGVQb2ludCA+IDB4RDdGRiAmJiBjb2RlUG9pbnQgPCAweEUwMDApIHtcbiAgICAgIC8vIGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoIWxlYWRTdXJyb2dhdGUpIHtcbiAgICAgICAgLy8gbm8gbGVhZCB5ZXRcbiAgICAgICAgaWYgKGNvZGVQb2ludCA+IDB4REJGRikge1xuICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgdHJhaWxcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9IGVsc2UgaWYgKGkgKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICAvLyB1bnBhaXJlZCBsZWFkXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHZhbGlkIGxlYWRcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIDIgbGVhZHMgaW4gYSByb3dcbiAgICAgIGlmIChjb2RlUG9pbnQgPCAweERDMDApIHtcbiAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gdmFsaWQgc3Vycm9nYXRlIHBhaXJcbiAgICAgIGNvZGVQb2ludCA9IChsZWFkU3Vycm9nYXRlIC0gMHhEODAwIDw8IDEwIHwgY29kZVBvaW50IC0gMHhEQzAwKSArIDB4MTAwMDBcbiAgICB9IGVsc2UgaWYgKGxlYWRTdXJyb2dhdGUpIHtcbiAgICAgIC8vIHZhbGlkIGJtcCBjaGFyLCBidXQgbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgIH1cblxuICAgIGxlYWRTdXJyb2dhdGUgPSBudWxsXG5cbiAgICAvLyBlbmNvZGUgdXRmOFxuICAgIGlmIChjb2RlUG9pbnQgPCAweDgwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDEpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50KVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHg4MDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiB8IDB4QzAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDMpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgfCAweEUwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSA0KSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHgxMiB8IDB4RjAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29kZSBwb2ludCcpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpVG9CeXRlcyAoc3RyKSB7XG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIC8vIE5vZGUncyBjb2RlIHNlZW1zIHRvIGJlIGRvaW5nIHRoaXMgYW5kIG5vdCAmIDB4N0YuLlxuICAgIGJ5dGVBcnJheS5wdXNoKHN0ci5jaGFyQ29kZUF0KGkpICYgMHhGRilcbiAgfVxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVUb0J5dGVzIChzdHIsIHVuaXRzKSB7XG4gIHZhciBjLCBoaSwgbG9cbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG5cbiAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSlcbiAgICBoaSA9IGMgPj4gOFxuICAgIGxvID0gYyAlIDI1NlxuICAgIGJ5dGVBcnJheS5wdXNoKGxvKVxuICAgIGJ5dGVBcnJheS5wdXNoKGhpKVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiBiYXNlNjRUb0J5dGVzIChzdHIpIHtcbiAgcmV0dXJuIGJhc2U2NC50b0J5dGVBcnJheShiYXNlNjRjbGVhbihzdHIpKVxufVxuXG5mdW5jdGlvbiBibGl0QnVmZmVyIChzcmMsIGRzdCwgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGlmICgoaSArIG9mZnNldCA+PSBkc3QubGVuZ3RoKSB8fCAoaSA+PSBzcmMubGVuZ3RoKSkgYnJlYWtcbiAgICBkc3RbaSArIG9mZnNldF0gPSBzcmNbaV1cbiAgfVxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiBpc25hbiAodmFsKSB7XG4gIHJldHVybiB2YWwgIT09IHZhbCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxufVxuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIE5PVEU6IFRoZXNlIHR5cGUgY2hlY2tpbmcgZnVuY3Rpb25zIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIGBpbnN0YW5jZW9mYFxuLy8gYmVjYXVzZSBpdCBpcyBmcmFnaWxlIGFuZCBjYW4gYmUgZWFzaWx5IGZha2VkIHdpdGggYE9iamVjdC5jcmVhdGUoKWAuXG5cbmZ1bmN0aW9uIGlzQXJyYXkoYXJnKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXJnKTtcbiAgfVxuICByZXR1cm4gb2JqZWN0VG9TdHJpbmcoYXJnKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbn1cbmV4cG9ydHMuaXNBcnJheSA9IGlzQXJyYXk7XG5cbmZ1bmN0aW9uIGlzQm9vbGVhbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJztcbn1cbmV4cG9ydHMuaXNCb29sZWFuID0gaXNCb29sZWFuO1xuXG5mdW5jdGlvbiBpc051bGwoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbCA9IGlzTnVsbDtcblxuZnVuY3Rpb24gaXNOdWxsT3JVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsT3JVbmRlZmluZWQgPSBpc051bGxPclVuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNOdW1iZXIoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnbnVtYmVyJztcbn1cbmV4cG9ydHMuaXNOdW1iZXIgPSBpc051bWJlcjtcblxuZnVuY3Rpb24gaXNTdHJpbmcoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJztcbn1cbmV4cG9ydHMuaXNTdHJpbmcgPSBpc1N0cmluZztcblxuZnVuY3Rpb24gaXNTeW1ib2woYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3ltYm9sJztcbn1cbmV4cG9ydHMuaXNTeW1ib2wgPSBpc1N5bWJvbDtcblxuZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IHZvaWQgMDtcbn1cbmV4cG9ydHMuaXNVbmRlZmluZWQgPSBpc1VuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNSZWdFeHAocmUpIHtcbiAgcmV0dXJuIG9iamVjdFRvU3RyaW5nKHJlKSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59XG5leHBvcnRzLmlzUmVnRXhwID0gaXNSZWdFeHA7XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xufVxuZXhwb3J0cy5pc09iamVjdCA9IGlzT2JqZWN0O1xuXG5mdW5jdGlvbiBpc0RhdGUoZCkge1xuICByZXR1cm4gb2JqZWN0VG9TdHJpbmcoZCkgPT09ICdbb2JqZWN0IERhdGVdJztcbn1cbmV4cG9ydHMuaXNEYXRlID0gaXNEYXRlO1xuXG5mdW5jdGlvbiBpc0Vycm9yKGUpIHtcbiAgcmV0dXJuIChvYmplY3RUb1N0cmluZyhlKSA9PT0gJ1tvYmplY3QgRXJyb3JdJyB8fCBlIGluc3RhbmNlb2YgRXJyb3IpO1xufVxuZXhwb3J0cy5pc0Vycm9yID0gaXNFcnJvcjtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5leHBvcnRzLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZShhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbCB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnIHx8ICAvLyBFUzYgc3ltYm9sXG4gICAgICAgICB0eXBlb2YgYXJnID09PSAndW5kZWZpbmVkJztcbn1cbmV4cG9ydHMuaXNQcmltaXRpdmUgPSBpc1ByaW1pdGl2ZTtcblxuZXhwb3J0cy5pc0J1ZmZlciA9IEJ1ZmZlci5pc0J1ZmZlcjtcblxuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcobykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pO1xufVxuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbmZ1bmN0aW9uIEV2ZW50RW1pdHRlcigpIHtcbiAgdGhpcy5fZXZlbnRzID0gdGhpcy5fZXZlbnRzIHx8IHt9O1xuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSB0aGlzLl9tYXhMaXN0ZW5lcnMgfHwgdW5kZWZpbmVkO1xufVxubW9kdWxlLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7XG5cbi8vIEJhY2t3YXJkcy1jb21wYXQgd2l0aCBub2RlIDAuMTAueFxuRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzID0gdW5kZWZpbmVkO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzID0gdW5kZWZpbmVkO1xuXG4vLyBCeSBkZWZhdWx0IEV2ZW50RW1pdHRlcnMgd2lsbCBwcmludCBhIHdhcm5pbmcgaWYgbW9yZSB0aGFuIDEwIGxpc3RlbmVycyBhcmVcbi8vIGFkZGVkIHRvIGl0LiBUaGlzIGlzIGEgdXNlZnVsIGRlZmF1bHQgd2hpY2ggaGVscHMgZmluZGluZyBtZW1vcnkgbGVha3MuXG5FdmVudEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVycyA9IDEwO1xuXG4vLyBPYnZpb3VzbHkgbm90IGFsbCBFbWl0dGVycyBzaG91bGQgYmUgbGltaXRlZCB0byAxMC4gVGhpcyBmdW5jdGlvbiBhbGxvd3Ncbi8vIHRoYXQgdG8gYmUgaW5jcmVhc2VkLiBTZXQgdG8gemVybyBmb3IgdW5saW1pdGVkLlxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbihuKSB7XG4gIGlmICghaXNOdW1iZXIobikgfHwgbiA8IDAgfHwgaXNOYU4obikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCduIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXInKTtcbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbih0eXBlKSB7XG4gIHZhciBlciwgaGFuZGxlciwgbGVuLCBhcmdzLCBpLCBsaXN0ZW5lcnM7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMpXG4gICAgdGhpcy5fZXZlbnRzID0ge307XG5cbiAgLy8gSWYgdGhlcmUgaXMgbm8gJ2Vycm9yJyBldmVudCBsaXN0ZW5lciB0aGVuIHRocm93LlxuICBpZiAodHlwZSA9PT0gJ2Vycm9yJykge1xuICAgIGlmICghdGhpcy5fZXZlbnRzLmVycm9yIHx8XG4gICAgICAgIChpc09iamVjdCh0aGlzLl9ldmVudHMuZXJyb3IpICYmICF0aGlzLl9ldmVudHMuZXJyb3IubGVuZ3RoKSkge1xuICAgICAgZXIgPSBhcmd1bWVudHNbMV07XG4gICAgICBpZiAoZXIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICB0aHJvdyBlcjsgLy8gVW5oYW5kbGVkICdlcnJvcicgZXZlbnRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEF0IGxlYXN0IGdpdmUgc29tZSBraW5kIG9mIGNvbnRleHQgdG8gdGhlIHVzZXJcbiAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcignVW5jYXVnaHQsIHVuc3BlY2lmaWVkIFwiZXJyb3JcIiBldmVudC4gKCcgKyBlciArICcpJyk7XG4gICAgICAgIGVyci5jb250ZXh0ID0gZXI7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBoYW5kbGVyID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xuXG4gIGlmIChpc1VuZGVmaW5lZChoYW5kbGVyKSlcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKGlzRnVuY3Rpb24oaGFuZGxlcikpIHtcbiAgICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIC8vIGZhc3QgY2FzZXNcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsIGFyZ3VtZW50c1sxXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOlxuICAgICAgICBoYW5kbGVyLmNhbGwodGhpcywgYXJndW1lbnRzWzFdLCBhcmd1bWVudHNbMl0pO1xuICAgICAgICBicmVhaztcbiAgICAgIC8vIHNsb3dlclxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgICAgIGhhbmRsZXIuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KGhhbmRsZXIpKSB7XG4gICAgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgbGlzdGVuZXJzID0gaGFuZGxlci5zbGljZSgpO1xuICAgIGxlbiA9IGxpc3RlbmVycy5sZW5ndGg7XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKVxuICAgICAgbGlzdGVuZXJzW2ldLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgdmFyIG07XG5cbiAgaWYgKCFpc0Z1bmN0aW9uKGxpc3RlbmVyKSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ2xpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzKVxuICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuXG4gIC8vIFRvIGF2b2lkIHJlY3Vyc2lvbiBpbiB0aGUgY2FzZSB0aGF0IHR5cGUgPT09IFwibmV3TGlzdGVuZXJcIiEgQmVmb3JlXG4gIC8vIGFkZGluZyBpdCB0byB0aGUgbGlzdGVuZXJzLCBmaXJzdCBlbWl0IFwibmV3TGlzdGVuZXJcIi5cbiAgaWYgKHRoaXMuX2V2ZW50cy5uZXdMaXN0ZW5lcilcbiAgICB0aGlzLmVtaXQoJ25ld0xpc3RlbmVyJywgdHlwZSxcbiAgICAgICAgICAgICAgaXNGdW5jdGlvbihsaXN0ZW5lci5saXN0ZW5lcikgP1xuICAgICAgICAgICAgICBsaXN0ZW5lci5saXN0ZW5lciA6IGxpc3RlbmVyKTtcblxuICBpZiAoIXRoaXMuX2V2ZW50c1t0eXBlXSlcbiAgICAvLyBPcHRpbWl6ZSB0aGUgY2FzZSBvZiBvbmUgbGlzdGVuZXIuIERvbid0IG5lZWQgdGhlIGV4dHJhIGFycmF5IG9iamVjdC5cbiAgICB0aGlzLl9ldmVudHNbdHlwZV0gPSBsaXN0ZW5lcjtcbiAgZWxzZSBpZiAoaXNPYmplY3QodGhpcy5fZXZlbnRzW3R5cGVdKSlcbiAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IGdvdCBhbiBhcnJheSwganVzdCBhcHBlbmQuXG4gICAgdGhpcy5fZXZlbnRzW3R5cGVdLnB1c2gobGlzdGVuZXIpO1xuICBlbHNlXG4gICAgLy8gQWRkaW5nIHRoZSBzZWNvbmQgZWxlbWVudCwgbmVlZCB0byBjaGFuZ2UgdG8gYXJyYXkuXG4gICAgdGhpcy5fZXZlbnRzW3R5cGVdID0gW3RoaXMuX2V2ZW50c1t0eXBlXSwgbGlzdGVuZXJdO1xuXG4gIC8vIENoZWNrIGZvciBsaXN0ZW5lciBsZWFrXG4gIGlmIChpc09iamVjdCh0aGlzLl9ldmVudHNbdHlwZV0pICYmICF0aGlzLl9ldmVudHNbdHlwZV0ud2FybmVkKSB7XG4gICAgaWYgKCFpc1VuZGVmaW5lZCh0aGlzLl9tYXhMaXN0ZW5lcnMpKSB7XG4gICAgICBtID0gdGhpcy5fbWF4TGlzdGVuZXJzO1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnM7XG4gICAgfVxuXG4gICAgaWYgKG0gJiYgbSA+IDAgJiYgdGhpcy5fZXZlbnRzW3R5cGVdLmxlbmd0aCA+IG0pIHtcbiAgICAgIHRoaXMuX2V2ZW50c1t0eXBlXS53YXJuZWQgPSB0cnVlO1xuICAgICAgY29uc29sZS5lcnJvcignKG5vZGUpIHdhcm5pbmc6IHBvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgJyArXG4gICAgICAgICAgICAgICAgICAgICdsZWFrIGRldGVjdGVkLiAlZCBsaXN0ZW5lcnMgYWRkZWQuICcgK1xuICAgICAgICAgICAgICAgICAgICAnVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gaW5jcmVhc2UgbGltaXQuJyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRzW3R5cGVdLmxlbmd0aCk7XG4gICAgICBpZiAodHlwZW9mIGNvbnNvbGUudHJhY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gbm90IHN1cHBvcnRlZCBpbiBJRSAxMFxuICAgICAgICBjb25zb2xlLnRyYWNlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgaWYgKCFpc0Z1bmN0aW9uKGxpc3RlbmVyKSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ2xpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXG4gIHZhciBmaXJlZCA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIGcoKSB7XG4gICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBnKTtcblxuICAgIGlmICghZmlyZWQpIHtcbiAgICAgIGZpcmVkID0gdHJ1ZTtcbiAgICAgIGxpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9XG5cbiAgZy5saXN0ZW5lciA9IGxpc3RlbmVyO1xuICB0aGlzLm9uKHR5cGUsIGcpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gZW1pdHMgYSAncmVtb3ZlTGlzdGVuZXInIGV2ZW50IGlmZiB0aGUgbGlzdGVuZXIgd2FzIHJlbW92ZWRcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikge1xuICB2YXIgbGlzdCwgcG9zaXRpb24sIGxlbmd0aCwgaTtcblxuICBpZiAoIWlzRnVuY3Rpb24obGlzdGVuZXIpKVxuICAgIHRocm93IFR5cGVFcnJvcignbGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMgfHwgIXRoaXMuX2V2ZW50c1t0eXBlXSlcbiAgICByZXR1cm4gdGhpcztcblxuICBsaXN0ID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xuICBsZW5ndGggPSBsaXN0Lmxlbmd0aDtcbiAgcG9zaXRpb24gPSAtMTtcblxuICBpZiAobGlzdCA9PT0gbGlzdGVuZXIgfHxcbiAgICAgIChpc0Z1bmN0aW9uKGxpc3QubGlzdGVuZXIpICYmIGxpc3QubGlzdGVuZXIgPT09IGxpc3RlbmVyKSkge1xuICAgIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG4gICAgaWYgKHRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lcilcbiAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBsaXN0ZW5lcik7XG5cbiAgfSBlbHNlIGlmIChpc09iamVjdChsaXN0KSkge1xuICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tID4gMDspIHtcbiAgICAgIGlmIChsaXN0W2ldID09PSBsaXN0ZW5lciB8fFxuICAgICAgICAgIChsaXN0W2ldLmxpc3RlbmVyICYmIGxpc3RbaV0ubGlzdGVuZXIgPT09IGxpc3RlbmVyKSkge1xuICAgICAgICBwb3NpdGlvbiA9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwb3NpdGlvbiA8IDApXG4gICAgICByZXR1cm4gdGhpcztcblxuICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgbGlzdC5sZW5ndGggPSAwO1xuICAgICAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGlzdC5zcGxpY2UocG9zaXRpb24sIDEpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXIpXG4gICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgdmFyIGtleSwgbGlzdGVuZXJzO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIC8vIG5vdCBsaXN0ZW5pbmcgZm9yIHJlbW92ZUxpc3RlbmVyLCBubyBuZWVkIHRvIGVtaXRcbiAgaWYgKCF0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXIpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMClcbiAgICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuICAgIGVsc2UgaWYgKHRoaXMuX2V2ZW50c1t0eXBlXSlcbiAgICAgIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBlbWl0IHJlbW92ZUxpc3RlbmVyIGZvciBhbGwgbGlzdGVuZXJzIG9uIGFsbCBldmVudHNcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICBmb3IgKGtleSBpbiB0aGlzLl9ldmVudHMpIHtcbiAgICAgIGlmIChrZXkgPT09ICdyZW1vdmVMaXN0ZW5lcicpIGNvbnRpbnVlO1xuICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoa2V5KTtcbiAgICB9XG4gICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ3JlbW92ZUxpc3RlbmVyJyk7XG4gICAgdGhpcy5fZXZlbnRzID0ge307XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbdHlwZV07XG5cbiAgaWYgKGlzRnVuY3Rpb24obGlzdGVuZXJzKSkge1xuICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzKTtcbiAgfSBlbHNlIGlmIChsaXN0ZW5lcnMpIHtcbiAgICAvLyBMSUZPIG9yZGVyXG4gICAgd2hpbGUgKGxpc3RlbmVycy5sZW5ndGgpXG4gICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyc1tsaXN0ZW5lcnMubGVuZ3RoIC0gMV0pO1xuICB9XG4gIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgdmFyIHJldDtcbiAgaWYgKCF0aGlzLl9ldmVudHMgfHwgIXRoaXMuX2V2ZW50c1t0eXBlXSlcbiAgICByZXQgPSBbXTtcbiAgZWxzZSBpZiAoaXNGdW5jdGlvbih0aGlzLl9ldmVudHNbdHlwZV0pKVxuICAgIHJldCA9IFt0aGlzLl9ldmVudHNbdHlwZV1dO1xuICBlbHNlXG4gICAgcmV0ID0gdGhpcy5fZXZlbnRzW3R5cGVdLnNsaWNlKCk7XG4gIHJldHVybiByZXQ7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbih0eXBlKSB7XG4gIGlmICh0aGlzLl9ldmVudHMpIHtcbiAgICB2YXIgZXZsaXN0ZW5lciA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICAgIGlmIChpc0Z1bmN0aW9uKGV2bGlzdGVuZXIpKVxuICAgICAgcmV0dXJuIDE7XG4gICAgZWxzZSBpZiAoZXZsaXN0ZW5lcilcbiAgICAgIHJldHVybiBldmxpc3RlbmVyLmxlbmd0aDtcbiAgfVxuICByZXR1cm4gMDtcbn07XG5cbkV2ZW50RW1pdHRlci5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24oZW1pdHRlciwgdHlwZSkge1xuICByZXR1cm4gZW1pdHRlci5saXN0ZW5lckNvdW50KHR5cGUpO1xufTtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xufVxuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gdm9pZCAwO1xufVxuIiwiZXhwb3J0cy5yZWFkID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG1cbiAgdmFyIGVMZW4gPSAobkJ5dGVzICogOCkgLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIG5CaXRzID0gLTdcbiAgdmFyIGkgPSBpc0xFID8gKG5CeXRlcyAtIDEpIDogMFxuICB2YXIgZCA9IGlzTEUgPyAtMSA6IDFcbiAgdmFyIHMgPSBidWZmZXJbb2Zmc2V0ICsgaV1cblxuICBpICs9IGRcblxuICBlID0gcyAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBzID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBlTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IGUgPSAoZSAqIDI1NikgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBtID0gZSAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBlID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBtTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IG0gPSAobSAqIDI1NikgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBpZiAoZSA9PT0gMCkge1xuICAgIGUgPSAxIC0gZUJpYXNcbiAgfSBlbHNlIGlmIChlID09PSBlTWF4KSB7XG4gICAgcmV0dXJuIG0gPyBOYU4gOiAoKHMgPyAtMSA6IDEpICogSW5maW5pdHkpXG4gIH0gZWxzZSB7XG4gICAgbSA9IG0gKyBNYXRoLnBvdygyLCBtTGVuKVxuICAgIGUgPSBlIC0gZUJpYXNcbiAgfVxuICByZXR1cm4gKHMgPyAtMSA6IDEpICogbSAqIE1hdGgucG93KDIsIGUgLSBtTGVuKVxufVxuXG5leHBvcnRzLndyaXRlID0gZnVuY3Rpb24gKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtLCBjXG4gIHZhciBlTGVuID0gKG5CeXRlcyAqIDgpIC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBydCA9IChtTGVuID09PSAyMyA/IE1hdGgucG93KDIsIC0yNCkgLSBNYXRoLnBvdygyLCAtNzcpIDogMClcbiAgdmFyIGkgPSBpc0xFID8gMCA6IChuQnl0ZXMgLSAxKVxuICB2YXIgZCA9IGlzTEUgPyAxIDogLTFcbiAgdmFyIHMgPSB2YWx1ZSA8IDAgfHwgKHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDApID8gMSA6IDBcblxuICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKVxuXG4gIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPT09IEluZmluaXR5KSB7XG4gICAgbSA9IGlzTmFOKHZhbHVlKSA/IDEgOiAwXG4gICAgZSA9IGVNYXhcbiAgfSBlbHNlIHtcbiAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMilcbiAgICBpZiAodmFsdWUgKiAoYyA9IE1hdGgucG93KDIsIC1lKSkgPCAxKSB7XG4gICAgICBlLS1cbiAgICAgIGMgKj0gMlxuICAgIH1cbiAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIHZhbHVlICs9IHJ0IC8gY1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSArPSBydCAqIE1hdGgucG93KDIsIDEgLSBlQmlhcylcbiAgICB9XG4gICAgaWYgKHZhbHVlICogYyA+PSAyKSB7XG4gICAgICBlKytcbiAgICAgIGMgLz0gMlxuICAgIH1cblxuICAgIGlmIChlICsgZUJpYXMgPj0gZU1heCkge1xuICAgICAgbSA9IDBcbiAgICAgIGUgPSBlTWF4XG4gICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgbSA9ICgodmFsdWUgKiBjKSAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSBlICsgZUJpYXNcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IHZhbHVlICogTWF0aC5wb3coMiwgZUJpYXMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gMFxuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBtTGVuID49IDg7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IG0gJiAweGZmLCBpICs9IGQsIG0gLz0gMjU2LCBtTGVuIC09IDgpIHt9XG5cbiAgZSA9IChlIDw8IG1MZW4pIHwgbVxuICBlTGVuICs9IG1MZW5cbiAgZm9yICg7IGVMZW4gPiAwOyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBlICYgMHhmZiwgaSArPSBkLCBlIC89IDI1NiwgZUxlbiAtPSA4KSB7fVxuXG4gIGJ1ZmZlcltvZmZzZXQgKyBpIC0gZF0gfD0gcyAqIDEyOFxufVxuIiwiaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gIC8vIGltcGxlbWVudGF0aW9uIGZyb20gc3RhbmRhcmQgbm9kZS5qcyAndXRpbCcgbW9kdWxlXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICBjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDdG9yLnByb3RvdHlwZSwge1xuICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgdmFsdWU6IGN0b3IsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59IGVsc2Uge1xuICAvLyBvbGQgc2Nob29sIHNoaW0gZm9yIG9sZCBicm93c2Vyc1xuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgdmFyIFRlbXBDdG9yID0gZnVuY3Rpb24gKCkge31cbiAgICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlXG4gICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgVGVtcEN0b3IoKVxuICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvclxuICB9XG59XG4iLCJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIChhcnIpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoYXJyKSA9PSAnW29iamVjdCBBcnJheV0nO1xufTtcbiIsIid1c2Ugc3RyaWN0J1xuXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXJcbnZhciBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKVxudmFyIGJsID0gcmVxdWlyZSgnYmwnKVxudmFyIHN0cmVhbXMgPSByZXF1aXJlKCcuL2xpYi9zdHJlYW1zJylcbnZhciBidWlsZERlY29kZSA9IHJlcXVpcmUoJy4vbGliL2RlY29kZXInKVxudmFyIGJ1aWxkRW5jb2RlID0gcmVxdWlyZSgnLi9saWIvZW5jb2RlcicpXG5cbmZ1bmN0aW9uIG1zZ3BhY2sgKG9wdGlvbnMpIHtcbiAgdmFyIGVuY29kaW5nVHlwZXMgPSBbXVxuICB2YXIgZGVjb2RpbmdUeXBlcyA9IFtdXG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge1xuICAgIGZvcmNlRmxvYXQ2NDogZmFsc2UsXG4gICAgY29tcGF0aWJpbGl0eU1vZGU6IGZhbHNlLFxuICAgIGRpc2FibGVUaW1lc3RhbXBFbmNvZGluZzogZmFsc2UgLy8gaWYgdHJ1ZSwgc2tpcHMgZW5jb2RpbmcgRGF0ZXMgdXNpbmcgdGhlIG1zZ3BhY2sgdGltZXN0YW1wIGV4dCBmb3JtYXQgKC0xKVxuICB9XG5cbiAgZnVuY3Rpb24gcmVnaXN0ZXJFbmNvZGVyIChjaGVjaywgZW5jb2RlKSB7XG4gICAgYXNzZXJ0KGNoZWNrLCAnbXVzdCBoYXZlIGFuIGVuY29kZSBmdW5jdGlvbicpXG4gICAgYXNzZXJ0KGVuY29kZSwgJ211c3QgaGF2ZSBhbiBlbmNvZGUgZnVuY3Rpb24nKVxuXG4gICAgZW5jb2RpbmdUeXBlcy5wdXNoKHtcbiAgICAgIGNoZWNrOiBjaGVjaywgZW5jb2RlOiBlbmNvZGVcbiAgICB9KVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlZ2lzdGVyRGVjb2RlciAodHlwZSwgZGVjb2RlKSB7XG4gICAgYXNzZXJ0KHR5cGUgPj0gMCwgJ211c3QgaGF2ZSBhIG5vbi1uZWdhdGl2ZSB0eXBlJylcbiAgICBhc3NlcnQoZGVjb2RlLCAnbXVzdCBoYXZlIGEgZGVjb2RlIGZ1bmN0aW9uJylcblxuICAgIGRlY29kaW5nVHlwZXMucHVzaCh7XG4gICAgICB0eXBlOiB0eXBlLCBkZWNvZGU6IGRlY29kZVxuICAgIH0pXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgZnVuY3Rpb24gcmVnaXN0ZXIgKHR5cGUsIGNvbnN0cnVjdG9yLCBlbmNvZGUsIGRlY29kZSkge1xuICAgIGFzc2VydChjb25zdHJ1Y3RvciwgJ211c3QgaGF2ZSBhIGNvbnN0cnVjdG9yJylcbiAgICBhc3NlcnQoZW5jb2RlLCAnbXVzdCBoYXZlIGFuIGVuY29kZSBmdW5jdGlvbicpXG4gICAgYXNzZXJ0KHR5cGUgPj0gMCwgJ211c3QgaGF2ZSBhIG5vbi1uZWdhdGl2ZSB0eXBlJylcbiAgICBhc3NlcnQoZGVjb2RlLCAnbXVzdCBoYXZlIGEgZGVjb2RlIGZ1bmN0aW9uJylcblxuICAgIGZ1bmN0aW9uIGNoZWNrIChvYmopIHtcbiAgICAgIHJldHVybiAob2JqIGluc3RhbmNlb2YgY29uc3RydWN0b3IpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVFbmNvZGUgKG9iaikge1xuICAgICAgdmFyIGJ1ZiA9IGJsKClcbiAgICAgIHZhciBoZWFkZXIgPSBCdWZmZXIuYWxsb2NVbnNhZmUoMSlcblxuICAgICAgaGVhZGVyLndyaXRlSW50OCh0eXBlLCAwKVxuXG4gICAgICBidWYuYXBwZW5kKGhlYWRlcilcbiAgICAgIGJ1Zi5hcHBlbmQoZW5jb2RlKG9iaikpXG5cbiAgICAgIHJldHVybiBidWZcbiAgICB9XG5cbiAgICB0aGlzLnJlZ2lzdGVyRW5jb2RlcihjaGVjaywgcmVFbmNvZGUpXG4gICAgdGhpcy5yZWdpc3RlckRlY29kZXIodHlwZSwgZGVjb2RlKVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZW5jb2RlOiBidWlsZEVuY29kZShlbmNvZGluZ1R5cGVzLCBvcHRpb25zLmZvcmNlRmxvYXQ2NCwgb3B0aW9ucy5jb21wYXRpYmlsaXR5TW9kZSwgb3B0aW9ucy5kaXNhYmxlVGltZXN0YW1wRW5jb2RpbmcpLFxuICAgIGRlY29kZTogYnVpbGREZWNvZGUoZGVjb2RpbmdUeXBlcyksXG4gICAgcmVnaXN0ZXI6IHJlZ2lzdGVyLFxuICAgIHJlZ2lzdGVyRW5jb2RlcjogcmVnaXN0ZXJFbmNvZGVyLFxuICAgIHJlZ2lzdGVyRGVjb2RlcjogcmVnaXN0ZXJEZWNvZGVyLFxuICAgIGVuY29kZXI6IHN0cmVhbXMuZW5jb2RlcixcbiAgICBkZWNvZGVyOiBzdHJlYW1zLmRlY29kZXIsXG4gICAgLy8gbmVlZGVkIGZvciBsZXZlbHVwIHN1cHBvcnRcbiAgICBidWZmZXI6IHRydWUsXG4gICAgdHlwZTogJ21zZ3BhY2s1JyxcbiAgICBJbmNvbXBsZXRlQnVmZmVyRXJyb3I6IGJ1aWxkRGVjb2RlLkluY29tcGxldGVCdWZmZXJFcnJvclxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbXNncGFja1xuIiwiJ3VzZSBzdHJpY3QnXG5cbnZhciBibCA9IHJlcXVpcmUoJ2JsJylcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpXG5cbmZ1bmN0aW9uIEluY29tcGxldGVCdWZmZXJFcnJvciAobWVzc2FnZSkge1xuICBFcnJvci5jYWxsKHRoaXMpIC8vIHN1cGVyIGNvbnN0cnVjdG9yXG4gIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpIC8vIHN1cGVyIGhlbHBlciBtZXRob2QgdG8gaW5jbHVkZSBzdGFjayB0cmFjZSBpbiBlcnJvciBvYmplY3RcbiAgfVxuICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWVcbiAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAndW5hYmxlIHRvIGRlY29kZSdcbn1cblxudXRpbC5pbmhlcml0cyhJbmNvbXBsZXRlQnVmZmVyRXJyb3IsIEVycm9yKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJ1aWxkRGVjb2RlIChkZWNvZGluZ1R5cGVzKSB7XG4gIHJldHVybiBkZWNvZGVcblxuICBmdW5jdGlvbiBnZXRTaXplIChmaXJzdCkge1xuICAgIHN3aXRjaCAoZmlyc3QpIHtcbiAgICAgIGNhc2UgMHhjNDpcbiAgICAgICAgcmV0dXJuIDJcbiAgICAgIGNhc2UgMHhjNTpcbiAgICAgICAgcmV0dXJuIDNcbiAgICAgIGNhc2UgMHhjNjpcbiAgICAgICAgcmV0dXJuIDVcbiAgICAgIGNhc2UgMHhjNzpcbiAgICAgICAgcmV0dXJuIDNcbiAgICAgIGNhc2UgMHhjODpcbiAgICAgICAgcmV0dXJuIDRcbiAgICAgIGNhc2UgMHhjOTpcbiAgICAgICAgcmV0dXJuIDZcbiAgICAgIGNhc2UgMHhjYTpcbiAgICAgICAgcmV0dXJuIDVcbiAgICAgIGNhc2UgMHhjYjpcbiAgICAgICAgcmV0dXJuIDlcbiAgICAgIGNhc2UgMHhjYzpcbiAgICAgICAgcmV0dXJuIDJcbiAgICAgIGNhc2UgMHhjZDpcbiAgICAgICAgcmV0dXJuIDNcbiAgICAgIGNhc2UgMHhjZTpcbiAgICAgICAgcmV0dXJuIDVcbiAgICAgIGNhc2UgMHhjZjpcbiAgICAgICAgcmV0dXJuIDlcbiAgICAgIGNhc2UgMHhkMDpcbiAgICAgICAgcmV0dXJuIDJcbiAgICAgIGNhc2UgMHhkMTpcbiAgICAgICAgcmV0dXJuIDNcbiAgICAgIGNhc2UgMHhkMjpcbiAgICAgICAgcmV0dXJuIDVcbiAgICAgIGNhc2UgMHhkMzpcbiAgICAgICAgcmV0dXJuIDlcbiAgICAgIGNhc2UgMHhkNDpcbiAgICAgICAgcmV0dXJuIDNcbiAgICAgIGNhc2UgMHhkNTpcbiAgICAgICAgcmV0dXJuIDRcbiAgICAgIGNhc2UgMHhkNjpcbiAgICAgICAgcmV0dXJuIDZcbiAgICAgIGNhc2UgMHhkNzpcbiAgICAgICAgcmV0dXJuIDEwXG4gICAgICBjYXNlIDB4ZDg6XG4gICAgICAgIHJldHVybiAxOFxuICAgICAgY2FzZSAweGQ5OlxuICAgICAgICByZXR1cm4gMlxuICAgICAgY2FzZSAweGRhOlxuICAgICAgICByZXR1cm4gM1xuICAgICAgY2FzZSAweGRiOlxuICAgICAgICByZXR1cm4gNVxuICAgICAgY2FzZSAweGRlOlxuICAgICAgICByZXR1cm4gM1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaGFzTWluQnVmZmVyU2l6ZSAoZmlyc3QsIGxlbmd0aCkge1xuICAgIHZhciBzaXplID0gZ2V0U2l6ZShmaXJzdClcblxuICAgIGlmIChzaXplICE9PSAtMSAmJiBsZW5ndGggPCBzaXplKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpc1ZhbGlkRGF0YVNpemUgKGRhdGFMZW5ndGgsIGJ1Zkxlbmd0aCwgaGVhZGVyTGVuZ3RoKSB7XG4gICAgcmV0dXJuIGJ1Zkxlbmd0aCA+PSBoZWFkZXJMZW5ndGggKyBkYXRhTGVuZ3RoXG4gIH1cblxuICBmdW5jdGlvbiBidWlsZERlY29kZVJlc3VsdCAodmFsdWUsIGJ5dGVzQ29uc3VtZWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgYnl0ZXNDb25zdW1lZDogYnl0ZXNDb25zdW1lZFxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGRlY29kZSAoYnVmKSB7XG4gICAgaWYgKCEoYnVmIGluc3RhbmNlb2YgYmwpKSB7XG4gICAgICBidWYgPSBibCgpLmFwcGVuZChidWYpXG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdCA9IHRyeURlY29kZShidWYpXG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgYnVmLmNvbnN1bWUocmVzdWx0LmJ5dGVzQ29uc3VtZWQpXG4gICAgICByZXR1cm4gcmVzdWx0LnZhbHVlXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBJbmNvbXBsZXRlQnVmZmVyRXJyb3IoKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRyeURlY29kZSAoYnVmLCBvZmZzZXQpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPT09IHVuZGVmaW5lZCA/IDAgOiBvZmZzZXRcbiAgICB2YXIgYnVmTGVuZ3RoID0gYnVmLmxlbmd0aCAtIG9mZnNldFxuICAgIGlmIChidWZMZW5ndGggPD0gMCkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICB2YXIgZmlyc3QgPSBidWYucmVhZFVJbnQ4KG9mZnNldClcbiAgICB2YXIgbGVuZ3RoXG4gICAgdmFyIHJlc3VsdCA9IDBcbiAgICB2YXIgdHlwZVxuICAgIHZhciBieXRlUG9zXG5cbiAgICBpZiAoIWhhc01pbkJ1ZmZlclNpemUoZmlyc3QsIGJ1Zkxlbmd0aCkpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgc3dpdGNoIChmaXJzdCkge1xuICAgICAgY2FzZSAweGMwOlxuICAgICAgICByZXR1cm4gYnVpbGREZWNvZGVSZXN1bHQobnVsbCwgMSlcbiAgICAgIGNhc2UgMHhjMjpcbiAgICAgICAgcmV0dXJuIGJ1aWxkRGVjb2RlUmVzdWx0KGZhbHNlLCAxKVxuICAgICAgY2FzZSAweGMzOlxuICAgICAgICByZXR1cm4gYnVpbGREZWNvZGVSZXN1bHQodHJ1ZSwgMSlcbiAgICAgIGNhc2UgMHhjYzpcbiAgICAgICAgLy8gMS1ieXRlIHVuc2lnbmVkIGludFxuICAgICAgICByZXN1bHQgPSBidWYucmVhZFVJbnQ4KG9mZnNldCArIDEpXG4gICAgICAgIHJldHVybiBidWlsZERlY29kZVJlc3VsdChyZXN1bHQsIDIpXG4gICAgICBjYXNlIDB4Y2Q6XG4gICAgICAgIC8vIDItYnl0ZXMgQkUgdW5zaWduZWQgaW50XG4gICAgICAgIHJlc3VsdCA9IGJ1Zi5yZWFkVUludDE2QkUob2Zmc2V0ICsgMSlcbiAgICAgICAgcmV0dXJuIGJ1aWxkRGVjb2RlUmVzdWx0KHJlc3VsdCwgMylcbiAgICAgIGNhc2UgMHhjZTpcbiAgICAgICAgLy8gNC1ieXRlcyBCRSB1bnNpZ25lZCBpbnRcbiAgICAgICAgcmVzdWx0ID0gYnVmLnJlYWRVSW50MzJCRShvZmZzZXQgKyAxKVxuICAgICAgICByZXR1cm4gYnVpbGREZWNvZGVSZXN1bHQocmVzdWx0LCA1KVxuICAgICAgY2FzZSAweGNmOlxuICAgICAgICAvLyA4LWJ5dGVzIEJFIHVuc2lnbmVkIGludFxuICAgICAgICAvLyBSZWFkIGxvbmcgYnl0ZSBieSBieXRlLCBiaWctZW5kaWFuXG4gICAgICAgIGZvciAoYnl0ZVBvcyA9IDc7IGJ5dGVQb3MgPj0gMDsgYnl0ZVBvcy0tKSB7XG4gICAgICAgICAgcmVzdWx0ICs9IChidWYucmVhZFVJbnQ4KG9mZnNldCArIGJ5dGVQb3MgKyAxKSAqIE1hdGgucG93KDIsICg4ICogKDcgLSBieXRlUG9zKSkpKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZERlY29kZVJlc3VsdChyZXN1bHQsIDkpXG4gICAgICBjYXNlIDB4ZDA6XG4gICAgICAgIC8vIDEtYnl0ZSBzaWduZWQgaW50XG4gICAgICAgIHJlc3VsdCA9IGJ1Zi5yZWFkSW50OChvZmZzZXQgKyAxKVxuICAgICAgICByZXR1cm4gYnVpbGREZWNvZGVSZXN1bHQocmVzdWx0LCAyKVxuICAgICAgY2FzZSAweGQxOlxuICAgICAgICAvLyAyLWJ5dGVzIHNpZ25lZCBpbnRcbiAgICAgICAgcmVzdWx0ID0gYnVmLnJlYWRJbnQxNkJFKG9mZnNldCArIDEpXG4gICAgICAgIHJldHVybiBidWlsZERlY29kZVJlc3VsdChyZXN1bHQsIDMpXG4gICAgICBjYXNlIDB4ZDI6XG4gICAgICAgIC8vIDQtYnl0ZXMgc2lnbmVkIGludFxuICAgICAgICByZXN1bHQgPSBidWYucmVhZEludDMyQkUob2Zmc2V0ICsgMSlcbiAgICAgICAgcmV0dXJuIGJ1aWxkRGVjb2RlUmVzdWx0KHJlc3VsdCwgNSlcbiAgICAgIGNhc2UgMHhkMzpcbiAgICAgICAgcmVzdWx0ID0gcmVhZEludDY0QkUoYnVmLnNsaWNlKG9mZnNldCArIDEsIG9mZnNldCArIDkpLCAwKVxuICAgICAgICByZXR1cm4gYnVpbGREZWNvZGVSZXN1bHQocmVzdWx0LCA5KVxuICAgICAgY2FzZSAweGNhOlxuICAgICAgICAvLyA0LWJ5dGVzIGZsb2F0XG4gICAgICAgIHJlc3VsdCA9IGJ1Zi5yZWFkRmxvYXRCRShvZmZzZXQgKyAxKVxuICAgICAgICByZXR1cm4gYnVpbGREZWNvZGVSZXN1bHQocmVzdWx0LCA1KVxuICAgICAgY2FzZSAweGNiOlxuICAgICAgICAvLyA4LWJ5dGVzIGRvdWJsZVxuICAgICAgICByZXN1bHQgPSBidWYucmVhZERvdWJsZUJFKG9mZnNldCArIDEpXG4gICAgICAgIHJldHVybiBidWlsZERlY29kZVJlc3VsdChyZXN1bHQsIDkpXG4gICAgICBjYXNlIDB4ZDk6XG4gICAgICAgIC8vIHN0cmluZ3MgdXAgdG8gMl44IC0gMSBieXRlc1xuICAgICAgICBsZW5ndGggPSBidWYucmVhZFVJbnQ4KG9mZnNldCArIDEpXG4gICAgICAgIGlmICghaXNWYWxpZERhdGFTaXplKGxlbmd0aCwgYnVmTGVuZ3RoLCAyKSkge1xuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0ID0gYnVmLnRvU3RyaW5nKCd1dGY4Jywgb2Zmc2V0ICsgMiwgb2Zmc2V0ICsgMiArIGxlbmd0aClcbiAgICAgICAgcmV0dXJuIGJ1aWxkRGVjb2RlUmVzdWx0KHJlc3VsdCwgMiArIGxlbmd0aClcbiAgICAgIGNhc2UgMHhkYTpcbiAgICAgICAgLy8gc3RyaW5ncyB1cCB0byAyXjE2IC0gMiBieXRlc1xuICAgICAgICBsZW5ndGggPSBidWYucmVhZFVJbnQxNkJFKG9mZnNldCArIDEpXG4gICAgICAgIGlmICghaXNWYWxpZERhdGFTaXplKGxlbmd0aCwgYnVmTGVuZ3RoLCAzKSkge1xuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0ID0gYnVmLnRvU3RyaW5nKCd1dGY4Jywgb2Zmc2V0ICsgMywgb2Zmc2V0ICsgMyArIGxlbmd0aClcbiAgICAgICAgcmV0dXJuIGJ1aWxkRGVjb2RlUmVzdWx0KHJlc3VsdCwgMyArIGxlbmd0aClcbiAgICAgIGNhc2UgMHhkYjpcbiAgICAgICAgLy8gc3RyaW5ncyB1cCB0byAyXjMyIC0gNCBieXRlc1xuICAgICAgICBsZW5ndGggPSBidWYucmVhZFVJbnQzMkJFKG9mZnNldCArIDEpXG4gICAgICAgIGlmICghaXNWYWxpZERhdGFTaXplKGxlbmd0aCwgYnVmTGVuZ3RoLCA1KSkge1xuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0ID0gYnVmLnRvU3RyaW5nKCd1dGY4Jywgb2Zmc2V0ICsgNSwgb2Zmc2V0ICsgNSArIGxlbmd0aClcbiAgICAgICAgcmV0dXJuIGJ1aWxkRGVjb2RlUmVzdWx0KHJlc3VsdCwgNSArIGxlbmd0aClcbiAgICAgIGNhc2UgMHhjNDpcbiAgICAgICAgLy8gYnVmZmVycyB1cCB0byAyXjggLSAxIGJ5dGVzXG4gICAgICAgIGxlbmd0aCA9IGJ1Zi5yZWFkVUludDgob2Zmc2V0ICsgMSlcbiAgICAgICAgaWYgKCFpc1ZhbGlkRGF0YVNpemUobGVuZ3RoLCBidWZMZW5ndGgsIDIpKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQgPSBidWYuc2xpY2Uob2Zmc2V0ICsgMiwgb2Zmc2V0ICsgMiArIGxlbmd0aClcbiAgICAgICAgcmV0dXJuIGJ1aWxkRGVjb2RlUmVzdWx0KHJlc3VsdCwgMiArIGxlbmd0aClcbiAgICAgIGNhc2UgMHhjNTpcbiAgICAgICAgLy8gYnVmZmVycyB1cCB0byAyXjE2IC0gMSBieXRlc1xuICAgICAgICBsZW5ndGggPSBidWYucmVhZFVJbnQxNkJFKG9mZnNldCArIDEpXG4gICAgICAgIGlmICghaXNWYWxpZERhdGFTaXplKGxlbmd0aCwgYnVmTGVuZ3RoLCAzKSkge1xuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0ID0gYnVmLnNsaWNlKG9mZnNldCArIDMsIG9mZnNldCArIDMgKyBsZW5ndGgpXG4gICAgICAgIHJldHVybiBidWlsZERlY29kZVJlc3VsdChyZXN1bHQsIDMgKyBsZW5ndGgpXG4gICAgICBjYXNlIDB4YzY6XG4gICAgICAgIC8vIGJ1ZmZlcnMgdXAgdG8gMl4zMiAtIDEgYnl0ZXNcbiAgICAgICAgbGVuZ3RoID0gYnVmLnJlYWRVSW50MzJCRShvZmZzZXQgKyAxKVxuICAgICAgICBpZiAoIWlzVmFsaWREYXRhU2l6ZShsZW5ndGgsIGJ1Zkxlbmd0aCwgNSkpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG4gICAgICAgIHJlc3VsdCA9IGJ1Zi5zbGljZShvZmZzZXQgKyA1LCBvZmZzZXQgKyA1ICsgbGVuZ3RoKVxuICAgICAgICByZXR1cm4gYnVpbGREZWNvZGVSZXN1bHQocmVzdWx0LCA1ICsgbGVuZ3RoKVxuICAgICAgY2FzZSAweGRjOlxuICAgICAgICAvLyBhcnJheSB1cCB0byAyXjE2IGVsZW1lbnRzIC0gMiBieXRlc1xuICAgICAgICBpZiAoYnVmTGVuZ3RoIDwgMykge1xuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cblxuICAgICAgICBsZW5ndGggPSBidWYucmVhZFVJbnQxNkJFKG9mZnNldCArIDEpXG4gICAgICAgIHJldHVybiBkZWNvZGVBcnJheShidWYsIG9mZnNldCwgbGVuZ3RoLCAzKVxuICAgICAgY2FzZSAweGRkOlxuICAgICAgICAvLyBhcnJheSB1cCB0byAyXjMyIGVsZW1lbnRzIC0gNCBieXRlc1xuICAgICAgICBpZiAoYnVmTGVuZ3RoIDwgNSkge1xuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cblxuICAgICAgICBsZW5ndGggPSBidWYucmVhZFVJbnQzMkJFKG9mZnNldCArIDEpXG4gICAgICAgIHJldHVybiBkZWNvZGVBcnJheShidWYsIG9mZnNldCwgbGVuZ3RoLCA1KVxuICAgICAgY2FzZSAweGRlOlxuICAgICAgICAvLyBtYXBzIHVwIHRvIDJeMTYgZWxlbWVudHMgLSAyIGJ5dGVzXG4gICAgICAgIGxlbmd0aCA9IGJ1Zi5yZWFkVUludDE2QkUob2Zmc2V0ICsgMSlcbiAgICAgICAgcmV0dXJuIGRlY29kZU1hcChidWYsIG9mZnNldCwgbGVuZ3RoLCAzKVxuICAgICAgY2FzZSAweGRmOlxuICAgICAgICBsZW5ndGggPSBidWYucmVhZFVJbnQzMkJFKG9mZnNldCArIDEpXG4gICAgICAgIHJldHVybiBkZWNvZGVNYXAoYnVmLCBvZmZzZXQsIGxlbmd0aCwgNSlcbiAgICAgIGNhc2UgMHhkNDpcbiAgICAgICAgcmV0dXJuIGRlY29kZUZpeEV4dChidWYsIG9mZnNldCwgMSlcbiAgICAgIGNhc2UgMHhkNTpcbiAgICAgICAgcmV0dXJuIGRlY29kZUZpeEV4dChidWYsIG9mZnNldCwgMilcbiAgICAgIGNhc2UgMHhkNjpcbiAgICAgICAgcmV0dXJuIGRlY29kZUZpeEV4dChidWYsIG9mZnNldCwgNClcbiAgICAgIGNhc2UgMHhkNzpcbiAgICAgICAgcmV0dXJuIGRlY29kZUZpeEV4dChidWYsIG9mZnNldCwgOClcbiAgICAgIGNhc2UgMHhkODpcbiAgICAgICAgcmV0dXJuIGRlY29kZUZpeEV4dChidWYsIG9mZnNldCwgMTYpXG4gICAgICBjYXNlIDB4Yzc6XG4gICAgICAgIC8vIGV4dCB1cCB0byAyXjggLSAxIGJ5dGVzXG4gICAgICAgIGxlbmd0aCA9IGJ1Zi5yZWFkVUludDgob2Zmc2V0ICsgMSlcbiAgICAgICAgdHlwZSA9IGJ1Zi5yZWFkVUludDgob2Zmc2V0ICsgMilcbiAgICAgICAgaWYgKCFpc1ZhbGlkRGF0YVNpemUobGVuZ3RoLCBidWZMZW5ndGgsIDMpKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVjb2RlRXh0KGJ1Ziwgb2Zmc2V0LCB0eXBlLCBsZW5ndGgsIDMpXG4gICAgICBjYXNlIDB4Yzg6XG4gICAgICAgIC8vIGV4dCB1cCB0byAyXjE2IC0gMSBieXRlc1xuICAgICAgICBsZW5ndGggPSBidWYucmVhZFVJbnQxNkJFKG9mZnNldCArIDEpXG4gICAgICAgIHR5cGUgPSBidWYucmVhZFVJbnQ4KG9mZnNldCArIDMpXG4gICAgICAgIGlmICghaXNWYWxpZERhdGFTaXplKGxlbmd0aCwgYnVmTGVuZ3RoLCA0KSkge1xuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlY29kZUV4dChidWYsIG9mZnNldCwgdHlwZSwgbGVuZ3RoLCA0KVxuICAgICAgY2FzZSAweGM5OlxuICAgICAgICAvLyBleHQgdXAgdG8gMl4zMiAtIDEgYnl0ZXNcbiAgICAgICAgbGVuZ3RoID0gYnVmLnJlYWRVSW50MzJCRShvZmZzZXQgKyAxKVxuICAgICAgICB0eXBlID0gYnVmLnJlYWRVSW50OChvZmZzZXQgKyA1KVxuICAgICAgICBpZiAoIWlzVmFsaWREYXRhU2l6ZShsZW5ndGgsIGJ1Zkxlbmd0aCwgNikpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWNvZGVFeHQoYnVmLCBvZmZzZXQsIHR5cGUsIGxlbmd0aCwgNilcbiAgICB9XG5cbiAgICBpZiAoKGZpcnN0ICYgMHhmMCkgPT09IDB4OTApIHtcbiAgICAgIC8vIHdlIGhhdmUgYW4gYXJyYXkgd2l0aCBsZXNzIHRoYW4gMTUgZWxlbWVudHNcbiAgICAgIGxlbmd0aCA9IGZpcnN0ICYgMHgwZlxuICAgICAgcmV0dXJuIGRlY29kZUFycmF5KGJ1Ziwgb2Zmc2V0LCBsZW5ndGgsIDEpXG4gICAgfSBlbHNlIGlmICgoZmlyc3QgJiAweGYwKSA9PT0gMHg4MCkge1xuICAgICAgLy8gd2UgaGF2ZSBhIG1hcCB3aXRoIGxlc3MgdGhhbiAxNSBlbGVtZW50c1xuICAgICAgbGVuZ3RoID0gZmlyc3QgJiAweDBmXG4gICAgICByZXR1cm4gZGVjb2RlTWFwKGJ1Ziwgb2Zmc2V0LCBsZW5ndGgsIDEpXG4gICAgfSBlbHNlIGlmICgoZmlyc3QgJiAweGUwKSA9PT0gMHhhMCkge1xuICAgICAgLy8gZml4c3RyIHVwIHRvIDMxIGJ5dGVzXG4gICAgICBsZW5ndGggPSBmaXJzdCAmIDB4MWZcbiAgICAgIGlmIChpc1ZhbGlkRGF0YVNpemUobGVuZ3RoLCBidWZMZW5ndGgsIDEpKSB7XG4gICAgICAgIHJlc3VsdCA9IGJ1Zi50b1N0cmluZygndXRmOCcsIG9mZnNldCArIDEsIG9mZnNldCArIGxlbmd0aCArIDEpXG4gICAgICAgIHJldHVybiBidWlsZERlY29kZVJlc3VsdChyZXN1bHQsIGxlbmd0aCArIDEpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZmlyc3QgPj0gMHhlMCkge1xuICAgICAgLy8gNSBiaXRzIG5lZ2F0aXZlIGludHNcbiAgICAgIHJlc3VsdCA9IGZpcnN0IC0gMHgxMDBcbiAgICAgIHJldHVybiBidWlsZERlY29kZVJlc3VsdChyZXN1bHQsIDEpXG4gICAgfSBlbHNlIGlmIChmaXJzdCA8IDB4ODApIHtcbiAgICAgIC8vIDctYml0cyBwb3NpdGl2ZSBpbnRzXG4gICAgICByZXR1cm4gYnVpbGREZWNvZGVSZXN1bHQoZmlyc3QsIDEpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkIHlldCcpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVhZEludDY0QkUgKGJ1Ziwgb2Zmc2V0KSB7XG4gICAgdmFyIG5lZ2F0ZSA9IChidWZbb2Zmc2V0XSAmIDB4ODApID09IDB4ODAgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuXG4gICAgaWYgKG5lZ2F0ZSkge1xuICAgICAgdmFyIGNhcnJ5ID0gMVxuICAgICAgZm9yICh2YXIgaSA9IG9mZnNldCArIDc7IGkgPj0gb2Zmc2V0OyBpLS0pIHtcbiAgICAgICAgdmFyIHYgPSAoYnVmW2ldIF4gMHhmZikgKyBjYXJyeVxuICAgICAgICBidWZbaV0gPSB2ICYgMHhmZlxuICAgICAgICBjYXJyeSA9IHYgPj4gOFxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBoaSA9IGJ1Zi5yZWFkVUludDMyQkUob2Zmc2V0ICsgMClcbiAgICB2YXIgbG8gPSBidWYucmVhZFVJbnQzMkJFKG9mZnNldCArIDQpXG4gICAgcmV0dXJuIChoaSAqIDQyOTQ5NjcyOTYgKyBsbykgKiAobmVnYXRlID8gLTEgOiArMSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlY29kZUFycmF5IChidWYsIG9mZnNldCwgbGVuZ3RoLCBoZWFkZXJMZW5ndGgpIHtcbiAgICB2YXIgcmVzdWx0ID0gW11cbiAgICB2YXIgaVxuICAgIHZhciB0b3RhbEJ5dGVzQ29uc3VtZWQgPSAwXG5cbiAgICBvZmZzZXQgKz0gaGVhZGVyTGVuZ3RoXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZGVjb2RlUmVzdWx0ID0gdHJ5RGVjb2RlKGJ1Ziwgb2Zmc2V0KVxuICAgICAgaWYgKGRlY29kZVJlc3VsdCkge1xuICAgICAgICByZXN1bHQucHVzaChkZWNvZGVSZXN1bHQudmFsdWUpXG4gICAgICAgIG9mZnNldCArPSBkZWNvZGVSZXN1bHQuYnl0ZXNDb25zdW1lZFxuICAgICAgICB0b3RhbEJ5dGVzQ29uc3VtZWQgKz0gZGVjb2RlUmVzdWx0LmJ5dGVzQ29uc3VtZWRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBidWlsZERlY29kZVJlc3VsdChyZXN1bHQsIGhlYWRlckxlbmd0aCArIHRvdGFsQnl0ZXNDb25zdW1lZClcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlY29kZU1hcCAoYnVmLCBvZmZzZXQsIGxlbmd0aCwgaGVhZGVyTGVuZ3RoKSB7XG4gICAgdmFyIHJlc3VsdCA9IHt9XG4gICAgdmFyIGtleVxuICAgIHZhciBpXG4gICAgdmFyIHRvdGFsQnl0ZXNDb25zdW1lZCA9IDBcblxuICAgIG9mZnNldCArPSBoZWFkZXJMZW5ndGhcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBrZXlSZXN1bHQgPSB0cnlEZWNvZGUoYnVmLCBvZmZzZXQpXG4gICAgICBpZiAoa2V5UmVzdWx0KSB7XG4gICAgICAgIG9mZnNldCArPSBrZXlSZXN1bHQuYnl0ZXNDb25zdW1lZFxuICAgICAgICB2YXIgdmFsdWVSZXN1bHQgPSB0cnlEZWNvZGUoYnVmLCBvZmZzZXQpXG4gICAgICAgIGlmICh2YWx1ZVJlc3VsdCkge1xuICAgICAgICAgIGtleSA9IGtleVJlc3VsdC52YWx1ZVxuICAgICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWVSZXN1bHQudmFsdWVcbiAgICAgICAgICBvZmZzZXQgKz0gdmFsdWVSZXN1bHQuYnl0ZXNDb25zdW1lZFxuICAgICAgICAgIHRvdGFsQnl0ZXNDb25zdW1lZCArPSAoa2V5UmVzdWx0LmJ5dGVzQ29uc3VtZWQgKyB2YWx1ZVJlc3VsdC5ieXRlc0NvbnN1bWVkKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBidWlsZERlY29kZVJlc3VsdChyZXN1bHQsIGhlYWRlckxlbmd0aCArIHRvdGFsQnl0ZXNDb25zdW1lZClcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlY29kZUZpeEV4dCAoYnVmLCBvZmZzZXQsIHNpemUpIHtcbiAgICB2YXIgdHlwZSA9IGJ1Zi5yZWFkSW50OChvZmZzZXQgKyAxKSAvLyBTaWduZWRcbiAgICByZXR1cm4gZGVjb2RlRXh0KGJ1Ziwgb2Zmc2V0LCB0eXBlLCBzaXplLCAyKVxuICB9XG5cbiAgZnVuY3Rpb24gZGVjb2RlVGltZXN0YW1wIChidWYsIHNpemUsIGhlYWRlclNpemUpIHtcbiAgICB2YXIgc2Vjb25kc1xuICAgIHZhciBuYW5vc2Vjb25kcyA9IDBcblxuICAgIHN3aXRjaCAoc2l6ZSkge1xuICAgICAgY2FzZSA0OlxuICAgICAgICAvLyB0aW1lc3RhbXAgMzIgc3RvcmVzIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0aGF0IGhhdmUgZWxhcHNlZCBzaW5jZSAxOTcwLTAxLTAxIDAwOjAwOjAwIFVUQyBpbiBhbiAzMi1iaXQgdW5zaWduZWQgaW50ZWdlclxuICAgICAgICBzZWNvbmRzID0gYnVmLnJlYWRVSW50MzJCRSgwKVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlIDg6XG4gICAgICAgIC8vIFRpbWVzdGFtcCA2NCBzdG9yZXMgdGhlIG51bWJlciBvZiBzZWNvbmRzIGFuZCBuYW5vc2Vjb25kcyB0aGF0IGhhdmUgZWxhcHNlZFxuICAgICAgICAvLyBzaW5jZSAxOTcwLTAxLTAxIDAwOjAwOjAwIFVUQyBpbiAzMi1iaXQgdW5zaWduZWQgaW50ZWdlcnMsIHNwbGl0IDMwLzM0IGJpdHNcbiAgICAgICAgdmFyIHVwcGVyID0gYnVmLnJlYWRVSW50MzJCRSgwKVxuICAgICAgICB2YXIgbG93ZXIgPSBidWYucmVhZFVJbnQzMkJFKDQpXG4gICAgICAgIG5hbm9zZWNvbmRzID0gdXBwZXIgLyA0XG4gICAgICAgIHNlY29uZHMgPSAoKHVwcGVyICYgMHgwMykgKiBNYXRoLnBvdygyLCAzMikpICsgbG93ZXIgLy8gSWYgd2UgdXNlIGJpdHdpc2Ugb3BlcmF0b3JzLCB3ZSBnZXQgdHJ1bmNhdGVkIHRvIDMyYml0c1xuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlIDEyOlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RpbWVzdGFtcCA5NiBpcyBub3QgeWV0IGltcGxlbWVudGVkJylcbiAgICB9XG5cbiAgICB2YXIgbWlsbGlzID0gKHNlY29uZHMgKiAxMDAwKSArIE1hdGgucm91bmQobmFub3NlY29uZHMgLyAxRTYpXG4gICAgcmV0dXJuIGJ1aWxkRGVjb2RlUmVzdWx0KG5ldyBEYXRlKG1pbGxpcyksIHNpemUgKyBoZWFkZXJTaXplKVxuICB9XG5cbiAgZnVuY3Rpb24gZGVjb2RlRXh0IChidWYsIG9mZnNldCwgdHlwZSwgc2l6ZSwgaGVhZGVyU2l6ZSkge1xuICAgIHZhciBpLFxuICAgICAgdG9EZWNvZGVcblxuICAgIG9mZnNldCArPSBoZWFkZXJTaXplXG5cbiAgICAvLyBQcmUtZGVmaW5lZFxuICAgIGlmICh0eXBlIDwgMCkgeyAvLyBSZXNlcnZlZCBmb3IgZnV0dXJlIGV4dGVuc2lvbnNcbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIC0xOiAvLyBUaWVtc3RhbXAgaHR0cHM6Ly9naXRodWIuY29tL21zZ3BhY2svbXNncGFjay9ibG9iL21hc3Rlci9zcGVjLm1kI3RpbWVzdGFtcC1leHRlbnNpb24tdHlwZVxuICAgICAgICAgIHRvRGVjb2RlID0gYnVmLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgc2l6ZSlcbiAgICAgICAgICByZXR1cm4gZGVjb2RlVGltZXN0YW1wKHRvRGVjb2RlLCBzaXplLCBoZWFkZXJTaXplKVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoaSA9IDA7IGkgPCBkZWNvZGluZ1R5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodHlwZSA9PT0gZGVjb2RpbmdUeXBlc1tpXS50eXBlKSB7XG4gICAgICAgIHRvRGVjb2RlID0gYnVmLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgc2l6ZSlcbiAgICAgICAgdmFyIHZhbHVlID0gZGVjb2RpbmdUeXBlc1tpXS5kZWNvZGUodG9EZWNvZGUpXG4gICAgICAgIHJldHVybiBidWlsZERlY29kZVJlc3VsdCh2YWx1ZSwgaGVhZGVyU2l6ZSArIHNpemUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKCd1bmFibGUgdG8gZmluZCBleHQgdHlwZSAnICsgdHlwZSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cy5JbmNvbXBsZXRlQnVmZmVyRXJyb3IgPSBJbmNvbXBsZXRlQnVmZmVyRXJyb3JcbiIsIid1c2Ugc3RyaWN0J1xuXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXJcbnZhciBibCA9IHJlcXVpcmUoJ2JsJylcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBidWlsZEVuY29kZSAoZW5jb2RpbmdUeXBlcywgZm9yY2VGbG9hdDY0LCBjb21wYXRpYmlsaXR5TW9kZSwgZGlzYWJsZVRpbWVzdGFtcEVuY29kaW5nKSB7XG4gIGZ1bmN0aW9uIGVuY29kZSAob2JqLCBhdm9pZFNsaWNlKSB7XG4gICAgdmFyIGJ1ZlxuICAgIHZhciBsZW5cblxuICAgIGlmIChvYmogPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmRlZmluZWQgaXMgbm90IGVuY29kYWJsZSBpbiBtc2dwYWNrIScpXG4gICAgfSBlbHNlIGlmIChvYmogPT09IG51bGwpIHtcbiAgICAgIGJ1ZiA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSgxKVxuICAgICAgYnVmWzBdID0gMHhjMFxuICAgIH0gZWxzZSBpZiAob2JqID09PSB0cnVlKSB7XG4gICAgICBidWYgPSBCdWZmZXIuYWxsb2NVbnNhZmUoMSlcbiAgICAgIGJ1ZlswXSA9IDB4YzNcbiAgICB9IGVsc2UgaWYgKG9iaiA9PT0gZmFsc2UpIHtcbiAgICAgIGJ1ZiA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSgxKVxuICAgICAgYnVmWzBdID0gMHhjMlxuICAgIH0gZWxzZSBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGxlbiA9IEJ1ZmZlci5ieXRlTGVuZ3RoKG9iailcbiAgICAgIGlmIChsZW4gPCAzMikge1xuICAgICAgICBidWYgPSBCdWZmZXIuYWxsb2NVbnNhZmUoMSArIGxlbilcbiAgICAgICAgYnVmWzBdID0gMHhhMCB8IGxlblxuICAgICAgICBpZiAobGVuID4gMCkge1xuICAgICAgICAgIGJ1Zi53cml0ZShvYmosIDEpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobGVuIDw9IDB4ZmYgJiYgIWNvbXBhdGliaWxpdHlNb2RlKSB7XG4gICAgICAgIC8vIHN0cjgsIGJ1dCBvbmx5IHdoZW4gbm90IGluIGNvbXBhdGliaWxpdHkgbW9kZVxuICAgICAgICBidWYgPSBCdWZmZXIuYWxsb2NVbnNhZmUoMiArIGxlbilcbiAgICAgICAgYnVmWzBdID0gMHhkOVxuICAgICAgICBidWZbMV0gPSBsZW5cbiAgICAgICAgYnVmLndyaXRlKG9iaiwgMilcbiAgICAgIH0gZWxzZSBpZiAobGVuIDw9IDB4ZmZmZikge1xuICAgICAgICBidWYgPSBCdWZmZXIuYWxsb2NVbnNhZmUoMyArIGxlbilcbiAgICAgICAgYnVmWzBdID0gMHhkYVxuICAgICAgICBidWYud3JpdGVVSW50MTZCRShsZW4sIDEpXG4gICAgICAgIGJ1Zi53cml0ZShvYmosIDMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBidWYgPSBCdWZmZXIuYWxsb2NVbnNhZmUoNSArIGxlbilcbiAgICAgICAgYnVmWzBdID0gMHhkYlxuICAgICAgICBidWYud3JpdGVVSW50MzJCRShsZW4sIDEpXG4gICAgICAgIGJ1Zi53cml0ZShvYmosIDUpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvYmogJiYgKG9iai5yZWFkVUludDMyTEUgfHwgb2JqIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgICAgIG9iaiA9IEJ1ZmZlci5mcm9tKG9iailcbiAgICAgIH1cbiAgICAgIC8vIHdlaXJkIGhhY2sgdG8gc3VwcG9ydCBCdWZmZXJcbiAgICAgIC8vIGFuZCBCdWZmZXItbGlrZSBvYmplY3RzXG4gICAgICBpZiAob2JqLmxlbmd0aCA8PSAweGZmKSB7XG4gICAgICAgIGJ1ZiA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSgyKVxuICAgICAgICBidWZbMF0gPSAweGM0XG4gICAgICAgIGJ1ZlsxXSA9IG9iai5sZW5ndGhcbiAgICAgIH0gZWxzZSBpZiAob2JqLmxlbmd0aCA8PSAweGZmZmYpIHtcbiAgICAgICAgYnVmID0gQnVmZmVyLmFsbG9jVW5zYWZlKDMpXG4gICAgICAgIGJ1ZlswXSA9IDB4YzVcbiAgICAgICAgYnVmLndyaXRlVUludDE2QkUob2JqLmxlbmd0aCwgMSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJ1ZiA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSg1KVxuICAgICAgICBidWZbMF0gPSAweGM2XG4gICAgICAgIGJ1Zi53cml0ZVVJbnQzMkJFKG9iai5sZW5ndGgsIDEpXG4gICAgICB9XG5cbiAgICAgIGJ1ZiA9IGJsKFtidWYsIG9ial0pXG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgIGlmIChvYmoubGVuZ3RoIDwgMTYpIHtcbiAgICAgICAgYnVmID0gQnVmZmVyLmFsbG9jVW5zYWZlKDEpXG4gICAgICAgIGJ1ZlswXSA9IDB4OTAgfCBvYmoubGVuZ3RoXG4gICAgICB9IGVsc2UgaWYgKG9iai5sZW5ndGggPCA2NTUzNikge1xuICAgICAgICBidWYgPSBCdWZmZXIuYWxsb2NVbnNhZmUoMylcbiAgICAgICAgYnVmWzBdID0gMHhkY1xuICAgICAgICBidWYud3JpdGVVSW50MTZCRShvYmoubGVuZ3RoLCAxKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnVmID0gQnVmZmVyLmFsbG9jVW5zYWZlKDUpXG4gICAgICAgIGJ1ZlswXSA9IDB4ZGRcbiAgICAgICAgYnVmLndyaXRlVUludDMyQkUob2JqLmxlbmd0aCwgMSlcbiAgICAgIH1cblxuICAgICAgYnVmID0gb2JqLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBvYmopIHtcbiAgICAgICAgYWNjLmFwcGVuZChlbmNvZGUob2JqLCB0cnVlKSlcbiAgICAgICAgcmV0dXJuIGFjY1xuICAgICAgfSwgYmwoKS5hcHBlbmQoYnVmKSlcbiAgICB9IGVsc2UgaWYgKCFkaXNhYmxlVGltZXN0YW1wRW5jb2RpbmcgJiYgdHlwZW9mIG9iai5nZXREYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gZW5jb2RlRGF0ZShvYmopXG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgYnVmID0gZW5jb2RlRXh0KG9iaikgfHwgZW5jb2RlT2JqZWN0KG9iailcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBvYmogPT09ICdudW1iZXInKSB7XG4gICAgICBpZiAoaXNGbG9hdChvYmopKSB7XG4gICAgICAgIHJldHVybiBlbmNvZGVGbG9hdChvYmosIGZvcmNlRmxvYXQ2NClcbiAgICAgIH0gZWxzZSBpZiAob2JqID49IDApIHtcbiAgICAgICAgaWYgKG9iaiA8IDEyOCkge1xuICAgICAgICAgIGJ1ZiA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSgxKVxuICAgICAgICAgIGJ1ZlswXSA9IG9ialxuICAgICAgICB9IGVsc2UgaWYgKG9iaiA8IDI1Nikge1xuICAgICAgICAgIGJ1ZiA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSgyKVxuICAgICAgICAgIGJ1ZlswXSA9IDB4Y2NcbiAgICAgICAgICBidWZbMV0gPSBvYmpcbiAgICAgICAgfSBlbHNlIGlmIChvYmogPCA2NTUzNikge1xuICAgICAgICAgIGJ1ZiA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSgzKVxuICAgICAgICAgIGJ1ZlswXSA9IDB4Y2RcbiAgICAgICAgICBidWYud3JpdGVVSW50MTZCRShvYmosIDEpXG4gICAgICAgIH0gZWxzZSBpZiAob2JqIDw9IDB4ZmZmZmZmZmYpIHtcbiAgICAgICAgICBidWYgPSBCdWZmZXIuYWxsb2NVbnNhZmUoNSlcbiAgICAgICAgICBidWZbMF0gPSAweGNlXG4gICAgICAgICAgYnVmLndyaXRlVUludDMyQkUob2JqLCAxKVxuICAgICAgICB9IGVsc2UgaWYgKG9iaiA8PSA5MDA3MTk5MjU0NzQwOTkxKSB7XG4gICAgICAgICAgYnVmID0gQnVmZmVyLmFsbG9jVW5zYWZlKDkpXG4gICAgICAgICAgYnVmWzBdID0gMHhjZlxuICAgICAgICAgIHdyaXRlNjRCaXRVaW50KGJ1Ziwgb2JqKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBlbmNvZGVGbG9hdChvYmosIHRydWUpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChvYmogPj0gLTMyKSB7XG4gICAgICAgICAgYnVmID0gQnVmZmVyLmFsbG9jVW5zYWZlKDEpXG4gICAgICAgICAgYnVmWzBdID0gMHgxMDAgKyBvYmpcbiAgICAgICAgfSBlbHNlIGlmIChvYmogPj0gLTEyOCkge1xuICAgICAgICAgIGJ1ZiA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSgyKVxuICAgICAgICAgIGJ1ZlswXSA9IDB4ZDBcbiAgICAgICAgICBidWYud3JpdGVJbnQ4KG9iaiwgMSlcbiAgICAgICAgfSBlbHNlIGlmIChvYmogPj0gLTMyNzY4KSB7XG4gICAgICAgICAgYnVmID0gQnVmZmVyLmFsbG9jVW5zYWZlKDMpXG4gICAgICAgICAgYnVmWzBdID0gMHhkMVxuICAgICAgICAgIGJ1Zi53cml0ZUludDE2QkUob2JqLCAxKVxuICAgICAgICB9IGVsc2UgaWYgKG9iaiA+IC0yMTQ3NDgzNjUpIHtcbiAgICAgICAgICBidWYgPSBCdWZmZXIuYWxsb2NVbnNhZmUoNSlcbiAgICAgICAgICBidWZbMF0gPSAweGQyXG4gICAgICAgICAgYnVmLndyaXRlSW50MzJCRShvYmosIDEpXG4gICAgICAgIH0gZWxzZSBpZiAob2JqID49IC05MDA3MTk5MjU0NzQwOTkxKSB7XG4gICAgICAgICAgYnVmID0gQnVmZmVyLmFsbG9jVW5zYWZlKDkpXG4gICAgICAgICAgYnVmWzBdID0gMHhkM1xuICAgICAgICAgIHdyaXRlNjRCaXRJbnQoYnVmLCAxLCBvYmopXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGVuY29kZUZsb2F0KG9iaiwgdHJ1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghYnVmKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCB5ZXQnKVxuICAgIH1cblxuICAgIGlmIChhdm9pZFNsaWNlKSB7XG4gICAgICByZXR1cm4gYnVmXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBidWYuc2xpY2UoKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGVuY29kZURhdGUgKGR0KSB7XG4gICAgdmFyIGVuY29kZWRcbiAgICB2YXIgbWlsbGlzID0gZHQgKiAxXG4gICAgdmFyIHNlY29uZHMgPSBNYXRoLmZsb29yKG1pbGxpcyAvIDEwMDApXG4gICAgdmFyIG5hbm9zID0gKG1pbGxpcyAtIChzZWNvbmRzICogMTAwMCkpICogMUU2XG5cbiAgICBpZiAobmFub3MgfHwgc2Vjb25kcyA+IDB4RkZGRkZGRkYpIHtcbiAgICAgIC8vIFRpbWVzdGFtcDY0XG4gICAgICBlbmNvZGVkID0gQnVmZmVyLmFsbG9jVW5zYWZlKDEwKVxuICAgICAgZW5jb2RlZFswXSA9IDB4ZDdcbiAgICAgIGVuY29kZWRbMV0gPSAtMVxuXG4gICAgICB2YXIgdXBwZXJOYW5vcyA9ICgobmFub3MgKiA0KSlcbiAgICAgIHZhciB1cHBlclNlY29uZHMgPSBzZWNvbmRzIC8gTWF0aC5wb3coMiwgMzIpXG4gICAgICB2YXIgdXBwZXIgPSAodXBwZXJOYW5vcyArIHVwcGVyU2Vjb25kcykgJiAweEZGRkZGRkZGXG4gICAgICB2YXIgbG93ZXIgPSBzZWNvbmRzICYgMHhGRkZGRkZGRlxuXG4gICAgICBlbmNvZGVkLndyaXRlSW50MzJCRSh1cHBlciwgMilcbiAgICAgIGVuY29kZWQud3JpdGVJbnQzMkJFKGxvd2VyLCA2KVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaW1lc3RhbXAzMlxuICAgICAgZW5jb2RlZCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSg2KVxuICAgICAgZW5jb2RlZFswXSA9IDB4ZDZcbiAgICAgIGVuY29kZWRbMV0gPSAtMVxuICAgICAgZW5jb2RlZC53cml0ZVVJbnQzMkJFKE1hdGguZmxvb3IobWlsbGlzIC8gMTAwMCksIDIpXG4gICAgfVxuICAgIHJldHVybiBibCgpLmFwcGVuZChlbmNvZGVkKVxuICB9XG5cbiAgZnVuY3Rpb24gZW5jb2RlRXh0IChvYmopIHtcbiAgICB2YXIgaVxuICAgIHZhciBlbmNvZGVkXG4gICAgdmFyIGxlbmd0aCA9IC0xXG4gICAgdmFyIGhlYWRlcnMgPSBbXVxuXG4gICAgZm9yIChpID0gMDsgaSA8IGVuY29kaW5nVHlwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChlbmNvZGluZ1R5cGVzW2ldLmNoZWNrKG9iaikpIHtcbiAgICAgICAgZW5jb2RlZCA9IGVuY29kaW5nVHlwZXNbaV0uZW5jb2RlKG9iailcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWVuY29kZWQpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgLy8gd2Ugc3VidHJhY3QgMSBiZWNhdXNlIHRoZSBsZW5ndGggZG9lcyBub3RcbiAgICAvLyBpbmNsdWRlIHRoZSB0eXBlXG4gICAgbGVuZ3RoID0gZW5jb2RlZC5sZW5ndGggLSAxXG5cbiAgICBpZiAobGVuZ3RoID09PSAxKSB7XG4gICAgICBoZWFkZXJzLnB1c2goMHhkNClcbiAgICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gMikge1xuICAgICAgaGVhZGVycy5wdXNoKDB4ZDUpXG4gICAgfSBlbHNlIGlmIChsZW5ndGggPT09IDQpIHtcbiAgICAgIGhlYWRlcnMucHVzaCgweGQ2KVxuICAgIH0gZWxzZSBpZiAobGVuZ3RoID09PSA4KSB7XG4gICAgICBoZWFkZXJzLnB1c2goMHhkNylcbiAgICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gMTYpIHtcbiAgICAgIGhlYWRlcnMucHVzaCgweGQ4KVxuICAgIH0gZWxzZSBpZiAobGVuZ3RoIDwgMjU2KSB7XG4gICAgICBoZWFkZXJzLnB1c2goMHhjNylcbiAgICAgIGhlYWRlcnMucHVzaChsZW5ndGgpXG4gICAgfSBlbHNlIGlmIChsZW5ndGggPCAweDEwMDAwKSB7XG4gICAgICBoZWFkZXJzLnB1c2goMHhjOClcbiAgICAgIGhlYWRlcnMucHVzaChsZW5ndGggPj4gOClcbiAgICAgIGhlYWRlcnMucHVzaChsZW5ndGggJiAweDAwZmYpXG4gICAgfSBlbHNlIHtcbiAgICAgIGhlYWRlcnMucHVzaCgweGM5KVxuICAgICAgaGVhZGVycy5wdXNoKGxlbmd0aCA+PiAyNClcbiAgICAgIGhlYWRlcnMucHVzaCgobGVuZ3RoID4+IDE2KSAmIDB4MDAwMDAwZmYpXG4gICAgICBoZWFkZXJzLnB1c2goKGxlbmd0aCA+PiA4KSAmIDB4MDAwMDAwZmYpXG4gICAgICBoZWFkZXJzLnB1c2gobGVuZ3RoICYgMHgwMDAwMDBmZilcbiAgICB9XG5cbiAgICByZXR1cm4gYmwoKS5hcHBlbmQoQnVmZmVyLmZyb20oaGVhZGVycykpLmFwcGVuZChlbmNvZGVkKVxuICB9XG5cbiAgZnVuY3Rpb24gZW5jb2RlT2JqZWN0IChvYmopIHtcbiAgICB2YXIgYWNjID0gW11cbiAgICB2YXIgbGVuZ3RoID0gMFxuICAgIHZhciBrZXlcbiAgICB2YXIgaGVhZGVyXG5cbiAgICBmb3IgKGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSAmJlxuICAgICAgICBvYmpba2V5XSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHR5cGVvZiBvYmpba2V5XSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICArK2xlbmd0aFxuICAgICAgICBhY2MucHVzaChlbmNvZGUoa2V5LCB0cnVlKSlcbiAgICAgICAgYWNjLnB1c2goZW5jb2RlKG9ialtrZXldLCB0cnVlKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobGVuZ3RoIDwgMTYpIHtcbiAgICAgIGhlYWRlciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSgxKVxuICAgICAgaGVhZGVyWzBdID0gMHg4MCB8IGxlbmd0aFxuICAgIH0gZWxzZSBpZiAobGVuZ3RoIDwgMHhGRkZGKSB7XG4gICAgICBoZWFkZXIgPSBCdWZmZXIuYWxsb2NVbnNhZmUoMylcbiAgICAgIGhlYWRlclswXSA9IDB4ZGVcbiAgICAgIGhlYWRlci53cml0ZVVJbnQxNkJFKGxlbmd0aCwgMSlcbiAgICB9IGVsc2Uge1xuICAgICAgaGVhZGVyID0gQnVmZmVyLmFsbG9jVW5zYWZlKDUpXG4gICAgICBoZWFkZXJbMF0gPSAweGRmXG4gICAgICBoZWFkZXIud3JpdGVVSW50MzJCRShsZW5ndGgsIDEpXG4gICAgfVxuXG4gICAgYWNjLnVuc2hpZnQoaGVhZGVyKVxuXG4gICAgdmFyIHJlc3VsdCA9IGFjYy5yZWR1Y2UoZnVuY3Rpb24gKGxpc3QsIGJ1Zikge1xuICAgICAgcmV0dXJuIGxpc3QuYXBwZW5kKGJ1ZilcbiAgICB9LCBibCgpKVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgcmV0dXJuIGVuY29kZVxufVxuXG5mdW5jdGlvbiB3cml0ZTY0Qml0VWludCAoYnVmLCBvYmopIHtcbiAgLy8gV3JpdGUgbG9uZyBieXRlIGJ5IGJ5dGUsIGluIGJpZy1lbmRpYW4gb3JkZXJcbiAgZm9yICh2YXIgY3VyckJ5dGUgPSA3OyBjdXJyQnl0ZSA+PSAwOyBjdXJyQnl0ZS0tKSB7XG4gICAgYnVmW2N1cnJCeXRlICsgMV0gPSAob2JqICYgMHhmZilcbiAgICBvYmogPSBvYmogLyAyNTZcbiAgfVxufVxuXG5mdW5jdGlvbiB3cml0ZTY0Qml0SW50IChidWYsIG9mZnNldCwgbnVtKSB7XG4gIHZhciBuZWdhdGUgPSBudW0gPCAwXG5cbiAgaWYgKG5lZ2F0ZSkge1xuICAgIG51bSA9IE1hdGguYWJzKG51bSlcbiAgfVxuXG4gIHZhciBsbyA9IG51bSAlIDQyOTQ5NjcyOTZcbiAgdmFyIGhpID0gbnVtIC8gNDI5NDk2NzI5NlxuICBidWYud3JpdGVVSW50MzJCRShNYXRoLmZsb29yKGhpKSwgb2Zmc2V0ICsgMClcbiAgYnVmLndyaXRlVUludDMyQkUobG8sIG9mZnNldCArIDQpXG5cbiAgaWYgKG5lZ2F0ZSkge1xuICAgIHZhciBjYXJyeSA9IDFcbiAgICBmb3IgKHZhciBpID0gb2Zmc2V0ICsgNzsgaSA+PSBvZmZzZXQ7IGktLSkge1xuICAgICAgdmFyIHYgPSAoYnVmW2ldIF4gMHhmZikgKyBjYXJyeVxuICAgICAgYnVmW2ldID0gdiAmIDB4ZmZcbiAgICAgIGNhcnJ5ID0gdiA+PiA4XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzRmxvYXQgKG4pIHtcbiAgcmV0dXJuIG4gJSAxICE9PSAwXG59XG5cbmZ1bmN0aW9uIGVuY29kZUZsb2F0IChvYmosIGZvcmNlRmxvYXQ2NCkge1xuICB2YXIgdXNlRG91YmxlUHJlY2lzaW9uID0gdHJ1ZVxuXG4gIC8vIElmIGBmcm91bmRgIGlzIHN1cHBvcnRlZCwgd2UgY2FuIGNoZWNrIGlmIGEgZmxvYXRcbiAgLy8gaXMgZG91YmxlIG9yIHNpbmdsZSBwcmVjaXNpb24gYnkgcm91bmRpbmcgdGhlIG9iamVjdFxuICAvLyB0byBzaW5nbGUgcHJlY2lzaW9uIGFuZCBjb21wYXJpbmcgdGhlIGRpZmZlcmVuY2UuXG4gIC8vIElmIGl0J3Mgbm90IHN1cHBvcnRlZCwgaXQncyBzYWZlciB0byB1c2UgYSA2NCBiaXRcbiAgLy8gZmxvYXQgc28gd2UgZG9uJ3QgbG9zZSBwcmVjaXNpb24gd2l0aG91dCBtZWFuaW5nIHRvLlxuICBpZiAoTWF0aC5mcm91bmQpIHtcbiAgICB1c2VEb3VibGVQcmVjaXNpb24gPSBNYXRoLmZyb3VuZChvYmopICE9PSBvYmpcbiAgfVxuXG4gIGlmIChmb3JjZUZsb2F0NjQpIHtcbiAgICB1c2VEb3VibGVQcmVjaXNpb24gPSB0cnVlXG4gIH1cblxuICB2YXIgYnVmXG5cbiAgaWYgKHVzZURvdWJsZVByZWNpc2lvbikge1xuICAgIGJ1ZiA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSg5KVxuICAgIGJ1ZlswXSA9IDB4Y2JcbiAgICBidWYud3JpdGVEb3VibGVCRShvYmosIDEpXG4gIH0gZWxzZSB7XG4gICAgYnVmID0gQnVmZmVyLmFsbG9jVW5zYWZlKDUpXG4gICAgYnVmWzBdID0gMHhjYVxuICAgIGJ1Zi53cml0ZUZsb2F0QkUob2JqLCAxKVxuICB9XG5cbiAgcmV0dXJuIGJ1ZlxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbnZhciBUcmFuc2Zvcm0gPSByZXF1aXJlKCdyZWFkYWJsZS1zdHJlYW0nKS5UcmFuc2Zvcm1cbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcbnZhciBibCA9IHJlcXVpcmUoJ2JsJylcblxuZnVuY3Rpb24gQmFzZSAob3B0cykge1xuICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gIG9wdHMub2JqZWN0TW9kZSA9IHRydWVcbiAgb3B0cy5oaWdoV2F0ZXJNYXJrID0gMTZcblxuICBUcmFuc2Zvcm0uY2FsbCh0aGlzLCBvcHRzKVxuXG4gIHRoaXMuX21zZ3BhY2sgPSBvcHRzLm1zZ3BhY2tcbn1cblxuaW5oZXJpdHMoQmFzZSwgVHJhbnNmb3JtKVxuXG5mdW5jdGlvbiBFbmNvZGVyIChvcHRzKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBFbmNvZGVyKSkge1xuICAgIG9wdHMgPSBvcHRzIHx8IHt9XG4gICAgb3B0cy5tc2dwYWNrID0gdGhpc1xuICAgIHJldHVybiBuZXcgRW5jb2RlcihvcHRzKVxuICB9XG5cbiAgQmFzZS5jYWxsKHRoaXMsIG9wdHMpXG4gIHRoaXMuX3dyYXAgPSAoJ3dyYXAnIGluIG9wdHMpICYmIG9wdHMud3JhcFxufVxuXG5pbmhlcml0cyhFbmNvZGVyLCBCYXNlKVxuXG5FbmNvZGVyLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKG9iaiwgZW5jLCBkb25lKSB7XG4gIHZhciBidWYgPSBudWxsXG5cbiAgdHJ5IHtcbiAgICBidWYgPSB0aGlzLl9tc2dwYWNrLmVuY29kZSh0aGlzLl93cmFwID8gb2JqLnZhbHVlIDogb2JqKS5zbGljZSgwKVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKVxuICAgIHJldHVybiBkb25lKClcbiAgfVxuXG4gIHRoaXMucHVzaChidWYpXG4gIGRvbmUoKVxufVxuXG5mdW5jdGlvbiBEZWNvZGVyIChvcHRzKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBEZWNvZGVyKSkge1xuICAgIG9wdHMgPSBvcHRzIHx8IHt9XG4gICAgb3B0cy5tc2dwYWNrID0gdGhpc1xuICAgIHJldHVybiBuZXcgRGVjb2RlcihvcHRzKVxuICB9XG5cbiAgQmFzZS5jYWxsKHRoaXMsIG9wdHMpXG5cbiAgdGhpcy5fY2h1bmtzID0gYmwoKVxuICB0aGlzLl93cmFwID0gKCd3cmFwJyBpbiBvcHRzKSAmJiBvcHRzLndyYXBcbn1cblxuaW5oZXJpdHMoRGVjb2RlciwgQmFzZSlcblxuRGVjb2Rlci5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uIChidWYsIGVuYywgZG9uZSkge1xuICBpZiAoYnVmKSB7XG4gICAgdGhpcy5fY2h1bmtzLmFwcGVuZChidWYpXG4gIH1cblxuICB0cnkge1xuICAgIHZhciByZXN1bHQgPSB0aGlzLl9tc2dwYWNrLmRlY29kZSh0aGlzLl9jaHVua3MpXG4gICAgaWYgKHRoaXMuX3dyYXApIHtcbiAgICAgIHJlc3VsdCA9IHt2YWx1ZTogcmVzdWx0fVxuICAgIH1cbiAgICB0aGlzLnB1c2gocmVzdWx0KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgdGhpcy5fbXNncGFjay5JbmNvbXBsZXRlQnVmZmVyRXJyb3IpIHtcbiAgICAgIGRvbmUoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKVxuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmICh0aGlzLl9jaHVua3MubGVuZ3RoID4gMCkge1xuICAgIHRoaXMuX3RyYW5zZm9ybShudWxsLCBlbmMsIGRvbmUpXG4gIH0gZWxzZSB7XG4gICAgZG9uZSgpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMuZGVjb2RlciA9IERlY29kZXJcbm1vZHVsZS5leHBvcnRzLmVuY29kZXIgPSBFbmNvZGVyXG4iLCIndXNlIHN0cmljdCc7XG5cbmlmICghcHJvY2Vzcy52ZXJzaW9uIHx8XG4gICAgcHJvY2Vzcy52ZXJzaW9uLmluZGV4T2YoJ3YwLicpID09PSAwIHx8XG4gICAgcHJvY2Vzcy52ZXJzaW9uLmluZGV4T2YoJ3YxLicpID09PSAwICYmIHByb2Nlc3MudmVyc2lvbi5pbmRleE9mKCd2MS44LicpICE9PSAwKSB7XG4gIG1vZHVsZS5leHBvcnRzID0geyBuZXh0VGljazogbmV4dFRpY2sgfTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcHJvY2Vzc1xufVxuXG5mdW5jdGlvbiBuZXh0VGljayhmbiwgYXJnMSwgYXJnMiwgYXJnMykge1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJjYWxsYmFja1wiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG4gIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgYXJncywgaTtcbiAgc3dpdGNoIChsZW4pIHtcbiAgY2FzZSAwOlxuICBjYXNlIDE6XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZm4pO1xuICBjYXNlIDI6XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gYWZ0ZXJUaWNrT25lKCkge1xuICAgICAgZm4uY2FsbChudWxsLCBhcmcxKTtcbiAgICB9KTtcbiAgY2FzZSAzOlxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uIGFmdGVyVGlja1R3bygpIHtcbiAgICAgIGZuLmNhbGwobnVsbCwgYXJnMSwgYXJnMik7XG4gICAgfSk7XG4gIGNhc2UgNDpcbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2tUaHJlZSgpIHtcbiAgICAgIGZuLmNhbGwobnVsbCwgYXJnMSwgYXJnMiwgYXJnMyk7XG4gICAgfSk7XG4gIGRlZmF1bHQ6XG4gICAgYXJncyA9IG5ldyBBcnJheShsZW4gLSAxKTtcbiAgICBpID0gMDtcbiAgICB3aGlsZSAoaSA8IGFyZ3MubGVuZ3RoKSB7XG4gICAgICBhcmdzW2krK10gPSBhcmd1bWVudHNbaV07XG4gICAgfVxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uIGFmdGVyVGljaygpIHtcbiAgICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgIH0pO1xuICB9XG59XG5cbiIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcbi8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuLy8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuLy8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblxudmFyIGNhY2hlZFNldFRpbWVvdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbihmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgfVxufSAoKSlcbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZE9uY2VMaXN0ZW5lciA9IG5vb3A7XG5cbnByb2Nlc3MubGlzdGVuZXJzID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIFtdIH1cblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gYSBkdXBsZXggc3RyZWFtIGlzIGp1c3QgYSBzdHJlYW0gdGhhdCBpcyBib3RoIHJlYWRhYmxlIGFuZCB3cml0YWJsZS5cbi8vIFNpbmNlIEpTIGRvZXNuJ3QgaGF2ZSBtdWx0aXBsZSBwcm90b3R5cGFsIGluaGVyaXRhbmNlLCB0aGlzIGNsYXNzXG4vLyBwcm90b3R5cGFsbHkgaW5oZXJpdHMgZnJvbSBSZWFkYWJsZSwgYW5kIHRoZW4gcGFyYXNpdGljYWxseSBmcm9tXG4vLyBXcml0YWJsZS5cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xuXG52YXIgcG5hID0gcmVxdWlyZSgncHJvY2Vzcy1uZXh0aWNrLWFyZ3MnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIG9iamVjdEtleXMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiAob2JqKSB7XG4gIHZhciBrZXlzID0gW107XG4gIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICBrZXlzLnB1c2goa2V5KTtcbiAgfXJldHVybiBrZXlzO1xufTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5tb2R1bGUuZXhwb3J0cyA9IER1cGxleDtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG52YXIgUmVhZGFibGUgPSByZXF1aXJlKCcuL19zdHJlYW1fcmVhZGFibGUnKTtcbnZhciBXcml0YWJsZSA9IHJlcXVpcmUoJy4vX3N0cmVhbV93cml0YWJsZScpO1xuXG51dGlsLmluaGVyaXRzKER1cGxleCwgUmVhZGFibGUpO1xuXG57XG4gIC8vIGF2b2lkIHNjb3BlIGNyZWVwLCB0aGUga2V5cyBhcnJheSBjYW4gdGhlbiBiZSBjb2xsZWN0ZWRcbiAgdmFyIGtleXMgPSBvYmplY3RLZXlzKFdyaXRhYmxlLnByb3RvdHlwZSk7XG4gIGZvciAodmFyIHYgPSAwOyB2IDwga2V5cy5sZW5ndGg7IHYrKykge1xuICAgIHZhciBtZXRob2QgPSBrZXlzW3ZdO1xuICAgIGlmICghRHVwbGV4LnByb3RvdHlwZVttZXRob2RdKSBEdXBsZXgucHJvdG90eXBlW21ldGhvZF0gPSBXcml0YWJsZS5wcm90b3R5cGVbbWV0aG9kXTtcbiAgfVxufVxuXG5mdW5jdGlvbiBEdXBsZXgob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRHVwbGV4KSkgcmV0dXJuIG5ldyBEdXBsZXgob3B0aW9ucyk7XG5cbiAgUmVhZGFibGUuY2FsbCh0aGlzLCBvcHRpb25zKTtcbiAgV3JpdGFibGUuY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnJlYWRhYmxlID09PSBmYWxzZSkgdGhpcy5yZWFkYWJsZSA9IGZhbHNlO1xuXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMud3JpdGFibGUgPT09IGZhbHNlKSB0aGlzLndyaXRhYmxlID0gZmFsc2U7XG5cbiAgdGhpcy5hbGxvd0hhbGZPcGVuID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5hbGxvd0hhbGZPcGVuID09PSBmYWxzZSkgdGhpcy5hbGxvd0hhbGZPcGVuID0gZmFsc2U7XG5cbiAgdGhpcy5vbmNlKCdlbmQnLCBvbmVuZCk7XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShEdXBsZXgucHJvdG90eXBlLCAnd3JpdGFibGVIaWdoV2F0ZXJNYXJrJywge1xuICAvLyBtYWtpbmcgaXQgZXhwbGljaXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZW51bWVyYWJsZVxuICAvLyBiZWNhdXNlIG90aGVyd2lzZSBzb21lIHByb3RvdHlwZSBtYW5pcHVsYXRpb24gaW5cbiAgLy8gdXNlcmxhbmQgd2lsbCBmYWlsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrO1xuICB9XG59KTtcblxuLy8gdGhlIG5vLWhhbGYtb3BlbiBlbmZvcmNlclxuZnVuY3Rpb24gb25lbmQoKSB7XG4gIC8vIGlmIHdlIGFsbG93IGhhbGYtb3BlbiBzdGF0ZSwgb3IgaWYgdGhlIHdyaXRhYmxlIHNpZGUgZW5kZWQsXG4gIC8vIHRoZW4gd2UncmUgb2suXG4gIGlmICh0aGlzLmFsbG93SGFsZk9wZW4gfHwgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRlZCkgcmV0dXJuO1xuXG4gIC8vIG5vIG1vcmUgZGF0YSBjYW4gYmUgd3JpdHRlbi5cbiAgLy8gQnV0IGFsbG93IG1vcmUgd3JpdGVzIHRvIGhhcHBlbiBpbiB0aGlzIHRpY2suXG4gIHBuYS5uZXh0VGljayhvbkVuZE5ULCB0aGlzKTtcbn1cblxuZnVuY3Rpb24gb25FbmROVChzZWxmKSB7XG4gIHNlbGYuZW5kKCk7XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShEdXBsZXgucHJvdG90eXBlLCAnZGVzdHJveWVkJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuX3dyaXRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgJiYgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgLy8gd2UgaWdub3JlIHRoZSB2YWx1ZSBpZiB0aGUgc3RyZWFtXG4gICAgLy8gaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIHlldFxuICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlID09PSB1bmRlZmluZWQgfHwgdGhpcy5fd3JpdGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdGhlIHVzZXIgaXMgZXhwbGljaXRseVxuICAgIC8vIG1hbmFnaW5nIGRlc3Ryb3llZFxuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkID0gdmFsdWU7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB2YWx1ZTtcbiAgfVxufSk7XG5cbkR1cGxleC5wcm90b3R5cGUuX2Rlc3Ryb3kgPSBmdW5jdGlvbiAoZXJyLCBjYikge1xuICB0aGlzLnB1c2gobnVsbCk7XG4gIHRoaXMuZW5kKCk7XG5cbiAgcG5hLm5leHRUaWNrKGNiLCBlcnIpO1xufTsiLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gYSBwYXNzdGhyb3VnaCBzdHJlYW0uXG4vLyBiYXNpY2FsbHkganVzdCB0aGUgbW9zdCBtaW5pbWFsIHNvcnQgb2YgVHJhbnNmb3JtIHN0cmVhbS5cbi8vIEV2ZXJ5IHdyaXR0ZW4gY2h1bmsgZ2V0cyBvdXRwdXQgYXMtaXMuXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBQYXNzVGhyb3VnaDtcblxudmFyIFRyYW5zZm9ybSA9IHJlcXVpcmUoJy4vX3N0cmVhbV90cmFuc2Zvcm0nKTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG51dGlsLmluaGVyaXRzKFBhc3NUaHJvdWdoLCBUcmFuc2Zvcm0pO1xuXG5mdW5jdGlvbiBQYXNzVGhyb3VnaChvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBQYXNzVGhyb3VnaCkpIHJldHVybiBuZXcgUGFzc1Rocm91Z2gob3B0aW9ucyk7XG5cbiAgVHJhbnNmb3JtLmNhbGwodGhpcywgb3B0aW9ucyk7XG59XG5cblBhc3NUaHJvdWdoLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2IobnVsbCwgY2h1bmspO1xufTsiLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xuXG52YXIgcG5hID0gcmVxdWlyZSgncHJvY2Vzcy1uZXh0aWNrLWFyZ3MnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWRhYmxlO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCdpc2FycmF5Jyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBEdXBsZXg7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuUmVhZGFibGUuUmVhZGFibGVTdGF0ZSA9IFJlYWRhYmxlU3RhdGU7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgRUUgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG5cbnZhciBFRWxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbiAoZW1pdHRlciwgdHlwZSkge1xuICByZXR1cm4gZW1pdHRlci5saXN0ZW5lcnModHlwZSkubGVuZ3RoO1xufTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIFN0cmVhbSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9zdHJlYW0nKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xuXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXI7XG52YXIgT3VyVWludDhBcnJheSA9IGdsb2JhbC5VaW50OEFycmF5IHx8IGZ1bmN0aW9uICgpIHt9O1xuZnVuY3Rpb24gX3VpbnQ4QXJyYXlUb0J1ZmZlcihjaHVuaykge1xuICByZXR1cm4gQnVmZmVyLmZyb20oY2h1bmspO1xufVxuZnVuY3Rpb24gX2lzVWludDhBcnJheShvYmopIHtcbiAgcmV0dXJuIEJ1ZmZlci5pc0J1ZmZlcihvYmopIHx8IG9iaiBpbnN0YW5jZW9mIE91clVpbnQ4QXJyYXk7XG59XG5cbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHV0aWwgPSByZXF1aXJlKCdjb3JlLXV0aWwtaXMnKTtcbnV0aWwuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgZGVidWdVdGlsID0gcmVxdWlyZSgndXRpbCcpO1xudmFyIGRlYnVnID0gdm9pZCAwO1xuaWYgKGRlYnVnVXRpbCAmJiBkZWJ1Z1V0aWwuZGVidWdsb2cpIHtcbiAgZGVidWcgPSBkZWJ1Z1V0aWwuZGVidWdsb2coJ3N0cmVhbScpO1xufSBlbHNlIHtcbiAgZGVidWcgPSBmdW5jdGlvbiAoKSB7fTtcbn1cbi8qPC9yZXBsYWNlbWVudD4qL1xuXG52YXIgQnVmZmVyTGlzdCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9CdWZmZXJMaXN0Jyk7XG52YXIgZGVzdHJveUltcGwgPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvZGVzdHJveScpO1xudmFyIFN0cmluZ0RlY29kZXI7XG5cbnV0aWwuaW5oZXJpdHMoUmVhZGFibGUsIFN0cmVhbSk7XG5cbnZhciBrUHJveHlFdmVudHMgPSBbJ2Vycm9yJywgJ2Nsb3NlJywgJ2Rlc3Ryb3knLCAncGF1c2UnLCAncmVzdW1lJ107XG5cbmZ1bmN0aW9uIHByZXBlbmRMaXN0ZW5lcihlbWl0dGVyLCBldmVudCwgZm4pIHtcbiAgLy8gU2FkbHkgdGhpcyBpcyBub3QgY2FjaGVhYmxlIGFzIHNvbWUgbGlicmFyaWVzIGJ1bmRsZSB0aGVpciBvd25cbiAgLy8gZXZlbnQgZW1pdHRlciBpbXBsZW1lbnRhdGlvbiB3aXRoIHRoZW0uXG4gIGlmICh0eXBlb2YgZW1pdHRlci5wcmVwZW5kTGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHJldHVybiBlbWl0dGVyLnByZXBlbmRMaXN0ZW5lcihldmVudCwgZm4pO1xuXG4gIC8vIFRoaXMgaXMgYSBoYWNrIHRvIG1ha2Ugc3VyZSB0aGF0IG91ciBlcnJvciBoYW5kbGVyIGlzIGF0dGFjaGVkIGJlZm9yZSBhbnlcbiAgLy8gdXNlcmxhbmQgb25lcy4gIE5FVkVSIERPIFRISVMuIFRoaXMgaXMgaGVyZSBvbmx5IGJlY2F1c2UgdGhpcyBjb2RlIG5lZWRzXG4gIC8vIHRvIGNvbnRpbnVlIHRvIHdvcmsgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBOb2RlLmpzIHRoYXQgZG8gbm90IGluY2x1ZGVcbiAgLy8gdGhlIHByZXBlbmRMaXN0ZW5lcigpIG1ldGhvZC4gVGhlIGdvYWwgaXMgdG8gZXZlbnR1YWxseSByZW1vdmUgdGhpcyBoYWNrLlxuICBpZiAoIWVtaXR0ZXIuX2V2ZW50cyB8fCAhZW1pdHRlci5fZXZlbnRzW2V2ZW50XSkgZW1pdHRlci5vbihldmVudCwgZm4pO2Vsc2UgaWYgKGlzQXJyYXkoZW1pdHRlci5fZXZlbnRzW2V2ZW50XSkpIGVtaXR0ZXIuX2V2ZW50c1tldmVudF0udW5zaGlmdChmbik7ZWxzZSBlbWl0dGVyLl9ldmVudHNbZXZlbnRdID0gW2ZuLCBlbWl0dGVyLl9ldmVudHNbZXZlbnRdXTtcbn1cblxuZnVuY3Rpb24gUmVhZGFibGVTdGF0ZShvcHRpb25zLCBzdHJlYW0pIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyBEdXBsZXggc3RyZWFtcyBhcmUgYm90aCByZWFkYWJsZSBhbmQgd3JpdGFibGUsIGJ1dCBzaGFyZVxuICAvLyB0aGUgc2FtZSBvcHRpb25zIG9iamVjdC5cbiAgLy8gSG93ZXZlciwgc29tZSBjYXNlcyByZXF1aXJlIHNldHRpbmcgb3B0aW9ucyB0byBkaWZmZXJlbnRcbiAgLy8gdmFsdWVzIGZvciB0aGUgcmVhZGFibGUgYW5kIHRoZSB3cml0YWJsZSBzaWRlcyBvZiB0aGUgZHVwbGV4IHN0cmVhbS5cbiAgLy8gVGhlc2Ugb3B0aW9ucyBjYW4gYmUgcHJvdmlkZWQgc2VwYXJhdGVseSBhcyByZWFkYWJsZVhYWCBhbmQgd3JpdGFibGVYWFguXG4gIHZhciBpc0R1cGxleCA9IHN0cmVhbSBpbnN0YW5jZW9mIER1cGxleDtcblxuICAvLyBvYmplY3Qgc3RyZWFtIGZsYWcuIFVzZWQgdG8gbWFrZSByZWFkKG4pIGlnbm9yZSBuIGFuZCB0b1xuICAvLyBtYWtlIGFsbCB0aGUgYnVmZmVyIG1lcmdpbmcgYW5kIGxlbmd0aCBjaGVja3MgZ28gYXdheVxuICB0aGlzLm9iamVjdE1vZGUgPSAhIW9wdGlvbnMub2JqZWN0TW9kZTtcblxuICBpZiAoaXNEdXBsZXgpIHRoaXMub2JqZWN0TW9kZSA9IHRoaXMub2JqZWN0TW9kZSB8fCAhIW9wdGlvbnMucmVhZGFibGVPYmplY3RNb2RlO1xuXG4gIC8vIHRoZSBwb2ludCBhdCB3aGljaCBpdCBzdG9wcyBjYWxsaW5nIF9yZWFkKCkgdG8gZmlsbCB0aGUgYnVmZmVyXG4gIC8vIE5vdGU6IDAgaXMgYSB2YWxpZCB2YWx1ZSwgbWVhbnMgXCJkb24ndCBjYWxsIF9yZWFkIHByZWVtcHRpdmVseSBldmVyXCJcbiAgdmFyIGh3bSA9IG9wdGlvbnMuaGlnaFdhdGVyTWFyaztcbiAgdmFyIHJlYWRhYmxlSHdtID0gb3B0aW9ucy5yZWFkYWJsZUhpZ2hXYXRlck1hcms7XG4gIHZhciBkZWZhdWx0SHdtID0gdGhpcy5vYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjQ7XG5cbiAgaWYgKGh3bSB8fCBod20gPT09IDApIHRoaXMuaGlnaFdhdGVyTWFyayA9IGh3bTtlbHNlIGlmIChpc0R1cGxleCAmJiAocmVhZGFibGVId20gfHwgcmVhZGFibGVId20gPT09IDApKSB0aGlzLmhpZ2hXYXRlck1hcmsgPSByZWFkYWJsZUh3bTtlbHNlIHRoaXMuaGlnaFdhdGVyTWFyayA9IGRlZmF1bHRId207XG5cbiAgLy8gY2FzdCB0byBpbnRzLlxuICB0aGlzLmhpZ2hXYXRlck1hcmsgPSBNYXRoLmZsb29yKHRoaXMuaGlnaFdhdGVyTWFyayk7XG5cbiAgLy8gQSBsaW5rZWQgbGlzdCBpcyB1c2VkIHRvIHN0b3JlIGRhdGEgY2h1bmtzIGluc3RlYWQgb2YgYW4gYXJyYXkgYmVjYXVzZSB0aGVcbiAgLy8gbGlua2VkIGxpc3QgY2FuIHJlbW92ZSBlbGVtZW50cyBmcm9tIHRoZSBiZWdpbm5pbmcgZmFzdGVyIHRoYW5cbiAgLy8gYXJyYXkuc2hpZnQoKVxuICB0aGlzLmJ1ZmZlciA9IG5ldyBCdWZmZXJMaXN0KCk7XG4gIHRoaXMubGVuZ3RoID0gMDtcbiAgdGhpcy5waXBlcyA9IG51bGw7XG4gIHRoaXMucGlwZXNDb3VudCA9IDA7XG4gIHRoaXMuZmxvd2luZyA9IG51bGw7XG4gIHRoaXMuZW5kZWQgPSBmYWxzZTtcbiAgdGhpcy5lbmRFbWl0dGVkID0gZmFsc2U7XG4gIHRoaXMucmVhZGluZyA9IGZhbHNlO1xuXG4gIC8vIGEgZmxhZyB0byBiZSBhYmxlIHRvIHRlbGwgaWYgdGhlIGV2ZW50ICdyZWFkYWJsZScvJ2RhdGEnIGlzIGVtaXR0ZWRcbiAgLy8gaW1tZWRpYXRlbHksIG9yIG9uIGEgbGF0ZXIgdGljay4gIFdlIHNldCB0aGlzIHRvIHRydWUgYXQgZmlyc3QsIGJlY2F1c2VcbiAgLy8gYW55IGFjdGlvbnMgdGhhdCBzaG91bGRuJ3QgaGFwcGVuIHVudGlsIFwibGF0ZXJcIiBzaG91bGQgZ2VuZXJhbGx5IGFsc29cbiAgLy8gbm90IGhhcHBlbiBiZWZvcmUgdGhlIGZpcnN0IHJlYWQgY2FsbC5cbiAgdGhpcy5zeW5jID0gdHJ1ZTtcblxuICAvLyB3aGVuZXZlciB3ZSByZXR1cm4gbnVsbCwgdGhlbiB3ZSBzZXQgYSBmbGFnIHRvIHNheVxuICAvLyB0aGF0IHdlJ3JlIGF3YWl0aW5nIGEgJ3JlYWRhYmxlJyBldmVudCBlbWlzc2lvbi5cbiAgdGhpcy5uZWVkUmVhZGFibGUgPSBmYWxzZTtcbiAgdGhpcy5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZTtcbiAgdGhpcy5yZWFkYWJsZUxpc3RlbmluZyA9IGZhbHNlO1xuICB0aGlzLnJlc3VtZVNjaGVkdWxlZCA9IGZhbHNlO1xuXG4gIC8vIGhhcyBpdCBiZWVuIGRlc3Ryb3llZFxuICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuXG4gIC8vIENyeXB0byBpcyBraW5kIG9mIG9sZCBhbmQgY3J1c3R5LiAgSGlzdG9yaWNhbGx5LCBpdHMgZGVmYXVsdCBzdHJpbmdcbiAgLy8gZW5jb2RpbmcgaXMgJ2JpbmFyeScgc28gd2UgaGF2ZSB0byBtYWtlIHRoaXMgY29uZmlndXJhYmxlLlxuICAvLyBFdmVyeXRoaW5nIGVsc2UgaW4gdGhlIHVuaXZlcnNlIHVzZXMgJ3V0ZjgnLCB0aG91Z2guXG4gIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gb3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcgfHwgJ3V0ZjgnO1xuXG4gIC8vIHRoZSBudW1iZXIgb2Ygd3JpdGVycyB0aGF0IGFyZSBhd2FpdGluZyBhIGRyYWluIGV2ZW50IGluIC5waXBlKClzXG4gIHRoaXMuYXdhaXREcmFpbiA9IDA7XG5cbiAgLy8gaWYgdHJ1ZSwgYSBtYXliZVJlYWRNb3JlIGhhcyBiZWVuIHNjaGVkdWxlZFxuICB0aGlzLnJlYWRpbmdNb3JlID0gZmFsc2U7XG5cbiAgdGhpcy5kZWNvZGVyID0gbnVsbDtcbiAgdGhpcy5lbmNvZGluZyA9IG51bGw7XG4gIGlmIChvcHRpb25zLmVuY29kaW5nKSB7XG4gICAgaWYgKCFTdHJpbmdEZWNvZGVyKSBTdHJpbmdEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXIvJykuU3RyaW5nRGVjb2RlcjtcbiAgICB0aGlzLmRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihvcHRpb25zLmVuY29kaW5nKTtcbiAgICB0aGlzLmVuY29kaW5nID0gb3B0aW9ucy5lbmNvZGluZztcbiAgfVxufVxuXG5mdW5jdGlvbiBSZWFkYWJsZShvcHRpb25zKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJlYWRhYmxlKSkgcmV0dXJuIG5ldyBSZWFkYWJsZShvcHRpb25zKTtcblxuICB0aGlzLl9yZWFkYWJsZVN0YXRlID0gbmV3IFJlYWRhYmxlU3RhdGUob3B0aW9ucywgdGhpcyk7XG5cbiAgLy8gbGVnYWN5XG4gIHRoaXMucmVhZGFibGUgPSB0cnVlO1xuXG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLnJlYWQgPT09ICdmdW5jdGlvbicpIHRoaXMuX3JlYWQgPSBvcHRpb25zLnJlYWQ7XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZGVzdHJveSA9IG9wdGlvbnMuZGVzdHJveTtcbiAgfVxuXG4gIFN0cmVhbS5jYWxsKHRoaXMpO1xufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGUucHJvdG90eXBlLCAnZGVzdHJveWVkJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZDtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAvLyB3ZSBpZ25vcmUgdGhlIHZhbHVlIGlmIHRoZSBzdHJlYW1cbiAgICAvLyBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0XG4gICAgaWYgKCF0aGlzLl9yZWFkYWJsZVN0YXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdGhlIHVzZXIgaXMgZXhwbGljaXRseVxuICAgIC8vIG1hbmFnaW5nIGRlc3Ryb3llZFxuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkID0gdmFsdWU7XG4gIH1cbn0pO1xuXG5SZWFkYWJsZS5wcm90b3R5cGUuZGVzdHJveSA9IGRlc3Ryb3lJbXBsLmRlc3Ryb3k7XG5SZWFkYWJsZS5wcm90b3R5cGUuX3VuZGVzdHJveSA9IGRlc3Ryb3lJbXBsLnVuZGVzdHJveTtcblJlYWRhYmxlLnByb3RvdHlwZS5fZGVzdHJveSA9IGZ1bmN0aW9uIChlcnIsIGNiKSB7XG4gIHRoaXMucHVzaChudWxsKTtcbiAgY2IoZXJyKTtcbn07XG5cbi8vIE1hbnVhbGx5IHNob3ZlIHNvbWV0aGluZyBpbnRvIHRoZSByZWFkKCkgYnVmZmVyLlxuLy8gVGhpcyByZXR1cm5zIHRydWUgaWYgdGhlIGhpZ2hXYXRlck1hcmsgaGFzIG5vdCBiZWVuIGhpdCB5ZXQsXG4vLyBzaW1pbGFyIHRvIGhvdyBXcml0YWJsZS53cml0ZSgpIHJldHVybnMgdHJ1ZSBpZiB5b3Ugc2hvdWxkXG4vLyB3cml0ZSgpIHNvbWUgbW9yZS5cblJlYWRhYmxlLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZykge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgc2tpcENodW5rQ2hlY2s7XG5cbiAgaWYgKCFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgaWYgKHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gZW5jb2RpbmcgfHwgc3RhdGUuZGVmYXVsdEVuY29kaW5nO1xuICAgICAgaWYgKGVuY29kaW5nICE9PSBzdGF0ZS5lbmNvZGluZykge1xuICAgICAgICBjaHVuayA9IEJ1ZmZlci5mcm9tKGNodW5rLCBlbmNvZGluZyk7XG4gICAgICAgIGVuY29kaW5nID0gJyc7XG4gICAgICB9XG4gICAgICBza2lwQ2h1bmtDaGVjayA9IHRydWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHNraXBDaHVua0NoZWNrID0gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIGNodW5rLCBlbmNvZGluZywgZmFsc2UsIHNraXBDaHVua0NoZWNrKTtcbn07XG5cbi8vIFVuc2hpZnQgc2hvdWxkICphbHdheXMqIGJlIHNvbWV0aGluZyBkaXJlY3RseSBvdXQgb2YgcmVhZCgpXG5SZWFkYWJsZS5wcm90b3R5cGUudW5zaGlmdCA9IGZ1bmN0aW9uIChjaHVuaykge1xuICByZXR1cm4gcmVhZGFibGVBZGRDaHVuayh0aGlzLCBjaHVuaywgbnVsbCwgdHJ1ZSwgZmFsc2UpO1xufTtcblxuZnVuY3Rpb24gcmVhZGFibGVBZGRDaHVuayhzdHJlYW0sIGNodW5rLCBlbmNvZGluZywgYWRkVG9Gcm9udCwgc2tpcENodW5rQ2hlY2spIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBpZiAoY2h1bmsgPT09IG51bGwpIHtcbiAgICBzdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG4gICAgb25Fb2ZDaHVuayhzdHJlYW0sIHN0YXRlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZXI7XG4gICAgaWYgKCFza2lwQ2h1bmtDaGVjaykgZXIgPSBjaHVua0ludmFsaWQoc3RhdGUsIGNodW5rKTtcbiAgICBpZiAoZXIpIHtcbiAgICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLm9iamVjdE1vZGUgfHwgY2h1bmsgJiYgY2h1bmsubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKHR5cGVvZiBjaHVuayAhPT0gJ3N0cmluZycgJiYgIXN0YXRlLm9iamVjdE1vZGUgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKGNodW5rKSAhPT0gQnVmZmVyLnByb3RvdHlwZSkge1xuICAgICAgICBjaHVuayA9IF91aW50OEFycmF5VG9CdWZmZXIoY2h1bmspO1xuICAgICAgfVxuXG4gICAgICBpZiAoYWRkVG9Gcm9udCkge1xuICAgICAgICBpZiAoc3RhdGUuZW5kRW1pdHRlZCkgc3RyZWFtLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdzdHJlYW0udW5zaGlmdCgpIGFmdGVyIGVuZCBldmVudCcpKTtlbHNlIGFkZENodW5rKHN0cmVhbSwgc3RhdGUsIGNodW5rLCB0cnVlKTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUuZW5kZWQpIHtcbiAgICAgICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdzdHJlYW0ucHVzaCgpIGFmdGVyIEVPRicpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHN0YXRlLmRlY29kZXIgJiYgIWVuY29kaW5nKSB7XG4gICAgICAgICAgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLndyaXRlKGNodW5rKTtcbiAgICAgICAgICBpZiAoc3RhdGUub2JqZWN0TW9kZSB8fCBjaHVuay5sZW5ndGggIT09IDApIGFkZENodW5rKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBmYWxzZSk7ZWxzZSBtYXliZVJlYWRNb3JlKHN0cmVhbSwgc3RhdGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFkZENodW5rKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFhZGRUb0Zyb250KSB7XG4gICAgICBzdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5lZWRNb3JlRGF0YShzdGF0ZSk7XG59XG5cbmZ1bmN0aW9uIGFkZENodW5rKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBhZGRUb0Zyb250KSB7XG4gIGlmIChzdGF0ZS5mbG93aW5nICYmIHN0YXRlLmxlbmd0aCA9PT0gMCAmJiAhc3RhdGUuc3luYykge1xuICAgIHN0cmVhbS5lbWl0KCdkYXRhJywgY2h1bmspO1xuICAgIHN0cmVhbS5yZWFkKDApO1xuICB9IGVsc2Uge1xuICAgIC8vIHVwZGF0ZSB0aGUgYnVmZmVyIGluZm8uXG4gICAgc3RhdGUubGVuZ3RoICs9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuICAgIGlmIChhZGRUb0Zyb250KSBzdGF0ZS5idWZmZXIudW5zaGlmdChjaHVuayk7ZWxzZSBzdGF0ZS5idWZmZXIucHVzaChjaHVuayk7XG5cbiAgICBpZiAoc3RhdGUubmVlZFJlYWRhYmxlKSBlbWl0UmVhZGFibGUoc3RyZWFtKTtcbiAgfVxuICBtYXliZVJlYWRNb3JlKHN0cmVhbSwgc3RhdGUpO1xufVxuXG5mdW5jdGlvbiBjaHVua0ludmFsaWQoc3RhdGUsIGNodW5rKSB7XG4gIHZhciBlcjtcbiAgaWYgKCFfaXNVaW50OEFycmF5KGNodW5rKSAmJiB0eXBlb2YgY2h1bmsgIT09ICdzdHJpbmcnICYmIGNodW5rICE9PSB1bmRlZmluZWQgJiYgIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBlciA9IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsnKTtcbiAgfVxuICByZXR1cm4gZXI7XG59XG5cbi8vIGlmIGl0J3MgcGFzdCB0aGUgaGlnaCB3YXRlciBtYXJrLCB3ZSBjYW4gcHVzaCBpbiBzb21lIG1vcmUuXG4vLyBBbHNvLCBpZiB3ZSBoYXZlIG5vIGRhdGEgeWV0LCB3ZSBjYW4gc3RhbmQgc29tZVxuLy8gbW9yZSBieXRlcy4gIFRoaXMgaXMgdG8gd29yayBhcm91bmQgY2FzZXMgd2hlcmUgaHdtPTAsXG4vLyBzdWNoIGFzIHRoZSByZXBsLiAgQWxzbywgaWYgdGhlIHB1c2goKSB0cmlnZ2VyZWQgYVxuLy8gcmVhZGFibGUgZXZlbnQsIGFuZCB0aGUgdXNlciBjYWxsZWQgcmVhZChsYXJnZU51bWJlcikgc3VjaCB0aGF0XG4vLyBuZWVkUmVhZGFibGUgd2FzIHNldCwgdGhlbiB3ZSBvdWdodCB0byBwdXNoIG1vcmUsIHNvIHRoYXQgYW5vdGhlclxuLy8gJ3JlYWRhYmxlJyBldmVudCB3aWxsIGJlIHRyaWdnZXJlZC5cbmZ1bmN0aW9uIG5lZWRNb3JlRGF0YShzdGF0ZSkge1xuICByZXR1cm4gIXN0YXRlLmVuZGVkICYmIChzdGF0ZS5uZWVkUmVhZGFibGUgfHwgc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyayB8fCBzdGF0ZS5sZW5ndGggPT09IDApO1xufVxuXG5SZWFkYWJsZS5wcm90b3R5cGUuaXNQYXVzZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPT09IGZhbHNlO1xufTtcblxuLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG5SZWFkYWJsZS5wcm90b3R5cGUuc2V0RW5jb2RpbmcgPSBmdW5jdGlvbiAoZW5jKSB7XG4gIGlmICghU3RyaW5nRGVjb2RlcikgU3RyaW5nRGVjb2RlciA9IHJlcXVpcmUoJ3N0cmluZ19kZWNvZGVyLycpLlN0cmluZ0RlY29kZXI7XG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKGVuYyk7XG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5jb2RpbmcgPSBlbmM7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gRG9uJ3QgcmFpc2UgdGhlIGh3bSA+IDhNQlxudmFyIE1BWF9IV00gPSAweDgwMDAwMDtcbmZ1bmN0aW9uIGNvbXB1dGVOZXdIaWdoV2F0ZXJNYXJrKG4pIHtcbiAgaWYgKG4gPj0gTUFYX0hXTSkge1xuICAgIG4gPSBNQVhfSFdNO1xuICB9IGVsc2Uge1xuICAgIC8vIEdldCB0aGUgbmV4dCBoaWdoZXN0IHBvd2VyIG9mIDIgdG8gcHJldmVudCBpbmNyZWFzaW5nIGh3bSBleGNlc3NpdmVseSBpblxuICAgIC8vIHRpbnkgYW1vdW50c1xuICAgIG4tLTtcbiAgICBuIHw9IG4gPj4+IDE7XG4gICAgbiB8PSBuID4+PiAyO1xuICAgIG4gfD0gbiA+Pj4gNDtcbiAgICBuIHw9IG4gPj4+IDg7XG4gICAgbiB8PSBuID4+PiAxNjtcbiAgICBuKys7XG4gIH1cbiAgcmV0dXJuIG47XG59XG5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgaW5saW5hYmxlLCBzbyBwbGVhc2UgdGFrZSBjYXJlIHdoZW4gbWFraW5nXG4vLyBjaGFuZ2VzIHRvIHRoZSBmdW5jdGlvbiBib2R5LlxuZnVuY3Rpb24gaG93TXVjaFRvUmVhZChuLCBzdGF0ZSkge1xuICBpZiAobiA8PSAwIHx8IHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkgcmV0dXJuIDA7XG4gIGlmIChzdGF0ZS5vYmplY3RNb2RlKSByZXR1cm4gMTtcbiAgaWYgKG4gIT09IG4pIHtcbiAgICAvLyBPbmx5IGZsb3cgb25lIGJ1ZmZlciBhdCBhIHRpbWVcbiAgICBpZiAoc3RhdGUuZmxvd2luZyAmJiBzdGF0ZS5sZW5ndGgpIHJldHVybiBzdGF0ZS5idWZmZXIuaGVhZC5kYXRhLmxlbmd0aDtlbHNlIHJldHVybiBzdGF0ZS5sZW5ndGg7XG4gIH1cbiAgLy8gSWYgd2UncmUgYXNraW5nIGZvciBtb3JlIHRoYW4gdGhlIGN1cnJlbnQgaHdtLCB0aGVuIHJhaXNlIHRoZSBod20uXG4gIGlmIChuID4gc3RhdGUuaGlnaFdhdGVyTWFyaykgc3RhdGUuaGlnaFdhdGVyTWFyayA9IGNvbXB1dGVOZXdIaWdoV2F0ZXJNYXJrKG4pO1xuICBpZiAobiA8PSBzdGF0ZS5sZW5ndGgpIHJldHVybiBuO1xuICAvLyBEb24ndCBoYXZlIGVub3VnaFxuICBpZiAoIXN0YXRlLmVuZGVkKSB7XG4gICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICByZXR1cm4gMDtcbiAgfVxuICByZXR1cm4gc3RhdGUubGVuZ3RoO1xufVxuXG4vLyB5b3UgY2FuIG92ZXJyaWRlIGVpdGhlciB0aGlzIG1ldGhvZCwgb3IgdGhlIGFzeW5jIF9yZWFkKG4pIGJlbG93LlxuUmVhZGFibGUucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbiAobikge1xuICBkZWJ1ZygncmVhZCcsIG4pO1xuICBuID0gcGFyc2VJbnQobiwgMTApO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgbk9yaWcgPSBuO1xuXG4gIGlmIChuICE9PSAwKSBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZTtcblxuICAvLyBpZiB3ZSdyZSBkb2luZyByZWFkKDApIHRvIHRyaWdnZXIgYSByZWFkYWJsZSBldmVudCwgYnV0IHdlXG4gIC8vIGFscmVhZHkgaGF2ZSBhIGJ1bmNoIG9mIGRhdGEgaW4gdGhlIGJ1ZmZlciwgdGhlbiBqdXN0IHRyaWdnZXJcbiAgLy8gdGhlICdyZWFkYWJsZScgZXZlbnQgYW5kIG1vdmUgb24uXG4gIGlmIChuID09PSAwICYmIHN0YXRlLm5lZWRSZWFkYWJsZSAmJiAoc3RhdGUubGVuZ3RoID49IHN0YXRlLmhpZ2hXYXRlck1hcmsgfHwgc3RhdGUuZW5kZWQpKSB7XG4gICAgZGVidWcoJ3JlYWQ6IGVtaXRSZWFkYWJsZScsIHN0YXRlLmxlbmd0aCwgc3RhdGUuZW5kZWQpO1xuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUuZW5kZWQpIGVuZFJlYWRhYmxlKHRoaXMpO2Vsc2UgZW1pdFJlYWRhYmxlKHRoaXMpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgbiA9IGhvd011Y2hUb1JlYWQobiwgc3RhdGUpO1xuXG4gIC8vIGlmIHdlJ3ZlIGVuZGVkLCBhbmQgd2UncmUgbm93IGNsZWFyLCB0aGVuIGZpbmlzaCBpdCB1cC5cbiAgaWYgKG4gPT09IDAgJiYgc3RhdGUuZW5kZWQpIHtcbiAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKSBlbmRSZWFkYWJsZSh0aGlzKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIEFsbCB0aGUgYWN0dWFsIGNodW5rIGdlbmVyYXRpb24gbG9naWMgbmVlZHMgdG8gYmVcbiAgLy8gKmJlbG93KiB0aGUgY2FsbCB0byBfcmVhZC4gIFRoZSByZWFzb24gaXMgdGhhdCBpbiBjZXJ0YWluXG4gIC8vIHN5bnRoZXRpYyBzdHJlYW0gY2FzZXMsIHN1Y2ggYXMgcGFzc3Rocm91Z2ggc3RyZWFtcywgX3JlYWRcbiAgLy8gbWF5IGJlIGEgY29tcGxldGVseSBzeW5jaHJvbm91cyBvcGVyYXRpb24gd2hpY2ggbWF5IGNoYW5nZVxuICAvLyB0aGUgc3RhdGUgb2YgdGhlIHJlYWQgYnVmZmVyLCBwcm92aWRpbmcgZW5vdWdoIGRhdGEgd2hlblxuICAvLyBiZWZvcmUgdGhlcmUgd2FzICpub3QqIGVub3VnaC5cbiAgLy9cbiAgLy8gU28sIHRoZSBzdGVwcyBhcmU6XG4gIC8vIDEuIEZpZ3VyZSBvdXQgd2hhdCB0aGUgc3RhdGUgb2YgdGhpbmdzIHdpbGwgYmUgYWZ0ZXIgd2UgZG9cbiAgLy8gYSByZWFkIGZyb20gdGhlIGJ1ZmZlci5cbiAgLy9cbiAgLy8gMi4gSWYgdGhhdCByZXN1bHRpbmcgc3RhdGUgd2lsbCB0cmlnZ2VyIGEgX3JlYWQsIHRoZW4gY2FsbCBfcmVhZC5cbiAgLy8gTm90ZSB0aGF0IHRoaXMgbWF5IGJlIGFzeW5jaHJvbm91cywgb3Igc3luY2hyb25vdXMuICBZZXMsIGl0IGlzXG4gIC8vIGRlZXBseSB1Z2x5IHRvIHdyaXRlIEFQSXMgdGhpcyB3YXksIGJ1dCB0aGF0IHN0aWxsIGRvZXNuJ3QgbWVhblxuICAvLyB0aGF0IHRoZSBSZWFkYWJsZSBjbGFzcyBzaG91bGQgYmVoYXZlIGltcHJvcGVybHksIGFzIHN0cmVhbXMgYXJlXG4gIC8vIGRlc2lnbmVkIHRvIGJlIHN5bmMvYXN5bmMgYWdub3N0aWMuXG4gIC8vIFRha2Ugbm90ZSBpZiB0aGUgX3JlYWQgY2FsbCBpcyBzeW5jIG9yIGFzeW5jIChpZSwgaWYgdGhlIHJlYWQgY2FsbFxuICAvLyBoYXMgcmV0dXJuZWQgeWV0KSwgc28gdGhhdCB3ZSBrbm93IHdoZXRoZXIgb3Igbm90IGl0J3Mgc2FmZSB0byBlbWl0XG4gIC8vICdyZWFkYWJsZScgZXRjLlxuICAvL1xuICAvLyAzLiBBY3R1YWxseSBwdWxsIHRoZSByZXF1ZXN0ZWQgY2h1bmtzIG91dCBvZiB0aGUgYnVmZmVyIGFuZCByZXR1cm4uXG5cbiAgLy8gaWYgd2UgbmVlZCBhIHJlYWRhYmxlIGV2ZW50LCB0aGVuIHdlIG5lZWQgdG8gZG8gc29tZSByZWFkaW5nLlxuICB2YXIgZG9SZWFkID0gc3RhdGUubmVlZFJlYWRhYmxlO1xuICBkZWJ1ZygnbmVlZCByZWFkYWJsZScsIGRvUmVhZCk7XG5cbiAgLy8gaWYgd2UgY3VycmVudGx5IGhhdmUgbGVzcyB0aGFuIHRoZSBoaWdoV2F0ZXJNYXJrLCB0aGVuIGFsc28gcmVhZCBzb21lXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgfHwgc3RhdGUubGVuZ3RoIC0gbiA8IHN0YXRlLmhpZ2hXYXRlck1hcmspIHtcbiAgICBkb1JlYWQgPSB0cnVlO1xuICAgIGRlYnVnKCdsZW5ndGggbGVzcyB0aGFuIHdhdGVybWFyaycsIGRvUmVhZCk7XG4gIH1cblxuICAvLyBob3dldmVyLCBpZiB3ZSd2ZSBlbmRlZCwgdGhlbiB0aGVyZSdzIG5vIHBvaW50LCBhbmQgaWYgd2UncmUgYWxyZWFkeVxuICAvLyByZWFkaW5nLCB0aGVuIGl0J3MgdW5uZWNlc3NhcnkuXG4gIGlmIChzdGF0ZS5lbmRlZCB8fCBzdGF0ZS5yZWFkaW5nKSB7XG4gICAgZG9SZWFkID0gZmFsc2U7XG4gICAgZGVidWcoJ3JlYWRpbmcgb3IgZW5kZWQnLCBkb1JlYWQpO1xuICB9IGVsc2UgaWYgKGRvUmVhZCkge1xuICAgIGRlYnVnKCdkbyByZWFkJyk7XG4gICAgc3RhdGUucmVhZGluZyA9IHRydWU7XG4gICAgc3RhdGUuc3luYyA9IHRydWU7XG4gICAgLy8gaWYgdGhlIGxlbmd0aCBpcyBjdXJyZW50bHkgemVybywgdGhlbiB3ZSAqbmVlZCogYSByZWFkYWJsZSBldmVudC5cbiAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKSBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgIC8vIGNhbGwgaW50ZXJuYWwgcmVhZCBtZXRob2RcbiAgICB0aGlzLl9yZWFkKHN0YXRlLmhpZ2hXYXRlck1hcmspO1xuICAgIHN0YXRlLnN5bmMgPSBmYWxzZTtcbiAgICAvLyBJZiBfcmVhZCBwdXNoZWQgZGF0YSBzeW5jaHJvbm91c2x5LCB0aGVuIGByZWFkaW5nYCB3aWxsIGJlIGZhbHNlLFxuICAgIC8vIGFuZCB3ZSBuZWVkIHRvIHJlLWV2YWx1YXRlIGhvdyBtdWNoIGRhdGEgd2UgY2FuIHJldHVybiB0byB0aGUgdXNlci5cbiAgICBpZiAoIXN0YXRlLnJlYWRpbmcpIG4gPSBob3dNdWNoVG9SZWFkKG5PcmlnLCBzdGF0ZSk7XG4gIH1cblxuICB2YXIgcmV0O1xuICBpZiAobiA+IDApIHJldCA9IGZyb21MaXN0KG4sIHN0YXRlKTtlbHNlIHJldCA9IG51bGw7XG5cbiAgaWYgKHJldCA9PT0gbnVsbCkge1xuICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgbiA9IDA7XG4gIH0gZWxzZSB7XG4gICAgc3RhdGUubGVuZ3RoIC09IG47XG4gIH1cblxuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKSB7XG4gICAgLy8gSWYgd2UgaGF2ZSBub3RoaW5nIGluIHRoZSBidWZmZXIsIHRoZW4gd2Ugd2FudCB0byBrbm93XG4gICAgLy8gYXMgc29vbiBhcyB3ZSAqZG8qIGdldCBzb21ldGhpbmcgaW50byB0aGUgYnVmZmVyLlxuICAgIGlmICghc3RhdGUuZW5kZWQpIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG5cbiAgICAvLyBJZiB3ZSB0cmllZCB0byByZWFkKCkgcGFzdCB0aGUgRU9GLCB0aGVuIGVtaXQgZW5kIG9uIHRoZSBuZXh0IHRpY2suXG4gICAgaWYgKG5PcmlnICE9PSBuICYmIHN0YXRlLmVuZGVkKSBlbmRSZWFkYWJsZSh0aGlzKTtcbiAgfVxuXG4gIGlmIChyZXQgIT09IG51bGwpIHRoaXMuZW1pdCgnZGF0YScsIHJldCk7XG5cbiAgcmV0dXJuIHJldDtcbn07XG5cbmZ1bmN0aW9uIG9uRW9mQ2h1bmsoc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoc3RhdGUuZW5kZWQpIHJldHVybjtcbiAgaWYgKHN0YXRlLmRlY29kZXIpIHtcbiAgICB2YXIgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLmVuZCgpO1xuICAgIGlmIChjaHVuayAmJiBjaHVuay5sZW5ndGgpIHtcbiAgICAgIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKTtcbiAgICAgIHN0YXRlLmxlbmd0aCArPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcbiAgICB9XG4gIH1cbiAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuXG4gIC8vIGVtaXQgJ3JlYWRhYmxlJyBub3cgdG8gbWFrZSBzdXJlIGl0IGdldHMgcGlja2VkIHVwLlxuICBlbWl0UmVhZGFibGUoc3RyZWFtKTtcbn1cblxuLy8gRG9uJ3QgZW1pdCByZWFkYWJsZSByaWdodCBhd2F5IGluIHN5bmMgbW9kZSwgYmVjYXVzZSB0aGlzIGNhbiB0cmlnZ2VyXG4vLyBhbm90aGVyIHJlYWQoKSBjYWxsID0+IHN0YWNrIG92ZXJmbG93LiAgVGhpcyB3YXksIGl0IG1pZ2h0IHRyaWdnZXJcbi8vIGEgbmV4dFRpY2sgcmVjdXJzaW9uIHdhcm5pbmcsIGJ1dCB0aGF0J3Mgbm90IHNvIGJhZC5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZShzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBzdGF0ZS5uZWVkUmVhZGFibGUgPSBmYWxzZTtcbiAgaWYgKCFzdGF0ZS5lbWl0dGVkUmVhZGFibGUpIHtcbiAgICBkZWJ1ZygnZW1pdFJlYWRhYmxlJywgc3RhdGUuZmxvd2luZyk7XG4gICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICBpZiAoc3RhdGUuc3luYykgcG5hLm5leHRUaWNrKGVtaXRSZWFkYWJsZV8sIHN0cmVhbSk7ZWxzZSBlbWl0UmVhZGFibGVfKHN0cmVhbSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW1pdFJlYWRhYmxlXyhzdHJlYW0pIHtcbiAgZGVidWcoJ2VtaXQgcmVhZGFibGUnKTtcbiAgc3RyZWFtLmVtaXQoJ3JlYWRhYmxlJyk7XG4gIGZsb3coc3RyZWFtKTtcbn1cblxuLy8gYXQgdGhpcyBwb2ludCwgdGhlIHVzZXIgaGFzIHByZXN1bWFibHkgc2VlbiB0aGUgJ3JlYWRhYmxlJyBldmVudCxcbi8vIGFuZCBjYWxsZWQgcmVhZCgpIHRvIGNvbnN1bWUgc29tZSBkYXRhLiAgdGhhdCBtYXkgaGF2ZSB0cmlnZ2VyZWRcbi8vIGluIHR1cm4gYW5vdGhlciBfcmVhZChuKSBjYWxsLCBpbiB3aGljaCBjYXNlIHJlYWRpbmcgPSB0cnVlIGlmXG4vLyBpdCdzIGluIHByb2dyZXNzLlxuLy8gSG93ZXZlciwgaWYgd2UncmUgbm90IGVuZGVkLCBvciByZWFkaW5nLCBhbmQgdGhlIGxlbmd0aCA8IGh3bSxcbi8vIHRoZW4gZ28gYWhlYWQgYW5kIHRyeSB0byByZWFkIHNvbWUgbW9yZSBwcmVlbXB0aXZlbHkuXG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZWFkaW5nTW9yZSkge1xuICAgIHN0YXRlLnJlYWRpbmdNb3JlID0gdHJ1ZTtcbiAgICBwbmEubmV4dFRpY2sobWF5YmVSZWFkTW9yZV8sIHN0cmVhbSwgc3RhdGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1heWJlUmVhZE1vcmVfKHN0cmVhbSwgc3RhdGUpIHtcbiAgdmFyIGxlbiA9IHN0YXRlLmxlbmd0aDtcbiAgd2hpbGUgKCFzdGF0ZS5yZWFkaW5nICYmICFzdGF0ZS5mbG93aW5nICYmICFzdGF0ZS5lbmRlZCAmJiBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgZGVidWcoJ21heWJlUmVhZE1vcmUgcmVhZCAwJyk7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gICAgaWYgKGxlbiA9PT0gc3RhdGUubGVuZ3RoKVxuICAgICAgLy8gZGlkbid0IGdldCBhbnkgZGF0YSwgc3RvcCBzcGlubmluZy5cbiAgICAgIGJyZWFrO2Vsc2UgbGVuID0gc3RhdGUubGVuZ3RoO1xuICB9XG4gIHN0YXRlLnJlYWRpbmdNb3JlID0gZmFsc2U7XG59XG5cbi8vIGFic3RyYWN0IG1ldGhvZC4gIHRvIGJlIG92ZXJyaWRkZW4gaW4gc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gY2xhc3Nlcy5cbi8vIGNhbGwgY2IoZXIsIGRhdGEpIHdoZXJlIGRhdGEgaXMgPD0gbiBpbiBsZW5ndGguXG4vLyBmb3IgdmlydHVhbCAobm9uLXN0cmluZywgbm9uLWJ1ZmZlcikgc3RyZWFtcywgXCJsZW5ndGhcIiBpcyBzb21ld2hhdFxuLy8gYXJiaXRyYXJ5LCBhbmQgcGVyaGFwcyBub3QgdmVyeSBtZWFuaW5nZnVsLlxuUmVhZGFibGUucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignX3JlYWQoKSBpcyBub3QgaW1wbGVtZW50ZWQnKSk7XG59O1xuXG5SZWFkYWJsZS5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uIChkZXN0LCBwaXBlT3B0cykge1xuICB2YXIgc3JjID0gdGhpcztcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcblxuICBzd2l0Y2ggKHN0YXRlLnBpcGVzQ291bnQpIHtcbiAgICBjYXNlIDA6XG4gICAgICBzdGF0ZS5waXBlcyA9IGRlc3Q7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDE6XG4gICAgICBzdGF0ZS5waXBlcyA9IFtzdGF0ZS5waXBlcywgZGVzdF07XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgc3RhdGUucGlwZXMucHVzaChkZXN0KTtcbiAgICAgIGJyZWFrO1xuICB9XG4gIHN0YXRlLnBpcGVzQ291bnQgKz0gMTtcbiAgZGVidWcoJ3BpcGUgY291bnQ9JWQgb3B0cz0laicsIHN0YXRlLnBpcGVzQ291bnQsIHBpcGVPcHRzKTtcblxuICB2YXIgZG9FbmQgPSAoIXBpcGVPcHRzIHx8IHBpcGVPcHRzLmVuZCAhPT0gZmFsc2UpICYmIGRlc3QgIT09IHByb2Nlc3Muc3Rkb3V0ICYmIGRlc3QgIT09IHByb2Nlc3Muc3RkZXJyO1xuXG4gIHZhciBlbmRGbiA9IGRvRW5kID8gb25lbmQgOiB1bnBpcGU7XG4gIGlmIChzdGF0ZS5lbmRFbWl0dGVkKSBwbmEubmV4dFRpY2soZW5kRm4pO2Vsc2Ugc3JjLm9uY2UoJ2VuZCcsIGVuZEZuKTtcblxuICBkZXN0Lm9uKCd1bnBpcGUnLCBvbnVucGlwZSk7XG4gIGZ1bmN0aW9uIG9udW5waXBlKHJlYWRhYmxlLCB1bnBpcGVJbmZvKSB7XG4gICAgZGVidWcoJ29udW5waXBlJyk7XG4gICAgaWYgKHJlYWRhYmxlID09PSBzcmMpIHtcbiAgICAgIGlmICh1bnBpcGVJbmZvICYmIHVucGlwZUluZm8uaGFzVW5waXBlZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgdW5waXBlSW5mby5oYXNVbnBpcGVkID0gdHJ1ZTtcbiAgICAgICAgY2xlYW51cCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uZW5kKCkge1xuICAgIGRlYnVnKCdvbmVuZCcpO1xuICAgIGRlc3QuZW5kKCk7XG4gIH1cblxuICAvLyB3aGVuIHRoZSBkZXN0IGRyYWlucywgaXQgcmVkdWNlcyB0aGUgYXdhaXREcmFpbiBjb3VudGVyXG4gIC8vIG9uIHRoZSBzb3VyY2UuICBUaGlzIHdvdWxkIGJlIG1vcmUgZWxlZ2FudCB3aXRoIGEgLm9uY2UoKVxuICAvLyBoYW5kbGVyIGluIGZsb3coKSwgYnV0IGFkZGluZyBhbmQgcmVtb3ZpbmcgcmVwZWF0ZWRseSBpc1xuICAvLyB0b28gc2xvdy5cbiAgdmFyIG9uZHJhaW4gPSBwaXBlT25EcmFpbihzcmMpO1xuICBkZXN0Lm9uKCdkcmFpbicsIG9uZHJhaW4pO1xuXG4gIHZhciBjbGVhbmVkVXAgPSBmYWxzZTtcbiAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICBkZWJ1ZygnY2xlYW51cCcpO1xuICAgIC8vIGNsZWFudXAgZXZlbnQgaGFuZGxlcnMgb25jZSB0aGUgcGlwZSBpcyBicm9rZW5cbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdkcmFpbicsIG9uZHJhaW4pO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcigndW5waXBlJywgb251bnBpcGUpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25lbmQpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgdW5waXBlKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2RhdGEnLCBvbmRhdGEpO1xuXG4gICAgY2xlYW5lZFVwID0gdHJ1ZTtcblxuICAgIC8vIGlmIHRoZSByZWFkZXIgaXMgd2FpdGluZyBmb3IgYSBkcmFpbiBldmVudCBmcm9tIHRoaXNcbiAgICAvLyBzcGVjaWZpYyB3cml0ZXIsIHRoZW4gaXQgd291bGQgY2F1c2UgaXQgdG8gbmV2ZXIgc3RhcnRcbiAgICAvLyBmbG93aW5nIGFnYWluLlxuICAgIC8vIFNvLCBpZiB0aGlzIGlzIGF3YWl0aW5nIGEgZHJhaW4sIHRoZW4gd2UganVzdCBjYWxsIGl0IG5vdy5cbiAgICAvLyBJZiB3ZSBkb24ndCBrbm93LCB0aGVuIGFzc3VtZSB0aGF0IHdlIGFyZSB3YWl0aW5nIGZvciBvbmUuXG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4gJiYgKCFkZXN0Ll93cml0YWJsZVN0YXRlIHx8IGRlc3QuX3dyaXRhYmxlU3RhdGUubmVlZERyYWluKSkgb25kcmFpbigpO1xuICB9XG5cbiAgLy8gSWYgdGhlIHVzZXIgcHVzaGVzIG1vcmUgZGF0YSB3aGlsZSB3ZSdyZSB3cml0aW5nIHRvIGRlc3QgdGhlbiB3ZSdsbCBlbmQgdXBcbiAgLy8gaW4gb25kYXRhIGFnYWluLiBIb3dldmVyLCB3ZSBvbmx5IHdhbnQgdG8gaW5jcmVhc2UgYXdhaXREcmFpbiBvbmNlIGJlY2F1c2VcbiAgLy8gZGVzdCB3aWxsIG9ubHkgZW1pdCBvbmUgJ2RyYWluJyBldmVudCBmb3IgdGhlIG11bHRpcGxlIHdyaXRlcy5cbiAgLy8gPT4gSW50cm9kdWNlIGEgZ3VhcmQgb24gaW5jcmVhc2luZyBhd2FpdERyYWluLlxuICB2YXIgaW5jcmVhc2VkQXdhaXREcmFpbiA9IGZhbHNlO1xuICBzcmMub24oJ2RhdGEnLCBvbmRhdGEpO1xuICBmdW5jdGlvbiBvbmRhdGEoY2h1bmspIHtcbiAgICBkZWJ1Zygnb25kYXRhJyk7XG4gICAgaW5jcmVhc2VkQXdhaXREcmFpbiA9IGZhbHNlO1xuICAgIHZhciByZXQgPSBkZXN0LndyaXRlKGNodW5rKTtcbiAgICBpZiAoZmFsc2UgPT09IHJldCAmJiAhaW5jcmVhc2VkQXdhaXREcmFpbikge1xuICAgICAgLy8gSWYgdGhlIHVzZXIgdW5waXBlZCBkdXJpbmcgYGRlc3Qud3JpdGUoKWAsIGl0IGlzIHBvc3NpYmxlXG4gICAgICAvLyB0byBnZXQgc3R1Y2sgaW4gYSBwZXJtYW5lbnRseSBwYXVzZWQgc3RhdGUgaWYgdGhhdCB3cml0ZVxuICAgICAgLy8gYWxzbyByZXR1cm5lZCBmYWxzZS5cbiAgICAgIC8vID0+IENoZWNrIHdoZXRoZXIgYGRlc3RgIGlzIHN0aWxsIGEgcGlwaW5nIGRlc3RpbmF0aW9uLlxuICAgICAgaWYgKChzdGF0ZS5waXBlc0NvdW50ID09PSAxICYmIHN0YXRlLnBpcGVzID09PSBkZXN0IHx8IHN0YXRlLnBpcGVzQ291bnQgPiAxICYmIGluZGV4T2Yoc3RhdGUucGlwZXMsIGRlc3QpICE9PSAtMSkgJiYgIWNsZWFuZWRVcCkge1xuICAgICAgICBkZWJ1ZygnZmFsc2Ugd3JpdGUgcmVzcG9uc2UsIHBhdXNlJywgc3JjLl9yZWFkYWJsZVN0YXRlLmF3YWl0RHJhaW4pO1xuICAgICAgICBzcmMuX3JlYWRhYmxlU3RhdGUuYXdhaXREcmFpbisrO1xuICAgICAgICBpbmNyZWFzZWRBd2FpdERyYWluID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHNyYy5wYXVzZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHRoZSBkZXN0IGhhcyBhbiBlcnJvciwgdGhlbiBzdG9wIHBpcGluZyBpbnRvIGl0LlxuICAvLyBob3dldmVyLCBkb24ndCBzdXBwcmVzcyB0aGUgdGhyb3dpbmcgYmVoYXZpb3IgZm9yIHRoaXMuXG4gIGZ1bmN0aW9uIG9uZXJyb3IoZXIpIHtcbiAgICBkZWJ1Zygnb25lcnJvcicsIGVyKTtcbiAgICB1bnBpcGUoKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGlmIChFRWxpc3RlbmVyQ291bnQoZGVzdCwgJ2Vycm9yJykgPT09IDApIGRlc3QuZW1pdCgnZXJyb3InLCBlcik7XG4gIH1cblxuICAvLyBNYWtlIHN1cmUgb3VyIGVycm9yIGhhbmRsZXIgaXMgYXR0YWNoZWQgYmVmb3JlIHVzZXJsYW5kIG9uZXMuXG4gIHByZXBlbmRMaXN0ZW5lcihkZXN0LCAnZXJyb3InLCBvbmVycm9yKTtcblxuICAvLyBCb3RoIGNsb3NlIGFuZCBmaW5pc2ggc2hvdWxkIHRyaWdnZXIgdW5waXBlLCBidXQgb25seSBvbmNlLlxuICBmdW5jdGlvbiBvbmNsb3NlKCkge1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgICB1bnBpcGUoKTtcbiAgfVxuICBkZXN0Lm9uY2UoJ2Nsb3NlJywgb25jbG9zZSk7XG4gIGZ1bmN0aW9uIG9uZmluaXNoKCkge1xuICAgIGRlYnVnKCdvbmZpbmlzaCcpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSk7XG4gICAgdW5waXBlKCk7XG4gIH1cbiAgZGVzdC5vbmNlKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG5cbiAgZnVuY3Rpb24gdW5waXBlKCkge1xuICAgIGRlYnVnKCd1bnBpcGUnKTtcbiAgICBzcmMudW5waXBlKGRlc3QpO1xuICB9XG5cbiAgLy8gdGVsbCB0aGUgZGVzdCB0aGF0IGl0J3MgYmVpbmcgcGlwZWQgdG9cbiAgZGVzdC5lbWl0KCdwaXBlJywgc3JjKTtcblxuICAvLyBzdGFydCB0aGUgZmxvdyBpZiBpdCBoYXNuJ3QgYmVlbiBzdGFydGVkIGFscmVhZHkuXG4gIGlmICghc3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdwaXBlIHJlc3VtZScpO1xuICAgIHNyYy5yZXN1bWUoKTtcbiAgfVxuXG4gIHJldHVybiBkZXN0O1xufTtcblxuZnVuY3Rpb24gcGlwZU9uRHJhaW4oc3JjKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHN0YXRlID0gc3JjLl9yZWFkYWJsZVN0YXRlO1xuICAgIGRlYnVnKCdwaXBlT25EcmFpbicsIHN0YXRlLmF3YWl0RHJhaW4pO1xuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluKSBzdGF0ZS5hd2FpdERyYWluLS07XG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4gPT09IDAgJiYgRUVsaXN0ZW5lckNvdW50KHNyYywgJ2RhdGEnKSkge1xuICAgICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG4gICAgICBmbG93KHNyYyk7XG4gICAgfVxuICB9O1xufVxuXG5SZWFkYWJsZS5wcm90b3R5cGUudW5waXBlID0gZnVuY3Rpb24gKGRlc3QpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIHVucGlwZUluZm8gPSB7IGhhc1VucGlwZWQ6IGZhbHNlIH07XG5cbiAgLy8gaWYgd2UncmUgbm90IHBpcGluZyBhbnl3aGVyZSwgdGhlbiBkbyBub3RoaW5nLlxuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMCkgcmV0dXJuIHRoaXM7XG5cbiAgLy8ganVzdCBvbmUgZGVzdGluYXRpb24uICBtb3N0IGNvbW1vbiBjYXNlLlxuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMSkge1xuICAgIC8vIHBhc3NlZCBpbiBvbmUsIGJ1dCBpdCdzIG5vdCB0aGUgcmlnaHQgb25lLlxuICAgIGlmIChkZXN0ICYmIGRlc3QgIT09IHN0YXRlLnBpcGVzKSByZXR1cm4gdGhpcztcblxuICAgIGlmICghZGVzdCkgZGVzdCA9IHN0YXRlLnBpcGVzO1xuXG4gICAgLy8gZ290IGEgbWF0Y2guXG4gICAgc3RhdGUucGlwZXMgPSBudWxsO1xuICAgIHN0YXRlLnBpcGVzQ291bnQgPSAwO1xuICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICBpZiAoZGVzdCkgZGVzdC5lbWl0KCd1bnBpcGUnLCB0aGlzLCB1bnBpcGVJbmZvKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHNsb3cgY2FzZS4gbXVsdGlwbGUgcGlwZSBkZXN0aW5hdGlvbnMuXG5cbiAgaWYgKCFkZXN0KSB7XG4gICAgLy8gcmVtb3ZlIGFsbC5cbiAgICB2YXIgZGVzdHMgPSBzdGF0ZS5waXBlcztcbiAgICB2YXIgbGVuID0gc3RhdGUucGlwZXNDb3VudDtcbiAgICBzdGF0ZS5waXBlcyA9IG51bGw7XG4gICAgc3RhdGUucGlwZXNDb3VudCA9IDA7XG4gICAgc3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgZGVzdHNbaV0uZW1pdCgndW5waXBlJywgdGhpcywgdW5waXBlSW5mbyk7XG4gICAgfXJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gdHJ5IHRvIGZpbmQgdGhlIHJpZ2h0IG9uZS5cbiAgdmFyIGluZGV4ID0gaW5kZXhPZihzdGF0ZS5waXBlcywgZGVzdCk7XG4gIGlmIChpbmRleCA9PT0gLTEpIHJldHVybiB0aGlzO1xuXG4gIHN0YXRlLnBpcGVzLnNwbGljZShpbmRleCwgMSk7XG4gIHN0YXRlLnBpcGVzQ291bnQgLT0gMTtcbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEpIHN0YXRlLnBpcGVzID0gc3RhdGUucGlwZXNbMF07XG5cbiAgZGVzdC5lbWl0KCd1bnBpcGUnLCB0aGlzLCB1bnBpcGVJbmZvKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIHNldCB1cCBkYXRhIGV2ZW50cyBpZiB0aGV5IGFyZSBhc2tlZCBmb3Jcbi8vIEVuc3VyZSByZWFkYWJsZSBsaXN0ZW5lcnMgZXZlbnR1YWxseSBnZXQgc29tZXRoaW5nXG5SZWFkYWJsZS5wcm90b3R5cGUub24gPSBmdW5jdGlvbiAoZXYsIGZuKSB7XG4gIHZhciByZXMgPSBTdHJlYW0ucHJvdG90eXBlLm9uLmNhbGwodGhpcywgZXYsIGZuKTtcblxuICBpZiAoZXYgPT09ICdkYXRhJykge1xuICAgIC8vIFN0YXJ0IGZsb3dpbmcgb24gbmV4dCB0aWNrIGlmIHN0cmVhbSBpc24ndCBleHBsaWNpdGx5IHBhdXNlZFxuICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgIT09IGZhbHNlKSB0aGlzLnJlc3VtZSgpO1xuICB9IGVsc2UgaWYgKGV2ID09PSAncmVhZGFibGUnKSB7XG4gICAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQgJiYgIXN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nKSB7XG4gICAgICBzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZyA9IHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZTtcbiAgICAgIGlmICghc3RhdGUucmVhZGluZykge1xuICAgICAgICBwbmEubmV4dFRpY2soblJlYWRpbmdOZXh0VGljaywgdGhpcyk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLmxlbmd0aCkge1xuICAgICAgICBlbWl0UmVhZGFibGUodGhpcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlcztcbn07XG5SZWFkYWJsZS5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBSZWFkYWJsZS5wcm90b3R5cGUub247XG5cbmZ1bmN0aW9uIG5SZWFkaW5nTmV4dFRpY2soc2VsZikge1xuICBkZWJ1ZygncmVhZGFibGUgbmV4dHRpY2sgcmVhZCAwJyk7XG4gIHNlbGYucmVhZCgwKTtcbn1cblxuLy8gcGF1c2UoKSBhbmQgcmVzdW1lKCkgYXJlIHJlbW5hbnRzIG9mIHRoZSBsZWdhY3kgcmVhZGFibGUgc3RyZWFtIEFQSVxuLy8gSWYgdGhlIHVzZXIgdXNlcyB0aGVtLCB0aGVuIHN3aXRjaCBpbnRvIG9sZCBtb2RlLlxuUmVhZGFibGUucHJvdG90eXBlLnJlc3VtZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgaWYgKCFzdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3Jlc3VtZScpO1xuICAgIHN0YXRlLmZsb3dpbmcgPSB0cnVlO1xuICAgIHJlc3VtZSh0aGlzLCBzdGF0ZSk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiByZXN1bWUoc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoIXN0YXRlLnJlc3VtZVNjaGVkdWxlZCkge1xuICAgIHN0YXRlLnJlc3VtZVNjaGVkdWxlZCA9IHRydWU7XG4gICAgcG5hLm5leHRUaWNrKHJlc3VtZV8sIHN0cmVhbSwgc3RhdGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc3VtZV8oc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoIXN0YXRlLnJlYWRpbmcpIHtcbiAgICBkZWJ1ZygncmVzdW1lIHJlYWQgMCcpO1xuICAgIHN0cmVhbS5yZWFkKDApO1xuICB9XG5cbiAgc3RhdGUucmVzdW1lU2NoZWR1bGVkID0gZmFsc2U7XG4gIHN0YXRlLmF3YWl0RHJhaW4gPSAwO1xuICBzdHJlYW0uZW1pdCgncmVzdW1lJyk7XG4gIGZsb3coc3RyZWFtKTtcbiAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgIXN0YXRlLnJlYWRpbmcpIHN0cmVhbS5yZWFkKDApO1xufVxuXG5SZWFkYWJsZS5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbiAoKSB7XG4gIGRlYnVnKCdjYWxsIHBhdXNlIGZsb3dpbmc9JWonLCB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpO1xuICBpZiAoZmFsc2UgIT09IHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdwYXVzZScpO1xuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuICAgIHRoaXMuZW1pdCgncGF1c2UnKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIGZsb3coc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgZGVidWcoJ2Zsb3cnLCBzdGF0ZS5mbG93aW5nKTtcbiAgd2hpbGUgKHN0YXRlLmZsb3dpbmcgJiYgc3RyZWFtLnJlYWQoKSAhPT0gbnVsbCkge31cbn1cblxuLy8gd3JhcCBhbiBvbGQtc3R5bGUgc3RyZWFtIGFzIHRoZSBhc3luYyBkYXRhIHNvdXJjZS5cbi8vIFRoaXMgaXMgKm5vdCogcGFydCBvZiB0aGUgcmVhZGFibGUgc3RyZWFtIGludGVyZmFjZS5cbi8vIEl0IGlzIGFuIHVnbHkgdW5mb3J0dW5hdGUgbWVzcyBvZiBoaXN0b3J5LlxuUmVhZGFibGUucHJvdG90eXBlLndyYXAgPSBmdW5jdGlvbiAoc3RyZWFtKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIHBhdXNlZCA9IGZhbHNlO1xuXG4gIHN0cmVhbS5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgIGRlYnVnKCd3cmFwcGVkIGVuZCcpO1xuICAgIGlmIChzdGF0ZS5kZWNvZGVyICYmICFzdGF0ZS5lbmRlZCkge1xuICAgICAgdmFyIGNodW5rID0gc3RhdGUuZGVjb2Rlci5lbmQoKTtcbiAgICAgIGlmIChjaHVuayAmJiBjaHVuay5sZW5ndGgpIF90aGlzLnB1c2goY2h1bmspO1xuICAgIH1cblxuICAgIF90aGlzLnB1c2gobnVsbCk7XG4gIH0pO1xuXG4gIHN0cmVhbS5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykge1xuICAgIGRlYnVnKCd3cmFwcGVkIGRhdGEnKTtcbiAgICBpZiAoc3RhdGUuZGVjb2RlcikgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLndyaXRlKGNodW5rKTtcblxuICAgIC8vIGRvbid0IHNraXAgb3ZlciBmYWxzeSB2YWx1ZXMgaW4gb2JqZWN0TW9kZVxuICAgIGlmIChzdGF0ZS5vYmplY3RNb2RlICYmIChjaHVuayA9PT0gbnVsbCB8fCBjaHVuayA9PT0gdW5kZWZpbmVkKSkgcmV0dXJuO2Vsc2UgaWYgKCFzdGF0ZS5vYmplY3RNb2RlICYmICghY2h1bmsgfHwgIWNodW5rLmxlbmd0aCkpIHJldHVybjtcblxuICAgIHZhciByZXQgPSBfdGhpcy5wdXNoKGNodW5rKTtcbiAgICBpZiAoIXJldCkge1xuICAgICAgcGF1c2VkID0gdHJ1ZTtcbiAgICAgIHN0cmVhbS5wYXVzZSgpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gcHJveHkgYWxsIHRoZSBvdGhlciBtZXRob2RzLlxuICAvLyBpbXBvcnRhbnQgd2hlbiB3cmFwcGluZyBmaWx0ZXJzIGFuZCBkdXBsZXhlcy5cbiAgZm9yICh2YXIgaSBpbiBzdHJlYW0pIHtcbiAgICBpZiAodGhpc1tpXSA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBzdHJlYW1baV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXNbaV0gPSBmdW5jdGlvbiAobWV0aG9kKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHN0cmVhbVttZXRob2RdLmFwcGx5KHN0cmVhbSwgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcbiAgICAgIH0oaSk7XG4gICAgfVxuICB9XG5cbiAgLy8gcHJveHkgY2VydGFpbiBpbXBvcnRhbnQgZXZlbnRzLlxuICBmb3IgKHZhciBuID0gMDsgbiA8IGtQcm94eUV2ZW50cy5sZW5ndGg7IG4rKykge1xuICAgIHN0cmVhbS5vbihrUHJveHlFdmVudHNbbl0sIHRoaXMuZW1pdC5iaW5kKHRoaXMsIGtQcm94eUV2ZW50c1tuXSkpO1xuICB9XG5cbiAgLy8gd2hlbiB3ZSB0cnkgdG8gY29uc3VtZSBzb21lIG1vcmUgYnl0ZXMsIHNpbXBseSB1bnBhdXNlIHRoZVxuICAvLyB1bmRlcmx5aW5nIHN0cmVhbS5cbiAgdGhpcy5fcmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgX3JlYWQnLCBuKTtcbiAgICBpZiAocGF1c2VkKSB7XG4gICAgICBwYXVzZWQgPSBmYWxzZTtcbiAgICAgIHN0cmVhbS5yZXN1bWUoKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGUucHJvdG90eXBlLCAncmVhZGFibGVIaWdoV2F0ZXJNYXJrJywge1xuICAvLyBtYWtpbmcgaXQgZXhwbGljaXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZW51bWVyYWJsZVxuICAvLyBiZWNhdXNlIG90aGVyd2lzZSBzb21lIHByb3RvdHlwZSBtYW5pcHVsYXRpb24gaW5cbiAgLy8gdXNlcmxhbmQgd2lsbCBmYWlsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrO1xuICB9XG59KTtcblxuLy8gZXhwb3NlZCBmb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5LlxuUmVhZGFibGUuX2Zyb21MaXN0ID0gZnJvbUxpc3Q7XG5cbi8vIFBsdWNrIG9mZiBuIGJ5dGVzIGZyb20gYW4gYXJyYXkgb2YgYnVmZmVycy5cbi8vIExlbmd0aCBpcyB0aGUgY29tYmluZWQgbGVuZ3RocyBvZiBhbGwgdGhlIGJ1ZmZlcnMgaW4gdGhlIGxpc3QuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cbmZ1bmN0aW9uIGZyb21MaXN0KG4sIHN0YXRlKSB7XG4gIC8vIG5vdGhpbmcgYnVmZmVyZWRcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgdmFyIHJldDtcbiAgaWYgKHN0YXRlLm9iamVjdE1vZGUpIHJldCA9IHN0YXRlLmJ1ZmZlci5zaGlmdCgpO2Vsc2UgaWYgKCFuIHx8IG4gPj0gc3RhdGUubGVuZ3RoKSB7XG4gICAgLy8gcmVhZCBpdCBhbGwsIHRydW5jYXRlIHRoZSBsaXN0XG4gICAgaWYgKHN0YXRlLmRlY29kZXIpIHJldCA9IHN0YXRlLmJ1ZmZlci5qb2luKCcnKTtlbHNlIGlmIChzdGF0ZS5idWZmZXIubGVuZ3RoID09PSAxKSByZXQgPSBzdGF0ZS5idWZmZXIuaGVhZC5kYXRhO2Vsc2UgcmV0ID0gc3RhdGUuYnVmZmVyLmNvbmNhdChzdGF0ZS5sZW5ndGgpO1xuICAgIHN0YXRlLmJ1ZmZlci5jbGVhcigpO1xuICB9IGVsc2Uge1xuICAgIC8vIHJlYWQgcGFydCBvZiBsaXN0XG4gICAgcmV0ID0gZnJvbUxpc3RQYXJ0aWFsKG4sIHN0YXRlLmJ1ZmZlciwgc3RhdGUuZGVjb2Rlcik7XG4gIH1cblxuICByZXR1cm4gcmV0O1xufVxuXG4vLyBFeHRyYWN0cyBvbmx5IGVub3VnaCBidWZmZXJlZCBkYXRhIHRvIHNhdGlzZnkgdGhlIGFtb3VudCByZXF1ZXN0ZWQuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cbmZ1bmN0aW9uIGZyb21MaXN0UGFydGlhbChuLCBsaXN0LCBoYXNTdHJpbmdzKSB7XG4gIHZhciByZXQ7XG4gIGlmIChuIDwgbGlzdC5oZWFkLmRhdGEubGVuZ3RoKSB7XG4gICAgLy8gc2xpY2UgaXMgdGhlIHNhbWUgZm9yIGJ1ZmZlcnMgYW5kIHN0cmluZ3NcbiAgICByZXQgPSBsaXN0LmhlYWQuZGF0YS5zbGljZSgwLCBuKTtcbiAgICBsaXN0LmhlYWQuZGF0YSA9IGxpc3QuaGVhZC5kYXRhLnNsaWNlKG4pO1xuICB9IGVsc2UgaWYgKG4gPT09IGxpc3QuaGVhZC5kYXRhLmxlbmd0aCkge1xuICAgIC8vIGZpcnN0IGNodW5rIGlzIGEgcGVyZmVjdCBtYXRjaFxuICAgIHJldCA9IGxpc3Quc2hpZnQoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyByZXN1bHQgc3BhbnMgbW9yZSB0aGFuIG9uZSBidWZmZXJcbiAgICByZXQgPSBoYXNTdHJpbmdzID8gY29weUZyb21CdWZmZXJTdHJpbmcobiwgbGlzdCkgOiBjb3B5RnJvbUJ1ZmZlcihuLCBsaXN0KTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG4vLyBDb3BpZXMgYSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGlzdCBvZiBidWZmZXJlZCBkYXRhXG4vLyBjaHVua3MuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cbmZ1bmN0aW9uIGNvcHlGcm9tQnVmZmVyU3RyaW5nKG4sIGxpc3QpIHtcbiAgdmFyIHAgPSBsaXN0LmhlYWQ7XG4gIHZhciBjID0gMTtcbiAgdmFyIHJldCA9IHAuZGF0YTtcbiAgbiAtPSByZXQubGVuZ3RoO1xuICB3aGlsZSAocCA9IHAubmV4dCkge1xuICAgIHZhciBzdHIgPSBwLmRhdGE7XG4gICAgdmFyIG5iID0gbiA+IHN0ci5sZW5ndGggPyBzdHIubGVuZ3RoIDogbjtcbiAgICBpZiAobmIgPT09IHN0ci5sZW5ndGgpIHJldCArPSBzdHI7ZWxzZSByZXQgKz0gc3RyLnNsaWNlKDAsIG4pO1xuICAgIG4gLT0gbmI7XG4gICAgaWYgKG4gPT09IDApIHtcbiAgICAgIGlmIChuYiA9PT0gc3RyLmxlbmd0aCkge1xuICAgICAgICArK2M7XG4gICAgICAgIGlmIChwLm5leHQpIGxpc3QuaGVhZCA9IHAubmV4dDtlbHNlIGxpc3QuaGVhZCA9IGxpc3QudGFpbCA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaXN0LmhlYWQgPSBwO1xuICAgICAgICBwLmRhdGEgPSBzdHIuc2xpY2UobmIpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgICsrYztcbiAgfVxuICBsaXN0Lmxlbmd0aCAtPSBjO1xuICByZXR1cm4gcmV0O1xufVxuXG4vLyBDb3BpZXMgYSBzcGVjaWZpZWQgYW1vdW50IG9mIGJ5dGVzIGZyb20gdGhlIGxpc3Qgb2YgYnVmZmVyZWQgZGF0YSBjaHVua3MuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cbmZ1bmN0aW9uIGNvcHlGcm9tQnVmZmVyKG4sIGxpc3QpIHtcbiAgdmFyIHJldCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShuKTtcbiAgdmFyIHAgPSBsaXN0LmhlYWQ7XG4gIHZhciBjID0gMTtcbiAgcC5kYXRhLmNvcHkocmV0KTtcbiAgbiAtPSBwLmRhdGEubGVuZ3RoO1xuICB3aGlsZSAocCA9IHAubmV4dCkge1xuICAgIHZhciBidWYgPSBwLmRhdGE7XG4gICAgdmFyIG5iID0gbiA+IGJ1Zi5sZW5ndGggPyBidWYubGVuZ3RoIDogbjtcbiAgICBidWYuY29weShyZXQsIHJldC5sZW5ndGggLSBuLCAwLCBuYik7XG4gICAgbiAtPSBuYjtcbiAgICBpZiAobiA9PT0gMCkge1xuICAgICAgaWYgKG5iID09PSBidWYubGVuZ3RoKSB7XG4gICAgICAgICsrYztcbiAgICAgICAgaWYgKHAubmV4dCkgbGlzdC5oZWFkID0gcC5uZXh0O2Vsc2UgbGlzdC5oZWFkID0gbGlzdC50YWlsID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpc3QuaGVhZCA9IHA7XG4gICAgICAgIHAuZGF0YSA9IGJ1Zi5zbGljZShuYik7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgKytjO1xuICB9XG4gIGxpc3QubGVuZ3RoIC09IGM7XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGVuZFJlYWRhYmxlKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG5cbiAgLy8gSWYgd2UgZ2V0IGhlcmUgYmVmb3JlIGNvbnN1bWluZyBhbGwgdGhlIGJ5dGVzLCB0aGVuIHRoYXQgaXMgYVxuICAvLyBidWcgaW4gbm9kZS4gIFNob3VsZCBuZXZlciBoYXBwZW4uXG4gIGlmIChzdGF0ZS5sZW5ndGggPiAwKSB0aHJvdyBuZXcgRXJyb3IoJ1wiZW5kUmVhZGFibGUoKVwiIGNhbGxlZCBvbiBub24tZW1wdHkgc3RyZWFtJyk7XG5cbiAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkKSB7XG4gICAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuICAgIHBuYS5uZXh0VGljayhlbmRSZWFkYWJsZU5ULCBzdGF0ZSwgc3RyZWFtKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbmRSZWFkYWJsZU5UKHN0YXRlLCBzdHJlYW0pIHtcbiAgLy8gQ2hlY2sgdGhhdCB3ZSBkaWRuJ3QgZ2V0IG9uZSBsYXN0IHVuc2hpZnQuXG4gIGlmICghc3RhdGUuZW5kRW1pdHRlZCAmJiBzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICBzdGF0ZS5lbmRFbWl0dGVkID0gdHJ1ZTtcbiAgICBzdHJlYW0ucmVhZGFibGUgPSBmYWxzZTtcbiAgICBzdHJlYW0uZW1pdCgnZW5kJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5kZXhPZih4cywgeCkge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGlmICh4c1tpXSA9PT0geCkgcmV0dXJuIGk7XG4gIH1cbiAgcmV0dXJuIC0xO1xufSIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBhIHRyYW5zZm9ybSBzdHJlYW0gaXMgYSByZWFkYWJsZS93cml0YWJsZSBzdHJlYW0gd2hlcmUgeW91IGRvXG4vLyBzb21ldGhpbmcgd2l0aCB0aGUgZGF0YS4gIFNvbWV0aW1lcyBpdCdzIGNhbGxlZCBhIFwiZmlsdGVyXCIsXG4vLyBidXQgdGhhdCdzIG5vdCBhIGdyZWF0IG5hbWUgZm9yIGl0LCBzaW5jZSB0aGF0IGltcGxpZXMgYSB0aGluZyB3aGVyZVxuLy8gc29tZSBiaXRzIHBhc3MgdGhyb3VnaCwgYW5kIG90aGVycyBhcmUgc2ltcGx5IGlnbm9yZWQuICAoVGhhdCB3b3VsZFxuLy8gYmUgYSB2YWxpZCBleGFtcGxlIG9mIGEgdHJhbnNmb3JtLCBvZiBjb3Vyc2UuKVxuLy9cbi8vIFdoaWxlIHRoZSBvdXRwdXQgaXMgY2F1c2FsbHkgcmVsYXRlZCB0byB0aGUgaW5wdXQsIGl0J3Mgbm90IGFcbi8vIG5lY2Vzc2FyaWx5IHN5bW1ldHJpYyBvciBzeW5jaHJvbm91cyB0cmFuc2Zvcm1hdGlvbi4gIEZvciBleGFtcGxlLFxuLy8gYSB6bGliIHN0cmVhbSBtaWdodCB0YWtlIG11bHRpcGxlIHBsYWluLXRleHQgd3JpdGVzKCksIGFuZCB0aGVuXG4vLyBlbWl0IGEgc2luZ2xlIGNvbXByZXNzZWQgY2h1bmsgc29tZSB0aW1lIGluIHRoZSBmdXR1cmUuXG4vL1xuLy8gSGVyZSdzIGhvdyB0aGlzIHdvcmtzOlxuLy9cbi8vIFRoZSBUcmFuc2Zvcm0gc3RyZWFtIGhhcyBhbGwgdGhlIGFzcGVjdHMgb2YgdGhlIHJlYWRhYmxlIGFuZCB3cml0YWJsZVxuLy8gc3RyZWFtIGNsYXNzZXMuICBXaGVuIHlvdSB3cml0ZShjaHVuayksIHRoYXQgY2FsbHMgX3dyaXRlKGNodW5rLGNiKVxuLy8gaW50ZXJuYWxseSwgYW5kIHJldHVybnMgZmFsc2UgaWYgdGhlcmUncyBhIGxvdCBvZiBwZW5kaW5nIHdyaXRlc1xuLy8gYnVmZmVyZWQgdXAuICBXaGVuIHlvdSBjYWxsIHJlYWQoKSwgdGhhdCBjYWxscyBfcmVhZChuKSB1bnRpbFxuLy8gdGhlcmUncyBlbm91Z2ggcGVuZGluZyByZWFkYWJsZSBkYXRhIGJ1ZmZlcmVkIHVwLlxuLy9cbi8vIEluIGEgdHJhbnNmb3JtIHN0cmVhbSwgdGhlIHdyaXR0ZW4gZGF0YSBpcyBwbGFjZWQgaW4gYSBidWZmZXIuICBXaGVuXG4vLyBfcmVhZChuKSBpcyBjYWxsZWQsIGl0IHRyYW5zZm9ybXMgdGhlIHF1ZXVlZCB1cCBkYXRhLCBjYWxsaW5nIHRoZVxuLy8gYnVmZmVyZWQgX3dyaXRlIGNiJ3MgYXMgaXQgY29uc3VtZXMgY2h1bmtzLiAgSWYgY29uc3VtaW5nIGEgc2luZ2xlXG4vLyB3cml0dGVuIGNodW5rIHdvdWxkIHJlc3VsdCBpbiBtdWx0aXBsZSBvdXRwdXQgY2h1bmtzLCB0aGVuIHRoZSBmaXJzdFxuLy8gb3V0cHV0dGVkIGJpdCBjYWxscyB0aGUgcmVhZGNiLCBhbmQgc3Vic2VxdWVudCBjaHVua3MganVzdCBnbyBpbnRvXG4vLyB0aGUgcmVhZCBidWZmZXIsIGFuZCB3aWxsIGNhdXNlIGl0IHRvIGVtaXQgJ3JlYWRhYmxlJyBpZiBuZWNlc3NhcnkuXG4vL1xuLy8gVGhpcyB3YXksIGJhY2stcHJlc3N1cmUgaXMgYWN0dWFsbHkgZGV0ZXJtaW5lZCBieSB0aGUgcmVhZGluZyBzaWRlLFxuLy8gc2luY2UgX3JlYWQgaGFzIHRvIGJlIGNhbGxlZCB0byBzdGFydCBwcm9jZXNzaW5nIGEgbmV3IGNodW5rLiAgSG93ZXZlcixcbi8vIGEgcGF0aG9sb2dpY2FsIGluZmxhdGUgdHlwZSBvZiB0cmFuc2Zvcm0gY2FuIGNhdXNlIGV4Y2Vzc2l2ZSBidWZmZXJpbmdcbi8vIGhlcmUuICBGb3IgZXhhbXBsZSwgaW1hZ2luZSBhIHN0cmVhbSB3aGVyZSBldmVyeSBieXRlIG9mIGlucHV0IGlzXG4vLyBpbnRlcnByZXRlZCBhcyBhbiBpbnRlZ2VyIGZyb20gMC0yNTUsIGFuZCB0aGVuIHJlc3VsdHMgaW4gdGhhdCBtYW55XG4vLyBieXRlcyBvZiBvdXRwdXQuICBXcml0aW5nIHRoZSA0IGJ5dGVzIHtmZixmZixmZixmZn0gd291bGQgcmVzdWx0IGluXG4vLyAxa2Igb2YgZGF0YSBiZWluZyBvdXRwdXQuICBJbiB0aGlzIGNhc2UsIHlvdSBjb3VsZCB3cml0ZSBhIHZlcnkgc21hbGxcbi8vIGFtb3VudCBvZiBpbnB1dCwgYW5kIGVuZCB1cCB3aXRoIGEgdmVyeSBsYXJnZSBhbW91bnQgb2Ygb3V0cHV0LiAgSW5cbi8vIHN1Y2ggYSBwYXRob2xvZ2ljYWwgaW5mbGF0aW5nIG1lY2hhbmlzbSwgdGhlcmUnZCBiZSBubyB3YXkgdG8gdGVsbFxuLy8gdGhlIHN5c3RlbSB0byBzdG9wIGRvaW5nIHRoZSB0cmFuc2Zvcm0uICBBIHNpbmdsZSA0TUIgd3JpdGUgY291bGRcbi8vIGNhdXNlIHRoZSBzeXN0ZW0gdG8gcnVuIG91dCBvZiBtZW1vcnkuXG4vL1xuLy8gSG93ZXZlciwgZXZlbiBpbiBzdWNoIGEgcGF0aG9sb2dpY2FsIGNhc2UsIG9ubHkgYSBzaW5nbGUgd3JpdHRlbiBjaHVua1xuLy8gd291bGQgYmUgY29uc3VtZWQsIGFuZCB0aGVuIHRoZSByZXN0IHdvdWxkIHdhaXQgKHVuLXRyYW5zZm9ybWVkKSB1bnRpbFxuLy8gdGhlIHJlc3VsdHMgb2YgdGhlIHByZXZpb3VzIHRyYW5zZm9ybWVkIGNodW5rIHdlcmUgY29uc3VtZWQuXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBUcmFuc2Zvcm07XG5cbnZhciBEdXBsZXggPSByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudXRpbC5pbmhlcml0cyhUcmFuc2Zvcm0sIER1cGxleCk7XG5cbmZ1bmN0aW9uIGFmdGVyVHJhbnNmb3JtKGVyLCBkYXRhKSB7XG4gIHZhciB0cyA9IHRoaXMuX3RyYW5zZm9ybVN0YXRlO1xuICB0cy50cmFuc2Zvcm1pbmcgPSBmYWxzZTtcblxuICB2YXIgY2IgPSB0cy53cml0ZWNiO1xuXG4gIGlmICghY2IpIHtcbiAgICByZXR1cm4gdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignd3JpdGUgY2FsbGJhY2sgY2FsbGVkIG11bHRpcGxlIHRpbWVzJykpO1xuICB9XG5cbiAgdHMud3JpdGVjaHVuayA9IG51bGw7XG4gIHRzLndyaXRlY2IgPSBudWxsO1xuXG4gIGlmIChkYXRhICE9IG51bGwpIC8vIHNpbmdsZSBlcXVhbHMgY2hlY2sgZm9yIGJvdGggYG51bGxgIGFuZCBgdW5kZWZpbmVkYFxuICAgIHRoaXMucHVzaChkYXRhKTtcblxuICBjYihlcik7XG5cbiAgdmFyIHJzID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgcnMucmVhZGluZyA9IGZhbHNlO1xuICBpZiAocnMubmVlZFJlYWRhYmxlIHx8IHJzLmxlbmd0aCA8IHJzLmhpZ2hXYXRlck1hcmspIHtcbiAgICB0aGlzLl9yZWFkKHJzLmhpZ2hXYXRlck1hcmspO1xuICB9XG59XG5cbmZ1bmN0aW9uIFRyYW5zZm9ybShvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBUcmFuc2Zvcm0pKSByZXR1cm4gbmV3IFRyYW5zZm9ybShvcHRpb25zKTtcblxuICBEdXBsZXguY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICB0aGlzLl90cmFuc2Zvcm1TdGF0ZSA9IHtcbiAgICBhZnRlclRyYW5zZm9ybTogYWZ0ZXJUcmFuc2Zvcm0uYmluZCh0aGlzKSxcbiAgICBuZWVkVHJhbnNmb3JtOiBmYWxzZSxcbiAgICB0cmFuc2Zvcm1pbmc6IGZhbHNlLFxuICAgIHdyaXRlY2I6IG51bGwsXG4gICAgd3JpdGVjaHVuazogbnVsbCxcbiAgICB3cml0ZWVuY29kaW5nOiBudWxsXG4gIH07XG5cbiAgLy8gc3RhcnQgb3V0IGFza2luZyBmb3IgYSByZWFkYWJsZSBldmVudCBvbmNlIGRhdGEgaXMgdHJhbnNmb3JtZWQuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcblxuICAvLyB3ZSBoYXZlIGltcGxlbWVudGVkIHRoZSBfcmVhZCBtZXRob2QsIGFuZCBkb25lIHRoZSBvdGhlciB0aGluZ3NcbiAgLy8gdGhhdCBSZWFkYWJsZSB3YW50cyBiZWZvcmUgdGhlIGZpcnN0IF9yZWFkIGNhbGwsIHNvIHVuc2V0IHRoZVxuICAvLyBzeW5jIGd1YXJkIGZsYWcuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUuc3luYyA9IGZhbHNlO1xuXG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLnRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fdHJhbnNmb3JtID0gb3B0aW9ucy50cmFuc2Zvcm07XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZmx1c2ggPT09ICdmdW5jdGlvbicpIHRoaXMuX2ZsdXNoID0gb3B0aW9ucy5mbHVzaDtcbiAgfVxuXG4gIC8vIFdoZW4gdGhlIHdyaXRhYmxlIHNpZGUgZmluaXNoZXMsIHRoZW4gZmx1c2ggb3V0IGFueXRoaW5nIHJlbWFpbmluZy5cbiAgdGhpcy5vbigncHJlZmluaXNoJywgcHJlZmluaXNoKTtcbn1cblxuZnVuY3Rpb24gcHJlZmluaXNoKCkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIGlmICh0eXBlb2YgdGhpcy5fZmx1c2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICB0aGlzLl9mbHVzaChmdW5jdGlvbiAoZXIsIGRhdGEpIHtcbiAgICAgIGRvbmUoX3RoaXMsIGVyLCBkYXRhKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBkb25lKHRoaXMsIG51bGwsIG51bGwpO1xuICB9XG59XG5cblRyYW5zZm9ybS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcpIHtcbiAgdGhpcy5fdHJhbnNmb3JtU3RhdGUubmVlZFRyYW5zZm9ybSA9IGZhbHNlO1xuICByZXR1cm4gRHVwbGV4LnByb3RvdHlwZS5wdXNoLmNhbGwodGhpcywgY2h1bmssIGVuY29kaW5nKTtcbn07XG5cbi8vIFRoaXMgaXMgdGhlIHBhcnQgd2hlcmUgeW91IGRvIHN0dWZmIVxuLy8gb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbiBpbiBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLlxuLy8gJ2NodW5rJyBpcyBhbiBpbnB1dCBjaHVuay5cbi8vXG4vLyBDYWxsIGBwdXNoKG5ld0NodW5rKWAgdG8gcGFzcyBhbG9uZyB0cmFuc2Zvcm1lZCBvdXRwdXRcbi8vIHRvIHRoZSByZWFkYWJsZSBzaWRlLiAgWW91IG1heSBjYWxsICdwdXNoJyB6ZXJvIG9yIG1vcmUgdGltZXMuXG4vL1xuLy8gQ2FsbCBgY2IoZXJyKWAgd2hlbiB5b3UgYXJlIGRvbmUgd2l0aCB0aGlzIGNodW5rLiAgSWYgeW91IHBhc3Ncbi8vIGFuIGVycm9yLCB0aGVuIHRoYXQnbGwgcHV0IHRoZSBodXJ0IG9uIHRoZSB3aG9sZSBvcGVyYXRpb24uICBJZiB5b3Vcbi8vIG5ldmVyIGNhbGwgY2IoKSwgdGhlbiB5b3UnbGwgbmV2ZXIgZ2V0IGFub3RoZXIgY2h1bmsuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB0aHJvdyBuZXcgRXJyb3IoJ190cmFuc2Zvcm0oKSBpcyBub3QgaW1wbGVtZW50ZWQnKTtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHRzID0gdGhpcy5fdHJhbnNmb3JtU3RhdGU7XG4gIHRzLndyaXRlY2IgPSBjYjtcbiAgdHMud3JpdGVjaHVuayA9IGNodW5rO1xuICB0cy53cml0ZWVuY29kaW5nID0gZW5jb2Rpbmc7XG4gIGlmICghdHMudHJhbnNmb3JtaW5nKSB7XG4gICAgdmFyIHJzID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgICBpZiAodHMubmVlZFRyYW5zZm9ybSB8fCBycy5uZWVkUmVhZGFibGUgfHwgcnMubGVuZ3RoIDwgcnMuaGlnaFdhdGVyTWFyaykgdGhpcy5fcmVhZChycy5oaWdoV2F0ZXJNYXJrKTtcbiAgfVxufTtcblxuLy8gRG9lc24ndCBtYXR0ZXIgd2hhdCB0aGUgYXJncyBhcmUgaGVyZS5cbi8vIF90cmFuc2Zvcm0gZG9lcyBhbGwgdGhlIHdvcmsuXG4vLyBUaGF0IHdlIGdvdCBoZXJlIG1lYW5zIHRoYXQgdGhlIHJlYWRhYmxlIHNpZGUgd2FudHMgbW9yZSBkYXRhLlxuVHJhbnNmb3JtLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIHZhciB0cyA9IHRoaXMuX3RyYW5zZm9ybVN0YXRlO1xuXG4gIGlmICh0cy53cml0ZWNodW5rICE9PSBudWxsICYmIHRzLndyaXRlY2IgJiYgIXRzLnRyYW5zZm9ybWluZykge1xuICAgIHRzLnRyYW5zZm9ybWluZyA9IHRydWU7XG4gICAgdGhpcy5fdHJhbnNmb3JtKHRzLndyaXRlY2h1bmssIHRzLndyaXRlZW5jb2RpbmcsIHRzLmFmdGVyVHJhbnNmb3JtKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBtYXJrIHRoYXQgd2UgbmVlZCBhIHRyYW5zZm9ybSwgc28gdGhhdCBhbnkgZGF0YSB0aGF0IGNvbWVzIGluXG4gICAgLy8gd2lsbCBnZXQgcHJvY2Vzc2VkLCBub3cgdGhhdCB3ZSd2ZSBhc2tlZCBmb3IgaXQuXG4gICAgdHMubmVlZFRyYW5zZm9ybSA9IHRydWU7XG4gIH1cbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuX2Rlc3Ryb3kgPSBmdW5jdGlvbiAoZXJyLCBjYikge1xuICB2YXIgX3RoaXMyID0gdGhpcztcblxuICBEdXBsZXgucHJvdG90eXBlLl9kZXN0cm95LmNhbGwodGhpcywgZXJyLCBmdW5jdGlvbiAoZXJyMikge1xuICAgIGNiKGVycjIpO1xuICAgIF90aGlzMi5lbWl0KCdjbG9zZScpO1xuICB9KTtcbn07XG5cbmZ1bmN0aW9uIGRvbmUoc3RyZWFtLCBlciwgZGF0YSkge1xuICBpZiAoZXIpIHJldHVybiBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG5cbiAgaWYgKGRhdGEgIT0gbnVsbCkgLy8gc2luZ2xlIGVxdWFscyBjaGVjayBmb3IgYm90aCBgbnVsbGAgYW5kIGB1bmRlZmluZWRgXG4gICAgc3RyZWFtLnB1c2goZGF0YSk7XG5cbiAgLy8gaWYgdGhlcmUncyBub3RoaW5nIGluIHRoZSB3cml0ZSBidWZmZXIsIHRoZW4gdGhhdCBtZWFuc1xuICAvLyB0aGF0IG5vdGhpbmcgbW9yZSB3aWxsIGV2ZXIgYmUgcHJvdmlkZWRcbiAgaWYgKHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignQ2FsbGluZyB0cmFuc2Zvcm0gZG9uZSB3aGVuIHdzLmxlbmd0aCAhPSAwJyk7XG5cbiAgaWYgKHN0cmVhbS5fdHJhbnNmb3JtU3RhdGUudHJhbnNmb3JtaW5nKSB0aHJvdyBuZXcgRXJyb3IoJ0NhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiBzdGlsbCB0cmFuc2Zvcm1pbmcnKTtcblxuICByZXR1cm4gc3RyZWFtLnB1c2gobnVsbCk7XG59IiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIEEgYml0IHNpbXBsZXIgdGhhbiByZWFkYWJsZSBzdHJlYW1zLlxuLy8gSW1wbGVtZW50IGFuIGFzeW5jIC5fd3JpdGUoY2h1bmssIGVuY29kaW5nLCBjYiksIGFuZCBpdCdsbCBoYW5kbGUgYWxsXG4vLyB0aGUgZHJhaW4gZXZlbnQgZW1pc3Npb24gYW5kIGJ1ZmZlcmluZy5cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xuXG52YXIgcG5hID0gcmVxdWlyZSgncHJvY2Vzcy1uZXh0aWNrLWFyZ3MnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5tb2R1bGUuZXhwb3J0cyA9IFdyaXRhYmxlO1xuXG4vKiA8cmVwbGFjZW1lbnQ+ICovXG5mdW5jdGlvbiBXcml0ZVJlcShjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHRoaXMuY2h1bmsgPSBjaHVuaztcbiAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nO1xuICB0aGlzLmNhbGxiYWNrID0gY2I7XG4gIHRoaXMubmV4dCA9IG51bGw7XG59XG5cbi8vIEl0IHNlZW1zIGEgbGlua2VkIGxpc3QgYnV0IGl0IGlzIG5vdFxuLy8gdGhlcmUgd2lsbCBiZSBvbmx5IDIgb2YgdGhlc2UgZm9yIGVhY2ggc3RyZWFtXG5mdW5jdGlvbiBDb3JrZWRSZXF1ZXN0KHN0YXRlKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgdGhpcy5uZXh0ID0gbnVsbDtcbiAgdGhpcy5lbnRyeSA9IG51bGw7XG4gIHRoaXMuZmluaXNoID0gZnVuY3Rpb24gKCkge1xuICAgIG9uQ29ya2VkRmluaXNoKF90aGlzLCBzdGF0ZSk7XG4gIH07XG59XG4vKiA8L3JlcGxhY2VtZW50PiAqL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGFzeW5jV3JpdGUgPSAhcHJvY2Vzcy5icm93c2VyICYmIFsndjAuMTAnLCAndjAuOS4nXS5pbmRleE9mKHByb2Nlc3MudmVyc2lvbi5zbGljZSgwLCA1KSkgPiAtMSA/IHNldEltbWVkaWF0ZSA6IHBuYS5uZXh0VGljaztcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIER1cGxleDtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5Xcml0YWJsZS5Xcml0YWJsZVN0YXRlID0gV3JpdGFibGVTdGF0ZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGludGVybmFsVXRpbCA9IHtcbiAgZGVwcmVjYXRlOiByZXF1aXJlKCd1dGlsLWRlcHJlY2F0ZScpXG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL3N0cmVhbScpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlcjtcbnZhciBPdXJVaW50OEFycmF5ID0gZ2xvYmFsLlVpbnQ4QXJyYXkgfHwgZnVuY3Rpb24gKCkge307XG5mdW5jdGlvbiBfdWludDhBcnJheVRvQnVmZmVyKGNodW5rKSB7XG4gIHJldHVybiBCdWZmZXIuZnJvbShjaHVuayk7XG59XG5mdW5jdGlvbiBfaXNVaW50OEFycmF5KG9iaikge1xuICByZXR1cm4gQnVmZmVyLmlzQnVmZmVyKG9iaikgfHwgb2JqIGluc3RhbmNlb2YgT3VyVWludDhBcnJheTtcbn1cblxuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBkZXN0cm95SW1wbCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9kZXN0cm95Jyk7XG5cbnV0aWwuaW5oZXJpdHMoV3JpdGFibGUsIFN0cmVhbSk7XG5cbmZ1bmN0aW9uIG5vcCgpIHt9XG5cbmZ1bmN0aW9uIFdyaXRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gRHVwbGV4IHN0cmVhbXMgYXJlIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlLCBidXQgc2hhcmVcbiAgLy8gdGhlIHNhbWUgb3B0aW9ucyBvYmplY3QuXG4gIC8vIEhvd2V2ZXIsIHNvbWUgY2FzZXMgcmVxdWlyZSBzZXR0aW5nIG9wdGlvbnMgdG8gZGlmZmVyZW50XG4gIC8vIHZhbHVlcyBmb3IgdGhlIHJlYWRhYmxlIGFuZCB0aGUgd3JpdGFibGUgc2lkZXMgb2YgdGhlIGR1cGxleCBzdHJlYW0uXG4gIC8vIFRoZXNlIG9wdGlvbnMgY2FuIGJlIHByb3ZpZGVkIHNlcGFyYXRlbHkgYXMgcmVhZGFibGVYWFggYW5kIHdyaXRhYmxlWFhYLlxuICB2YXIgaXNEdXBsZXggPSBzdHJlYW0gaW5zdGFuY2VvZiBEdXBsZXg7XG5cbiAgLy8gb2JqZWN0IHN0cmVhbSBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRoaXMgc3RyZWFtXG4gIC8vIGNvbnRhaW5zIGJ1ZmZlcnMgb3Igb2JqZWN0cy5cbiAgdGhpcy5vYmplY3RNb2RlID0gISFvcHRpb25zLm9iamVjdE1vZGU7XG5cbiAgaWYgKGlzRHVwbGV4KSB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISFvcHRpb25zLndyaXRhYmxlT2JqZWN0TW9kZTtcblxuICAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggd3JpdGUoKSBzdGFydHMgcmV0dXJuaW5nIGZhbHNlXG4gIC8vIE5vdGU6IDAgaXMgYSB2YWxpZCB2YWx1ZSwgbWVhbnMgdGhhdCB3ZSBhbHdheXMgcmV0dXJuIGZhbHNlIGlmXG4gIC8vIHRoZSBlbnRpcmUgYnVmZmVyIGlzIG5vdCBmbHVzaGVkIGltbWVkaWF0ZWx5IG9uIHdyaXRlKClcbiAgdmFyIGh3bSA9IG9wdGlvbnMuaGlnaFdhdGVyTWFyaztcbiAgdmFyIHdyaXRhYmxlSHdtID0gb3B0aW9ucy53cml0YWJsZUhpZ2hXYXRlck1hcms7XG4gIHZhciBkZWZhdWx0SHdtID0gdGhpcy5vYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjQ7XG5cbiAgaWYgKGh3bSB8fCBod20gPT09IDApIHRoaXMuaGlnaFdhdGVyTWFyayA9IGh3bTtlbHNlIGlmIChpc0R1cGxleCAmJiAod3JpdGFibGVId20gfHwgd3JpdGFibGVId20gPT09IDApKSB0aGlzLmhpZ2hXYXRlck1hcmsgPSB3cml0YWJsZUh3bTtlbHNlIHRoaXMuaGlnaFdhdGVyTWFyayA9IGRlZmF1bHRId207XG5cbiAgLy8gY2FzdCB0byBpbnRzLlxuICB0aGlzLmhpZ2hXYXRlck1hcmsgPSBNYXRoLmZsb29yKHRoaXMuaGlnaFdhdGVyTWFyayk7XG5cbiAgLy8gaWYgX2ZpbmFsIGhhcyBiZWVuIGNhbGxlZFxuICB0aGlzLmZpbmFsQ2FsbGVkID0gZmFsc2U7XG5cbiAgLy8gZHJhaW4gZXZlbnQgZmxhZy5cbiAgdGhpcy5uZWVkRHJhaW4gPSBmYWxzZTtcbiAgLy8gYXQgdGhlIHN0YXJ0IG9mIGNhbGxpbmcgZW5kKClcbiAgdGhpcy5lbmRpbmcgPSBmYWxzZTtcbiAgLy8gd2hlbiBlbmQoKSBoYXMgYmVlbiBjYWxsZWQsIGFuZCByZXR1cm5lZFxuICB0aGlzLmVuZGVkID0gZmFsc2U7XG4gIC8vIHdoZW4gJ2ZpbmlzaCcgaXMgZW1pdHRlZFxuICB0aGlzLmZpbmlzaGVkID0gZmFsc2U7XG5cbiAgLy8gaGFzIGl0IGJlZW4gZGVzdHJveWVkXG4gIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7XG5cbiAgLy8gc2hvdWxkIHdlIGRlY29kZSBzdHJpbmdzIGludG8gYnVmZmVycyBiZWZvcmUgcGFzc2luZyB0byBfd3JpdGU/XG4gIC8vIHRoaXMgaXMgaGVyZSBzbyB0aGF0IHNvbWUgbm9kZS1jb3JlIHN0cmVhbXMgY2FuIG9wdGltaXplIHN0cmluZ1xuICAvLyBoYW5kbGluZyBhdCBhIGxvd2VyIGxldmVsLlxuICB2YXIgbm9EZWNvZGUgPSBvcHRpb25zLmRlY29kZVN0cmluZ3MgPT09IGZhbHNlO1xuICB0aGlzLmRlY29kZVN0cmluZ3MgPSAhbm9EZWNvZGU7XG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgLy8gbm90IGFuIGFjdHVhbCBidWZmZXIgd2Uga2VlcCB0cmFjayBvZiwgYnV0IGEgbWVhc3VyZW1lbnRcbiAgLy8gb2YgaG93IG11Y2ggd2UncmUgd2FpdGluZyB0byBnZXQgcHVzaGVkIHRvIHNvbWUgdW5kZXJseWluZ1xuICAvLyBzb2NrZXQgb3IgZmlsZS5cbiAgdGhpcy5sZW5ndGggPSAwO1xuXG4gIC8vIGEgZmxhZyB0byBzZWUgd2hlbiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGEgd3JpdGUuXG4gIHRoaXMud3JpdGluZyA9IGZhbHNlO1xuXG4gIC8vIHdoZW4gdHJ1ZSBhbGwgd3JpdGVzIHdpbGwgYmUgYnVmZmVyZWQgdW50aWwgLnVuY29yaygpIGNhbGxcbiAgdGhpcy5jb3JrZWQgPSAwO1xuXG4gIC8vIGEgZmxhZyB0byBiZSBhYmxlIHRvIHRlbGwgaWYgdGhlIG9ud3JpdGUgY2IgaXMgY2FsbGVkIGltbWVkaWF0ZWx5LFxuICAvLyBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlIGFueVxuICAvLyBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBjYWxsLlxuICB0aGlzLnN5bmMgPSB0cnVlO1xuXG4gIC8vIGEgZmxhZyB0byBrbm93IGlmIHdlJ3JlIHByb2Nlc3NpbmcgcHJldmlvdXNseSBidWZmZXJlZCBpdGVtcywgd2hpY2hcbiAgLy8gbWF5IGNhbGwgdGhlIF93cml0ZSgpIGNhbGxiYWNrIGluIHRoZSBzYW1lIHRpY2ssIHNvIHRoYXQgd2UgZG9uJ3RcbiAgLy8gZW5kIHVwIGluIGFuIG92ZXJsYXBwZWQgb253cml0ZSBzaXR1YXRpb24uXG4gIHRoaXMuYnVmZmVyUHJvY2Vzc2luZyA9IGZhbHNlO1xuXG4gIC8vIHRoZSBjYWxsYmFjayB0aGF0J3MgcGFzc2VkIHRvIF93cml0ZShjaHVuayxjYilcbiAgdGhpcy5vbndyaXRlID0gZnVuY3Rpb24gKGVyKSB7XG4gICAgb253cml0ZShzdHJlYW0sIGVyKTtcbiAgfTtcblxuICAvLyB0aGUgY2FsbGJhY2sgdGhhdCB0aGUgdXNlciBzdXBwbGllcyB0byB3cml0ZShjaHVuayxlbmNvZGluZyxjYilcbiAgdGhpcy53cml0ZWNiID0gbnVsbDtcblxuICAvLyB0aGUgYW1vdW50IHRoYXQgaXMgYmVpbmcgd3JpdHRlbiB3aGVuIF93cml0ZSBpcyBjYWxsZWQuXG4gIHRoaXMud3JpdGVsZW4gPSAwO1xuXG4gIHRoaXMuYnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcbiAgdGhpcy5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcblxuICAvLyBudW1iZXIgb2YgcGVuZGluZyB1c2VyLXN1cHBsaWVkIHdyaXRlIGNhbGxiYWNrc1xuICAvLyB0aGlzIG11c3QgYmUgMCBiZWZvcmUgJ2ZpbmlzaCcgY2FuIGJlIGVtaXR0ZWRcbiAgdGhpcy5wZW5kaW5nY2IgPSAwO1xuXG4gIC8vIGVtaXQgcHJlZmluaXNoIGlmIHRoZSBvbmx5IHRoaW5nIHdlJ3JlIHdhaXRpbmcgZm9yIGlzIF93cml0ZSBjYnNcbiAgLy8gVGhpcyBpcyByZWxldmFudCBmb3Igc3luY2hyb25vdXMgVHJhbnNmb3JtIHN0cmVhbXNcbiAgdGhpcy5wcmVmaW5pc2hlZCA9IGZhbHNlO1xuXG4gIC8vIFRydWUgaWYgdGhlIGVycm9yIHdhcyBhbHJlYWR5IGVtaXR0ZWQgYW5kIHNob3VsZCBub3QgYmUgdGhyb3duIGFnYWluXG4gIHRoaXMuZXJyb3JFbWl0dGVkID0gZmFsc2U7XG5cbiAgLy8gY291bnQgYnVmZmVyZWQgcmVxdWVzdHNcbiAgdGhpcy5idWZmZXJlZFJlcXVlc3RDb3VudCA9IDA7XG5cbiAgLy8gYWxsb2NhdGUgdGhlIGZpcnN0IENvcmtlZFJlcXVlc3QsIHRoZXJlIGlzIGFsd2F5c1xuICAvLyBvbmUgYWxsb2NhdGVkIGFuZCBmcmVlIHRvIHVzZSwgYW5kIHdlIG1haW50YWluIGF0IG1vc3QgdHdvXG4gIHRoaXMuY29ya2VkUmVxdWVzdHNGcmVlID0gbmV3IENvcmtlZFJlcXVlc3QodGhpcyk7XG59XG5cbldyaXRhYmxlU3RhdGUucHJvdG90eXBlLmdldEJ1ZmZlciA9IGZ1bmN0aW9uIGdldEJ1ZmZlcigpIHtcbiAgdmFyIGN1cnJlbnQgPSB0aGlzLmJ1ZmZlcmVkUmVxdWVzdDtcbiAgdmFyIG91dCA9IFtdO1xuICB3aGlsZSAoY3VycmVudCkge1xuICAgIG91dC5wdXNoKGN1cnJlbnQpO1xuICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn07XG5cbihmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlU3RhdGUucHJvdG90eXBlLCAnYnVmZmVyJywge1xuICAgICAgZ2V0OiBpbnRlcm5hbFV0aWwuZGVwcmVjYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QnVmZmVyKCk7XG4gICAgICB9LCAnX3dyaXRhYmxlU3RhdGUuYnVmZmVyIGlzIGRlcHJlY2F0ZWQuIFVzZSBfd3JpdGFibGVTdGF0ZS5nZXRCdWZmZXIgJyArICdpbnN0ZWFkLicsICdERVAwMDAzJylcbiAgICB9KTtcbiAgfSBjYXRjaCAoXykge31cbn0pKCk7XG5cbi8vIFRlc3QgX3dyaXRhYmxlU3RhdGUgZm9yIGluaGVyaXRhbmNlIHRvIGFjY291bnQgZm9yIER1cGxleCBzdHJlYW1zLFxuLy8gd2hvc2UgcHJvdG90eXBlIGNoYWluIG9ubHkgcG9pbnRzIHRvIFJlYWRhYmxlLlxudmFyIHJlYWxIYXNJbnN0YW5jZTtcbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5oYXNJbnN0YW5jZSAmJiB0eXBlb2YgRnVuY3Rpb24ucHJvdG90eXBlW1N5bWJvbC5oYXNJbnN0YW5jZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgcmVhbEhhc0luc3RhbmNlID0gRnVuY3Rpb24ucHJvdG90eXBlW1N5bWJvbC5oYXNJbnN0YW5jZV07XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZSwgU3ltYm9sLmhhc0luc3RhbmNlLCB7XG4gICAgdmFsdWU6IGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgICAgIGlmIChyZWFsSGFzSW5zdGFuY2UuY2FsbCh0aGlzLCBvYmplY3QpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmICh0aGlzICE9PSBXcml0YWJsZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICByZXR1cm4gb2JqZWN0ICYmIG9iamVjdC5fd3JpdGFibGVTdGF0ZSBpbnN0YW5jZW9mIFdyaXRhYmxlU3RhdGU7XG4gICAgfVxuICB9KTtcbn0gZWxzZSB7XG4gIHJlYWxIYXNJbnN0YW5jZSA9IGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgICByZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgdGhpcztcbiAgfTtcbn1cblxuZnVuY3Rpb24gV3JpdGFibGUob3B0aW9ucykge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIC8vIFdyaXRhYmxlIGN0b3IgaXMgYXBwbGllZCB0byBEdXBsZXhlcywgdG9vLlxuICAvLyBgcmVhbEhhc0luc3RhbmNlYCBpcyBuZWNlc3NhcnkgYmVjYXVzZSB1c2luZyBwbGFpbiBgaW5zdGFuY2VvZmBcbiAgLy8gd291bGQgcmV0dXJuIGZhbHNlLCBhcyBubyBgX3dyaXRhYmxlU3RhdGVgIHByb3BlcnR5IGlzIGF0dGFjaGVkLlxuXG4gIC8vIFRyeWluZyB0byB1c2UgdGhlIGN1c3RvbSBgaW5zdGFuY2VvZmAgZm9yIFdyaXRhYmxlIGhlcmUgd2lsbCBhbHNvIGJyZWFrIHRoZVxuICAvLyBOb2RlLmpzIExhenlUcmFuc2Zvcm0gaW1wbGVtZW50YXRpb24sIHdoaWNoIGhhcyBhIG5vbi10cml2aWFsIGdldHRlciBmb3JcbiAgLy8gYF93cml0YWJsZVN0YXRlYCB0aGF0IHdvdWxkIGxlYWQgdG8gaW5maW5pdGUgcmVjdXJzaW9uLlxuICBpZiAoIXJlYWxIYXNJbnN0YW5jZS5jYWxsKFdyaXRhYmxlLCB0aGlzKSAmJiAhKHRoaXMgaW5zdGFuY2VvZiBEdXBsZXgpKSB7XG4gICAgcmV0dXJuIG5ldyBXcml0YWJsZShvcHRpb25zKTtcbiAgfVxuXG4gIHRoaXMuX3dyaXRhYmxlU3RhdGUgPSBuZXcgV3JpdGFibGVTdGF0ZShvcHRpb25zLCB0aGlzKTtcblxuICAvLyBsZWdhY3kuXG4gIHRoaXMud3JpdGFibGUgPSB0cnVlO1xuXG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLndyaXRlID09PSAnZnVuY3Rpb24nKSB0aGlzLl93cml0ZSA9IG9wdGlvbnMud3JpdGU7XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMud3JpdGV2ID09PSAnZnVuY3Rpb24nKSB0aGlzLl93cml0ZXYgPSBvcHRpb25zLndyaXRldjtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSB0aGlzLl9kZXN0cm95ID0gb3B0aW9ucy5kZXN0cm95O1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmZpbmFsID09PSAnZnVuY3Rpb24nKSB0aGlzLl9maW5hbCA9IG9wdGlvbnMuZmluYWw7XG4gIH1cblxuICBTdHJlYW0uY2FsbCh0aGlzKTtcbn1cblxuLy8gT3RoZXJ3aXNlIHBlb3BsZSBjYW4gcGlwZSBXcml0YWJsZSBzdHJlYW1zLCB3aGljaCBpcyBqdXN0IHdyb25nLlxuV3JpdGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ0Nhbm5vdCBwaXBlLCBub3QgcmVhZGFibGUnKSk7XG59O1xuXG5mdW5jdGlvbiB3cml0ZUFmdGVyRW5kKHN0cmVhbSwgY2IpIHtcbiAgdmFyIGVyID0gbmV3IEVycm9yKCd3cml0ZSBhZnRlciBlbmQnKTtcbiAgLy8gVE9ETzogZGVmZXIgZXJyb3IgZXZlbnRzIGNvbnNpc3RlbnRseSBldmVyeXdoZXJlLCBub3QganVzdCB0aGUgY2JcbiAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICBwbmEubmV4dFRpY2soY2IsIGVyKTtcbn1cblxuLy8gQ2hlY2tzIHRoYXQgYSB1c2VyLXN1cHBsaWVkIGNodW5rIGlzIHZhbGlkLCBlc3BlY2lhbGx5IGZvciB0aGUgcGFydGljdWxhclxuLy8gbW9kZSB0aGUgc3RyZWFtIGlzIGluLiBDdXJyZW50bHkgdGhpcyBtZWFucyB0aGF0IGBudWxsYCBpcyBuZXZlciBhY2NlcHRlZFxuLy8gYW5kIHVuZGVmaW5lZC9ub24tc3RyaW5nIHZhbHVlcyBhcmUgb25seSBhbGxvd2VkIGluIG9iamVjdCBtb2RlLlxuZnVuY3Rpb24gdmFsaWRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgY2IpIHtcbiAgdmFyIHZhbGlkID0gdHJ1ZTtcbiAgdmFyIGVyID0gZmFsc2U7XG5cbiAgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgZXIgPSBuZXcgVHlwZUVycm9yKCdNYXkgbm90IHdyaXRlIG51bGwgdmFsdWVzIHRvIHN0cmVhbScpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBjaHVuayAhPT0gJ3N0cmluZycgJiYgY2h1bmsgIT09IHVuZGVmaW5lZCAmJiAhc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIGVyID0gbmV3IFR5cGVFcnJvcignSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuaycpO1xuICB9XG4gIGlmIChlcikge1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgICBwbmEubmV4dFRpY2soY2IsIGVyKTtcbiAgICB2YWxpZCA9IGZhbHNlO1xuICB9XG4gIHJldHVybiB2YWxpZDtcbn1cblxuV3JpdGFibGUucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHJldCA9IGZhbHNlO1xuICB2YXIgaXNCdWYgPSAhc3RhdGUub2JqZWN0TW9kZSAmJiBfaXNVaW50OEFycmF5KGNodW5rKTtcblxuICBpZiAoaXNCdWYgJiYgIUJ1ZmZlci5pc0J1ZmZlcihjaHVuaykpIHtcbiAgICBjaHVuayA9IF91aW50OEFycmF5VG9CdWZmZXIoY2h1bmspO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gZW5jb2Rpbmc7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9XG5cbiAgaWYgKGlzQnVmKSBlbmNvZGluZyA9ICdidWZmZXInO2Vsc2UgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSBzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7XG5cbiAgaWYgKHR5cGVvZiBjYiAhPT0gJ2Z1bmN0aW9uJykgY2IgPSBub3A7XG5cbiAgaWYgKHN0YXRlLmVuZGVkKSB3cml0ZUFmdGVyRW5kKHRoaXMsIGNiKTtlbHNlIGlmIChpc0J1ZiB8fCB2YWxpZENodW5rKHRoaXMsIHN0YXRlLCBjaHVuaywgY2IpKSB7XG4gICAgc3RhdGUucGVuZGluZ2NiKys7XG4gICAgcmV0ID0gd3JpdGVPckJ1ZmZlcih0aGlzLCBzdGF0ZSwgaXNCdWYsIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5jb3JrID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIHN0YXRlLmNvcmtlZCsrO1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLnVuY29yayA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBpZiAoc3RhdGUuY29ya2VkKSB7XG4gICAgc3RhdGUuY29ya2VkLS07XG5cbiAgICBpZiAoIXN0YXRlLndyaXRpbmcgJiYgIXN0YXRlLmNvcmtlZCAmJiAhc3RhdGUuZmluaXNoZWQgJiYgIXN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgJiYgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0KSBjbGVhckJ1ZmZlcih0aGlzLCBzdGF0ZSk7XG4gIH1cbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5zZXREZWZhdWx0RW5jb2RpbmcgPSBmdW5jdGlvbiBzZXREZWZhdWx0RW5jb2RpbmcoZW5jb2RpbmcpIHtcbiAgLy8gbm9kZTo6UGFyc2VFbmNvZGluZygpIHJlcXVpcmVzIGxvd2VyIGNhc2UuXG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnKSBlbmNvZGluZyA9IGVuY29kaW5nLnRvTG93ZXJDYXNlKCk7XG4gIGlmICghKFsnaGV4JywgJ3V0ZjgnLCAndXRmLTgnLCAnYXNjaWknLCAnYmluYXJ5JywgJ2Jhc2U2NCcsICd1Y3MyJywgJ3Vjcy0yJywgJ3V0ZjE2bGUnLCAndXRmLTE2bGUnLCAncmF3J10uaW5kZXhPZigoZW5jb2RpbmcgKyAnJykudG9Mb3dlckNhc2UoKSkgPiAtMSkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZyk7XG4gIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVmYXVsdEVuY29kaW5nID0gZW5jb2Rpbmc7XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gZGVjb2RlQ2h1bmsoc3RhdGUsIGNodW5rLCBlbmNvZGluZykge1xuICBpZiAoIXN0YXRlLm9iamVjdE1vZGUgJiYgc3RhdGUuZGVjb2RlU3RyaW5ncyAhPT0gZmFsc2UgJiYgdHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmssIGVuY29kaW5nKTtcbiAgfVxuICByZXR1cm4gY2h1bms7XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZS5wcm90b3R5cGUsICd3cml0YWJsZUhpZ2hXYXRlck1hcmsnLCB7XG4gIC8vIG1ha2luZyBpdCBleHBsaWNpdCB0aGlzIHByb3BlcnR5IGlzIG5vdCBlbnVtZXJhYmxlXG4gIC8vIGJlY2F1c2Ugb3RoZXJ3aXNlIHNvbWUgcHJvdG90eXBlIG1hbmlwdWxhdGlvbiBpblxuICAvLyB1c2VybGFuZCB3aWxsIGZhaWxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmhpZ2hXYXRlck1hcms7XG4gIH1cbn0pO1xuXG4vLyBpZiB3ZSdyZSBhbHJlYWR5IHdyaXRpbmcgc29tZXRoaW5nLCB0aGVuIGp1c3QgcHV0IHRoaXNcbi8vIGluIHRoZSBxdWV1ZSwgYW5kIHdhaXQgb3VyIHR1cm4uICBPdGhlcndpc2UsIGNhbGwgX3dyaXRlXG4vLyBJZiB3ZSByZXR1cm4gZmFsc2UsIHRoZW4gd2UgbmVlZCBhIGRyYWluIGV2ZW50LCBzbyBzZXQgdGhhdCBmbGFnLlxuZnVuY3Rpb24gd3JpdGVPckJ1ZmZlcihzdHJlYW0sIHN0YXRlLCBpc0J1ZiwgY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBpZiAoIWlzQnVmKSB7XG4gICAgdmFyIG5ld0NodW5rID0gZGVjb2RlQ2h1bmsoc3RhdGUsIGNodW5rLCBlbmNvZGluZyk7XG4gICAgaWYgKGNodW5rICE9PSBuZXdDaHVuaykge1xuICAgICAgaXNCdWYgPSB0cnVlO1xuICAgICAgZW5jb2RpbmcgPSAnYnVmZmVyJztcbiAgICAgIGNodW5rID0gbmV3Q2h1bms7XG4gICAgfVxuICB9XG4gIHZhciBsZW4gPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcblxuICBzdGF0ZS5sZW5ndGggKz0gbGVuO1xuXG4gIHZhciByZXQgPSBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrO1xuICAvLyB3ZSBtdXN0IGVuc3VyZSB0aGF0IHByZXZpb3VzIG5lZWREcmFpbiB3aWxsIG5vdCBiZSByZXNldCB0byBmYWxzZS5cbiAgaWYgKCFyZXQpIHN0YXRlLm5lZWREcmFpbiA9IHRydWU7XG5cbiAgaWYgKHN0YXRlLndyaXRpbmcgfHwgc3RhdGUuY29ya2VkKSB7XG4gICAgdmFyIGxhc3QgPSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O1xuICAgIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSB7XG4gICAgICBjaHVuazogY2h1bmssXG4gICAgICBlbmNvZGluZzogZW5jb2RpbmcsXG4gICAgICBpc0J1ZjogaXNCdWYsXG4gICAgICBjYWxsYmFjazogY2IsXG4gICAgICBuZXh0OiBudWxsXG4gICAgfTtcbiAgICBpZiAobGFzdCkge1xuICAgICAgbGFzdC5uZXh0ID0gc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0ID0gc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtcbiAgICB9XG4gICAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQgKz0gMTtcbiAgfSBlbHNlIHtcbiAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIGZhbHNlLCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCB3cml0ZXYsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBzdGF0ZS53cml0ZWxlbiA9IGxlbjtcbiAgc3RhdGUud3JpdGVjYiA9IGNiO1xuICBzdGF0ZS53cml0aW5nID0gdHJ1ZTtcbiAgc3RhdGUuc3luYyA9IHRydWU7XG4gIGlmICh3cml0ZXYpIHN0cmVhbS5fd3JpdGV2KGNodW5rLCBzdGF0ZS5vbndyaXRlKTtlbHNlIHN0cmVhbS5fd3JpdGUoY2h1bmssIGVuY29kaW5nLCBzdGF0ZS5vbndyaXRlKTtcbiAgc3RhdGUuc3luYyA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBvbndyaXRlRXJyb3Ioc3RyZWFtLCBzdGF0ZSwgc3luYywgZXIsIGNiKSB7XG4gIC0tc3RhdGUucGVuZGluZ2NiO1xuXG4gIGlmIChzeW5jKSB7XG4gICAgLy8gZGVmZXIgdGhlIGNhbGxiYWNrIGlmIHdlIGFyZSBiZWluZyBjYWxsZWQgc3luY2hyb25vdXNseVxuICAgIC8vIHRvIGF2b2lkIHBpbGluZyB1cCB0aGluZ3Mgb24gdGhlIHN0YWNrXG4gICAgcG5hLm5leHRUaWNrKGNiLCBlcik7XG4gICAgLy8gdGhpcyBjYW4gZW1pdCBmaW5pc2gsIGFuZCBpdCB3aWxsIGFsd2F5cyBoYXBwZW5cbiAgICAvLyBhZnRlciBlcnJvclxuICAgIHBuYS5uZXh0VGljayhmaW5pc2hNYXliZSwgc3RyZWFtLCBzdGF0ZSk7XG4gICAgc3RyZWFtLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCA9IHRydWU7XG4gICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICB9IGVsc2Uge1xuICAgIC8vIHRoZSBjYWxsZXIgZXhwZWN0IHRoaXMgdG8gaGFwcGVuIGJlZm9yZSBpZlxuICAgIC8vIGl0IGlzIGFzeW5jXG4gICAgY2IoZXIpO1xuICAgIHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlO1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgICAvLyB0aGlzIGNhbiBlbWl0IGZpbmlzaCwgYnV0IGZpbmlzaCBtdXN0XG4gICAgLy8gYWx3YXlzIGZvbGxvdyBlcnJvclxuICAgIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGVTdGF0ZVVwZGF0ZShzdGF0ZSkge1xuICBzdGF0ZS53cml0aW5nID0gZmFsc2U7XG4gIHN0YXRlLndyaXRlY2IgPSBudWxsO1xuICBzdGF0ZS5sZW5ndGggLT0gc3RhdGUud3JpdGVsZW47XG4gIHN0YXRlLndyaXRlbGVuID0gMDtcbn1cblxuZnVuY3Rpb24gb253cml0ZShzdHJlYW0sIGVyKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHN5bmMgPSBzdGF0ZS5zeW5jO1xuICB2YXIgY2IgPSBzdGF0ZS53cml0ZWNiO1xuXG4gIG9ud3JpdGVTdGF0ZVVwZGF0ZShzdGF0ZSk7XG5cbiAgaWYgKGVyKSBvbndyaXRlRXJyb3Ioc3RyZWFtLCBzdGF0ZSwgc3luYywgZXIsIGNiKTtlbHNlIHtcbiAgICAvLyBDaGVjayBpZiB3ZSdyZSBhY3R1YWxseSByZWFkeSB0byBmaW5pc2gsIGJ1dCBkb24ndCBlbWl0IHlldFxuICAgIHZhciBmaW5pc2hlZCA9IG5lZWRGaW5pc2goc3RhdGUpO1xuXG4gICAgaWYgKCFmaW5pc2hlZCAmJiAhc3RhdGUuY29ya2VkICYmICFzdGF0ZS5idWZmZXJQcm9jZXNzaW5nICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCkge1xuICAgICAgY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKHN5bmMpIHtcbiAgICAgIC8qPHJlcGxhY2VtZW50PiovXG4gICAgICBhc3luY1dyaXRlKGFmdGVyV3JpdGUsIHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYik7XG4gICAgICAvKjwvcmVwbGFjZW1lbnQ+Ki9cbiAgICB9IGVsc2Uge1xuICAgICAgYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhZnRlcldyaXRlKHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYikge1xuICBpZiAoIWZpbmlzaGVkKSBvbndyaXRlRHJhaW4oc3RyZWFtLCBzdGF0ZSk7XG4gIHN0YXRlLnBlbmRpbmdjYi0tO1xuICBjYigpO1xuICBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKTtcbn1cblxuLy8gTXVzdCBmb3JjZSBjYWxsYmFjayB0byBiZSBjYWxsZWQgb24gbmV4dFRpY2ssIHNvIHRoYXQgd2UgZG9uJ3Rcbi8vIGVtaXQgJ2RyYWluJyBiZWZvcmUgdGhlIHdyaXRlKCkgY29uc3VtZXIgZ2V0cyB0aGUgJ2ZhbHNlJyByZXR1cm5cbi8vIHZhbHVlLCBhbmQgaGFzIGEgY2hhbmNlIHRvIGF0dGFjaCBhICdkcmFpbicgbGlzdGVuZXIuXG5mdW5jdGlvbiBvbndyaXRlRHJhaW4oc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLm5lZWREcmFpbikge1xuICAgIHN0YXRlLm5lZWREcmFpbiA9IGZhbHNlO1xuICAgIHN0cmVhbS5lbWl0KCdkcmFpbicpO1xuICB9XG59XG5cbi8vIGlmIHRoZXJlJ3Mgc29tZXRoaW5nIGluIHRoZSBidWZmZXIgd2FpdGluZywgdGhlbiBwcm9jZXNzIGl0XG5mdW5jdGlvbiBjbGVhckJ1ZmZlcihzdHJlYW0sIHN0YXRlKSB7XG4gIHN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgPSB0cnVlO1xuICB2YXIgZW50cnkgPSBzdGF0ZS5idWZmZXJlZFJlcXVlc3Q7XG5cbiAgaWYgKHN0cmVhbS5fd3JpdGV2ICYmIGVudHJ5ICYmIGVudHJ5Lm5leHQpIHtcbiAgICAvLyBGYXN0IGNhc2UsIHdyaXRlIGV2ZXJ5dGhpbmcgdXNpbmcgX3dyaXRldigpXG4gICAgdmFyIGwgPSBzdGF0ZS5idWZmZXJlZFJlcXVlc3RDb3VudDtcbiAgICB2YXIgYnVmZmVyID0gbmV3IEFycmF5KGwpO1xuICAgIHZhciBob2xkZXIgPSBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWU7XG4gICAgaG9sZGVyLmVudHJ5ID0gZW50cnk7XG5cbiAgICB2YXIgY291bnQgPSAwO1xuICAgIHZhciBhbGxCdWZmZXJzID0gdHJ1ZTtcbiAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgIGJ1ZmZlcltjb3VudF0gPSBlbnRyeTtcbiAgICAgIGlmICghZW50cnkuaXNCdWYpIGFsbEJ1ZmZlcnMgPSBmYWxzZTtcbiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDtcbiAgICAgIGNvdW50ICs9IDE7XG4gICAgfVxuICAgIGJ1ZmZlci5hbGxCdWZmZXJzID0gYWxsQnVmZmVycztcblxuICAgIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgdHJ1ZSwgc3RhdGUubGVuZ3RoLCBidWZmZXIsICcnLCBob2xkZXIuZmluaXNoKTtcblxuICAgIC8vIGRvV3JpdGUgaXMgYWxtb3N0IGFsd2F5cyBhc3luYywgZGVmZXIgdGhlc2UgdG8gc2F2ZSBhIGJpdCBvZiB0aW1lXG4gICAgLy8gYXMgdGhlIGhvdCBwYXRoIGVuZHMgd2l0aCBkb1dyaXRlXG4gICAgc3RhdGUucGVuZGluZ2NiKys7XG4gICAgc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG4gICAgaWYgKGhvbGRlci5uZXh0KSB7XG4gICAgICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBob2xkZXIubmV4dDtcbiAgICAgIGhvbGRlci5uZXh0ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlID0gbmV3IENvcmtlZFJlcXVlc3Qoc3RhdGUpO1xuICAgIH1cbiAgICBzdGF0ZS5idWZmZXJlZFJlcXVlc3RDb3VudCA9IDA7XG4gIH0gZWxzZSB7XG4gICAgLy8gU2xvdyBjYXNlLCB3cml0ZSBjaHVua3Mgb25lLWJ5LW9uZVxuICAgIHdoaWxlIChlbnRyeSkge1xuICAgICAgdmFyIGNodW5rID0gZW50cnkuY2h1bms7XG4gICAgICB2YXIgZW5jb2RpbmcgPSBlbnRyeS5lbmNvZGluZztcbiAgICAgIHZhciBjYiA9IGVudHJ5LmNhbGxiYWNrO1xuICAgICAgdmFyIGxlbiA9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuXG4gICAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIGZhbHNlLCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICAgICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICAgICAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQtLTtcbiAgICAgIC8vIGlmIHdlIGRpZG4ndCBjYWxsIHRoZSBvbndyaXRlIGltbWVkaWF0ZWx5LCB0aGVuXG4gICAgICAvLyBpdCBtZWFucyB0aGF0IHdlIG5lZWQgdG8gd2FpdCB1bnRpbCBpdCBkb2VzLlxuICAgICAgLy8gYWxzbywgdGhhdCBtZWFucyB0aGF0IHRoZSBjaHVuayBhbmQgY2IgYXJlIGN1cnJlbnRseVxuICAgICAgLy8gYmVpbmcgcHJvY2Vzc2VkLCBzbyBtb3ZlIHRoZSBidWZmZXIgY291bnRlciBwYXN0IHRoZW0uXG4gICAgICBpZiAoc3RhdGUud3JpdGluZykge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZW50cnkgPT09IG51bGwpIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICB9XG5cbiAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0ID0gZW50cnk7XG4gIHN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZTtcbn1cblxuV3JpdGFibGUucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNiKG5ldyBFcnJvcignX3dyaXRlKCkgaXMgbm90IGltcGxlbWVudGVkJykpO1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLl93cml0ZXYgPSBudWxsO1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBpZiAodHlwZW9mIGNodW5rID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBjaHVuaztcbiAgICBjaHVuayA9IG51bGw7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gZW5jb2Rpbmc7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9XG5cbiAgaWYgKGNodW5rICE9PSBudWxsICYmIGNodW5rICE9PSB1bmRlZmluZWQpIHRoaXMud3JpdGUoY2h1bmssIGVuY29kaW5nKTtcblxuICAvLyAuZW5kKCkgZnVsbHkgdW5jb3Jrc1xuICBpZiAoc3RhdGUuY29ya2VkKSB7XG4gICAgc3RhdGUuY29ya2VkID0gMTtcbiAgICB0aGlzLnVuY29yaygpO1xuICB9XG5cbiAgLy8gaWdub3JlIHVubmVjZXNzYXJ5IGVuZCgpIGNhbGxzLlxuICBpZiAoIXN0YXRlLmVuZGluZyAmJiAhc3RhdGUuZmluaXNoZWQpIGVuZFdyaXRhYmxlKHRoaXMsIHN0YXRlLCBjYik7XG59O1xuXG5mdW5jdGlvbiBuZWVkRmluaXNoKHN0YXRlKSB7XG4gIHJldHVybiBzdGF0ZS5lbmRpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9PT0gbnVsbCAmJiAhc3RhdGUuZmluaXNoZWQgJiYgIXN0YXRlLndyaXRpbmc7XG59XG5mdW5jdGlvbiBjYWxsRmluYWwoc3RyZWFtLCBzdGF0ZSkge1xuICBzdHJlYW0uX2ZpbmFsKGZ1bmN0aW9uIChlcnIpIHtcbiAgICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgICBpZiAoZXJyKSB7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgIH1cbiAgICBzdGF0ZS5wcmVmaW5pc2hlZCA9IHRydWU7XG4gICAgc3RyZWFtLmVtaXQoJ3ByZWZpbmlzaCcpO1xuICAgIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucHJlZmluaXNoZWQgJiYgIXN0YXRlLmZpbmFsQ2FsbGVkKSB7XG4gICAgaWYgKHR5cGVvZiBzdHJlYW0uX2ZpbmFsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBzdGF0ZS5wZW5kaW5nY2IrKztcbiAgICAgIHN0YXRlLmZpbmFsQ2FsbGVkID0gdHJ1ZTtcbiAgICAgIHBuYS5uZXh0VGljayhjYWxsRmluYWwsIHN0cmVhbSwgc3RhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5wcmVmaW5pc2hlZCA9IHRydWU7XG4gICAgICBzdHJlYW0uZW1pdCgncHJlZmluaXNoJyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpIHtcbiAgdmFyIG5lZWQgPSBuZWVkRmluaXNoKHN0YXRlKTtcbiAgaWYgKG5lZWQpIHtcbiAgICBwcmVmaW5pc2goc3RyZWFtLCBzdGF0ZSk7XG4gICAgaWYgKHN0YXRlLnBlbmRpbmdjYiA9PT0gMCkge1xuICAgICAgc3RhdGUuZmluaXNoZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLmVtaXQoJ2ZpbmlzaCcpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmVlZDtcbn1cblxuZnVuY3Rpb24gZW5kV3JpdGFibGUoc3RyZWFtLCBzdGF0ZSwgY2IpIHtcbiAgc3RhdGUuZW5kaW5nID0gdHJ1ZTtcbiAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG4gIGlmIChjYikge1xuICAgIGlmIChzdGF0ZS5maW5pc2hlZCkgcG5hLm5leHRUaWNrKGNiKTtlbHNlIHN0cmVhbS5vbmNlKCdmaW5pc2gnLCBjYik7XG4gIH1cbiAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuICBzdHJlYW0ud3JpdGFibGUgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gb25Db3JrZWRGaW5pc2goY29ya1JlcSwgc3RhdGUsIGVycikge1xuICB2YXIgZW50cnkgPSBjb3JrUmVxLmVudHJ5O1xuICBjb3JrUmVxLmVudHJ5ID0gbnVsbDtcbiAgd2hpbGUgKGVudHJ5KSB7XG4gICAgdmFyIGNiID0gZW50cnkuY2FsbGJhY2s7XG4gICAgc3RhdGUucGVuZGluZ2NiLS07XG4gICAgY2IoZXJyKTtcbiAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gIH1cbiAgaWYgKHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSkge1xuICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZS5uZXh0ID0gY29ya1JlcTtcbiAgfSBlbHNlIHtcbiAgICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBjb3JrUmVxO1xuICB9XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZS5wcm90b3R5cGUsICdkZXN0cm95ZWQnLCB7XG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLl93cml0YWJsZVN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIC8vIHdlIGlnbm9yZSB0aGUgdmFsdWUgaWYgdGhlIHN0cmVhbVxuICAgIC8vIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXRcbiAgICBpZiAoIXRoaXMuX3dyaXRhYmxlU3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGUgdXNlciBpcyBleHBsaWNpdGx5XG4gICAgLy8gbWFuYWdpbmcgZGVzdHJveWVkXG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB2YWx1ZTtcbiAgfVxufSk7XG5cbldyaXRhYmxlLnByb3RvdHlwZS5kZXN0cm95ID0gZGVzdHJveUltcGwuZGVzdHJveTtcbldyaXRhYmxlLnByb3RvdHlwZS5fdW5kZXN0cm95ID0gZGVzdHJveUltcGwudW5kZXN0cm95O1xuV3JpdGFibGUucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24gKGVyciwgY2IpIHtcbiAgdGhpcy5lbmQoKTtcbiAgY2IoZXJyKTtcbn07IiwiJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXI7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcblxuZnVuY3Rpb24gY29weUJ1ZmZlcihzcmMsIHRhcmdldCwgb2Zmc2V0KSB7XG4gIHNyYy5jb3B5KHRhcmdldCwgb2Zmc2V0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEJ1ZmZlckxpc3QoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEJ1ZmZlckxpc3QpO1xuXG4gICAgdGhpcy5oZWFkID0gbnVsbDtcbiAgICB0aGlzLnRhaWwgPSBudWxsO1xuICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgfVxuXG4gIEJ1ZmZlckxpc3QucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiBwdXNoKHYpIHtcbiAgICB2YXIgZW50cnkgPSB7IGRhdGE6IHYsIG5leHQ6IG51bGwgfTtcbiAgICBpZiAodGhpcy5sZW5ndGggPiAwKSB0aGlzLnRhaWwubmV4dCA9IGVudHJ5O2Vsc2UgdGhpcy5oZWFkID0gZW50cnk7XG4gICAgdGhpcy50YWlsID0gZW50cnk7XG4gICAgKyt0aGlzLmxlbmd0aDtcbiAgfTtcblxuICBCdWZmZXJMaXN0LnByb3RvdHlwZS51bnNoaWZ0ID0gZnVuY3Rpb24gdW5zaGlmdCh2KSB7XG4gICAgdmFyIGVudHJ5ID0geyBkYXRhOiB2LCBuZXh0OiB0aGlzLmhlYWQgfTtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHRoaXMudGFpbCA9IGVudHJ5O1xuICAgIHRoaXMuaGVhZCA9IGVudHJ5O1xuICAgICsrdGhpcy5sZW5ndGg7XG4gIH07XG5cbiAgQnVmZmVyTGlzdC5wcm90b3R5cGUuc2hpZnQgPSBmdW5jdGlvbiBzaGlmdCgpIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICB2YXIgcmV0ID0gdGhpcy5oZWFkLmRhdGE7XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAxKSB0aGlzLmhlYWQgPSB0aGlzLnRhaWwgPSBudWxsO2Vsc2UgdGhpcy5oZWFkID0gdGhpcy5oZWFkLm5leHQ7XG4gICAgLS10aGlzLmxlbmd0aDtcbiAgICByZXR1cm4gcmV0O1xuICB9O1xuXG4gIEJ1ZmZlckxpc3QucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbnVsbDtcbiAgICB0aGlzLmxlbmd0aCA9IDA7XG4gIH07XG5cbiAgQnVmZmVyTGlzdC5wcm90b3R5cGUuam9pbiA9IGZ1bmN0aW9uIGpvaW4ocykge1xuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuICcnO1xuICAgIHZhciBwID0gdGhpcy5oZWFkO1xuICAgIHZhciByZXQgPSAnJyArIHAuZGF0YTtcbiAgICB3aGlsZSAocCA9IHAubmV4dCkge1xuICAgICAgcmV0ICs9IHMgKyBwLmRhdGE7XG4gICAgfXJldHVybiByZXQ7XG4gIH07XG5cbiAgQnVmZmVyTGlzdC5wcm90b3R5cGUuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0KG4pIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybiBCdWZmZXIuYWxsb2MoMCk7XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAxKSByZXR1cm4gdGhpcy5oZWFkLmRhdGE7XG4gICAgdmFyIHJldCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShuID4+PiAwKTtcbiAgICB2YXIgcCA9IHRoaXMuaGVhZDtcbiAgICB2YXIgaSA9IDA7XG4gICAgd2hpbGUgKHApIHtcbiAgICAgIGNvcHlCdWZmZXIocC5kYXRhLCByZXQsIGkpO1xuICAgICAgaSArPSBwLmRhdGEubGVuZ3RoO1xuICAgICAgcCA9IHAubmV4dDtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfTtcblxuICByZXR1cm4gQnVmZmVyTGlzdDtcbn0oKTtcblxuaWYgKHV0aWwgJiYgdXRpbC5pbnNwZWN0ICYmIHV0aWwuaW5zcGVjdC5jdXN0b20pIHtcbiAgbW9kdWxlLmV4cG9ydHMucHJvdG90eXBlW3V0aWwuaW5zcGVjdC5jdXN0b21dID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBvYmogPSB1dGlsLmluc3BlY3QoeyBsZW5ndGg6IHRoaXMubGVuZ3RoIH0pO1xuICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgKyAnICcgKyBvYmo7XG4gIH07XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xuXG52YXIgcG5hID0gcmVxdWlyZSgncHJvY2Vzcy1uZXh0aWNrLWFyZ3MnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vLyB1bmRvY3VtZW50ZWQgY2IoKSBBUEksIG5lZWRlZCBmb3IgY29yZSwgbm90IGZvciBwdWJsaWMgQVBJXG5mdW5jdGlvbiBkZXN0cm95KGVyciwgY2IpIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICB2YXIgcmVhZGFibGVEZXN0cm95ZWQgPSB0aGlzLl9yZWFkYWJsZVN0YXRlICYmIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkO1xuICB2YXIgd3JpdGFibGVEZXN0cm95ZWQgPSB0aGlzLl93cml0YWJsZVN0YXRlICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkO1xuXG4gIGlmIChyZWFkYWJsZURlc3Ryb3llZCB8fCB3cml0YWJsZURlc3Ryb3llZCkge1xuICAgIGlmIChjYikge1xuICAgICAgY2IoZXJyKTtcbiAgICB9IGVsc2UgaWYgKGVyciAmJiAoIXRoaXMuX3dyaXRhYmxlU3RhdGUgfHwgIXRoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkKSkge1xuICAgICAgcG5hLm5leHRUaWNrKGVtaXRFcnJvck5ULCB0aGlzLCBlcnIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHdlIHNldCBkZXN0cm95ZWQgdG8gdHJ1ZSBiZWZvcmUgZmlyaW5nIGVycm9yIGNhbGxiYWNrcyBpbiBvcmRlclxuICAvLyB0byBtYWtlIGl0IHJlLWVudHJhbmNlIHNhZmUgaW4gY2FzZSBkZXN0cm95KCkgaXMgY2FsbGVkIHdpdGhpbiBjYWxsYmFja3NcblxuICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZSkge1xuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8vIGlmIHRoaXMgaXMgYSBkdXBsZXggc3RyZWFtIG1hcmsgdGhlIHdyaXRhYmxlIHBhcnQgYXMgZGVzdHJveWVkIGFzIHdlbGxcbiAgaWYgKHRoaXMuX3dyaXRhYmxlU3RhdGUpIHtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZCA9IHRydWU7XG4gIH1cblxuICB0aGlzLl9kZXN0cm95KGVyciB8fCBudWxsLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYgKCFjYiAmJiBlcnIpIHtcbiAgICAgIHBuYS5uZXh0VGljayhlbWl0RXJyb3JOVCwgX3RoaXMsIGVycik7XG4gICAgICBpZiAoX3RoaXMuX3dyaXRhYmxlU3RhdGUpIHtcbiAgICAgICAgX3RoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNiKSB7XG4gICAgICBjYihlcnIpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHRoaXM7XG59XG5cbmZ1bmN0aW9uIHVuZGVzdHJveSgpIHtcbiAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUpIHtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5kZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQgPSBmYWxzZTtcbiAgfVxuXG4gIGlmICh0aGlzLl93cml0YWJsZVN0YXRlKSB7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkID0gZmFsc2U7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmZpbmlzaGVkID0gZmFsc2U7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbWl0RXJyb3JOVChzZWxmLCBlcnIpIHtcbiAgc2VsZi5lbWl0KCdlcnJvcicsIGVycik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBkZXN0cm95OiBkZXN0cm95LFxuICB1bmRlc3Ryb3k6IHVuZGVzdHJveVxufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlcjtcbiIsImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fcmVhZGFibGUuanMnKTtcbmV4cG9ydHMuU3RyZWFtID0gZXhwb3J0cztcbmV4cG9ydHMuUmVhZGFibGUgPSBleHBvcnRzO1xuZXhwb3J0cy5Xcml0YWJsZSA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fd3JpdGFibGUuanMnKTtcbmV4cG9ydHMuRHVwbGV4ID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV9kdXBsZXguanMnKTtcbmV4cG9ydHMuVHJhbnNmb3JtID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV90cmFuc2Zvcm0uanMnKTtcbmV4cG9ydHMuUGFzc1Rocm91Z2ggPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3Bhc3N0aHJvdWdoLmpzJyk7XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBub2RlL25vLWRlcHJlY2F0ZWQtYXBpICovXG52YXIgYnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJylcbnZhciBCdWZmZXIgPSBidWZmZXIuQnVmZmVyXG5cbi8vIGFsdGVybmF0aXZlIHRvIHVzaW5nIE9iamVjdC5rZXlzIGZvciBvbGQgYnJvd3NlcnNcbmZ1bmN0aW9uIGNvcHlQcm9wcyAoc3JjLCBkc3QpIHtcbiAgZm9yICh2YXIga2V5IGluIHNyYykge1xuICAgIGRzdFtrZXldID0gc3JjW2tleV1cbiAgfVxufVxuaWYgKEJ1ZmZlci5mcm9tICYmIEJ1ZmZlci5hbGxvYyAmJiBCdWZmZXIuYWxsb2NVbnNhZmUgJiYgQnVmZmVyLmFsbG9jVW5zYWZlU2xvdykge1xuICBtb2R1bGUuZXhwb3J0cyA9IGJ1ZmZlclxufSBlbHNlIHtcbiAgLy8gQ29weSBwcm9wZXJ0aWVzIGZyb20gcmVxdWlyZSgnYnVmZmVyJylcbiAgY29weVByb3BzKGJ1ZmZlciwgZXhwb3J0cylcbiAgZXhwb3J0cy5CdWZmZXIgPSBTYWZlQnVmZmVyXG59XG5cbmZ1bmN0aW9uIFNhZmVCdWZmZXIgKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBCdWZmZXIoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbi8vIENvcHkgc3RhdGljIG1ldGhvZHMgZnJvbSBCdWZmZXJcbmNvcHlQcm9wcyhCdWZmZXIsIFNhZmVCdWZmZXIpXG5cblNhZmVCdWZmZXIuZnJvbSA9IGZ1bmN0aW9uIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgcmV0dXJuIEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuU2FmZUJ1ZmZlci5hbGxvYyA9IGZ1bmN0aW9uIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgdmFyIGJ1ZiA9IEJ1ZmZlcihzaXplKVxuICBpZiAoZmlsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGJ1Zi5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgIH0gZWxzZSB7XG4gICAgICBidWYuZmlsbChmaWxsKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBidWYuZmlsbCgwKVxuICB9XG4gIHJldHVybiBidWZcbn1cblxuU2FmZUJ1ZmZlci5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfVxuICByZXR1cm4gQnVmZmVyKHNpemUpXG59XG5cblNhZmVCdWZmZXIuYWxsb2NVbnNhZmVTbG93ID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHJldHVybiBidWZmZXIuU2xvd0J1ZmZlcihzaXplKVxufVxuIiwiKGZ1bmN0aW9uIChnbG9iYWwsIHVuZGVmaW5lZCkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgaWYgKGdsb2JhbC5zZXRJbW1lZGlhdGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBuZXh0SGFuZGxlID0gMTsgLy8gU3BlYyBzYXlzIGdyZWF0ZXIgdGhhbiB6ZXJvXG4gICAgdmFyIHRhc2tzQnlIYW5kbGUgPSB7fTtcbiAgICB2YXIgY3VycmVudGx5UnVubmluZ0FUYXNrID0gZmFsc2U7XG4gICAgdmFyIGRvYyA9IGdsb2JhbC5kb2N1bWVudDtcbiAgICB2YXIgcmVnaXN0ZXJJbW1lZGlhdGU7XG5cbiAgICBmdW5jdGlvbiBzZXRJbW1lZGlhdGUoY2FsbGJhY2spIHtcbiAgICAgIC8vIENhbGxiYWNrIGNhbiBlaXRoZXIgYmUgYSBmdW5jdGlvbiBvciBhIHN0cmluZ1xuICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGNhbGxiYWNrID0gbmV3IEZ1bmN0aW9uKFwiXCIgKyBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgICAvLyBDb3B5IGZ1bmN0aW9uIGFyZ3VtZW50c1xuICAgICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgYXJnc1tpXSA9IGFyZ3VtZW50c1tpICsgMV07XG4gICAgICB9XG4gICAgICAvLyBTdG9yZSBhbmQgcmVnaXN0ZXIgdGhlIHRhc2tcbiAgICAgIHZhciB0YXNrID0geyBjYWxsYmFjazogY2FsbGJhY2ssIGFyZ3M6IGFyZ3MgfTtcbiAgICAgIHRhc2tzQnlIYW5kbGVbbmV4dEhhbmRsZV0gPSB0YXNrO1xuICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUobmV4dEhhbmRsZSk7XG4gICAgICByZXR1cm4gbmV4dEhhbmRsZSsrO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsZWFySW1tZWRpYXRlKGhhbmRsZSkge1xuICAgICAgICBkZWxldGUgdGFza3NCeUhhbmRsZVtoYW5kbGVdO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJ1bih0YXNrKSB7XG4gICAgICAgIHZhciBjYWxsYmFjayA9IHRhc2suY2FsbGJhY2s7XG4gICAgICAgIHZhciBhcmdzID0gdGFzay5hcmdzO1xuICAgICAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgY2FsbGJhY2soYXJnc1swXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgY2FsbGJhY2soYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgY2FsbGJhY2soYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJ1bklmUHJlc2VudChoYW5kbGUpIHtcbiAgICAgICAgLy8gRnJvbSB0aGUgc3BlYzogXCJXYWl0IHVudGlsIGFueSBpbnZvY2F0aW9ucyBvZiB0aGlzIGFsZ29yaXRobSBzdGFydGVkIGJlZm9yZSB0aGlzIG9uZSBoYXZlIGNvbXBsZXRlZC5cIlxuICAgICAgICAvLyBTbyBpZiB3ZSdyZSBjdXJyZW50bHkgcnVubmluZyBhIHRhc2ssIHdlJ2xsIG5lZWQgdG8gZGVsYXkgdGhpcyBpbnZvY2F0aW9uLlxuICAgICAgICBpZiAoY3VycmVudGx5UnVubmluZ0FUYXNrKSB7XG4gICAgICAgICAgICAvLyBEZWxheSBieSBkb2luZyBhIHNldFRpbWVvdXQuIHNldEltbWVkaWF0ZSB3YXMgdHJpZWQgaW5zdGVhZCwgYnV0IGluIEZpcmVmb3ggNyBpdCBnZW5lcmF0ZWQgYVxuICAgICAgICAgICAgLy8gXCJ0b28gbXVjaCByZWN1cnNpb25cIiBlcnJvci5cbiAgICAgICAgICAgIHNldFRpbWVvdXQocnVuSWZQcmVzZW50LCAwLCBoYW5kbGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHRhc2sgPSB0YXNrc0J5SGFuZGxlW2hhbmRsZV07XG4gICAgICAgICAgICBpZiAodGFzaykge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRseVJ1bm5pbmdBVGFzayA9IHRydWU7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcnVuKHRhc2spO1xuICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFySW1tZWRpYXRlKGhhbmRsZSk7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRseVJ1bm5pbmdBVGFzayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxOZXh0VGlja0ltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7IHJ1bklmUHJlc2VudChoYW5kbGUpOyB9KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjYW5Vc2VQb3N0TWVzc2FnZSgpIHtcbiAgICAgICAgLy8gVGhlIHRlc3QgYWdhaW5zdCBgaW1wb3J0U2NyaXB0c2AgcHJldmVudHMgdGhpcyBpbXBsZW1lbnRhdGlvbiBmcm9tIGJlaW5nIGluc3RhbGxlZCBpbnNpZGUgYSB3ZWIgd29ya2VyLFxuICAgICAgICAvLyB3aGVyZSBgZ2xvYmFsLnBvc3RNZXNzYWdlYCBtZWFucyBzb21ldGhpbmcgY29tcGxldGVseSBkaWZmZXJlbnQgYW5kIGNhbid0IGJlIHVzZWQgZm9yIHRoaXMgcHVycG9zZS5cbiAgICAgICAgaWYgKGdsb2JhbC5wb3N0TWVzc2FnZSAmJiAhZ2xvYmFsLmltcG9ydFNjcmlwdHMpIHtcbiAgICAgICAgICAgIHZhciBwb3N0TWVzc2FnZUlzQXN5bmNocm9ub3VzID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhciBvbGRPbk1lc3NhZ2UgPSBnbG9iYWwub25tZXNzYWdlO1xuICAgICAgICAgICAgZ2xvYmFsLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXMgPSBmYWxzZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBnbG9iYWwucG9zdE1lc3NhZ2UoXCJcIiwgXCIqXCIpO1xuICAgICAgICAgICAgZ2xvYmFsLm9ubWVzc2FnZSA9IG9sZE9uTWVzc2FnZTtcbiAgICAgICAgICAgIHJldHVybiBwb3N0TWVzc2FnZUlzQXN5bmNocm9ub3VzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbFBvc3RNZXNzYWdlSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIC8vIEluc3RhbGxzIGFuIGV2ZW50IGhhbmRsZXIgb24gYGdsb2JhbGAgZm9yIHRoZSBgbWVzc2FnZWAgZXZlbnQ6IHNlZVxuICAgICAgICAvLyAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0RPTS93aW5kb3cucG9zdE1lc3NhZ2VcbiAgICAgICAgLy8gKiBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrL211bHRpcGFnZS9jb21tcy5odG1sI2Nyb3NzRG9jdW1lbnRNZXNzYWdlc1xuXG4gICAgICAgIHZhciBtZXNzYWdlUHJlZml4ID0gXCJzZXRJbW1lZGlhdGUkXCIgKyBNYXRoLnJhbmRvbSgpICsgXCIkXCI7XG4gICAgICAgIHZhciBvbkdsb2JhbE1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LnNvdXJjZSA9PT0gZ2xvYmFsICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIGV2ZW50LmRhdGEgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICAgICBldmVudC5kYXRhLmluZGV4T2YobWVzc2FnZVByZWZpeCkgPT09IDApIHtcbiAgICAgICAgICAgICAgICBydW5JZlByZXNlbnQoK2V2ZW50LmRhdGEuc2xpY2UobWVzc2FnZVByZWZpeC5sZW5ndGgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBvbkdsb2JhbE1lc3NhZ2UsIGZhbHNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdsb2JhbC5hdHRhY2hFdmVudChcIm9ubWVzc2FnZVwiLCBvbkdsb2JhbE1lc3NhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIGdsb2JhbC5wb3N0TWVzc2FnZShtZXNzYWdlUHJlZml4ICsgaGFuZGxlLCBcIipcIik7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbE1lc3NhZ2VDaGFubmVsSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHZhciBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gICAgICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBldmVudC5kYXRhO1xuICAgICAgICAgICAgcnVuSWZQcmVzZW50KGhhbmRsZSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIGNoYW5uZWwucG9ydDIucG9zdE1lc3NhZ2UoaGFuZGxlKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsUmVhZHlTdGF0ZUNoYW5nZUltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICB2YXIgaHRtbCA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICAvLyBDcmVhdGUgYSA8c2NyaXB0PiBlbGVtZW50OyBpdHMgcmVhZHlzdGF0ZWNoYW5nZSBldmVudCB3aWxsIGJlIGZpcmVkIGFzeW5jaHJvbm91c2x5IG9uY2UgaXQgaXMgaW5zZXJ0ZWRcbiAgICAgICAgICAgIC8vIGludG8gdGhlIGRvY3VtZW50LiBEbyBzbywgdGh1cyBxdWV1aW5nIHVwIHRoZSB0YXNrLiBSZW1lbWJlciB0byBjbGVhbiB1cCBvbmNlIGl0J3MgYmVlbiBjYWxsZWQuXG4gICAgICAgICAgICB2YXIgc2NyaXB0ID0gZG9jLmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG4gICAgICAgICAgICBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJ1bklmUHJlc2VudChoYW5kbGUpO1xuICAgICAgICAgICAgICAgIHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsO1xuICAgICAgICAgICAgICAgIGh0bWwucmVtb3ZlQ2hpbGQoc2NyaXB0KTtcbiAgICAgICAgICAgICAgICBzY3JpcHQgPSBudWxsO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGh0bWwuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsU2V0VGltZW91dEltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgc2V0VGltZW91dChydW5JZlByZXNlbnQsIDAsIGhhbmRsZSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gSWYgc3VwcG9ydGVkLCB3ZSBzaG91bGQgYXR0YWNoIHRvIHRoZSBwcm90b3R5cGUgb2YgZ2xvYmFsLCBzaW5jZSB0aGF0IGlzIHdoZXJlIHNldFRpbWVvdXQgZXQgYWwuIGxpdmUuXG4gICAgdmFyIGF0dGFjaFRvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihnbG9iYWwpO1xuICAgIGF0dGFjaFRvID0gYXR0YWNoVG8gJiYgYXR0YWNoVG8uc2V0VGltZW91dCA/IGF0dGFjaFRvIDogZ2xvYmFsO1xuXG4gICAgLy8gRG9uJ3QgZ2V0IGZvb2xlZCBieSBlLmcuIGJyb3dzZXJpZnkgZW52aXJvbm1lbnRzLlxuICAgIGlmICh7fS50b1N0cmluZy5jYWxsKGdsb2JhbC5wcm9jZXNzKSA9PT0gXCJbb2JqZWN0IHByb2Nlc3NdXCIpIHtcbiAgICAgICAgLy8gRm9yIE5vZGUuanMgYmVmb3JlIDAuOVxuICAgICAgICBpbnN0YWxsTmV4dFRpY2tJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIGlmIChjYW5Vc2VQb3N0TWVzc2FnZSgpKSB7XG4gICAgICAgIC8vIEZvciBub24tSUUxMCBtb2Rlcm4gYnJvd3NlcnNcbiAgICAgICAgaW5zdGFsbFBvc3RNZXNzYWdlSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSBpZiAoZ2xvYmFsLk1lc3NhZ2VDaGFubmVsKSB7XG4gICAgICAgIC8vIEZvciB3ZWIgd29ya2Vycywgd2hlcmUgc3VwcG9ydGVkXG4gICAgICAgIGluc3RhbGxNZXNzYWdlQ2hhbm5lbEltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2UgaWYgKGRvYyAmJiBcIm9ucmVhZHlzdGF0ZWNoYW5nZVwiIGluIGRvYy5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpKSB7XG4gICAgICAgIC8vIEZvciBJRSA24oCTOFxuICAgICAgICBpbnN0YWxsUmVhZHlTdGF0ZUNoYW5nZUltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBGb3Igb2xkZXIgYnJvd3NlcnNcbiAgICAgICAgaW5zdGFsbFNldFRpbWVvdXRJbXBsZW1lbnRhdGlvbigpO1xuICAgIH1cblxuICAgIGF0dGFjaFRvLnNldEltbWVkaWF0ZSA9IHNldEltbWVkaWF0ZTtcbiAgICBhdHRhY2hUby5jbGVhckltbWVkaWF0ZSA9IGNsZWFySW1tZWRpYXRlO1xufSh0eXBlb2Ygc2VsZiA9PT0gXCJ1bmRlZmluZWRcIiA/IHR5cGVvZiBnbG9iYWwgPT09IFwidW5kZWZpbmVkXCIgPyB0aGlzIDogZ2xvYmFsIDogc2VsZikpO1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBpc0VuY29kaW5nID0gQnVmZmVyLmlzRW5jb2RpbmcgfHwgZnVuY3Rpb24gKGVuY29kaW5nKSB7XG4gIGVuY29kaW5nID0gJycgKyBlbmNvZGluZztcbiAgc3dpdGNoIChlbmNvZGluZyAmJiBlbmNvZGluZy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpjYXNlICd1dGY4JzpjYXNlICd1dGYtOCc6Y2FzZSAnYXNjaWknOmNhc2UgJ2JpbmFyeSc6Y2FzZSAnYmFzZTY0JzpjYXNlICd1Y3MyJzpjYXNlICd1Y3MtMic6Y2FzZSAndXRmMTZsZSc6Y2FzZSAndXRmLTE2bGUnOmNhc2UgJ3Jhdyc6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG5mdW5jdGlvbiBfbm9ybWFsaXplRW5jb2RpbmcoZW5jKSB7XG4gIGlmICghZW5jKSByZXR1cm4gJ3V0ZjgnO1xuICB2YXIgcmV0cmllZDtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuYykge1xuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiAndXRmOCc7XG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gJ3V0ZjE2bGUnO1xuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiAnbGF0aW4xJztcbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gZW5jO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKHJldHJpZWQpIHJldHVybjsgLy8gdW5kZWZpbmVkXG4gICAgICAgIGVuYyA9ICgnJyArIGVuYykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgcmV0cmllZCA9IHRydWU7XG4gICAgfVxuICB9XG59O1xuXG4vLyBEbyBub3QgY2FjaGUgYEJ1ZmZlci5pc0VuY29kaW5nYCB3aGVuIGNoZWNraW5nIGVuY29kaW5nIG5hbWVzIGFzIHNvbWVcbi8vIG1vZHVsZXMgbW9ua2V5LXBhdGNoIGl0IHRvIHN1cHBvcnQgYWRkaXRpb25hbCBlbmNvZGluZ3NcbmZ1bmN0aW9uIG5vcm1hbGl6ZUVuY29kaW5nKGVuYykge1xuICB2YXIgbmVuYyA9IF9ub3JtYWxpemVFbmNvZGluZyhlbmMpO1xuICBpZiAodHlwZW9mIG5lbmMgIT09ICdzdHJpbmcnICYmIChCdWZmZXIuaXNFbmNvZGluZyA9PT0gaXNFbmNvZGluZyB8fCAhaXNFbmNvZGluZyhlbmMpKSkgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jKTtcbiAgcmV0dXJuIG5lbmMgfHwgZW5jO1xufVxuXG4vLyBTdHJpbmdEZWNvZGVyIHByb3ZpZGVzIGFuIGludGVyZmFjZSBmb3IgZWZmaWNpZW50bHkgc3BsaXR0aW5nIGEgc2VyaWVzIG9mXG4vLyBidWZmZXJzIGludG8gYSBzZXJpZXMgb2YgSlMgc3RyaW5ncyB3aXRob3V0IGJyZWFraW5nIGFwYXJ0IG11bHRpLWJ5dGVcbi8vIGNoYXJhY3RlcnMuXG5leHBvcnRzLlN0cmluZ0RlY29kZXIgPSBTdHJpbmdEZWNvZGVyO1xuZnVuY3Rpb24gU3RyaW5nRGVjb2RlcihlbmNvZGluZykge1xuICB0aGlzLmVuY29kaW5nID0gbm9ybWFsaXplRW5jb2RpbmcoZW5jb2RpbmcpO1xuICB2YXIgbmI7XG4gIHN3aXRjaCAodGhpcy5lbmNvZGluZykge1xuICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgdGhpcy50ZXh0ID0gdXRmMTZUZXh0O1xuICAgICAgdGhpcy5lbmQgPSB1dGYxNkVuZDtcbiAgICAgIG5iID0gNDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgdGhpcy5maWxsTGFzdCA9IHV0ZjhGaWxsTGFzdDtcbiAgICAgIG5iID0gNDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICB0aGlzLnRleHQgPSBiYXNlNjRUZXh0O1xuICAgICAgdGhpcy5lbmQgPSBiYXNlNjRFbmQ7XG4gICAgICBuYiA9IDM7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhpcy53cml0ZSA9IHNpbXBsZVdyaXRlO1xuICAgICAgdGhpcy5lbmQgPSBzaW1wbGVFbmQ7XG4gICAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5sYXN0TmVlZCA9IDA7XG4gIHRoaXMubGFzdFRvdGFsID0gMDtcbiAgdGhpcy5sYXN0Q2hhciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShuYik7XG59XG5cblN0cmluZ0RlY29kZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGJ1Zikge1xuICBpZiAoYnVmLmxlbmd0aCA9PT0gMCkgcmV0dXJuICcnO1xuICB2YXIgcjtcbiAgdmFyIGk7XG4gIGlmICh0aGlzLmxhc3ROZWVkKSB7XG4gICAgciA9IHRoaXMuZmlsbExhc3QoYnVmKTtcbiAgICBpZiAociA9PT0gdW5kZWZpbmVkKSByZXR1cm4gJyc7XG4gICAgaSA9IHRoaXMubGFzdE5lZWQ7XG4gICAgdGhpcy5sYXN0TmVlZCA9IDA7XG4gIH0gZWxzZSB7XG4gICAgaSA9IDA7XG4gIH1cbiAgaWYgKGkgPCBidWYubGVuZ3RoKSByZXR1cm4gciA/IHIgKyB0aGlzLnRleHQoYnVmLCBpKSA6IHRoaXMudGV4dChidWYsIGkpO1xuICByZXR1cm4gciB8fCAnJztcbn07XG5cblN0cmluZ0RlY29kZXIucHJvdG90eXBlLmVuZCA9IHV0ZjhFbmQ7XG5cbi8vIFJldHVybnMgb25seSBjb21wbGV0ZSBjaGFyYWN0ZXJzIGluIGEgQnVmZmVyXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS50ZXh0ID0gdXRmOFRleHQ7XG5cbi8vIEF0dGVtcHRzIHRvIGNvbXBsZXRlIGEgcGFydGlhbCBub24tVVRGLTggY2hhcmFjdGVyIHVzaW5nIGJ5dGVzIGZyb20gYSBCdWZmZXJcblN0cmluZ0RlY29kZXIucHJvdG90eXBlLmZpbGxMYXN0ID0gZnVuY3Rpb24gKGJ1Zikge1xuICBpZiAodGhpcy5sYXN0TmVlZCA8PSBidWYubGVuZ3RoKSB7XG4gICAgYnVmLmNvcHkodGhpcy5sYXN0Q2hhciwgdGhpcy5sYXN0VG90YWwgLSB0aGlzLmxhc3ROZWVkLCAwLCB0aGlzLmxhc3ROZWVkKTtcbiAgICByZXR1cm4gdGhpcy5sYXN0Q2hhci50b1N0cmluZyh0aGlzLmVuY29kaW5nLCAwLCB0aGlzLmxhc3RUb3RhbCk7XG4gIH1cbiAgYnVmLmNvcHkodGhpcy5sYXN0Q2hhciwgdGhpcy5sYXN0VG90YWwgLSB0aGlzLmxhc3ROZWVkLCAwLCBidWYubGVuZ3RoKTtcbiAgdGhpcy5sYXN0TmVlZCAtPSBidWYubGVuZ3RoO1xufTtcblxuLy8gQ2hlY2tzIHRoZSB0eXBlIG9mIGEgVVRGLTggYnl0ZSwgd2hldGhlciBpdCdzIEFTQ0lJLCBhIGxlYWRpbmcgYnl0ZSwgb3IgYVxuLy8gY29udGludWF0aW9uIGJ5dGUuIElmIGFuIGludmFsaWQgYnl0ZSBpcyBkZXRlY3RlZCwgLTIgaXMgcmV0dXJuZWQuXG5mdW5jdGlvbiB1dGY4Q2hlY2tCeXRlKGJ5dGUpIHtcbiAgaWYgKGJ5dGUgPD0gMHg3RikgcmV0dXJuIDA7ZWxzZSBpZiAoYnl0ZSA+PiA1ID09PSAweDA2KSByZXR1cm4gMjtlbHNlIGlmIChieXRlID4+IDQgPT09IDB4MEUpIHJldHVybiAzO2Vsc2UgaWYgKGJ5dGUgPj4gMyA9PT0gMHgxRSkgcmV0dXJuIDQ7XG4gIHJldHVybiBieXRlID4+IDYgPT09IDB4MDIgPyAtMSA6IC0yO1xufVxuXG4vLyBDaGVja3MgYXQgbW9zdCAzIGJ5dGVzIGF0IHRoZSBlbmQgb2YgYSBCdWZmZXIgaW4gb3JkZXIgdG8gZGV0ZWN0IGFuXG4vLyBpbmNvbXBsZXRlIG11bHRpLWJ5dGUgVVRGLTggY2hhcmFjdGVyLiBUaGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzICgyLCAzLCBvciA0KVxuLy8gbmVlZGVkIHRvIGNvbXBsZXRlIHRoZSBVVEYtOCBjaGFyYWN0ZXIgKGlmIGFwcGxpY2FibGUpIGFyZSByZXR1cm5lZC5cbmZ1bmN0aW9uIHV0ZjhDaGVja0luY29tcGxldGUoc2VsZiwgYnVmLCBpKSB7XG4gIHZhciBqID0gYnVmLmxlbmd0aCAtIDE7XG4gIGlmIChqIDwgaSkgcmV0dXJuIDA7XG4gIHZhciBuYiA9IHV0ZjhDaGVja0J5dGUoYnVmW2pdKTtcbiAgaWYgKG5iID49IDApIHtcbiAgICBpZiAobmIgPiAwKSBzZWxmLmxhc3ROZWVkID0gbmIgLSAxO1xuICAgIHJldHVybiBuYjtcbiAgfVxuICBpZiAoLS1qIDwgaSB8fCBuYiA9PT0gLTIpIHJldHVybiAwO1xuICBuYiA9IHV0ZjhDaGVja0J5dGUoYnVmW2pdKTtcbiAgaWYgKG5iID49IDApIHtcbiAgICBpZiAobmIgPiAwKSBzZWxmLmxhc3ROZWVkID0gbmIgLSAyO1xuICAgIHJldHVybiBuYjtcbiAgfVxuICBpZiAoLS1qIDwgaSB8fCBuYiA9PT0gLTIpIHJldHVybiAwO1xuICBuYiA9IHV0ZjhDaGVja0J5dGUoYnVmW2pdKTtcbiAgaWYgKG5iID49IDApIHtcbiAgICBpZiAobmIgPiAwKSB7XG4gICAgICBpZiAobmIgPT09IDIpIG5iID0gMDtlbHNlIHNlbGYubGFzdE5lZWQgPSBuYiAtIDM7XG4gICAgfVxuICAgIHJldHVybiBuYjtcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy8gVmFsaWRhdGVzIGFzIG1hbnkgY29udGludWF0aW9uIGJ5dGVzIGZvciBhIG11bHRpLWJ5dGUgVVRGLTggY2hhcmFjdGVyIGFzXG4vLyBuZWVkZWQgb3IgYXJlIGF2YWlsYWJsZS4gSWYgd2Ugc2VlIGEgbm9uLWNvbnRpbnVhdGlvbiBieXRlIHdoZXJlIHdlIGV4cGVjdFxuLy8gb25lLCB3ZSBcInJlcGxhY2VcIiB0aGUgdmFsaWRhdGVkIGNvbnRpbnVhdGlvbiBieXRlcyB3ZSd2ZSBzZWVuIHNvIGZhciB3aXRoXG4vLyBhIHNpbmdsZSBVVEYtOCByZXBsYWNlbWVudCBjaGFyYWN0ZXIgKCdcXHVmZmZkJyksIHRvIG1hdGNoIHY4J3MgVVRGLTggZGVjb2Rpbmdcbi8vIGJlaGF2aW9yLiBUaGUgY29udGludWF0aW9uIGJ5dGUgY2hlY2sgaXMgaW5jbHVkZWQgdGhyZWUgdGltZXMgaW4gdGhlIGNhc2Vcbi8vIHdoZXJlIGFsbCBvZiB0aGUgY29udGludWF0aW9uIGJ5dGVzIGZvciBhIGNoYXJhY3RlciBleGlzdCBpbiB0aGUgc2FtZSBidWZmZXIuXG4vLyBJdCBpcyBhbHNvIGRvbmUgdGhpcyB3YXkgYXMgYSBzbGlnaHQgcGVyZm9ybWFuY2UgaW5jcmVhc2UgaW5zdGVhZCBvZiB1c2luZyBhXG4vLyBsb29wLlxuZnVuY3Rpb24gdXRmOENoZWNrRXh0cmFCeXRlcyhzZWxmLCBidWYsIHApIHtcbiAgaWYgKChidWZbMF0gJiAweEMwKSAhPT0gMHg4MCkge1xuICAgIHNlbGYubGFzdE5lZWQgPSAwO1xuICAgIHJldHVybiAnXFx1ZmZmZCc7XG4gIH1cbiAgaWYgKHNlbGYubGFzdE5lZWQgPiAxICYmIGJ1Zi5sZW5ndGggPiAxKSB7XG4gICAgaWYgKChidWZbMV0gJiAweEMwKSAhPT0gMHg4MCkge1xuICAgICAgc2VsZi5sYXN0TmVlZCA9IDE7XG4gICAgICByZXR1cm4gJ1xcdWZmZmQnO1xuICAgIH1cbiAgICBpZiAoc2VsZi5sYXN0TmVlZCA+IDIgJiYgYnVmLmxlbmd0aCA+IDIpIHtcbiAgICAgIGlmICgoYnVmWzJdICYgMHhDMCkgIT09IDB4ODApIHtcbiAgICAgICAgc2VsZi5sYXN0TmVlZCA9IDI7XG4gICAgICAgIHJldHVybiAnXFx1ZmZmZCc7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIEF0dGVtcHRzIHRvIGNvbXBsZXRlIGEgbXVsdGktYnl0ZSBVVEYtOCBjaGFyYWN0ZXIgdXNpbmcgYnl0ZXMgZnJvbSBhIEJ1ZmZlci5cbmZ1bmN0aW9uIHV0ZjhGaWxsTGFzdChidWYpIHtcbiAgdmFyIHAgPSB0aGlzLmxhc3RUb3RhbCAtIHRoaXMubGFzdE5lZWQ7XG4gIHZhciByID0gdXRmOENoZWNrRXh0cmFCeXRlcyh0aGlzLCBidWYsIHApO1xuICBpZiAociAhPT0gdW5kZWZpbmVkKSByZXR1cm4gcjtcbiAgaWYgKHRoaXMubGFzdE5lZWQgPD0gYnVmLmxlbmd0aCkge1xuICAgIGJ1Zi5jb3B5KHRoaXMubGFzdENoYXIsIHAsIDAsIHRoaXMubGFzdE5lZWQpO1xuICAgIHJldHVybiB0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsIDAsIHRoaXMubGFzdFRvdGFsKTtcbiAgfVxuICBidWYuY29weSh0aGlzLmxhc3RDaGFyLCBwLCAwLCBidWYubGVuZ3RoKTtcbiAgdGhpcy5sYXN0TmVlZCAtPSBidWYubGVuZ3RoO1xufVxuXG4vLyBSZXR1cm5zIGFsbCBjb21wbGV0ZSBVVEYtOCBjaGFyYWN0ZXJzIGluIGEgQnVmZmVyLiBJZiB0aGUgQnVmZmVyIGVuZGVkIG9uIGFcbi8vIHBhcnRpYWwgY2hhcmFjdGVyLCB0aGUgY2hhcmFjdGVyJ3MgYnl0ZXMgYXJlIGJ1ZmZlcmVkIHVudGlsIHRoZSByZXF1aXJlZFxuLy8gbnVtYmVyIG9mIGJ5dGVzIGFyZSBhdmFpbGFibGUuXG5mdW5jdGlvbiB1dGY4VGV4dChidWYsIGkpIHtcbiAgdmFyIHRvdGFsID0gdXRmOENoZWNrSW5jb21wbGV0ZSh0aGlzLCBidWYsIGkpO1xuICBpZiAoIXRoaXMubGFzdE5lZWQpIHJldHVybiBidWYudG9TdHJpbmcoJ3V0ZjgnLCBpKTtcbiAgdGhpcy5sYXN0VG90YWwgPSB0b3RhbDtcbiAgdmFyIGVuZCA9IGJ1Zi5sZW5ndGggLSAodG90YWwgLSB0aGlzLmxhc3ROZWVkKTtcbiAgYnVmLmNvcHkodGhpcy5sYXN0Q2hhciwgMCwgZW5kKTtcbiAgcmV0dXJuIGJ1Zi50b1N0cmluZygndXRmOCcsIGksIGVuZCk7XG59XG5cbi8vIEZvciBVVEYtOCwgYSByZXBsYWNlbWVudCBjaGFyYWN0ZXIgaXMgYWRkZWQgd2hlbiBlbmRpbmcgb24gYSBwYXJ0aWFsXG4vLyBjaGFyYWN0ZXIuXG5mdW5jdGlvbiB1dGY4RW5kKGJ1Zikge1xuICB2YXIgciA9IGJ1ZiAmJiBidWYubGVuZ3RoID8gdGhpcy53cml0ZShidWYpIDogJyc7XG4gIGlmICh0aGlzLmxhc3ROZWVkKSByZXR1cm4gciArICdcXHVmZmZkJztcbiAgcmV0dXJuIHI7XG59XG5cbi8vIFVURi0xNkxFIHR5cGljYWxseSBuZWVkcyB0d28gYnl0ZXMgcGVyIGNoYXJhY3RlciwgYnV0IGV2ZW4gaWYgd2UgaGF2ZSBhbiBldmVuXG4vLyBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlLCB3ZSBuZWVkIHRvIGNoZWNrIGlmIHdlIGVuZCBvbiBhIGxlYWRpbmcvaGlnaFxuLy8gc3Vycm9nYXRlLiBJbiB0aGF0IGNhc2UsIHdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIG5leHQgdHdvIGJ5dGVzIGluIG9yZGVyIHRvXG4vLyBkZWNvZGUgdGhlIGxhc3QgY2hhcmFjdGVyIHByb3Blcmx5LlxuZnVuY3Rpb24gdXRmMTZUZXh0KGJ1ZiwgaSkge1xuICBpZiAoKGJ1Zi5sZW5ndGggLSBpKSAlIDIgPT09IDApIHtcbiAgICB2YXIgciA9IGJ1Zi50b1N0cmluZygndXRmMTZsZScsIGkpO1xuICAgIGlmIChyKSB7XG4gICAgICB2YXIgYyA9IHIuY2hhckNvZGVBdChyLmxlbmd0aCAtIDEpO1xuICAgICAgaWYgKGMgPj0gMHhEODAwICYmIGMgPD0gMHhEQkZGKSB7XG4gICAgICAgIHRoaXMubGFzdE5lZWQgPSAyO1xuICAgICAgICB0aGlzLmxhc3RUb3RhbCA9IDQ7XG4gICAgICAgIHRoaXMubGFzdENoYXJbMF0gPSBidWZbYnVmLmxlbmd0aCAtIDJdO1xuICAgICAgICB0aGlzLmxhc3RDaGFyWzFdID0gYnVmW2J1Zi5sZW5ndGggLSAxXTtcbiAgICAgICAgcmV0dXJuIHIuc2xpY2UoMCwgLTEpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfVxuICB0aGlzLmxhc3ROZWVkID0gMTtcbiAgdGhpcy5sYXN0VG90YWwgPSAyO1xuICB0aGlzLmxhc3RDaGFyWzBdID0gYnVmW2J1Zi5sZW5ndGggLSAxXTtcbiAgcmV0dXJuIGJ1Zi50b1N0cmluZygndXRmMTZsZScsIGksIGJ1Zi5sZW5ndGggLSAxKTtcbn1cblxuLy8gRm9yIFVURi0xNkxFIHdlIGRvIG5vdCBleHBsaWNpdGx5IGFwcGVuZCBzcGVjaWFsIHJlcGxhY2VtZW50IGNoYXJhY3RlcnMgaWYgd2Vcbi8vIGVuZCBvbiBhIHBhcnRpYWwgY2hhcmFjdGVyLCB3ZSBzaW1wbHkgbGV0IHY4IGhhbmRsZSB0aGF0LlxuZnVuY3Rpb24gdXRmMTZFbmQoYnVmKSB7XG4gIHZhciByID0gYnVmICYmIGJ1Zi5sZW5ndGggPyB0aGlzLndyaXRlKGJ1ZikgOiAnJztcbiAgaWYgKHRoaXMubGFzdE5lZWQpIHtcbiAgICB2YXIgZW5kID0gdGhpcy5sYXN0VG90YWwgLSB0aGlzLmxhc3ROZWVkO1xuICAgIHJldHVybiByICsgdGhpcy5sYXN0Q2hhci50b1N0cmluZygndXRmMTZsZScsIDAsIGVuZCk7XG4gIH1cbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFRleHQoYnVmLCBpKSB7XG4gIHZhciBuID0gKGJ1Zi5sZW5ndGggLSBpKSAlIDM7XG4gIGlmIChuID09PSAwKSByZXR1cm4gYnVmLnRvU3RyaW5nKCdiYXNlNjQnLCBpKTtcbiAgdGhpcy5sYXN0TmVlZCA9IDMgLSBuO1xuICB0aGlzLmxhc3RUb3RhbCA9IDM7XG4gIGlmIChuID09PSAxKSB7XG4gICAgdGhpcy5sYXN0Q2hhclswXSA9IGJ1ZltidWYubGVuZ3RoIC0gMV07XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5sYXN0Q2hhclswXSA9IGJ1ZltidWYubGVuZ3RoIC0gMl07XG4gICAgdGhpcy5sYXN0Q2hhclsxXSA9IGJ1ZltidWYubGVuZ3RoIC0gMV07XG4gIH1cbiAgcmV0dXJuIGJ1Zi50b1N0cmluZygnYmFzZTY0JywgaSwgYnVmLmxlbmd0aCAtIG4pO1xufVxuXG5mdW5jdGlvbiBiYXNlNjRFbmQoYnVmKSB7XG4gIHZhciByID0gYnVmICYmIGJ1Zi5sZW5ndGggPyB0aGlzLndyaXRlKGJ1ZikgOiAnJztcbiAgaWYgKHRoaXMubGFzdE5lZWQpIHJldHVybiByICsgdGhpcy5sYXN0Q2hhci50b1N0cmluZygnYmFzZTY0JywgMCwgMyAtIHRoaXMubGFzdE5lZWQpO1xuICByZXR1cm4gcjtcbn1cblxuLy8gUGFzcyBieXRlcyBvbiB0aHJvdWdoIGZvciBzaW5nbGUtYnl0ZSBlbmNvZGluZ3MgKGUuZy4gYXNjaWksIGxhdGluMSwgaGV4KVxuZnVuY3Rpb24gc2ltcGxlV3JpdGUoYnVmKSB7XG4gIHJldHVybiBidWYudG9TdHJpbmcodGhpcy5lbmNvZGluZyk7XG59XG5cbmZ1bmN0aW9uIHNpbXBsZUVuZChidWYpIHtcbiAgcmV0dXJuIGJ1ZiAmJiBidWYubGVuZ3RoID8gdGhpcy53cml0ZShidWYpIDogJyc7XG59IiwidmFyIHNjb3BlID0gKHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgJiYgZ2xvYmFsKSB8fFxuICAgICAgICAgICAgKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiICYmIHNlbGYpIHx8XG4gICAgICAgICAgICB3aW5kb3c7XG52YXIgYXBwbHkgPSBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHk7XG5cbi8vIERPTSBBUElzLCBmb3IgY29tcGxldGVuZXNzXG5cbmV4cG9ydHMuc2V0VGltZW91dCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFRpbWVvdXQoYXBwbHkuY2FsbChzZXRUaW1lb3V0LCBzY29wZSwgYXJndW1lbnRzKSwgY2xlYXJUaW1lb3V0KTtcbn07XG5leHBvcnRzLnNldEludGVydmFsID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgVGltZW91dChhcHBseS5jYWxsKHNldEludGVydmFsLCBzY29wZSwgYXJndW1lbnRzKSwgY2xlYXJJbnRlcnZhbCk7XG59O1xuZXhwb3J0cy5jbGVhclRpbWVvdXQgPVxuZXhwb3J0cy5jbGVhckludGVydmFsID0gZnVuY3Rpb24odGltZW91dCkge1xuICBpZiAodGltZW91dCkge1xuICAgIHRpbWVvdXQuY2xvc2UoKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gVGltZW91dChpZCwgY2xlYXJGbikge1xuICB0aGlzLl9pZCA9IGlkO1xuICB0aGlzLl9jbGVhckZuID0gY2xlYXJGbjtcbn1cblRpbWVvdXQucHJvdG90eXBlLnVucmVmID0gVGltZW91dC5wcm90b3R5cGUucmVmID0gZnVuY3Rpb24oKSB7fTtcblRpbWVvdXQucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX2NsZWFyRm4uY2FsbChzY29wZSwgdGhpcy5faWQpO1xufTtcblxuLy8gRG9lcyBub3Qgc3RhcnQgdGhlIHRpbWUsIGp1c3Qgc2V0cyB1cCB0aGUgbWVtYmVycyBuZWVkZWQuXG5leHBvcnRzLmVucm9sbCA9IGZ1bmN0aW9uKGl0ZW0sIG1zZWNzKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcbiAgaXRlbS5faWRsZVRpbWVvdXQgPSBtc2Vjcztcbn07XG5cbmV4cG9ydHMudW5lbnJvbGwgPSBmdW5jdGlvbihpdGVtKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcbiAgaXRlbS5faWRsZVRpbWVvdXQgPSAtMTtcbn07XG5cbmV4cG9ydHMuX3VucmVmQWN0aXZlID0gZXhwb3J0cy5hY3RpdmUgPSBmdW5jdGlvbihpdGVtKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcblxuICB2YXIgbXNlY3MgPSBpdGVtLl9pZGxlVGltZW91dDtcbiAgaWYgKG1zZWNzID49IDApIHtcbiAgICBpdGVtLl9pZGxlVGltZW91dElkID0gc2V0VGltZW91dChmdW5jdGlvbiBvblRpbWVvdXQoKSB7XG4gICAgICBpZiAoaXRlbS5fb25UaW1lb3V0KVxuICAgICAgICBpdGVtLl9vblRpbWVvdXQoKTtcbiAgICB9LCBtc2Vjcyk7XG4gIH1cbn07XG5cbi8vIHNldGltbWVkaWF0ZSBhdHRhY2hlcyBpdHNlbGYgdG8gdGhlIGdsb2JhbCBvYmplY3RcbnJlcXVpcmUoXCJzZXRpbW1lZGlhdGVcIik7XG4vLyBPbiBzb21lIGV4b3RpYyBlbnZpcm9ubWVudHMsIGl0J3Mgbm90IGNsZWFyIHdoaWNoIG9iamVjdCBgc2V0aW1tZWRpYXRlYCB3YXNcbi8vIGFibGUgdG8gaW5zdGFsbCBvbnRvLiAgU2VhcmNoIGVhY2ggcG9zc2liaWxpdHkgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlXG4vLyBgc2V0aW1tZWRpYXRlYCBsaWJyYXJ5LlxuZXhwb3J0cy5zZXRJbW1lZGlhdGUgPSAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgJiYgc2VsZi5zZXRJbW1lZGlhdGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiICYmIGdsb2JhbC5zZXRJbW1lZGlhdGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICh0aGlzICYmIHRoaXMuc2V0SW1tZWRpYXRlKTtcbmV4cG9ydHMuY2xlYXJJbW1lZGlhdGUgPSAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgJiYgc2VsZi5jbGVhckltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBnbG9iYWwuY2xlYXJJbW1lZGlhdGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMgJiYgdGhpcy5jbGVhckltbWVkaWF0ZSk7XG4iLCIvKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZVxyXG50aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZVxyXG5MaWNlbnNlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG5cclxuVEhJUyBDT0RFIElTIFBST1ZJREVEIE9OIEFOICpBUyBJUyogQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxyXG5LSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIEFOWSBJTVBMSUVEXHJcbldBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsXHJcbk1FUkNIQU5UQUJMSVRZIE9SIE5PTi1JTkZSSU5HRU1FTlQuXHJcblxyXG5TZWUgdGhlIEFwYWNoZSBWZXJzaW9uIDIuMCBMaWNlbnNlIGZvciBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnNcclxuYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSAqL1xyXG5cclxudmFyIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdOyB9O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgIH1cclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMClcclxuICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZShyZXN1bHQudmFsdWUpOyB9KS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XHJcbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XHJcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xyXG4gICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcclxuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XHJcbiAgICAgICAgd2hpbGUgKF8pIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcclxuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cclxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBleHBvcnRzKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmICghZXhwb3J0cy5oYXNPd25Qcm9wZXJ0eShwKSkgZXhwb3J0c1twXSA9IG1bcF07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl0sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XHJcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xyXG4gICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIHJlc3VsdFtrXSA9IG1vZFtrXTtcclxuICAgIHJlc3VsdC5kZWZhdWx0ID0gbW9kO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuIiwiXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZGVwcmVjYXRlO1xuXG4vKipcbiAqIE1hcmsgdGhhdCBhIG1ldGhvZCBzaG91bGQgbm90IGJlIHVzZWQuXG4gKiBSZXR1cm5zIGEgbW9kaWZpZWQgZnVuY3Rpb24gd2hpY2ggd2FybnMgb25jZSBieSBkZWZhdWx0LlxuICpcbiAqIElmIGBsb2NhbFN0b3JhZ2Uubm9EZXByZWNhdGlvbiA9IHRydWVgIGlzIHNldCwgdGhlbiBpdCBpcyBhIG5vLW9wLlxuICpcbiAqIElmIGBsb2NhbFN0b3JhZ2UudGhyb3dEZXByZWNhdGlvbiA9IHRydWVgIGlzIHNldCwgdGhlbiBkZXByZWNhdGVkIGZ1bmN0aW9uc1xuICogd2lsbCB0aHJvdyBhbiBFcnJvciB3aGVuIGludm9rZWQuXG4gKlxuICogSWYgYGxvY2FsU3RvcmFnZS50cmFjZURlcHJlY2F0aW9uID0gdHJ1ZWAgaXMgc2V0LCB0aGVuIGRlcHJlY2F0ZWQgZnVuY3Rpb25zXG4gKiB3aWxsIGludm9rZSBgY29uc29sZS50cmFjZSgpYCBpbnN0ZWFkIG9mIGBjb25zb2xlLmVycm9yKClgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gdGhlIGZ1bmN0aW9uIHRvIGRlcHJlY2F0ZVxuICogQHBhcmFtIHtTdHJpbmd9IG1zZyAtIHRoZSBzdHJpbmcgdG8gcHJpbnQgdG8gdGhlIGNvbnNvbGUgd2hlbiBgZm5gIGlzIGludm9rZWRcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gYSBuZXcgXCJkZXByZWNhdGVkXCIgdmVyc2lvbiBvZiBgZm5gXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGRlcHJlY2F0ZSAoZm4sIG1zZykge1xuICBpZiAoY29uZmlnKCdub0RlcHJlY2F0aW9uJykpIHtcbiAgICByZXR1cm4gZm47XG4gIH1cblxuICB2YXIgd2FybmVkID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGRlcHJlY2F0ZWQoKSB7XG4gICAgaWYgKCF3YXJuZWQpIHtcbiAgICAgIGlmIChjb25maWcoJ3Rocm93RGVwcmVjYXRpb24nKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgIH0gZWxzZSBpZiAoY29uZmlnKCd0cmFjZURlcHJlY2F0aW9uJykpIHtcbiAgICAgICAgY29uc29sZS50cmFjZShtc2cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKG1zZyk7XG4gICAgICB9XG4gICAgICB3YXJuZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIHJldHVybiBkZXByZWNhdGVkO1xufVxuXG4vKipcbiAqIENoZWNrcyBgbG9jYWxTdG9yYWdlYCBmb3IgYm9vbGVhbiB2YWx1ZXMgZm9yIHRoZSBnaXZlbiBgbmFtZWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY29uZmlnIChuYW1lKSB7XG4gIC8vIGFjY2Vzc2luZyBnbG9iYWwubG9jYWxTdG9yYWdlIGNhbiB0cmlnZ2VyIGEgRE9NRXhjZXB0aW9uIGluIHNhbmRib3hlZCBpZnJhbWVzXG4gIHRyeSB7XG4gICAgaWYgKCFnbG9iYWwubG9jYWxTdG9yYWdlKSByZXR1cm4gZmFsc2U7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHZhbCA9IGdsb2JhbC5sb2NhbFN0b3JhZ2VbbmFtZV07XG4gIGlmIChudWxsID09IHZhbCkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gU3RyaW5nKHZhbCkudG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnO1xufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0J1ZmZlcihhcmcpIHtcbiAgcmV0dXJuIGFyZyAmJiB0eXBlb2YgYXJnID09PSAnb2JqZWN0J1xuICAgICYmIHR5cGVvZiBhcmcuY29weSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICYmIHR5cGVvZiBhcmcuZmlsbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICYmIHR5cGVvZiBhcmcucmVhZFVJbnQ4ID09PSAnZnVuY3Rpb24nO1xufSIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgZm9ybWF0UmVnRXhwID0gLyVbc2RqJV0vZztcbmV4cG9ydHMuZm9ybWF0ID0gZnVuY3Rpb24oZikge1xuICBpZiAoIWlzU3RyaW5nKGYpKSB7XG4gICAgdmFyIG9iamVjdHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgb2JqZWN0cy5wdXNoKGluc3BlY3QoYXJndW1lbnRzW2ldKSk7XG4gICAgfVxuICAgIHJldHVybiBvYmplY3RzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHZhciBpID0gMTtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIHZhciBsZW4gPSBhcmdzLmxlbmd0aDtcbiAgdmFyIHN0ciA9IFN0cmluZyhmKS5yZXBsYWNlKGZvcm1hdFJlZ0V4cCwgZnVuY3Rpb24oeCkge1xuICAgIGlmICh4ID09PSAnJSUnKSByZXR1cm4gJyUnO1xuICAgIGlmIChpID49IGxlbikgcmV0dXJuIHg7XG4gICAgc3dpdGNoICh4KSB7XG4gICAgICBjYXNlICclcyc6IHJldHVybiBTdHJpbmcoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVkJzogcmV0dXJuIE51bWJlcihhcmdzW2krK10pO1xuICAgICAgY2FzZSAnJWonOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcmdzW2krK10pO1xuICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICB9KTtcbiAgZm9yICh2YXIgeCA9IGFyZ3NbaV07IGkgPCBsZW47IHggPSBhcmdzWysraV0pIHtcbiAgICBpZiAoaXNOdWxsKHgpIHx8ICFpc09iamVjdCh4KSkge1xuICAgICAgc3RyICs9ICcgJyArIHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciArPSAnICcgKyBpbnNwZWN0KHgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyO1xufTtcblxuXG4vLyBNYXJrIHRoYXQgYSBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkLlxuLy8gUmV0dXJucyBhIG1vZGlmaWVkIGZ1bmN0aW9uIHdoaWNoIHdhcm5zIG9uY2UgYnkgZGVmYXVsdC5cbi8vIElmIC0tbm8tZGVwcmVjYXRpb24gaXMgc2V0LCB0aGVuIGl0IGlzIGEgbm8tb3AuXG5leHBvcnRzLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKGZuLCBtc2cpIHtcbiAgLy8gQWxsb3cgZm9yIGRlcHJlY2F0aW5nIHRoaW5ncyBpbiB0aGUgcHJvY2VzcyBvZiBzdGFydGluZyB1cC5cbiAgaWYgKGlzVW5kZWZpbmVkKGdsb2JhbC5wcm9jZXNzKSkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBleHBvcnRzLmRlcHJlY2F0ZShmbiwgbXNnKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH1cblxuICBpZiAocHJvY2Vzcy5ub0RlcHJlY2F0aW9uID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgdmFyIHdhcm5lZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBkZXByZWNhdGVkKCkge1xuICAgIGlmICghd2FybmVkKSB7XG4gICAgICBpZiAocHJvY2Vzcy50aHJvd0RlcHJlY2F0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLnRyYWNlRGVwcmVjYXRpb24pIHtcbiAgICAgICAgY29uc29sZS50cmFjZShtc2cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihtc2cpO1xuICAgICAgfVxuICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gZGVwcmVjYXRlZDtcbn07XG5cblxudmFyIGRlYnVncyA9IHt9O1xudmFyIGRlYnVnRW52aXJvbjtcbmV4cG9ydHMuZGVidWdsb2cgPSBmdW5jdGlvbihzZXQpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKGRlYnVnRW52aXJvbikpXG4gICAgZGVidWdFbnZpcm9uID0gcHJvY2Vzcy5lbnYuTk9ERV9ERUJVRyB8fCAnJztcbiAgc2V0ID0gc2V0LnRvVXBwZXJDYXNlKCk7XG4gIGlmICghZGVidWdzW3NldF0pIHtcbiAgICBpZiAobmV3IFJlZ0V4cCgnXFxcXGInICsgc2V0ICsgJ1xcXFxiJywgJ2knKS50ZXN0KGRlYnVnRW52aXJvbikpIHtcbiAgICAgIHZhciBwaWQgPSBwcm9jZXNzLnBpZDtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBtc2cgPSBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCclcyAlZDogJXMnLCBzZXQsIHBpZCwgbXNnKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7fTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlYnVnc1tzZXRdO1xufTtcblxuXG4vKipcbiAqIEVjaG9zIHRoZSB2YWx1ZSBvZiBhIHZhbHVlLiBUcnlzIHRvIHByaW50IHRoZSB2YWx1ZSBvdXRcbiAqIGluIHRoZSBiZXN0IHdheSBwb3NzaWJsZSBnaXZlbiB0aGUgZGlmZmVyZW50IHR5cGVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBwcmludCBvdXQuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyBPcHRpb25hbCBvcHRpb25zIG9iamVjdCB0aGF0IGFsdGVycyB0aGUgb3V0cHV0LlxuICovXG4vKiBsZWdhY3k6IG9iaiwgc2hvd0hpZGRlbiwgZGVwdGgsIGNvbG9ycyovXG5mdW5jdGlvbiBpbnNwZWN0KG9iaiwgb3B0cykge1xuICAvLyBkZWZhdWx0IG9wdGlvbnNcbiAgdmFyIGN0eCA9IHtcbiAgICBzZWVuOiBbXSxcbiAgICBzdHlsaXplOiBzdHlsaXplTm9Db2xvclxuICB9O1xuICAvLyBsZWdhY3kuLi5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMykgY3R4LmRlcHRoID0gYXJndW1lbnRzWzJdO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSA0KSBjdHguY29sb3JzID0gYXJndW1lbnRzWzNdO1xuICBpZiAoaXNCb29sZWFuKG9wdHMpKSB7XG4gICAgLy8gbGVnYWN5Li4uXG4gICAgY3R4LnNob3dIaWRkZW4gPSBvcHRzO1xuICB9IGVsc2UgaWYgKG9wdHMpIHtcbiAgICAvLyBnb3QgYW4gXCJvcHRpb25zXCIgb2JqZWN0XG4gICAgZXhwb3J0cy5fZXh0ZW5kKGN0eCwgb3B0cyk7XG4gIH1cbiAgLy8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LnNob3dIaWRkZW4pKSBjdHguc2hvd0hpZGRlbiA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmRlcHRoKSkgY3R4LmRlcHRoID0gMjtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jb2xvcnMpKSBjdHguY29sb3JzID0gZmFsc2U7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY3VzdG9tSW5zcGVjdCkpIGN0eC5jdXN0b21JbnNwZWN0ID0gdHJ1ZTtcbiAgaWYgKGN0eC5jb2xvcnMpIGN0eC5zdHlsaXplID0gc3R5bGl6ZVdpdGhDb2xvcjtcbiAgcmV0dXJuIGZvcm1hdFZhbHVlKGN0eCwgb2JqLCBjdHguZGVwdGgpO1xufVxuZXhwb3J0cy5pbnNwZWN0ID0gaW5zcGVjdDtcblxuXG4vLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FOU0lfZXNjYXBlX2NvZGUjZ3JhcGhpY3Ncbmluc3BlY3QuY29sb3JzID0ge1xuICAnYm9sZCcgOiBbMSwgMjJdLFxuICAnaXRhbGljJyA6IFszLCAyM10sXG4gICd1bmRlcmxpbmUnIDogWzQsIDI0XSxcbiAgJ2ludmVyc2UnIDogWzcsIDI3XSxcbiAgJ3doaXRlJyA6IFszNywgMzldLFxuICAnZ3JleScgOiBbOTAsIDM5XSxcbiAgJ2JsYWNrJyA6IFszMCwgMzldLFxuICAnYmx1ZScgOiBbMzQsIDM5XSxcbiAgJ2N5YW4nIDogWzM2LCAzOV0sXG4gICdncmVlbicgOiBbMzIsIDM5XSxcbiAgJ21hZ2VudGEnIDogWzM1LCAzOV0sXG4gICdyZWQnIDogWzMxLCAzOV0sXG4gICd5ZWxsb3cnIDogWzMzLCAzOV1cbn07XG5cbi8vIERvbid0IHVzZSAnYmx1ZScgbm90IHZpc2libGUgb24gY21kLmV4ZVxuaW5zcGVjdC5zdHlsZXMgPSB7XG4gICdzcGVjaWFsJzogJ2N5YW4nLFxuICAnbnVtYmVyJzogJ3llbGxvdycsXG4gICdib29sZWFuJzogJ3llbGxvdycsXG4gICd1bmRlZmluZWQnOiAnZ3JleScsXG4gICdudWxsJzogJ2JvbGQnLFxuICAnc3RyaW5nJzogJ2dyZWVuJyxcbiAgJ2RhdGUnOiAnbWFnZW50YScsXG4gIC8vIFwibmFtZVwiOiBpbnRlbnRpb25hbGx5IG5vdCBzdHlsaW5nXG4gICdyZWdleHAnOiAncmVkJ1xufTtcblxuXG5mdW5jdGlvbiBzdHlsaXplV2l0aENvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG4gIHZhciBzdHlsZSA9IGluc3BlY3Quc3R5bGVzW3N0eWxlVHlwZV07XG5cbiAgaWYgKHN0eWxlKSB7XG4gICAgcmV0dXJuICdcXHUwMDFiWycgKyBpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMF0gKyAnbScgKyBzdHIgK1xuICAgICAgICAgICAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzFdICsgJ20nO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBzdHlsaXplTm9Db2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICByZXR1cm4gc3RyO1xufVxuXG5cbmZ1bmN0aW9uIGFycmF5VG9IYXNoKGFycmF5KSB7XG4gIHZhciBoYXNoID0ge307XG5cbiAgYXJyYXkuZm9yRWFjaChmdW5jdGlvbih2YWwsIGlkeCkge1xuICAgIGhhc2hbdmFsXSA9IHRydWU7XG4gIH0pO1xuXG4gIHJldHVybiBoYXNoO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFZhbHVlKGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcykge1xuICAvLyBQcm92aWRlIGEgaG9vayBmb3IgdXNlci1zcGVjaWZpZWQgaW5zcGVjdCBmdW5jdGlvbnMuXG4gIC8vIENoZWNrIHRoYXQgdmFsdWUgaXMgYW4gb2JqZWN0IHdpdGggYW4gaW5zcGVjdCBmdW5jdGlvbiBvbiBpdFxuICBpZiAoY3R4LmN1c3RvbUluc3BlY3QgJiZcbiAgICAgIHZhbHVlICYmXG4gICAgICBpc0Z1bmN0aW9uKHZhbHVlLmluc3BlY3QpICYmXG4gICAgICAvLyBGaWx0ZXIgb3V0IHRoZSB1dGlsIG1vZHVsZSwgaXQncyBpbnNwZWN0IGZ1bmN0aW9uIGlzIHNwZWNpYWxcbiAgICAgIHZhbHVlLmluc3BlY3QgIT09IGV4cG9ydHMuaW5zcGVjdCAmJlxuICAgICAgLy8gQWxzbyBmaWx0ZXIgb3V0IGFueSBwcm90b3R5cGUgb2JqZWN0cyB1c2luZyB0aGUgY2lyY3VsYXIgY2hlY2suXG4gICAgICAhKHZhbHVlLmNvbnN0cnVjdG9yICYmIHZhbHVlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSA9PT0gdmFsdWUpKSB7XG4gICAgdmFyIHJldCA9IHZhbHVlLmluc3BlY3QocmVjdXJzZVRpbWVzLCBjdHgpO1xuICAgIGlmICghaXNTdHJpbmcocmV0KSkge1xuICAgICAgcmV0ID0gZm9ybWF0VmFsdWUoY3R4LCByZXQsIHJlY3Vyc2VUaW1lcyk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvLyBQcmltaXRpdmUgdHlwZXMgY2Fubm90IGhhdmUgcHJvcGVydGllc1xuICB2YXIgcHJpbWl0aXZlID0gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpO1xuICBpZiAocHJpbWl0aXZlKSB7XG4gICAgcmV0dXJuIHByaW1pdGl2ZTtcbiAgfVxuXG4gIC8vIExvb2sgdXAgdGhlIGtleXMgb2YgdGhlIG9iamVjdC5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG4gIHZhciB2aXNpYmxlS2V5cyA9IGFycmF5VG9IYXNoKGtleXMpO1xuXG4gIGlmIChjdHguc2hvd0hpZGRlbikge1xuICAgIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh2YWx1ZSk7XG4gIH1cblxuICAvLyBJRSBkb2Vzbid0IG1ha2UgZXJyb3IgZmllbGRzIG5vbi1lbnVtZXJhYmxlXG4gIC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9kd3c1MnNidCh2PXZzLjk0KS5hc3B4XG4gIGlmIChpc0Vycm9yKHZhbHVlKVxuICAgICAgJiYgKGtleXMuaW5kZXhPZignbWVzc2FnZScpID49IDAgfHwga2V5cy5pbmRleE9mKCdkZXNjcmlwdGlvbicpID49IDApKSB7XG4gICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIC8vIFNvbWUgdHlwZSBvZiBvYmplY3Qgd2l0aG91dCBwcm9wZXJ0aWVzIGNhbiBiZSBzaG9ydGN1dHRlZC5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICB2YXIgbmFtZSA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbRnVuY3Rpb24nICsgbmFtZSArICddJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcbiAgICB9XG4gICAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ2RhdGUnKTtcbiAgICB9XG4gICAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgICByZXR1cm4gZm9ybWF0RXJyb3IodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBiYXNlID0gJycsIGFycmF5ID0gZmFsc2UsIGJyYWNlcyA9IFsneycsICd9J107XG5cbiAgLy8gTWFrZSBBcnJheSBzYXkgdGhhdCB0aGV5IGFyZSBBcnJheVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBhcnJheSA9IHRydWU7XG4gICAgYnJhY2VzID0gWydbJywgJ10nXTtcbiAgfVxuXG4gIC8vIE1ha2UgZnVuY3Rpb25zIHNheSB0aGF0IHRoZXkgYXJlIGZ1bmN0aW9uc1xuICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICB2YXIgbiA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgIGJhc2UgPSAnIFtGdW5jdGlvbicgKyBuICsgJ10nO1xuICB9XG5cbiAgLy8gTWFrZSBSZWdFeHBzIHNheSB0aGF0IHRoZXkgYXJlIFJlZ0V4cHNcbiAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBkYXRlcyB3aXRoIHByb3BlcnRpZXMgZmlyc3Qgc2F5IHRoZSBkYXRlXG4gIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIERhdGUucHJvdG90eXBlLnRvVVRDU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBlcnJvciB3aXRoIG1lc3NhZ2UgZmlyc3Qgc2F5IHRoZSBlcnJvclxuICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgZm9ybWF0RXJyb3IodmFsdWUpO1xuICB9XG5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwICYmICghYXJyYXkgfHwgdmFsdWUubGVuZ3RoID09IDApKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyBicmFjZXNbMV07XG4gIH1cblxuICBpZiAocmVjdXJzZVRpbWVzIDwgMCkge1xuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW09iamVjdF0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuXG4gIGN0eC5zZWVuLnB1c2godmFsdWUpO1xuXG4gIHZhciBvdXRwdXQ7XG4gIGlmIChhcnJheSkge1xuICAgIG91dHB1dCA9IGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpO1xuICB9IGVsc2Uge1xuICAgIG91dHB1dCA9IGtleXMubWFwKGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpO1xuICAgIH0pO1xuICB9XG5cbiAgY3R4LnNlZW4ucG9wKCk7XG5cbiAgcmV0dXJuIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSkge1xuICBpZiAoaXNVbmRlZmluZWQodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgndW5kZWZpbmVkJywgJ3VuZGVmaW5lZCcpO1xuICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgdmFyIHNpbXBsZSA9ICdcXCcnICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpLnJlcGxhY2UoL15cInxcIiQvZywgJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpICsgJ1xcJyc7XG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKHNpbXBsZSwgJ3N0cmluZycpO1xuICB9XG4gIGlmIChpc051bWJlcih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdudW1iZXInKTtcbiAgaWYgKGlzQm9vbGVhbih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdib29sZWFuJyk7XG4gIC8vIEZvciBzb21lIHJlYXNvbiB0eXBlb2YgbnVsbCBpcyBcIm9iamVjdFwiLCBzbyBzcGVjaWFsIGNhc2UgaGVyZS5cbiAgaWYgKGlzTnVsbCh2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCdudWxsJywgJ251bGwnKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRFcnJvcih2YWx1ZSkge1xuICByZXR1cm4gJ1snICsgRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpICsgJ10nO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eSh2YWx1ZSwgU3RyaW5nKGkpKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBTdHJpbmcoaSksIHRydWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0cHV0LnB1c2goJycpO1xuICAgIH1cbiAgfVxuICBrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgaWYgKCFrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLFxuICAgICAgICAgIGtleSwgdHJ1ZSkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCBhcnJheSkge1xuICB2YXIgbmFtZSwgc3RyLCBkZXNjO1xuICBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZSwga2V5KSB8fCB7IHZhbHVlOiB2YWx1ZVtrZXldIH07XG4gIGlmIChkZXNjLmdldCkge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXIvU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tTZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFoYXNPd25Qcm9wZXJ0eSh2aXNpYmxlS2V5cywga2V5KSkge1xuICAgIG5hbWUgPSAnWycgKyBrZXkgKyAnXSc7XG4gIH1cbiAgaWYgKCFzdHIpIHtcbiAgICBpZiAoY3R4LnNlZW4uaW5kZXhPZihkZXNjLnZhbHVlKSA8IDApIHtcbiAgICAgIGlmIChpc051bGwocmVjdXJzZVRpbWVzKSkge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIGRlc2MudmFsdWUsIG51bGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCByZWN1cnNlVGltZXMgLSAxKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZignXFxuJykgPiAtMSkge1xuICAgICAgICBpZiAoYXJyYXkpIHtcbiAgICAgICAgICBzdHIgPSBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJykuc3Vic3RyKDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ciA9ICdcXG4nICsgc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICAnICsgbGluZTtcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0NpcmN1bGFyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmIChpc1VuZGVmaW5lZChuYW1lKSkge1xuICAgIGlmIChhcnJheSAmJiBrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBuYW1lID0gSlNPTi5zdHJpbmdpZnkoJycgKyBrZXkpO1xuICAgIGlmIChuYW1lLm1hdGNoKC9eXCIoW2EtekEtWl9dW2EtekEtWl8wLTldKilcIiQvKSkge1xuICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyKDEsIG5hbWUubGVuZ3RoIC0gMik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ25hbWUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJylcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLyheXCJ8XCIkKS9nLCBcIidcIik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ3N0cmluZycpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuYW1lICsgJzogJyArIHN0cjtcbn1cblxuXG5mdW5jdGlvbiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcykge1xuICB2YXIgbnVtTGluZXNFc3QgPSAwO1xuICB2YXIgbGVuZ3RoID0gb3V0cHV0LnJlZHVjZShmdW5jdGlvbihwcmV2LCBjdXIpIHtcbiAgICBudW1MaW5lc0VzdCsrO1xuICAgIGlmIChjdXIuaW5kZXhPZignXFxuJykgPj0gMCkgbnVtTGluZXNFc3QrKztcbiAgICByZXR1cm4gcHJldiArIGN1ci5yZXBsYWNlKC9cXHUwMDFiXFxbXFxkXFxkP20vZywgJycpLmxlbmd0aCArIDE7XG4gIH0sIDApO1xuXG4gIGlmIChsZW5ndGggPiA2MCkge1xuICAgIHJldHVybiBicmFjZXNbMF0gK1xuICAgICAgICAgICAoYmFzZSA9PT0gJycgPyAnJyA6IGJhc2UgKyAnXFxuICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgb3V0cHV0LmpvaW4oJyxcXG4gICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgYnJhY2VzWzFdO1xuICB9XG5cbiAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyAnICcgKyBvdXRwdXQuam9pbignLCAnKSArICcgJyArIGJyYWNlc1sxXTtcbn1cblxuXG4vLyBOT1RFOiBUaGVzZSB0eXBlIGNoZWNraW5nIGZ1bmN0aW9ucyBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBgaW5zdGFuY2VvZmBcbi8vIGJlY2F1c2UgaXQgaXMgZnJhZ2lsZSBhbmQgY2FuIGJlIGVhc2lseSBmYWtlZCB3aXRoIGBPYmplY3QuY3JlYXRlKClgLlxuZnVuY3Rpb24gaXNBcnJheShhcikge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShhcik7XG59XG5leHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5O1xuXG5mdW5jdGlvbiBpc0Jvb2xlYW4oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnYm9vbGVhbic7XG59XG5leHBvcnRzLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcblxuZnVuY3Rpb24gaXNOdWxsKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGwgPSBpc051bGw7XG5cbmZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbE9yVW5kZWZpbmVkID0gaXNOdWxsT3JVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5leHBvcnRzLmlzTnVtYmVyID0gaXNOdW1iZXI7XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZyc7XG59XG5leHBvcnRzLmlzU3RyaW5nID0gaXNTdHJpbmc7XG5cbmZ1bmN0aW9uIGlzU3ltYm9sKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCc7XG59XG5leHBvcnRzLmlzU3ltYm9sID0gaXNTeW1ib2w7XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09PSB2b2lkIDA7XG59XG5leHBvcnRzLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzUmVnRXhwKHJlKSB7XG4gIHJldHVybiBpc09iamVjdChyZSkgJiYgb2JqZWN0VG9TdHJpbmcocmUpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cbmV4cG9ydHMuaXNSZWdFeHAgPSBpc1JlZ0V4cDtcblxuZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5leHBvcnRzLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG5cbmZ1bmN0aW9uIGlzRGF0ZShkKSB7XG4gIHJldHVybiBpc09iamVjdChkKSAmJiBvYmplY3RUb1N0cmluZyhkKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuZXhwb3J0cy5pc0RhdGUgPSBpc0RhdGU7XG5cbmZ1bmN0aW9uIGlzRXJyb3IoZSkge1xuICByZXR1cm4gaXNPYmplY3QoZSkgJiZcbiAgICAgIChvYmplY3RUb1N0cmluZyhlKSA9PT0gJ1tvYmplY3QgRXJyb3JdJyB8fCBlIGluc3RhbmNlb2YgRXJyb3IpO1xufVxuZXhwb3J0cy5pc0Vycm9yID0gaXNFcnJvcjtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5leHBvcnRzLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZShhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbCB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnIHx8ICAvLyBFUzYgc3ltYm9sXG4gICAgICAgICB0eXBlb2YgYXJnID09PSAndW5kZWZpbmVkJztcbn1cbmV4cG9ydHMuaXNQcmltaXRpdmUgPSBpc1ByaW1pdGl2ZTtcblxuZXhwb3J0cy5pc0J1ZmZlciA9IHJlcXVpcmUoJy4vc3VwcG9ydC9pc0J1ZmZlcicpO1xuXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyhvKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7XG59XG5cblxuZnVuY3Rpb24gcGFkKG4pIHtcbiAgcmV0dXJuIG4gPCAxMCA/ICcwJyArIG4udG9TdHJpbmcoMTApIDogbi50b1N0cmluZygxMCk7XG59XG5cblxudmFyIG1vbnRocyA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLFxuICAgICAgICAgICAgICAnT2N0JywgJ05vdicsICdEZWMnXTtcblxuLy8gMjYgRmViIDE2OjE5OjM0XG5mdW5jdGlvbiB0aW1lc3RhbXAoKSB7XG4gIHZhciBkID0gbmV3IERhdGUoKTtcbiAgdmFyIHRpbWUgPSBbcGFkKGQuZ2V0SG91cnMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldE1pbnV0ZXMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldFNlY29uZHMoKSldLmpvaW4oJzonKTtcbiAgcmV0dXJuIFtkLmdldERhdGUoKSwgbW9udGhzW2QuZ2V0TW9udGgoKV0sIHRpbWVdLmpvaW4oJyAnKTtcbn1cblxuXG4vLyBsb2cgaXMganVzdCBhIHRoaW4gd3JhcHBlciB0byBjb25zb2xlLmxvZyB0aGF0IHByZXBlbmRzIGEgdGltZXN0YW1wXG5leHBvcnRzLmxvZyA9IGZ1bmN0aW9uKCkge1xuICBjb25zb2xlLmxvZygnJXMgLSAlcycsIHRpbWVzdGFtcCgpLCBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpKTtcbn07XG5cblxuLyoqXG4gKiBJbmhlcml0IHRoZSBwcm90b3R5cGUgbWV0aG9kcyBmcm9tIG9uZSBjb25zdHJ1Y3RvciBpbnRvIGFub3RoZXIuXG4gKlxuICogVGhlIEZ1bmN0aW9uLnByb3RvdHlwZS5pbmhlcml0cyBmcm9tIGxhbmcuanMgcmV3cml0dGVuIGFzIGEgc3RhbmRhbG9uZVxuICogZnVuY3Rpb24gKG5vdCBvbiBGdW5jdGlvbi5wcm90b3R5cGUpLiBOT1RFOiBJZiB0aGlzIGZpbGUgaXMgdG8gYmUgbG9hZGVkXG4gKiBkdXJpbmcgYm9vdHN0cmFwcGluZyB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIHJld3JpdHRlbiB1c2luZyBzb21lIG5hdGl2ZVxuICogZnVuY3Rpb25zIGFzIHByb3RvdHlwZSBzZXR1cCB1c2luZyBub3JtYWwgSmF2YVNjcmlwdCBkb2VzIG5vdCB3b3JrIGFzXG4gKiBleHBlY3RlZCBkdXJpbmcgYm9vdHN0cmFwcGluZyAoc2VlIG1pcnJvci5qcyBpbiByMTE0OTAzKS5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHdoaWNoIG5lZWRzIHRvIGluaGVyaXQgdGhlXG4gKiAgICAgcHJvdG90eXBlLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gc3VwZXJDdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHRvIGluaGVyaXQgcHJvdG90eXBlIGZyb20uXG4gKi9cbmV4cG9ydHMuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5leHBvcnRzLl9leHRlbmQgPSBmdW5jdGlvbihvcmlnaW4sIGFkZCkge1xuICAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiBhZGQgaXNuJ3QgYW4gb2JqZWN0XG4gIGlmICghYWRkIHx8ICFpc09iamVjdChhZGQpKSByZXR1cm4gb3JpZ2luO1xuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoYWRkKTtcbiAgdmFyIGkgPSBrZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGktLSkge1xuICAgIG9yaWdpbltrZXlzW2ldXSA9IGFkZFtrZXlzW2ldXTtcbiAgfVxuICByZXR1cm4gb3JpZ2luO1xufTtcblxuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn1cbiIsInZhciBnO1xuXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxuZyA9IChmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXM7XG59KSgpO1xuXG50cnkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcblx0ZyA9IGcgfHwgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpIHx8ICgxLCBldmFsKShcInRoaXNcIik7XG59IGNhdGNoIChlKSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXG5cdGlmICh0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKSBnID0gd2luZG93O1xufVxuXG4vLyBnIGNhbiBzdGlsbCBiZSB1bmRlZmluZWQsIGJ1dCBub3RoaW5nIHRvIGRvIGFib3V0IGl0Li4uXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xuLy8gZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuIGlmKCFnbG9iYWwpIHsgLi4ufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGc7XG4iLCIvKiAoaWdub3JlZCkgKi8iLCIvKiAoaWdub3JlZCkgKi8iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/components.webassembly.js b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/components.webassembly.js
new file mode 100644
index 0000000..6456bbb
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/components.webassembly.js
@@ -0,0 +1,2332 @@
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./Boot.WebAssembly.ts");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./Boot.WebAssembly.ts":
+/*!*****************************!*\
+ !*** ./Boot.WebAssembly.ts ***!
+ \*****************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+var __generator = (this && this.__generator) || function (thisArg, body) {
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
+ function verb(n) { return function (v) { return step([n, v]); }; }
+ function step(op) {
+ if (f) throw new TypeError("Generator is already executing.");
+ while (_) try {
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
+ if (y = 0, t) op = [op[0] & 2, t.value];
+ switch (op[0]) {
+ case 0: case 1: t = op; break;
+ case 4: _.label++; return { value: op[1], done: false };
+ case 5: _.label++; y = op[1]; op = [0]; continue;
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
+ default:
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
+ if (t[2]) _.ops.pop();
+ _.trys.pop(); continue;
+ }
+ op = body.call(thisArg, _);
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
+ }
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+__webpack_require__(/*! @dotnet/jsinterop */ "./node_modules/@dotnet/jsinterop/dist/Microsoft.JSInterop.js");
+__webpack_require__(/*! ./GlobalExports */ "./GlobalExports.ts");
+var Environment = __webpack_require__(/*! ./Environment */ "./Environment.ts");
+var MonoPlatform_1 = __webpack_require__(/*! ./Platform/Mono/MonoPlatform */ "./Platform/Mono/MonoPlatform.ts");
+var Url_1 = __webpack_require__(/*! ./Platform/Url */ "./Platform/Url.ts");
+var Renderer_1 = __webpack_require__(/*! ./Rendering/Renderer */ "./Rendering/Renderer.ts");
+var SharedMemoryRenderBatch_1 = __webpack_require__(/*! ./Rendering/RenderBatch/SharedMemoryRenderBatch */ "./Rendering/RenderBatch/SharedMemoryRenderBatch.ts");
+var BootCommon_1 = __webpack_require__(/*! ./BootCommon */ "./BootCommon.ts");
+function boot() {
+ return __awaiter(this, void 0, void 0, function () {
+ var platform, bootConfig, embeddedResourcesPromise, loadAssemblyUrls, ex_1, mainAssemblyName;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ platform = Environment.setPlatform(MonoPlatform_1.monoPlatform);
+ window['Blazor'].platform = platform;
+ window['Blazor']._internal.renderBatch = function (browserRendererId, batchAddress) {
+ Renderer_1.renderBatch(browserRendererId, new SharedMemoryRenderBatch_1.SharedMemoryRenderBatch(batchAddress));
+ };
+ return [4 /*yield*/, BootCommon_1.fetchBootConfigAsync()];
+ case 1:
+ bootConfig = _a.sent();
+ embeddedResourcesPromise = BootCommon_1.loadEmbeddedResourcesAsync(bootConfig);
+ if (!bootConfig.linkerEnabled) {
+ console.info('Blazor is running in dev mode without IL stripping. To make the bundle size significantly smaller, publish the application or see https://go.microsoft.com/fwlink/?linkid=870414');
+ }
+ loadAssemblyUrls = [bootConfig.main]
+ .concat(bootConfig.assemblyReferences)
+ .map(function (filename) { return "_framework/_bin/" + filename; });
+ _a.label = 2;
+ case 2:
+ _a.trys.push([2, 4, , 5]);
+ return [4 /*yield*/, platform.start(loadAssemblyUrls)];
+ case 3:
+ _a.sent();
+ return [3 /*break*/, 5];
+ case 4:
+ ex_1 = _a.sent();
+ throw new Error("Failed to start platform. Reason: " + ex_1);
+ case 5:
+ // Before we start running .NET code, be sure embedded content resources are all loaded
+ return [4 /*yield*/, embeddedResourcesPromise];
+ case 6:
+ // Before we start running .NET code, be sure embedded content resources are all loaded
+ _a.sent();
+ mainAssemblyName = Url_1.getAssemblyNameFromUrl(bootConfig.main);
+ platform.callEntryPoint(mainAssemblyName, bootConfig.entryPoint, []);
+ return [2 /*return*/];
+ }
+ });
+ });
+}
+boot();
+
+
+/***/ }),
+
+/***/ "./BootCommon.ts":
+/*!***********************!*\
+ !*** ./BootCommon.ts ***!
+ \***********************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+var __generator = (this && this.__generator) || function (thisArg, body) {
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
+ function verb(n) { return function (v) { return step([n, v]); }; }
+ function step(op) {
+ if (f) throw new TypeError("Generator is already executing.");
+ while (_) try {
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
+ if (y = 0, t) op = [op[0] & 2, t.value];
+ switch (op[0]) {
+ case 0: case 1: t = op; break;
+ case 4: _.label++; return { value: op[1], done: false };
+ case 5: _.label++; y = op[1]; op = [0]; continue;
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
+ default:
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
+ if (t[2]) _.ops.pop();
+ _.trys.pop(); continue;
+ }
+ op = body.call(thisArg, _);
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
+ }
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+function fetchBootConfigAsync() {
+ return __awaiter(this, void 0, void 0, function () {
+ var bootConfigResponse;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [4 /*yield*/, fetch('_framework/blazor.boot.json', { method: 'Get', credentials: 'include' })];
+ case 1:
+ bootConfigResponse = _a.sent();
+ return [2 /*return*/, bootConfigResponse.json()];
+ }
+ });
+ });
+}
+exports.fetchBootConfigAsync = fetchBootConfigAsync;
+function loadEmbeddedResourcesAsync(bootConfig) {
+ var cssLoadingPromises = bootConfig.cssReferences.map(function (cssReference) {
+ var linkElement = document.createElement('link');
+ linkElement.rel = 'stylesheet';
+ linkElement.href = cssReference;
+ return loadResourceFromElement(linkElement);
+ });
+ var jsLoadingPromises = bootConfig.jsReferences.map(function (jsReference) {
+ var scriptElement = document.createElement('script');
+ scriptElement.src = jsReference;
+ return loadResourceFromElement(scriptElement);
+ });
+ return Promise.all(cssLoadingPromises.concat(jsLoadingPromises));
+}
+exports.loadEmbeddedResourcesAsync = loadEmbeddedResourcesAsync;
+function loadResourceFromElement(element) {
+ return new Promise(function (resolve, reject) {
+ element.onload = resolve;
+ element.onerror = reject;
+ document.head.appendChild(element);
+ });
+}
+
+
+/***/ }),
+
+/***/ "./Environment.ts":
+/*!************************!*\
+ !*** ./Environment.ts ***!
+ \************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+function setPlatform(platformInstance) {
+ exports.platform = platformInstance;
+ return exports.platform;
+}
+exports.setPlatform = setPlatform;
+
+
+/***/ }),
+
+/***/ "./GlobalExports.ts":
+/*!**************************!*\
+ !*** ./GlobalExports.ts ***!
+ \**************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var UriHelper_1 = __webpack_require__(/*! ./Services/UriHelper */ "./Services/UriHelper.ts");
+var Http_1 = __webpack_require__(/*! ./Services/Http */ "./Services/Http.ts");
+var Renderer_1 = __webpack_require__(/*! ./Rendering/Renderer */ "./Rendering/Renderer.ts");
+// Make the following APIs available in global scope for invocation from JS
+window['Blazor'] = {
+ navigateTo: UriHelper_1.navigateTo,
+ _internal: {
+ attachRootComponentToElement: Renderer_1.attachRootComponentToElement,
+ http: Http_1.internalFunctions,
+ uriHelper: UriHelper_1.internalFunctions
+ }
+};
+
+
+/***/ }),
+
+/***/ "./Platform/Mono/MonoDebugger.ts":
+/*!***************************************!*\
+ !*** ./Platform/Mono/MonoDebugger.ts ***!
+ \***************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var Url_1 = __webpack_require__(/*! ../Url */ "./Platform/Url.ts");
+var currentBrowserIsChrome = window.chrome
+ && navigator.userAgent.indexOf('Edge') < 0; // Edge pretends to be Chrome
+var hasReferencedPdbs = false;
+function hasDebuggingEnabled() {
+ return hasReferencedPdbs && currentBrowserIsChrome;
+}
+exports.hasDebuggingEnabled = hasDebuggingEnabled;
+function attachDebuggerHotkey(loadAssemblyUrls) {
+ hasReferencedPdbs = loadAssemblyUrls
+ .some(function (url) { return /\.pdb$/.test(Url_1.getFileNameFromUrl(url)); });
+ // Use the combination shift+alt+D because it isn't used by the major browsers
+ // for anything else by default
+ var altKeyName = navigator.platform.match(/^Mac/i) ? 'Cmd' : 'Alt';
+ if (hasDebuggingEnabled()) {
+ console.info("Debugging hotkey: Shift+" + altKeyName + "+D (when application has focus)");
+ }
+ // Even if debugging isn't enabled, we register the hotkey so we can report why it's not enabled
+ document.addEventListener('keydown', function (evt) {
+ if (evt.shiftKey && (evt.metaKey || evt.altKey) && evt.code === 'KeyD') {
+ if (!hasReferencedPdbs) {
+ console.error('Cannot start debugging, because the application was not compiled with debugging enabled.');
+ }
+ else if (!currentBrowserIsChrome) {
+ console.error('Currently, only Chrome is supported for debugging.');
+ }
+ else {
+ launchDebugger();
+ }
+ }
+ });
+}
+exports.attachDebuggerHotkey = attachDebuggerHotkey;
+function launchDebugger() {
+ // The noopener flag is essential, because otherwise Chrome tracks the association with the
+ // parent tab, and then when the parent tab pauses in the debugger, the child tab does so
+ // too (even if it's since navigated to a different page). This means that the debugger
+ // itself freezes, and not just the page being debugged.
+ //
+ // We have to construct a link element and simulate a click on it, because the more obvious
+ // window.open(..., 'noopener') always opens a new window instead of a new tab.
+ var link = document.createElement('a');
+ link.href = "_framework/debug?url=" + encodeURIComponent(location.href);
+ link.target = '_blank';
+ link.rel = 'noopener noreferrer';
+ link.click();
+}
+
+
+/***/ }),
+
+/***/ "./Platform/Mono/MonoPlatform.ts":
+/*!***************************************!*\
+ !*** ./Platform/Mono/MonoPlatform.ts ***!
+ \***************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var Url_1 = __webpack_require__(/*! ../Url */ "./Platform/Url.ts");
+var MonoDebugger_1 = __webpack_require__(/*! ./MonoDebugger */ "./Platform/Mono/MonoDebugger.ts");
+var assemblyHandleCache = {};
+var typeHandleCache = {};
+var methodHandleCache = {};
+var assembly_load;
+var find_class;
+var find_method;
+var invoke_method;
+var mono_string_get_utf8;
+var mono_string;
+var appBinDirName = 'appBinDir';
+exports.monoPlatform = {
+ start: function start(loadAssemblyUrls) {
+ return new Promise(function (resolve, reject) {
+ MonoDebugger_1.attachDebuggerHotkey(loadAssemblyUrls);
+ // mono.js assumes the existence of this
+ window['Browser'] = {
+ init: function () { }
+ };
+ // Emscripten works by expecting the module config to be a global
+ window['Module'] = createEmscriptenModuleInstance(loadAssemblyUrls, resolve, reject);
+ addScriptTagsToDocument();
+ });
+ },
+ findMethod: findMethod,
+ callEntryPoint: function callEntryPoint(assemblyName, entrypointMethod, args) {
+ // Parse the entrypointMethod, which is of the form MyApp.MyNamespace.MyTypeName::MyMethodName
+ // Note that we don't support specifying a method overload, so it has to be unique
+ var entrypointSegments = entrypointMethod.split('::');
+ if (entrypointSegments.length != 2) {
+ throw new Error('Malformed entry point method name; could not resolve class name and method name.');
+ }
+ var typeFullName = entrypointSegments[0];
+ var methodName = entrypointSegments[1];
+ var lastDot = typeFullName.lastIndexOf('.');
+ var namespace = lastDot > -1 ? typeFullName.substring(0, lastDot) : '';
+ var typeShortName = lastDot > -1 ? typeFullName.substring(lastDot + 1) : typeFullName;
+ var entryPointMethodHandle = exports.monoPlatform.findMethod(assemblyName, namespace, typeShortName, methodName);
+ exports.monoPlatform.callMethod(entryPointMethodHandle, null, args);
+ },
+ callMethod: function callMethod(method, target, args) {
+ if (args.length > 4) {
+ // Hopefully this restriction can be eased soon, but for now make it clear what's going on
+ throw new Error("Currently, MonoPlatform supports passing a maximum of 4 arguments from JS to .NET. You tried to pass " + args.length + ".");
+ }
+ var stack = Module.stackSave();
+ try {
+ var argsBuffer = Module.stackAlloc(args.length);
+ var exceptionFlagManagedInt = Module.stackAlloc(4);
+ for (var i = 0; i < args.length; ++i) {
+ Module.setValue(argsBuffer + i * 4, args[i], 'i32');
+ }
+ Module.setValue(exceptionFlagManagedInt, 0, 'i32');
+ var res = invoke_method(method, target, argsBuffer, exceptionFlagManagedInt);
+ if (Module.getValue(exceptionFlagManagedInt, 'i32') !== 0) {
+ // If the exception flag is set, the returned value is exception.ToString()
+ throw new Error(exports.monoPlatform.toJavaScriptString(res));
+ }
+ return res;
+ }
+ finally {
+ Module.stackRestore(stack);
+ }
+ },
+ toJavaScriptString: function toJavaScriptString(managedString) {
+ // Comments from original Mono sample:
+ //FIXME this is wastefull, we could remove the temp malloc by going the UTF16 route
+ //FIXME this is unsafe, cuz raw objects could be GC'd.
+ var utf8 = mono_string_get_utf8(managedString);
+ var res = Module.UTF8ToString(utf8);
+ Module._free(utf8);
+ return res;
+ },
+ toDotNetString: function toDotNetString(jsString) {
+ return mono_string(jsString);
+ },
+ toUint8Array: function toUint8Array(array) {
+ var dataPtr = getArrayDataPointer(array);
+ var length = Module.getValue(dataPtr, 'i32');
+ return new Uint8Array(Module.HEAPU8.buffer, dataPtr + 4, length);
+ },
+ getArrayLength: function getArrayLength(array) {
+ return Module.getValue(getArrayDataPointer(array), 'i32');
+ },
+ getArrayEntryPtr: function getArrayEntryPtr(array, index, itemSize) {
+ // First byte is array length, followed by entries
+ var address = getArrayDataPointer(array) + 4 + index * itemSize;
+ return address;
+ },
+ getObjectFieldsBaseAddress: function getObjectFieldsBaseAddress(referenceTypedObject) {
+ // The first two int32 values are internal Mono data
+ return (referenceTypedObject + 8);
+ },
+ readInt32Field: function readHeapInt32(baseAddress, fieldOffset) {
+ return Module.getValue(baseAddress + (fieldOffset || 0), 'i32');
+ },
+ readFloatField: function readHeapFloat(baseAddress, fieldOffset) {
+ return Module.getValue(baseAddress + (fieldOffset || 0), 'float');
+ },
+ readObjectField: function readHeapObject(baseAddress, fieldOffset) {
+ return Module.getValue(baseAddress + (fieldOffset || 0), 'i32');
+ },
+ readStringField: function readHeapObject(baseAddress, fieldOffset) {
+ var fieldValue = Module.getValue(baseAddress + (fieldOffset || 0), 'i32');
+ return fieldValue === 0 ? null : exports.monoPlatform.toJavaScriptString(fieldValue);
+ },
+ readStructField: function readStructField(baseAddress, fieldOffset) {
+ return (baseAddress + (fieldOffset || 0));
+ },
+};
+function findAssembly(assemblyName) {
+ var assemblyHandle = assemblyHandleCache[assemblyName];
+ if (!assemblyHandle) {
+ assemblyHandle = assembly_load(assemblyName);
+ if (!assemblyHandle) {
+ throw new Error("Could not find assembly \"" + assemblyName + "\"");
+ }
+ assemblyHandleCache[assemblyName] = assemblyHandle;
+ }
+ return assemblyHandle;
+}
+function findType(assemblyName, namespace, className) {
+ var fullyQualifiedTypeName = "[" + assemblyName + "]" + namespace + "." + className;
+ var typeHandle = typeHandleCache[fullyQualifiedTypeName];
+ if (!typeHandle) {
+ typeHandle = find_class(findAssembly(assemblyName), namespace, className);
+ if (!typeHandle) {
+ throw new Error("Could not find type \"" + className + "\" in namespace \"" + namespace + "\" in assembly \"" + assemblyName + "\"");
+ }
+ typeHandleCache[fullyQualifiedTypeName] = typeHandle;
+ }
+ return typeHandle;
+}
+function findMethod(assemblyName, namespace, className, methodName) {
+ var fullyQualifiedMethodName = "[" + assemblyName + "]" + namespace + "." + className + "::" + methodName;
+ var methodHandle = methodHandleCache[fullyQualifiedMethodName];
+ if (!methodHandle) {
+ methodHandle = find_method(findType(assemblyName, namespace, className), methodName, -1);
+ if (!methodHandle) {
+ throw new Error("Could not find method \"" + methodName + "\" on type \"" + namespace + "." + className + "\"");
+ }
+ methodHandleCache[fullyQualifiedMethodName] = methodHandle;
+ }
+ return methodHandle;
+}
+function addScriptTagsToDocument() {
+ var browserSupportsNativeWebAssembly = typeof WebAssembly !== 'undefined' && WebAssembly.validate;
+ if (!browserSupportsNativeWebAssembly) {
+ throw new Error('This browser does not support WebAssembly.');
+ }
+ var scriptElem = document.createElement('script');
+ scriptElem.src = '_framework/wasm/mono.js';
+ scriptElem.defer = true;
+ document.body.appendChild(scriptElem);
+}
+function createEmscriptenModuleInstance(loadAssemblyUrls, onReady, onError) {
+ var module = {};
+ var wasmBinaryFile = '_framework/wasm/mono.wasm';
+ var suppressMessages = ['DEBUGGING ENABLED'];
+ module.print = function (line) { return (suppressMessages.indexOf(line) < 0 && console.log("WASM: " + line)); };
+ module.printErr = function (line) { return console.error("WASM: " + line); };
+ module.preRun = [];
+ module.postRun = [];
+ module.preloadPlugins = [];
+ module.locateFile = function (fileName) {
+ switch (fileName) {
+ case 'mono.wasm': return wasmBinaryFile;
+ default: return fileName;
+ }
+ };
+ module.preRun.push(function () {
+ // By now, emscripten should be initialised enough that we can capture these methods for later use
+ var mono_wasm_add_assembly = Module.cwrap('mono_wasm_add_assembly', null, ['string', 'number', 'number']);
+ assembly_load = Module.cwrap('mono_wasm_assembly_load', 'number', ['string']);
+ find_class = Module.cwrap('mono_wasm_assembly_find_class', 'number', ['number', 'string', 'string']);
+ find_method = Module.cwrap('mono_wasm_assembly_find_method', 'number', ['number', 'string', 'number']);
+ invoke_method = Module.cwrap('mono_wasm_invoke_method', 'number', ['number', 'number', 'number']);
+ mono_string_get_utf8 = Module.cwrap('mono_wasm_string_get_utf8', 'number', ['number']);
+ mono_string = Module.cwrap('mono_wasm_string_from_js', 'number', ['string']);
+ MONO.loaded_files = [];
+ loadAssemblyUrls.forEach(function (url) {
+ var filename = Url_1.getFileNameFromUrl(url);
+ var runDependencyId = "blazor:" + filename;
+ addRunDependency(runDependencyId);
+ asyncLoad(url).then(function (data) {
+ var heapAddress = Module._malloc(data.length);
+ var heapMemory = new Uint8Array(Module.HEAPU8.buffer, heapAddress, data.length);
+ heapMemory.set(data);
+ mono_wasm_add_assembly(filename, heapAddress, data.length);
+ MONO.loaded_files.push(toAbsoluteUrl(url));
+ removeRunDependency(runDependencyId);
+ }, function (errorInfo) {
+ // If it's a 404 on a .pdb, we don't want to block the app from starting up.
+ // We'll just skip that file and continue (though the 404 is logged in the console).
+ // This happens if you build a Debug build but then run in Production environment.
+ var isPdb404 = errorInfo instanceof XMLHttpRequest
+ && errorInfo.status === 404
+ && filename.match(/\.pdb$/);
+ if (!isPdb404) {
+ onError(errorInfo);
+ }
+ removeRunDependency(runDependencyId);
+ });
+ });
+ });
+ module.postRun.push(function () {
+ var load_runtime = Module.cwrap('mono_wasm_load_runtime', null, ['string', 'number']);
+ load_runtime(appBinDirName, MonoDebugger_1.hasDebuggingEnabled() ? 1 : 0);
+ MONO.mono_wasm_runtime_is_ready = true;
+ attachInteropInvoker();
+ onReady();
+ });
+ return module;
+}
+var anchorTagForAbsoluteUrlConversions = document.createElement('a');
+function toAbsoluteUrl(possiblyRelativeUrl) {
+ anchorTagForAbsoluteUrlConversions.href = possiblyRelativeUrl;
+ return anchorTagForAbsoluteUrlConversions.href;
+}
+function asyncLoad(url) {
+ return new Promise(function (resolve, reject) {
+ var xhr = new XMLHttpRequest;
+ xhr.open('GET', url, /* async: */ true);
+ xhr.responseType = 'arraybuffer';
+ xhr.onload = function xhr_onload() {
+ if (xhr.status == 200 || xhr.status == 0 && xhr.response) {
+ var asm = new Uint8Array(xhr.response);
+ resolve(asm);
+ }
+ else {
+ reject(xhr);
+ }
+ };
+ xhr.onerror = reject;
+ xhr.send(undefined);
+ });
+}
+function getArrayDataPointer(array) {
+ return array + 12; // First byte from here is length, then following bytes are entries
+}
+function attachInteropInvoker() {
+ var dotNetDispatcherInvokeMethodHandle = findMethod('Mono.WebAssembly.Interop', 'Mono.WebAssembly.Interop', 'MonoWebAssemblyJSRuntime', 'InvokeDotNet');
+ var dotNetDispatcherBeginInvokeMethodHandle = findMethod('Mono.WebAssembly.Interop', 'Mono.WebAssembly.Interop', 'MonoWebAssemblyJSRuntime', 'BeginInvokeDotNet');
+ DotNet.attachDispatcher({
+ beginInvokeDotNetFromJS: function (callId, assemblyName, methodIdentifier, dotNetObjectId, argsJson) {
+ // As a current limitation, we can only pass 4 args. Fortunately we only need one of
+ // 'assemblyName' or 'dotNetObjectId', so overload them in a single slot
+ var assemblyNameOrDotNetObjectId = dotNetObjectId
+ ? dotNetObjectId.toString()
+ : assemblyName;
+ exports.monoPlatform.callMethod(dotNetDispatcherBeginInvokeMethodHandle, null, [
+ callId ? exports.monoPlatform.toDotNetString(callId.toString()) : null,
+ exports.monoPlatform.toDotNetString(assemblyNameOrDotNetObjectId),
+ exports.monoPlatform.toDotNetString(methodIdentifier),
+ exports.monoPlatform.toDotNetString(argsJson)
+ ]);
+ },
+ invokeDotNetFromJS: function (assemblyName, methodIdentifier, dotNetObjectId, argsJson) {
+ var resultJsonStringPtr = exports.monoPlatform.callMethod(dotNetDispatcherInvokeMethodHandle, null, [
+ assemblyName ? exports.monoPlatform.toDotNetString(assemblyName) : null,
+ exports.monoPlatform.toDotNetString(methodIdentifier),
+ dotNetObjectId ? exports.monoPlatform.toDotNetString(dotNetObjectId.toString()) : null,
+ exports.monoPlatform.toDotNetString(argsJson)
+ ]);
+ return resultJsonStringPtr
+ ? exports.monoPlatform.toJavaScriptString(resultJsonStringPtr)
+ : null;
+ },
+ });
+}
+
+
+/***/ }),
+
+/***/ "./Platform/Url.ts":
+/*!*************************!*\
+ !*** ./Platform/Url.ts ***!
+ \*************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+function getFileNameFromUrl(url) {
+ // This could also be called "get last path segment from URL", but the primary
+ // use case is to extract things that look like filenames
+ var lastSegment = url.substring(url.lastIndexOf('/') + 1);
+ var queryStringStartPos = lastSegment.indexOf('?');
+ return queryStringStartPos < 0 ? lastSegment : lastSegment.substring(0, queryStringStartPos);
+}
+exports.getFileNameFromUrl = getFileNameFromUrl;
+function getAssemblyNameFromUrl(url) {
+ return getFileNameFromUrl(url).replace(/\.dll$/, '');
+}
+exports.getAssemblyNameFromUrl = getAssemblyNameFromUrl;
+
+
+/***/ }),
+
+/***/ "./Rendering/BrowserRenderer.ts":
+/*!**************************************!*\
+ !*** ./Rendering/BrowserRenderer.ts ***!
+ \**************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var RenderBatch_1 = __webpack_require__(/*! ./RenderBatch/RenderBatch */ "./Rendering/RenderBatch/RenderBatch.ts");
+var EventDelegator_1 = __webpack_require__(/*! ./EventDelegator */ "./Rendering/EventDelegator.ts");
+var LogicalElements_1 = __webpack_require__(/*! ./LogicalElements */ "./Rendering/LogicalElements.ts");
+var ElementReferenceCapture_1 = __webpack_require__(/*! ./ElementReferenceCapture */ "./Rendering/ElementReferenceCapture.ts");
+var selectValuePropname = '_blazorSelectValue';
+var sharedTemplateElemForParsing = document.createElement('template');
+var sharedSvgElemForParsing = document.createElementNS('http://www.w3.org/2000/svg', 'g');
+var preventDefaultEvents = { submit: true };
+var rootComponentsPendingFirstRender = {};
+var BrowserRenderer = /** @class */ (function () {
+ function BrowserRenderer(browserRendererId) {
+ var _this = this;
+ this.browserRendererId = browserRendererId;
+ this.childComponentLocations = {};
+ this.eventDelegator = new EventDelegator_1.EventDelegator(function (event, eventHandlerId, eventArgs) {
+ raiseEvent(event, _this.browserRendererId, eventHandlerId, eventArgs);
+ });
+ }
+ BrowserRenderer.prototype.attachRootComponentToElement = function (componentId, element) {
+ // 'allowExistingContents' to keep any prerendered content until we do the first client-side render
+ this.attachComponentToElement(componentId, LogicalElements_1.toLogicalElement(element, /* allowExistingContents */ true));
+ rootComponentsPendingFirstRender[componentId] = element;
+ };
+ BrowserRenderer.prototype.updateComponent = function (batch, componentId, edits, referenceFrames) {
+ var element = this.childComponentLocations[componentId];
+ if (!element) {
+ throw new Error("No element is currently associated with component " + componentId);
+ }
+ // On the first render for each root component, clear any existing content (e.g., prerendered)
+ var rootElementToClear = rootComponentsPendingFirstRender[componentId];
+ if (rootElementToClear) {
+ delete rootComponentsPendingFirstRender[componentId];
+ clearElement(rootElementToClear);
+ }
+ this.applyEdits(batch, element, 0, edits, referenceFrames);
+ };
+ BrowserRenderer.prototype.disposeComponent = function (componentId) {
+ delete this.childComponentLocations[componentId];
+ };
+ BrowserRenderer.prototype.disposeEventHandler = function (eventHandlerId) {
+ this.eventDelegator.removeListener(eventHandlerId);
+ };
+ BrowserRenderer.prototype.attachComponentToElement = function (componentId, element) {
+ this.childComponentLocations[componentId] = element;
+ };
+ BrowserRenderer.prototype.applyEdits = function (batch, parent, childIndex, edits, referenceFrames) {
+ var currentDepth = 0;
+ var childIndexAtCurrentDepth = childIndex;
+ var arraySegmentReader = batch.arraySegmentReader;
+ var editReader = batch.editReader;
+ var frameReader = batch.frameReader;
+ var editsValues = arraySegmentReader.values(edits);
+ var editsOffset = arraySegmentReader.offset(edits);
+ var editsLength = arraySegmentReader.count(edits);
+ var maxEditIndexExcl = editsOffset + editsLength;
+ for (var editIndex = editsOffset; editIndex < maxEditIndexExcl; editIndex++) {
+ var edit = batch.diffReader.editsEntry(editsValues, editIndex);
+ var editType = editReader.editType(edit);
+ switch (editType) {
+ case RenderBatch_1.EditType.prependFrame: {
+ var frameIndex = editReader.newTreeIndex(edit);
+ var frame = batch.referenceFramesEntry(referenceFrames, frameIndex);
+ var siblingIndex = editReader.siblingIndex(edit);
+ this.insertFrame(batch, parent, childIndexAtCurrentDepth + siblingIndex, referenceFrames, frame, frameIndex);
+ break;
+ }
+ case RenderBatch_1.EditType.removeFrame: {
+ var siblingIndex = editReader.siblingIndex(edit);
+ LogicalElements_1.removeLogicalChild(parent, childIndexAtCurrentDepth + siblingIndex);
+ break;
+ }
+ case RenderBatch_1.EditType.setAttribute: {
+ var frameIndex = editReader.newTreeIndex(edit);
+ var frame = batch.referenceFramesEntry(referenceFrames, frameIndex);
+ var siblingIndex = editReader.siblingIndex(edit);
+ var element = LogicalElements_1.getLogicalChild(parent, childIndexAtCurrentDepth + siblingIndex);
+ if (element instanceof Element) {
+ this.applyAttribute(batch, element, frame);
+ }
+ else {
+ throw new Error("Cannot set attribute on non-element child");
+ }
+ break;
+ }
+ case RenderBatch_1.EditType.removeAttribute: {
+ // Note that we don't have to dispose the info we track about event handlers here, because the
+ // disposed event handler IDs are delivered separately (in the 'disposedEventHandlerIds' array)
+ var siblingIndex = editReader.siblingIndex(edit);
+ var element = LogicalElements_1.getLogicalChild(parent, childIndexAtCurrentDepth + siblingIndex);
+ if (element instanceof HTMLElement) {
+ var attributeName = editReader.removedAttributeName(edit);
+ // First try to remove any special property we use for this attribute
+ if (!this.tryApplySpecialProperty(batch, element, attributeName, null)) {
+ // If that's not applicable, it's a regular DOM attribute so remove that
+ element.removeAttribute(attributeName);
+ }
+ }
+ else {
+ throw new Error("Cannot remove attribute from non-element child");
+ }
+ break;
+ }
+ case RenderBatch_1.EditType.updateText: {
+ var frameIndex = editReader.newTreeIndex(edit);
+ var frame = batch.referenceFramesEntry(referenceFrames, frameIndex);
+ var siblingIndex = editReader.siblingIndex(edit);
+ var textNode = LogicalElements_1.getLogicalChild(parent, childIndexAtCurrentDepth + siblingIndex);
+ if (textNode instanceof Text) {
+ textNode.textContent = frameReader.textContent(frame);
+ }
+ else {
+ throw new Error("Cannot set text content on non-text child");
+ }
+ break;
+ }
+ case RenderBatch_1.EditType.updateMarkup: {
+ var frameIndex = editReader.newTreeIndex(edit);
+ var frame = batch.referenceFramesEntry(referenceFrames, frameIndex);
+ var siblingIndex = editReader.siblingIndex(edit);
+ LogicalElements_1.removeLogicalChild(parent, childIndexAtCurrentDepth + siblingIndex);
+ this.insertMarkup(batch, parent, childIndexAtCurrentDepth + siblingIndex, frame);
+ break;
+ }
+ case RenderBatch_1.EditType.stepIn: {
+ var siblingIndex = editReader.siblingIndex(edit);
+ parent = LogicalElements_1.getLogicalChild(parent, childIndexAtCurrentDepth + siblingIndex);
+ currentDepth++;
+ childIndexAtCurrentDepth = 0;
+ break;
+ }
+ case RenderBatch_1.EditType.stepOut: {
+ parent = LogicalElements_1.getLogicalParent(parent);
+ currentDepth--;
+ childIndexAtCurrentDepth = currentDepth === 0 ? childIndex : 0; // The childIndex is only ever nonzero at zero depth
+ break;
+ }
+ default: {
+ var unknownType = editType; // Compile-time verification that the switch was exhaustive
+ throw new Error("Unknown edit type: " + unknownType);
+ }
+ }
+ }
+ };
+ BrowserRenderer.prototype.insertFrame = function (batch, parent, childIndex, frames, frame, frameIndex) {
+ var frameReader = batch.frameReader;
+ var frameType = frameReader.frameType(frame);
+ switch (frameType) {
+ case RenderBatch_1.FrameType.element:
+ this.insertElement(batch, parent, childIndex, frames, frame, frameIndex);
+ return 1;
+ case RenderBatch_1.FrameType.text:
+ this.insertText(batch, parent, childIndex, frame);
+ return 1;
+ case RenderBatch_1.FrameType.attribute:
+ throw new Error('Attribute frames should only be present as leading children of element frames.');
+ case RenderBatch_1.FrameType.component:
+ this.insertComponent(batch, parent, childIndex, frame);
+ return 1;
+ case RenderBatch_1.FrameType.region:
+ return this.insertFrameRange(batch, parent, childIndex, frames, frameIndex + 1, frameIndex + frameReader.subtreeLength(frame));
+ case RenderBatch_1.FrameType.elementReferenceCapture:
+ if (parent instanceof Element) {
+ ElementReferenceCapture_1.applyCaptureIdToElement(parent, frameReader.elementReferenceCaptureId(frame));
+ return 0; // A "capture" is a child in the diff, but has no node in the DOM
+ }
+ else {
+ throw new Error('Reference capture frames can only be children of element frames.');
+ }
+ case RenderBatch_1.FrameType.markup:
+ this.insertMarkup(batch, parent, childIndex, frame);
+ return 1;
+ default:
+ var unknownType = frameType; // Compile-time verification that the switch was exhaustive
+ throw new Error("Unknown frame type: " + unknownType);
+ }
+ };
+ BrowserRenderer.prototype.insertElement = function (batch, parent, childIndex, frames, frame, frameIndex) {
+ var frameReader = batch.frameReader;
+ var tagName = frameReader.elementName(frame);
+ var newDomElementRaw = tagName === 'svg' || LogicalElements_1.isSvgElement(parent) ?
+ document.createElementNS('http://www.w3.org/2000/svg', tagName) :
+ document.createElement(tagName);
+ var newElement = LogicalElements_1.toLogicalElement(newDomElementRaw);
+ LogicalElements_1.insertLogicalChild(newDomElementRaw, parent, childIndex);
+ // Apply attributes
+ var descendantsEndIndexExcl = frameIndex + frameReader.subtreeLength(frame);
+ for (var descendantIndex = frameIndex + 1; descendantIndex < descendantsEndIndexExcl; descendantIndex++) {
+ var descendantFrame = batch.referenceFramesEntry(frames, descendantIndex);
+ if (frameReader.frameType(descendantFrame) === RenderBatch_1.FrameType.attribute) {
+ this.applyAttribute(batch, newDomElementRaw, descendantFrame);
+ }
+ else {
+ // As soon as we see a non-attribute child, all the subsequent child frames are
+ // not attributes, so bail out and insert the remnants recursively
+ this.insertFrameRange(batch, newElement, 0, frames, descendantIndex, descendantsEndIndexExcl);
+ break;
+ }
+ }
+ };
+ BrowserRenderer.prototype.insertComponent = function (batch, parent, childIndex, frame) {
+ var containerElement = LogicalElements_1.createAndInsertLogicalContainer(parent, childIndex);
+ // All we have to do is associate the child component ID with its location. We don't actually
+ // do any rendering here, because the diff for the child will appear later in the render batch.
+ var childComponentId = batch.frameReader.componentId(frame);
+ this.attachComponentToElement(childComponentId, containerElement);
+ };
+ BrowserRenderer.prototype.insertText = function (batch, parent, childIndex, textFrame) {
+ var textContent = batch.frameReader.textContent(textFrame);
+ var newTextNode = document.createTextNode(textContent);
+ LogicalElements_1.insertLogicalChild(newTextNode, parent, childIndex);
+ };
+ BrowserRenderer.prototype.insertMarkup = function (batch, parent, childIndex, markupFrame) {
+ var markupContainer = LogicalElements_1.createAndInsertLogicalContainer(parent, childIndex);
+ var markupContent = batch.frameReader.markupContent(markupFrame);
+ var parsedMarkup = parseMarkup(markupContent, LogicalElements_1.isSvgElement(parent));
+ var logicalSiblingIndex = 0;
+ while (parsedMarkup.firstChild) {
+ LogicalElements_1.insertLogicalChild(parsedMarkup.firstChild, markupContainer, logicalSiblingIndex++);
+ }
+ };
+ BrowserRenderer.prototype.applyAttribute = function (batch, toDomElement, attributeFrame) {
+ var frameReader = batch.frameReader;
+ var attributeName = frameReader.attributeName(attributeFrame);
+ var browserRendererId = this.browserRendererId;
+ var eventHandlerId = frameReader.attributeEventHandlerId(attributeFrame);
+ if (eventHandlerId) {
+ var firstTwoChars = attributeName.substring(0, 2);
+ var eventName = attributeName.substring(2);
+ if (firstTwoChars !== 'on' || !eventName) {
+ throw new Error("Attribute has nonzero event handler ID, but attribute name '" + attributeName + "' does not start with 'on'.");
+ }
+ this.eventDelegator.setListener(toDomElement, eventName, eventHandlerId);
+ return;
+ }
+ // First see if we have special handling for this attribute
+ if (!this.tryApplySpecialProperty(batch, toDomElement, attributeName, attributeFrame)) {
+ // If not, treat it as a regular string-valued attribute
+ toDomElement.setAttribute(attributeName, frameReader.attributeValue(attributeFrame));
+ }
+ };
+ BrowserRenderer.prototype.tryApplySpecialProperty = function (batch, element, attributeName, attributeFrame) {
+ switch (attributeName) {
+ case 'value':
+ return this.tryApplyValueProperty(batch, element, attributeFrame);
+ case 'checked':
+ return this.tryApplyCheckedProperty(batch, element, attributeFrame);
+ default:
+ return false;
+ }
+ };
+ BrowserRenderer.prototype.tryApplyValueProperty = function (batch, element, attributeFrame) {
+ // Certain elements have built-in behaviour for their 'value' property
+ var frameReader = batch.frameReader;
+ switch (element.tagName) {
+ case 'INPUT':
+ case 'SELECT':
+ case 'TEXTAREA': {
+ var value = attributeFrame ? frameReader.attributeValue(attributeFrame) : null;
+ element.value = value;
+ if (element.tagName === 'SELECT') {
+ // <select> is special, in that anything we write to .value will be lost if there
+ // isn't yet a matching <option>. To maintain the expected behavior no matter the
+ // element insertion/update order, preserve the desired value separately so
+ // we can recover it when inserting any matching <option>.
+ element[selectValuePropname] = value;
+ }
+ return true;
+ }
+ case 'OPTION': {
+ var value = attributeFrame ? frameReader.attributeValue(attributeFrame) : null;
+ if (value) {
+ element.setAttribute('value', value);
+ }
+ else {
+ element.removeAttribute('value');
+ }
+ // See above for why we have this special handling for <select>/<option>
+ var parentElement = element.parentElement;
+ if (parentElement && (selectValuePropname in parentElement) && parentElement[selectValuePropname] === value) {
+ this.tryApplyValueProperty(batch, parentElement, attributeFrame);
+ delete parentElement[selectValuePropname];
+ }
+ return true;
+ }
+ default:
+ return false;
+ }
+ };
+ BrowserRenderer.prototype.tryApplyCheckedProperty = function (batch, element, attributeFrame) {
+ // Certain elements have built-in behaviour for their 'checked' property
+ if (element.tagName === 'INPUT') {
+ var value = attributeFrame ? batch.frameReader.attributeValue(attributeFrame) : null;
+ element.checked = value !== null;
+ return true;
+ }
+ else {
+ return false;
+ }
+ };
+ BrowserRenderer.prototype.insertFrameRange = function (batch, parent, childIndex, frames, startIndex, endIndexExcl) {
+ var origChildIndex = childIndex;
+ for (var index = startIndex; index < endIndexExcl; index++) {
+ var frame = batch.referenceFramesEntry(frames, index);
+ var numChildrenInserted = this.insertFrame(batch, parent, childIndex, frames, frame, index);
+ childIndex += numChildrenInserted;
+ // Skip over any descendants, since they are already dealt with recursively
+ index += countDescendantFrames(batch, frame);
+ }
+ return (childIndex - origChildIndex); // Total number of children inserted
+ };
+ return BrowserRenderer;
+}());
+exports.BrowserRenderer = BrowserRenderer;
+function parseMarkup(markup, isSvg) {
+ if (isSvg) {
+ sharedSvgElemForParsing.innerHTML = markup || ' ';
+ return sharedSvgElemForParsing;
+ }
+ else {
+ sharedTemplateElemForParsing.innerHTML = markup || ' ';
+ return sharedTemplateElemForParsing.content;
+ }
+}
+function countDescendantFrames(batch, frame) {
+ var frameReader = batch.frameReader;
+ switch (frameReader.frameType(frame)) {
+ // The following frame types have a subtree length. Other frames may use that memory slot
+ // to mean something else, so we must not read it. We should consider having nominal subtypes
+ // of RenderTreeFramePointer that prevent access to non-applicable fields.
+ case RenderBatch_1.FrameType.component:
+ case RenderBatch_1.FrameType.element:
+ case RenderBatch_1.FrameType.region:
+ return frameReader.subtreeLength(frame) - 1;
+ default:
+ return 0;
+ }
+}
+function raiseEvent(event, browserRendererId, eventHandlerId, eventArgs) {
+ if (preventDefaultEvents[event.type]) {
+ event.preventDefault();
+ }
+ var eventDescriptor = {
+ browserRendererId: browserRendererId,
+ eventHandlerId: eventHandlerId,
+ eventArgsType: eventArgs.type
+ };
+ return DotNet.invokeMethodAsync('Microsoft.AspNetCore.Components.Browser', 'DispatchEvent', eventDescriptor, JSON.stringify(eventArgs.data));
+}
+function clearElement(element) {
+ var childNode;
+ while (childNode = element.firstChild) {
+ element.removeChild(childNode);
+ }
+}
+
+
+/***/ }),
+
+/***/ "./Rendering/ElementReferenceCapture.ts":
+/*!**********************************************!*\
+ !*** ./Rendering/ElementReferenceCapture.ts ***!
+ \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+function applyCaptureIdToElement(element, referenceCaptureId) {
+ element.setAttribute(getCaptureIdAttributeName(referenceCaptureId), '');
+}
+exports.applyCaptureIdToElement = applyCaptureIdToElement;
+function getElementByCaptureId(referenceCaptureId) {
+ var selector = "[" + getCaptureIdAttributeName(referenceCaptureId) + "]";
+ return document.querySelector(selector);
+}
+function getCaptureIdAttributeName(referenceCaptureId) {
+ return "_bl_" + referenceCaptureId;
+}
+// Support receiving ElementRef instances as args in interop calls
+var elementRefKey = '_blazorElementRef'; // Keep in sync with ElementRef.cs
+DotNet.attachReviver(function (key, value) {
+ if (value && typeof value === 'object' && value.hasOwnProperty(elementRefKey) && typeof value[elementRefKey] === 'string') {
+ return getElementByCaptureId(value[elementRefKey]);
+ }
+ else {
+ return value;
+ }
+});
+
+
+/***/ }),
+
+/***/ "./Rendering/EventDelegator.ts":
+/*!*************************************!*\
+ !*** ./Rendering/EventDelegator.ts ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var EventForDotNet_1 = __webpack_require__(/*! ./EventForDotNet */ "./Rendering/EventForDotNet.ts");
+var nonBubblingEvents = toLookup([
+ 'abort', 'blur', 'change', 'error', 'focus', 'load', 'loadend', 'loadstart', 'mouseenter', 'mouseleave',
+ 'progress', 'reset', 'scroll', 'submit', 'unload', 'DOMNodeInsertedIntoDocument', 'DOMNodeRemovedFromDocument'
+]);
+// Responsible for adding/removing the eventInfo on an expando property on DOM elements, and
+// calling an EventInfoStore that deals with registering/unregistering the underlying delegated
+// event listeners as required (and also maps actual events back to the given callback).
+var EventDelegator = /** @class */ (function () {
+ function EventDelegator(onEvent) {
+ this.onEvent = onEvent;
+ var eventDelegatorId = ++EventDelegator.nextEventDelegatorId;
+ this.eventsCollectionKey = "_blazorEvents_" + eventDelegatorId;
+ this.eventInfoStore = new EventInfoStore(this.onGlobalEvent.bind(this));
+ }
+ EventDelegator.prototype.setListener = function (element, eventName, eventHandlerId) {
+ // Ensure we have a place to store event info for this element
+ var infoForElement = element[this.eventsCollectionKey];
+ if (!infoForElement) {
+ infoForElement = element[this.eventsCollectionKey] = {};
+ }
+ if (infoForElement.hasOwnProperty(eventName)) {
+ // We can cheaply update the info on the existing object and don't need any other housekeeping
+ var oldInfo = infoForElement[eventName];
+ this.eventInfoStore.update(oldInfo.eventHandlerId, eventHandlerId);
+ }
+ else {
+ // Go through the whole flow which might involve registering a new global handler
+ var newInfo = { element: element, eventName: eventName, eventHandlerId: eventHandlerId };
+ this.eventInfoStore.add(newInfo);
+ infoForElement[eventName] = newInfo;
+ }
+ };
+ EventDelegator.prototype.removeListener = function (eventHandlerId) {
+ // This method gets called whenever the .NET-side code reports that a certain event handler
+ // has been disposed. However we will already have disposed the info about that handler if
+ // the eventHandlerId for the (element,eventName) pair was replaced during diff application.
+ var info = this.eventInfoStore.remove(eventHandlerId);
+ if (info) {
+ // Looks like this event handler wasn't already disposed
+ // Remove the associated data from the DOM element
+ var element = info.element;
+ if (element.hasOwnProperty(this.eventsCollectionKey)) {
+ var elementEventInfos = element[this.eventsCollectionKey];
+ delete elementEventInfos[info.eventName];
+ if (Object.getOwnPropertyNames(elementEventInfos).length === 0) {
+ delete element[this.eventsCollectionKey];
+ }
+ }
+ }
+ };
+ EventDelegator.prototype.onGlobalEvent = function (evt) {
+ if (!(evt.target instanceof Element)) {
+ return;
+ }
+ // Scan up the element hierarchy, looking for any matching registered event handlers
+ var candidateElement = evt.target;
+ var eventArgs = null; // Populate lazily
+ var eventIsNonBubbling = nonBubblingEvents.hasOwnProperty(evt.type);
+ while (candidateElement) {
+ if (candidateElement.hasOwnProperty(this.eventsCollectionKey)) {
+ var handlerInfos = candidateElement[this.eventsCollectionKey];
+ if (handlerInfos.hasOwnProperty(evt.type)) {
+ // We are going to raise an event for this element, so prepare info needed by the .NET code
+ if (!eventArgs) {
+ eventArgs = EventForDotNet_1.EventForDotNet.fromDOMEvent(evt);
+ }
+ var handlerInfo = handlerInfos[evt.type];
+ this.onEvent(evt, handlerInfo.eventHandlerId, eventArgs);
+ }
+ }
+ candidateElement = eventIsNonBubbling ? null : candidateElement.parentElement;
+ }
+ };
+ EventDelegator.nextEventDelegatorId = 0;
+ return EventDelegator;
+}());
+exports.EventDelegator = EventDelegator;
+// Responsible for adding and removing the global listener when the number of listeners
+// for a given event name changes between zero and nonzero
+var EventInfoStore = /** @class */ (function () {
+ function EventInfoStore(globalListener) {
+ this.globalListener = globalListener;
+ this.infosByEventHandlerId = {};
+ this.countByEventName = {};
+ }
+ EventInfoStore.prototype.add = function (info) {
+ if (this.infosByEventHandlerId[info.eventHandlerId]) {
+ // Should never happen, but we want to know if it does
+ throw new Error("Event " + info.eventHandlerId + " is already tracked");
+ }
+ this.infosByEventHandlerId[info.eventHandlerId] = info;
+ var eventName = info.eventName;
+ if (this.countByEventName.hasOwnProperty(eventName)) {
+ this.countByEventName[eventName]++;
+ }
+ else {
+ this.countByEventName[eventName] = 1;
+ // To make delegation work with non-bubbling events, register a 'capture' listener.
+ // We preserve the non-bubbling behavior by only dispatching such events to the targeted element.
+ var useCapture = nonBubblingEvents.hasOwnProperty(eventName);
+ document.addEventListener(eventName, this.globalListener, useCapture);
+ }
+ };
+ EventInfoStore.prototype.update = function (oldEventHandlerId, newEventHandlerId) {
+ if (this.infosByEventHandlerId.hasOwnProperty(newEventHandlerId)) {
+ // Should never happen, but we want to know if it does
+ throw new Error("Event " + newEventHandlerId + " is already tracked");
+ }
+ // Since we're just updating the event handler ID, there's no need to update the global counts
+ var info = this.infosByEventHandlerId[oldEventHandlerId];
+ delete this.infosByEventHandlerId[oldEventHandlerId];
+ info.eventHandlerId = newEventHandlerId;
+ this.infosByEventHandlerId[newEventHandlerId] = info;
+ };
+ EventInfoStore.prototype.remove = function (eventHandlerId) {
+ var info = this.infosByEventHandlerId[eventHandlerId];
+ if (info) {
+ delete this.infosByEventHandlerId[eventHandlerId];
+ var eventName = info.eventName;
+ if (--this.countByEventName[eventName] === 0) {
+ delete this.countByEventName[eventName];
+ document.removeEventListener(eventName, this.globalListener);
+ }
+ }
+ return info;
+ };
+ return EventInfoStore;
+}());
+function toLookup(items) {
+ var result = {};
+ items.forEach(function (value) { result[value] = true; });
+ return result;
+}
+
+
+/***/ }),
+
+/***/ "./Rendering/EventForDotNet.ts":
+/*!*************************************!*\
+ !*** ./Rendering/EventForDotNet.ts ***!
+ \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var __assign = (this && this.__assign) || Object.assign || function(t) {
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
+ s = arguments[i];
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
+ t[p] = s[p];
+ }
+ return t;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+var EventForDotNet = /** @class */ (function () {
+ function EventForDotNet(type, data) {
+ this.type = type;
+ this.data = data;
+ }
+ EventForDotNet.fromDOMEvent = function (event) {
+ var element = event.target;
+ switch (event.type) {
+ case 'input':
+ case 'change': {
+ var targetIsCheckbox = isCheckbox(element);
+ var newValue = targetIsCheckbox ? !!element['checked'] : element['value'];
+ return new EventForDotNet('change', { type: event.type, value: newValue });
+ }
+ case 'copy':
+ case 'cut':
+ case 'paste':
+ return new EventForDotNet('clipboard', { type: event.type });
+ case 'drag':
+ case 'dragend':
+ case 'dragenter':
+ case 'dragleave':
+ case 'dragover':
+ case 'dragstart':
+ case 'drop':
+ return new EventForDotNet('drag', parseDragEvent(event));
+ case 'focus':
+ case 'blur':
+ case 'focusin':
+ case 'focusout':
+ return new EventForDotNet('focus', { type: event.type });
+ case 'keydown':
+ case 'keyup':
+ case 'keypress':
+ return new EventForDotNet('keyboard', parseKeyboardEvent(event));
+ case 'contextmenu':
+ case 'click':
+ case 'mouseover':
+ case 'mouseout':
+ case 'mousemove':
+ case 'mousedown':
+ case 'mouseup':
+ case 'dblclick':
+ return new EventForDotNet('mouse', parseMouseEvent(event));
+ case 'error':
+ return new EventForDotNet('error', parseErrorEvent(event));
+ case 'loadstart':
+ case 'timeout':
+ case 'abort':
+ case 'load':
+ case 'loadend':
+ case 'progress':
+ return new EventForDotNet('progress', parseProgressEvent(event));
+ case 'touchcancel':
+ case 'touchend':
+ case 'touchmove':
+ case 'touchenter':
+ case 'touchleave':
+ case 'touchstart':
+ return new EventForDotNet('touch', parseTouchEvent(event));
+ case 'gotpointercapture':
+ case 'lostpointercapture':
+ case 'pointercancel':
+ case 'pointerdown':
+ case 'pointerenter':
+ case 'pointerleave':
+ case 'pointermove':
+ case 'pointerout':
+ case 'pointerover':
+ case 'pointerup':
+ return new EventForDotNet('pointer', parsePointerEvent(event));
+ case 'wheel':
+ case 'mousewheel':
+ return new EventForDotNet('wheel', parseWheelEvent(event));
+ default:
+ return new EventForDotNet('unknown', { type: event.type });
+ }
+ };
+ return EventForDotNet;
+}());
+exports.EventForDotNet = EventForDotNet;
+function parseDragEvent(event) {
+ return {
+ type: event.type,
+ detail: event.detail,
+ dataTransfer: event.dataTransfer,
+ screenX: event.screenX,
+ screenY: event.screenY,
+ clientX: event.clientX,
+ clientY: event.clientY,
+ button: event.button,
+ buttons: event.buttons,
+ ctrlKey: event.ctrlKey,
+ shiftKey: event.shiftKey,
+ altKey: event.altKey,
+ metaKey: event.metaKey
+ };
+}
+function parseWheelEvent(event) {
+ return __assign({}, parseMouseEvent(event), { deltaX: event.deltaX, deltaY: event.deltaY, deltaZ: event.deltaZ, deltaMode: event.deltaMode });
+}
+function parseErrorEvent(event) {
+ return {
+ type: event.type,
+ message: event.message,
+ filename: event.filename,
+ lineno: event.lineno,
+ colno: event.colno
+ };
+}
+function parseProgressEvent(event) {
+ return {
+ type: event.type,
+ lengthComputable: event.lengthComputable,
+ loaded: event.loaded,
+ total: event.total
+ };
+}
+function parseTouchEvent(event) {
+ function parseTouch(touchList) {
+ var touches = [];
+ for (var i = 0; i < touchList.length; i++) {
+ var touch = touchList[i];
+ touches.push({
+ identifier: touch.identifier,
+ clientX: touch.clientX,
+ clientY: touch.clientY,
+ screenX: touch.screenX,
+ screenY: touch.screenY,
+ pageX: touch.pageX,
+ pageY: touch.pageY
+ });
+ }
+ return touches;
+ }
+ return {
+ type: event.type,
+ detail: event.detail,
+ touches: parseTouch(event.touches),
+ targetTouches: parseTouch(event.targetTouches),
+ changedTouches: parseTouch(event.changedTouches),
+ ctrlKey: event.ctrlKey,
+ shiftKey: event.shiftKey,
+ altKey: event.altKey,
+ metaKey: event.metaKey
+ };
+}
+function parseKeyboardEvent(event) {
+ return {
+ type: event.type,
+ key: event.key,
+ code: event.code,
+ location: event.location,
+ repeat: event.repeat,
+ ctrlKey: event.ctrlKey,
+ shiftKey: event.shiftKey,
+ altKey: event.altKey,
+ metaKey: event.metaKey
+ };
+}
+function parsePointerEvent(event) {
+ return __assign({}, parseMouseEvent(event), { pointerId: event.pointerId, width: event.width, height: event.height, pressure: event.pressure, tiltX: event.tiltX, tiltY: event.tiltY, pointerType: event.pointerType, isPrimary: event.isPrimary });
+}
+function parseMouseEvent(event) {
+ return {
+ type: event.type,
+ detail: event.detail,
+ screenX: event.screenX,
+ screenY: event.screenY,
+ clientX: event.clientX,
+ clientY: event.clientY,
+ button: event.button,
+ buttons: event.buttons,
+ ctrlKey: event.ctrlKey,
+ shiftKey: event.shiftKey,
+ altKey: event.altKey,
+ metaKey: event.metaKey
+ };
+}
+function isCheckbox(element) {
+ return element && element.tagName === 'INPUT' && element.getAttribute('type') === 'checkbox';
+}
+
+
+/***/ }),
+
+/***/ "./Rendering/LogicalElements.ts":
+/*!**************************************!*\
+ !*** ./Rendering/LogicalElements.ts ***!
+ \**************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/*
+ A LogicalElement plays the same role as an Element instance from the point of view of the
+ API consumer. Inserting and removing logical elements updates the browser DOM just the same.
+
+ The difference is that, unlike regular DOM mutation APIs, the LogicalElement APIs don't use
+ the underlying DOM structure as the data storage for the element hierarchy. Instead, the
+ LogicalElement APIs take care of tracking hierarchical relationships separately. The point
+ of this is to permit a logical tree structure in which parent/child relationships don't
+ have to be materialized in terms of DOM element parent/child relationships. And the reason
+ why we want that is so that hierarchies of Blazor components can be tracked even when those
+ components' render output need not be a single literal DOM element.
+
+ Consumers of the API don't need to know about the implementation, but how it's done is:
+ - Each LogicalElement is materialized in the DOM as either:
+ - A Node instance, for actual Node instances inserted using 'insertLogicalChild' or
+ for Element instances promoted to LogicalElement via 'toLogicalElement'
+ - A Comment instance, for 'logical container' instances inserted using 'createAndInsertLogicalContainer'
+ - Then, on that instance (i.e., the Node or Comment), we store an array of 'logical children'
+ instances, e.g.,
+ [firstChild, secondChild, thirdChild, ...]
+ ... plus we store a reference to the 'logical parent' (if any)
+ - The 'logical children' array means we can look up in O(1):
+ - The number of logical children (not currently implemented because not required, but trivial)
+ - The logical child at any given index
+ - Whenever a logical child is added or removed, we update the parent's array of logical children
+*/
+Object.defineProperty(exports, "__esModule", { value: true });
+var logicalChildrenPropname = createSymbolOrFallback('_blazorLogicalChildren');
+var logicalParentPropname = createSymbolOrFallback('_blazorLogicalParent');
+function toLogicalElement(element, allowExistingContents) {
+ // Normally it's good to assert that the element has started empty, because that's the usual
+ // situation and we probably have a bug if it's not. But for the element that contain prerendered
+ // root components, we want to let them keep their content until we replace it.
+ if (element.childNodes.length > 0 && !allowExistingContents) {
+ throw new Error('New logical elements must start empty, or allowExistingContents must be true');
+ }
+ element[logicalChildrenPropname] = [];
+ return element;
+}
+exports.toLogicalElement = toLogicalElement;
+function createAndInsertLogicalContainer(parent, childIndex) {
+ var containerElement = document.createComment('!');
+ insertLogicalChild(containerElement, parent, childIndex);
+ return containerElement;
+}
+exports.createAndInsertLogicalContainer = createAndInsertLogicalContainer;
+function insertLogicalChild(child, parent, childIndex) {
+ var childAsLogicalElement = child;
+ if (child instanceof Comment) {
+ var existingGrandchildren = getLogicalChildrenArray(childAsLogicalElement);
+ if (existingGrandchildren && getLogicalChildrenArray(childAsLogicalElement).length > 0) {
+ // There's nothing to stop us implementing support for this scenario, and it's not difficult
+ // (after inserting 'child' itself, also iterate through its logical children and physically
+ // put them as following-siblings in the DOM). However there's no scenario that requires it
+ // presently, so if we did implement it there'd be no good way to have tests for it.
+ throw new Error('Not implemented: inserting non-empty logical container');
+ }
+ }
+ if (getLogicalParent(childAsLogicalElement)) {
+ // Likewise, we could easily support this scenario too (in this 'if' block, just splice
+ // out 'child' from the logical children array of its previous logical parent by using
+ // Array.prototype.indexOf to determine its previous sibling index).
+ // But again, since there's not currently any scenario that would use it, we would not
+ // have any test coverage for such an implementation.
+ throw new Error('Not implemented: moving existing logical children');
+ }
+ var newSiblings = getLogicalChildrenArray(parent);
+ if (childIndex < newSiblings.length) {
+ // Insert
+ var nextSibling = newSiblings[childIndex];
+ nextSibling.parentNode.insertBefore(child, nextSibling);
+ newSiblings.splice(childIndex, 0, childAsLogicalElement);
+ }
+ else {
+ // Append
+ appendDomNode(child, parent);
+ newSiblings.push(childAsLogicalElement);
+ }
+ childAsLogicalElement[logicalParentPropname] = parent;
+ if (!(logicalChildrenPropname in childAsLogicalElement)) {
+ childAsLogicalElement[logicalChildrenPropname] = [];
+ }
+}
+exports.insertLogicalChild = insertLogicalChild;
+function removeLogicalChild(parent, childIndex) {
+ var childrenArray = getLogicalChildrenArray(parent);
+ var childToRemove = childrenArray.splice(childIndex, 1)[0];
+ // If it's a logical container, also remove its descendants
+ if (childToRemove instanceof Comment) {
+ var grandchildrenArray = getLogicalChildrenArray(childToRemove);
+ while (grandchildrenArray.length > 0) {
+ removeLogicalChild(childToRemove, 0);
+ }
+ }
+ // Finally, remove the node itself
+ var domNodeToRemove = childToRemove;
+ domNodeToRemove.parentNode.removeChild(domNodeToRemove);
+}
+exports.removeLogicalChild = removeLogicalChild;
+function getLogicalParent(element) {
+ return element[logicalParentPropname] || null;
+}
+exports.getLogicalParent = getLogicalParent;
+function getLogicalChild(parent, childIndex) {
+ return getLogicalChildrenArray(parent)[childIndex];
+}
+exports.getLogicalChild = getLogicalChild;
+function isSvgElement(element) {
+ return getClosestDomElement(element).namespaceURI === 'http://www.w3.org/2000/svg';
+}
+exports.isSvgElement = isSvgElement;
+function getLogicalChildrenArray(element) {
+ return element[logicalChildrenPropname];
+}
+function getLogicalNextSibling(element) {
+ var siblings = getLogicalChildrenArray(getLogicalParent(element));
+ var siblingIndex = Array.prototype.indexOf.call(siblings, element);
+ return siblings[siblingIndex + 1] || null;
+}
+function getClosestDomElement(logicalElement) {
+ if (logicalElement instanceof Element) {
+ return logicalElement;
+ }
+ else if (logicalElement instanceof Comment) {
+ return logicalElement.parentNode;
+ }
+ else {
+ throw new Error('Not a valid logical element');
+ }
+}
+function appendDomNode(child, parent) {
+ // This function only puts 'child' into the DOM in the right place relative to 'parent'
+ // It does not update the logical children array of anything
+ if (parent instanceof Element) {
+ parent.appendChild(child);
+ }
+ else if (parent instanceof Comment) {
+ var parentLogicalNextSibling = getLogicalNextSibling(parent);
+ if (parentLogicalNextSibling) {
+ // Since the parent has a logical next-sibling, its appended child goes right before that
+ parentLogicalNextSibling.parentNode.insertBefore(child, parentLogicalNextSibling);
+ }
+ else {
+ // Since the parent has no logical next-sibling, keep recursing upwards until we find
+ // a logical ancestor that does have a next-sibling or is a physical element.
+ appendDomNode(child, getLogicalParent(parent));
+ }
+ }
+ else {
+ // Should never happen
+ throw new Error("Cannot append node because the parent is not a valid logical element. Parent: " + parent);
+ }
+}
+function createSymbolOrFallback(fallback) {
+ return typeof Symbol === 'function' ? Symbol() : fallback;
+}
+;
+
+
+/***/ }),
+
+/***/ "./Rendering/RenderBatch/RenderBatch.ts":
+/*!**********************************************!*\
+ !*** ./Rendering/RenderBatch/RenderBatch.ts ***!
+ \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var EditType;
+(function (EditType) {
+ // The values must be kept in sync with the .NET equivalent in RenderTreeEditType.cs
+ EditType[EditType["prependFrame"] = 1] = "prependFrame";
+ EditType[EditType["removeFrame"] = 2] = "removeFrame";
+ EditType[EditType["setAttribute"] = 3] = "setAttribute";
+ EditType[EditType["removeAttribute"] = 4] = "removeAttribute";
+ EditType[EditType["updateText"] = 5] = "updateText";
+ EditType[EditType["stepIn"] = 6] = "stepIn";
+ EditType[EditType["stepOut"] = 7] = "stepOut";
+ EditType[EditType["updateMarkup"] = 8] = "updateMarkup";
+})(EditType = exports.EditType || (exports.EditType = {}));
+var FrameType;
+(function (FrameType) {
+ // The values must be kept in sync with the .NET equivalent in RenderTreeFrameType.cs
+ FrameType[FrameType["element"] = 1] = "element";
+ FrameType[FrameType["text"] = 2] = "text";
+ FrameType[FrameType["attribute"] = 3] = "attribute";
+ FrameType[FrameType["component"] = 4] = "component";
+ FrameType[FrameType["region"] = 5] = "region";
+ FrameType[FrameType["elementReferenceCapture"] = 6] = "elementReferenceCapture";
+ FrameType[FrameType["markup"] = 8] = "markup";
+})(FrameType = exports.FrameType || (exports.FrameType = {}));
+
+
+/***/ }),
+
+/***/ "./Rendering/RenderBatch/SharedMemoryRenderBatch.ts":
+/*!**********************************************************!*\
+ !*** ./Rendering/RenderBatch/SharedMemoryRenderBatch.ts ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var Environment_1 = __webpack_require__(/*! ../../Environment */ "./Environment.ts");
+// Used when running on Mono WebAssembly for shared-memory interop. The code here encapsulates
+// our knowledge of the memory layout of RenderBatch and all referenced types.
+//
+// In this implementation, all the DTO types are really heap pointers at runtime, hence all
+// the casts to 'any' whenever we pass them to platform.read.
+var SharedMemoryRenderBatch = /** @class */ (function () {
+ function SharedMemoryRenderBatch(batchAddress) {
+ this.batchAddress = batchAddress;
+ this.arrayRangeReader = arrayRangeReader;
+ this.arraySegmentReader = arraySegmentReader;
+ this.diffReader = diffReader;
+ this.editReader = editReader;
+ this.frameReader = frameReader;
+ }
+ // Keep in sync with memory layout in RenderBatch.cs
+ SharedMemoryRenderBatch.prototype.updatedComponents = function () { return Environment_1.platform.readStructField(this.batchAddress, 0); };
+ SharedMemoryRenderBatch.prototype.referenceFrames = function () { return Environment_1.platform.readStructField(this.batchAddress, arrayRangeReader.structLength); };
+ SharedMemoryRenderBatch.prototype.disposedComponentIds = function () { return Environment_1.platform.readStructField(this.batchAddress, arrayRangeReader.structLength * 2); };
+ SharedMemoryRenderBatch.prototype.disposedEventHandlerIds = function () { return Environment_1.platform.readStructField(this.batchAddress, arrayRangeReader.structLength * 3); };
+ SharedMemoryRenderBatch.prototype.updatedComponentsEntry = function (values, index) {
+ return arrayValuesEntry(values, index, diffReader.structLength);
+ };
+ SharedMemoryRenderBatch.prototype.referenceFramesEntry = function (values, index) {
+ return arrayValuesEntry(values, index, frameReader.structLength);
+ };
+ SharedMemoryRenderBatch.prototype.disposedComponentIdsEntry = function (values, index) {
+ var pointer = arrayValuesEntry(values, index, /* int length */ 4);
+ return Environment_1.platform.readInt32Field(pointer);
+ };
+ SharedMemoryRenderBatch.prototype.disposedEventHandlerIdsEntry = function (values, index) {
+ var pointer = arrayValuesEntry(values, index, /* int length */ 4);
+ return Environment_1.platform.readInt32Field(pointer);
+ };
+ return SharedMemoryRenderBatch;
+}());
+exports.SharedMemoryRenderBatch = SharedMemoryRenderBatch;
+// Keep in sync with memory layout in ArrayRange.cs
+var arrayRangeReader = {
+ structLength: 8,
+ values: function (arrayRange) { return Environment_1.platform.readObjectField(arrayRange, 0); },
+ count: function (arrayRange) { return Environment_1.platform.readInt32Field(arrayRange, 4); },
+};
+// Keep in sync with memory layout in ArraySegment
+var arraySegmentReader = {
+ structLength: 12,
+ values: function (arraySegment) { return Environment_1.platform.readObjectField(arraySegment, 0); },
+ offset: function (arraySegment) { return Environment_1.platform.readInt32Field(arraySegment, 4); },
+ count: function (arraySegment) { return Environment_1.platform.readInt32Field(arraySegment, 8); },
+};
+// Keep in sync with memory layout in RenderTreeDiff.cs
+var diffReader = {
+ structLength: 4 + arraySegmentReader.structLength,
+ componentId: function (diff) { return Environment_1.platform.readInt32Field(diff, 0); },
+ edits: function (diff) { return Environment_1.platform.readStructField(diff, 4); },
+ editsEntry: function (values, index) { return arrayValuesEntry(values, index, editReader.structLength); },
+};
+// Keep in sync with memory layout in RenderTreeEdit.cs
+var editReader = {
+ structLength: 16,
+ editType: function (edit) { return Environment_1.platform.readInt32Field(edit, 0); },
+ siblingIndex: function (edit) { return Environment_1.platform.readInt32Field(edit, 4); },
+ newTreeIndex: function (edit) { return Environment_1.platform.readInt32Field(edit, 8); },
+ removedAttributeName: function (edit) { return Environment_1.platform.readStringField(edit, 12); },
+};
+// Keep in sync with memory layout in RenderTreeFrame.cs
+var frameReader = {
+ structLength: 28,
+ frameType: function (frame) { return Environment_1.platform.readInt32Field(frame, 4); },
+ subtreeLength: function (frame) { return Environment_1.platform.readInt32Field(frame, 8); },
+ elementReferenceCaptureId: function (frame) { return Environment_1.platform.readStringField(frame, 16); },
+ componentId: function (frame) { return Environment_1.platform.readInt32Field(frame, 12); },
+ elementName: function (frame) { return Environment_1.platform.readStringField(frame, 16); },
+ textContent: function (frame) { return Environment_1.platform.readStringField(frame, 16); },
+ markupContent: function (frame) { return Environment_1.platform.readStringField(frame, 16); },
+ attributeName: function (frame) { return Environment_1.platform.readStringField(frame, 16); },
+ attributeValue: function (frame) { return Environment_1.platform.readStringField(frame, 24); },
+ attributeEventHandlerId: function (frame) { return Environment_1.platform.readInt32Field(frame, 8); },
+};
+function arrayValuesEntry(arrayValues, index, itemSize) {
+ return Environment_1.platform.getArrayEntryPtr(arrayValues, index, itemSize);
+}
+
+
+/***/ }),
+
+/***/ "./Rendering/Renderer.ts":
+/*!*******************************!*\
+ !*** ./Rendering/Renderer.ts ***!
+ \*******************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var BrowserRenderer_1 = __webpack_require__(/*! ./BrowserRenderer */ "./Rendering/BrowserRenderer.ts");
+var browserRenderers = {};
+function attachRootComponentToElement(browserRendererId, elementSelector, componentId) {
+ var element = document.querySelector(elementSelector);
+ if (!element) {
+ throw new Error("Could not find any element matching selector '" + elementSelector + "'.");
+ }
+ var browserRenderer = browserRenderers[browserRendererId];
+ if (!browserRenderer) {
+ browserRenderer = browserRenderers[browserRendererId] = new BrowserRenderer_1.BrowserRenderer(browserRendererId);
+ }
+ browserRenderer.attachRootComponentToElement(componentId, element);
+}
+exports.attachRootComponentToElement = attachRootComponentToElement;
+function renderBatch(browserRendererId, batch) {
+ var browserRenderer = browserRenderers[browserRendererId];
+ if (!browserRenderer) {
+ throw new Error("There is no browser renderer with ID " + browserRendererId + ".");
+ }
+ var arrayRangeReader = batch.arrayRangeReader;
+ var updatedComponentsRange = batch.updatedComponents();
+ var updatedComponentsValues = arrayRangeReader.values(updatedComponentsRange);
+ var updatedComponentsLength = arrayRangeReader.count(updatedComponentsRange);
+ var referenceFrames = batch.referenceFrames();
+ var referenceFramesValues = arrayRangeReader.values(referenceFrames);
+ var diffReader = batch.diffReader;
+ for (var i = 0; i < updatedComponentsLength; i++) {
+ var diff = batch.updatedComponentsEntry(updatedComponentsValues, i);
+ var componentId = diffReader.componentId(diff);
+ var edits = diffReader.edits(diff);
+ browserRenderer.updateComponent(batch, componentId, edits, referenceFramesValues);
+ }
+ var disposedComponentIdsRange = batch.disposedComponentIds();
+ var disposedComponentIdsValues = arrayRangeReader.values(disposedComponentIdsRange);
+ var disposedComponentIdsLength = arrayRangeReader.count(disposedComponentIdsRange);
+ for (var i = 0; i < disposedComponentIdsLength; i++) {
+ var componentId = batch.disposedComponentIdsEntry(disposedComponentIdsValues, i);
+ browserRenderer.disposeComponent(componentId);
+ }
+ var disposedEventHandlerIdsRange = batch.disposedEventHandlerIds();
+ var disposedEventHandlerIdsValues = arrayRangeReader.values(disposedEventHandlerIdsRange);
+ var disposedEventHandlerIdsLength = arrayRangeReader.count(disposedEventHandlerIdsRange);
+ for (var i = 0; i < disposedEventHandlerIdsLength; i++) {
+ var eventHandlerId = batch.disposedEventHandlerIdsEntry(disposedEventHandlerIdsValues, i);
+ browserRenderer.disposeEventHandler(eventHandlerId);
+ }
+}
+exports.renderBatch = renderBatch;
+
+
+/***/ }),
+
+/***/ "./Services/Http.ts":
+/*!**************************!*\
+ !*** ./Services/Http.ts ***!
+ \**************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+var __generator = (this && this.__generator) || function (thisArg, body) {
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
+ function verb(n) { return function (v) { return step([n, v]); }; }
+ function step(op) {
+ if (f) throw new TypeError("Generator is already executing.");
+ while (_) try {
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
+ if (y = 0, t) op = [op[0] & 2, t.value];
+ switch (op[0]) {
+ case 0: case 1: t = op; break;
+ case 4: _.label++; return { value: op[1], done: false };
+ case 5: _.label++; y = op[1]; op = [0]; continue;
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
+ default:
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
+ if (t[2]) _.ops.pop();
+ _.trys.pop(); continue;
+ }
+ op = body.call(thisArg, _);
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
+ }
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+var Environment_1 = __webpack_require__(/*! ../Environment */ "./Environment.ts");
+var httpClientAssembly = 'Microsoft.AspNetCore.Blazor';
+var httpClientNamespace = httpClientAssembly + ".Http";
+var httpClientTypeName = 'WebAssemblyHttpMessageHandler';
+var receiveResponseMethod;
+var allocateArrayMethod;
+// These are the functions we're making available for invocation from .NET
+exports.internalFunctions = {
+ sendAsync: sendAsync
+};
+function sendAsync(id, body, jsonFetchArgs) {
+ return __awaiter(this, void 0, void 0, function () {
+ var response, responseData, fetchOptions, requestInit, ex_1;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ fetchOptions = JSON.parse(Environment_1.platform.toJavaScriptString(jsonFetchArgs));
+ requestInit = Object.assign(fetchOptions.requestInit, fetchOptions.requestInitOverrides);
+ if (body) {
+ requestInit.body = Environment_1.platform.toUint8Array(body);
+ }
+ _a.label = 1;
+ case 1:
+ _a.trys.push([1, 4, , 5]);
+ return [4 /*yield*/, fetch(fetchOptions.requestUri, requestInit)];
+ case 2:
+ response = _a.sent();
+ return [4 /*yield*/, response.arrayBuffer()];
+ case 3:
+ responseData = _a.sent();
+ return [3 /*break*/, 5];
+ case 4:
+ ex_1 = _a.sent();
+ dispatchErrorResponse(id, ex_1.toString());
+ return [2 /*return*/];
+ case 5:
+ dispatchSuccessResponse(id, response, responseData);
+ return [2 /*return*/];
+ }
+ });
+ });
+}
+function dispatchSuccessResponse(id, response, responseData) {
+ var responseDescriptor = {
+ statusCode: response.status,
+ statusText: response.statusText,
+ headers: []
+ };
+ response.headers.forEach(function (value, name) {
+ responseDescriptor.headers.push([name, value]);
+ });
+ if (!allocateArrayMethod) {
+ allocateArrayMethod = Environment_1.platform.findMethod(httpClientAssembly, httpClientNamespace, httpClientTypeName, 'AllocateArray');
+ }
+ // allocate a managed byte[] of the right size
+ var dotNetArray = Environment_1.platform.callMethod(allocateArrayMethod, null, [Environment_1.platform.toDotNetString(responseData.byteLength.toString())]);
+ // get an Uint8Array view of it
+ var array = Environment_1.platform.toUint8Array(dotNetArray);
+ // copy the responseData to our managed byte[]
+ array.set(new Uint8Array(responseData));
+ dispatchResponse(id, Environment_1.platform.toDotNetString(JSON.stringify(responseDescriptor)), dotNetArray,
+ /* errorMessage */ null);
+}
+function dispatchErrorResponse(id, errorMessage) {
+ dispatchResponse(id,
+ /* responseDescriptor */ null,
+ /* responseText */ null, Environment_1.platform.toDotNetString(errorMessage));
+}
+function dispatchResponse(id, responseDescriptor, responseData, errorMessage) {
+ if (!receiveResponseMethod) {
+ receiveResponseMethod = Environment_1.platform.findMethod(httpClientAssembly, httpClientNamespace, httpClientTypeName, 'ReceiveResponse');
+ }
+ Environment_1.platform.callMethod(receiveResponseMethod, null, [
+ Environment_1.platform.toDotNetString(id.toString()),
+ responseDescriptor,
+ responseData,
+ errorMessage,
+ ]);
+}
+
+
+/***/ }),
+
+/***/ "./Services/UriHelper.ts":
+/*!*******************************!*\
+ !*** ./Services/UriHelper.ts ***!
+ \*******************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+var __generator = (this && this.__generator) || function (thisArg, body) {
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
+ function verb(n) { return function (v) { return step([n, v]); }; }
+ function step(op) {
+ if (f) throw new TypeError("Generator is already executing.");
+ while (_) try {
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
+ if (y = 0, t) op = [op[0] & 2, t.value];
+ switch (op[0]) {
+ case 0: case 1: t = op; break;
+ case 4: _.label++; return { value: op[1], done: false };
+ case 5: _.label++; y = op[1]; op = [0]; continue;
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
+ default:
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
+ if (t[2]) _.ops.pop();
+ _.trys.pop(); continue;
+ }
+ op = body.call(thisArg, _);
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
+ }
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+__webpack_require__(/*! @dotnet/jsinterop */ "./node_modules/@dotnet/jsinterop/dist/Microsoft.JSInterop.js");
+var hasRegisteredEventListeners = false;
+// Will be initialized once someone registers
+var notifyLocationChangedCallback = null;
+// These are the functions we're making available for invocation from .NET
+exports.internalFunctions = {
+ enableNavigationInterception: enableNavigationInterception,
+ navigateTo: navigateTo,
+ getBaseURI: function () { return document.baseURI; },
+ getLocationHref: function () { return location.href; },
+};
+function enableNavigationInterception(assemblyName, functionName) {
+ if (hasRegisteredEventListeners || assemblyName === undefined || functionName === undefined) {
+ return;
+ }
+ notifyLocationChangedCallback = { assemblyName: assemblyName, functionName: functionName };
+ hasRegisteredEventListeners = true;
+ document.addEventListener('click', function (event) {
+ // Intercept clicks on all <a> elements where the href is within the <base href> URI space
+ // We must explicitly check if it has an 'href' attribute, because if it doesn't, the result might be null or an empty string depending on the browser
+ var anchorTarget = findClosestAncestor(event.target, 'A');
+ var hrefAttributeName = 'href';
+ if (anchorTarget && anchorTarget.hasAttribute(hrefAttributeName) && event.button === 0) {
+ var href = anchorTarget.getAttribute(hrefAttributeName);
+ var absoluteHref = toAbsoluteUri(href);
+ var targetAttributeValue = anchorTarget.getAttribute('target');
+ var opensInSameFrame = !targetAttributeValue || targetAttributeValue === '_self';
+ // Don't stop ctrl/meta-click (etc) from opening links in new tabs/windows
+ if (isWithinBaseUriSpace(absoluteHref) && !eventHasSpecialKey(event) && opensInSameFrame) {
+ event.preventDefault();
+ performInternalNavigation(absoluteHref);
+ }
+ }
+ });
+ window.addEventListener('popstate', handleInternalNavigation);
+}
+function navigateTo(uri, forceLoad) {
+ var absoluteUri = toAbsoluteUri(uri);
+ if (!forceLoad && isWithinBaseUriSpace(absoluteUri)) {
+ performInternalNavigation(absoluteUri);
+ }
+ else {
+ location.href = uri;
+ }
+}
+exports.navigateTo = navigateTo;
+function performInternalNavigation(absoluteInternalHref) {
+ history.pushState(null, /* ignored title */ '', absoluteInternalHref);
+ handleInternalNavigation();
+}
+function handleInternalNavigation() {
+ return __awaiter(this, void 0, void 0, function () {
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ if (!notifyLocationChangedCallback) return [3 /*break*/, 2];
+ return [4 /*yield*/, DotNet.invokeMethodAsync(notifyLocationChangedCallback.assemblyName, notifyLocationChangedCallback.functionName, location.href)];
+ case 1:
+ _a.sent();
+ _a.label = 2;
+ case 2: return [2 /*return*/];
+ }
+ });
+ });
+}
+var testAnchor;
+function toAbsoluteUri(relativeUri) {
+ testAnchor = testAnchor || document.createElement('a');
+ testAnchor.href = relativeUri;
+ return testAnchor.href;
+}
+function findClosestAncestor(element, tagName) {
+ return !element
+ ? null
+ : element.tagName === tagName
+ ? element
+ : findClosestAncestor(element.parentElement, tagName);
+}
+function isWithinBaseUriSpace(href) {
+ var baseUriWithTrailingSlash = toBaseUriWithTrailingSlash(document.baseURI); // TODO: Might baseURI really be null?
+ return href.startsWith(baseUriWithTrailingSlash);
+}
+function toBaseUriWithTrailingSlash(baseUri) {
+ return baseUri.substr(0, baseUri.lastIndexOf('/') + 1);
+}
+function eventHasSpecialKey(event) {
+ return event.ctrlKey || event.shiftKey || event.altKey || event.metaKey;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/@dotnet/jsinterop/dist/Microsoft.JSInterop.js":
+/*!********************************************************************!*\
+ !*** ./node_modules/@dotnet/jsinterop/dist/Microsoft.JSInterop.js ***!
+ \********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// This is a single-file self-contained module to avoid the need for a Webpack build
+var DotNet;
+(function (DotNet) {
+ window.DotNet = DotNet; // Ensure reachable from anywhere
+ var jsonRevivers = [];
+ var pendingAsyncCalls = {};
+ var cachedJSFunctions = {};
+ var nextAsyncCallId = 1; // Start at 1 because zero signals "no response needed"
+ var dotNetDispatcher = null;
+ /**
+ * Sets the specified .NET call dispatcher as the current instance so that it will be used
+ * for future invocations.
+ *
+ * @param dispatcher An object that can dispatch calls from JavaScript to a .NET runtime.
+ */
+ function attachDispatcher(dispatcher) {
+ dotNetDispatcher = dispatcher;
+ }
+ DotNet.attachDispatcher = attachDispatcher;
+ /**
+ * Adds a JSON reviver callback that will be used when parsing arguments received from .NET.
+ * @param reviver The reviver to add.
+ */
+ function attachReviver(reviver) {
+ jsonRevivers.push(reviver);
+ }
+ DotNet.attachReviver = attachReviver;
+ /**
+ * Invokes the specified .NET public method synchronously. Not all hosting scenarios support
+ * synchronous invocation, so if possible use invokeMethodAsync instead.
+ *
+ * @param assemblyName The short name (without key/version or .dll extension) of the .NET assembly containing the method.
+ * @param methodIdentifier The identifier of the method to invoke. The method must have a [JSInvokable] attribute specifying this identifier.
+ * @param args Arguments to pass to the method, each of which must be JSON-serializable.
+ * @returns The result of the operation.
+ */
+ function invokeMethod(assemblyName, methodIdentifier) {
+ var args = [];
+ for (var _i = 2; _i < arguments.length; _i++) {
+ args[_i - 2] = arguments[_i];
+ }
+ return invokePossibleInstanceMethod(assemblyName, methodIdentifier, null, args);
+ }
+ DotNet.invokeMethod = invokeMethod;
+ /**
+ * Invokes the specified .NET public method asynchronously.
+ *
+ * @param assemblyName The short name (without key/version or .dll extension) of the .NET assembly containing the method.
+ * @param methodIdentifier The identifier of the method to invoke. The method must have a [JSInvokable] attribute specifying this identifier.
+ * @param args Arguments to pass to the method, each of which must be JSON-serializable.
+ * @returns A promise representing the result of the operation.
+ */
+ function invokeMethodAsync(assemblyName, methodIdentifier) {
+ var args = [];
+ for (var _i = 2; _i < arguments.length; _i++) {
+ args[_i - 2] = arguments[_i];
+ }
+ return invokePossibleInstanceMethodAsync(assemblyName, methodIdentifier, null, args);
+ }
+ DotNet.invokeMethodAsync = invokeMethodAsync;
+ function invokePossibleInstanceMethod(assemblyName, methodIdentifier, dotNetObjectId, args) {
+ var dispatcher = getRequiredDispatcher();
+ if (dispatcher.invokeDotNetFromJS) {
+ var argsJson = JSON.stringify(args, argReplacer);
+ var resultJson = dispatcher.invokeDotNetFromJS(assemblyName, methodIdentifier, dotNetObjectId, argsJson);
+ return resultJson ? parseJsonWithRevivers(resultJson) : null;
+ }
+ else {
+ throw new Error('The current dispatcher does not support synchronous calls from JS to .NET. Use invokeMethodAsync instead.');
+ }
+ }
+ function invokePossibleInstanceMethodAsync(assemblyName, methodIdentifier, dotNetObjectId, args) {
+ var asyncCallId = nextAsyncCallId++;
+ var resultPromise = new Promise(function (resolve, reject) {
+ pendingAsyncCalls[asyncCallId] = { resolve: resolve, reject: reject };
+ });
+ try {
+ var argsJson = JSON.stringify(args, argReplacer);
+ getRequiredDispatcher().beginInvokeDotNetFromJS(asyncCallId, assemblyName, methodIdentifier, dotNetObjectId, argsJson);
+ }
+ catch (ex) {
+ // Synchronous failure
+ completePendingCall(asyncCallId, false, ex);
+ }
+ return resultPromise;
+ }
+ function getRequiredDispatcher() {
+ if (dotNetDispatcher !== null) {
+ return dotNetDispatcher;
+ }
+ throw new Error('No .NET call dispatcher has been set.');
+ }
+ function completePendingCall(asyncCallId, success, resultOrError) {
+ if (!pendingAsyncCalls.hasOwnProperty(asyncCallId)) {
+ throw new Error("There is no pending async call with ID " + asyncCallId + ".");
+ }
+ var asyncCall = pendingAsyncCalls[asyncCallId];
+ delete pendingAsyncCalls[asyncCallId];
+ if (success) {
+ asyncCall.resolve(resultOrError);
+ }
+ else {
+ asyncCall.reject(resultOrError);
+ }
+ }
+ /**
+ * Receives incoming calls from .NET and dispatches them to JavaScript.
+ */
+ DotNet.jsCallDispatcher = {
+ /**
+ * Finds the JavaScript function matching the specified identifier.
+ *
+ * @param identifier Identifies the globally-reachable function to be returned.
+ * @returns A Function instance.
+ */
+ findJSFunction: findJSFunction,
+ /**
+ * Invokes the specified synchronous JavaScript function.
+ *
+ * @param identifier Identifies the globally-reachable function to invoke.
+ * @param argsJson JSON representation of arguments to be passed to the function.
+ * @returns JSON representation of the invocation result.
+ */
+ invokeJSFromDotNet: function (identifier, argsJson) {
+ var result = findJSFunction(identifier).apply(null, parseJsonWithRevivers(argsJson));
+ return result === null || result === undefined
+ ? null
+ : JSON.stringify(result, argReplacer);
+ },
+ /**
+ * Invokes the specified synchronous or asynchronous JavaScript function.
+ *
+ * @param asyncHandle A value identifying the asynchronous operation. This value will be passed back in a later call to endInvokeJSFromDotNet.
+ * @param identifier Identifies the globally-reachable function to invoke.
+ * @param argsJson JSON representation of arguments to be passed to the function.
+ */
+ beginInvokeJSFromDotNet: function (asyncHandle, identifier, argsJson) {
+ // Coerce synchronous functions into async ones, plus treat
+ // synchronous exceptions the same as async ones
+ var promise = new Promise(function (resolve) {
+ var synchronousResultOrPromise = findJSFunction(identifier).apply(null, parseJsonWithRevivers(argsJson));
+ resolve(synchronousResultOrPromise);
+ });
+ // We only listen for a result if the caller wants to be notified about it
+ if (asyncHandle) {
+ // On completion, dispatch result back to .NET
+ // Not using "await" because it codegens a lot of boilerplate
+ promise.then(function (result) { return getRequiredDispatcher().beginInvokeDotNetFromJS(0, 'Microsoft.JSInterop', 'DotNetDispatcher.EndInvoke', null, JSON.stringify([asyncHandle, true, result], argReplacer)); }, function (error) { return getRequiredDispatcher().beginInvokeDotNetFromJS(0, 'Microsoft.JSInterop', 'DotNetDispatcher.EndInvoke', null, JSON.stringify([asyncHandle, false, formatError(error)])); });
+ }
+ },
+ /**
+ * Receives notification that an async call from JS to .NET has completed.
+ * @param asyncCallId The identifier supplied in an earlier call to beginInvokeDotNetFromJS.
+ * @param success A flag to indicate whether the operation completed successfully.
+ * @param resultOrExceptionMessage Either the operation result or an error message.
+ */
+ endInvokeDotNetFromJS: function (asyncCallId, success, resultOrExceptionMessage) {
+ var resultOrError = success ? resultOrExceptionMessage : new Error(resultOrExceptionMessage);
+ completePendingCall(parseInt(asyncCallId), success, resultOrError);
+ }
+ };
+ function parseJsonWithRevivers(json) {
+ return json ? JSON.parse(json, function (key, initialValue) {
+ // Invoke each reviver in order, passing the output from the previous reviver,
+ // so that each one gets a chance to transform the value
+ return jsonRevivers.reduce(function (latestValue, reviver) { return reviver(key, latestValue); }, initialValue);
+ }) : null;
+ }
+ function formatError(error) {
+ if (error instanceof Error) {
+ return error.message + "\n" + error.stack;
+ }
+ else {
+ return error ? error.toString() : 'null';
+ }
+ }
+ function findJSFunction(identifier) {
+ if (cachedJSFunctions.hasOwnProperty(identifier)) {
+ return cachedJSFunctions[identifier];
+ }
+ var result = window;
+ var resultIdentifier = 'window';
+ identifier.split('.').forEach(function (segment) {
+ if (segment in result) {
+ result = result[segment];
+ resultIdentifier += '.' + segment;
+ }
+ else {
+ throw new Error("Could not find '" + segment + "' in '" + resultIdentifier + "'.");
+ }
+ });
+ if (result instanceof Function) {
+ return result;
+ }
+ else {
+ throw new Error("The value '" + resultIdentifier + "' is not a function.");
+ }
+ }
+ var DotNetObject = /** @class */ (function () {
+ function DotNetObject(_id) {
+ this._id = _id;
+ }
+ DotNetObject.prototype.invokeMethod = function (methodIdentifier) {
+ var args = [];
+ for (var _i = 1; _i < arguments.length; _i++) {
+ args[_i - 1] = arguments[_i];
+ }
+ return invokePossibleInstanceMethod(null, methodIdentifier, this._id, args);
+ };
+ DotNetObject.prototype.invokeMethodAsync = function (methodIdentifier) {
+ var args = [];
+ for (var _i = 1; _i < arguments.length; _i++) {
+ args[_i - 1] = arguments[_i];
+ }
+ return invokePossibleInstanceMethodAsync(null, methodIdentifier, this._id, args);
+ };
+ DotNetObject.prototype.dispose = function () {
+ var promise = invokeMethodAsync('Microsoft.JSInterop', 'DotNetDispatcher.ReleaseDotNetObject', this._id);
+ promise.catch(function (error) { return console.error(error); });
+ };
+ DotNetObject.prototype.serializeAsArg = function () {
+ return "__dotNetObject:" + this._id;
+ };
+ return DotNetObject;
+ }());
+ var dotNetObjectValueFormat = /^__dotNetObject\:(\d+)$/;
+ attachReviver(function reviveDotNetObject(key, value) {
+ if (typeof value === 'string') {
+ var match = value.match(dotNetObjectValueFormat);
+ if (match) {
+ return new DotNetObject(parseInt(match[1]));
+ }
+ }
+ // Unrecognized - let another reviver handle it
+ return value;
+ });
+ function argReplacer(key, value) {
+ return value instanceof DotNetObject ? value.serializeAsArg() : value;
+ }
+})(DotNet || (DotNet = {}));
+//# sourceMappingURL=Microsoft.JSInterop.js.map
+
+/***/ })
+
+/******/ });
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vQm9vdC5XZWJBc3NlbWJseS50cyIsIndlYnBhY2s6Ly8vLi9Cb290Q29tbW9uLnRzIiwid2VicGFjazovLy8uL0Vudmlyb25tZW50LnRzIiwid2VicGFjazovLy8uL0dsb2JhbEV4cG9ydHMudHMiLCJ3ZWJwYWNrOi8vLy4vUGxhdGZvcm0vTW9uby9Nb25vRGVidWdnZXIudHMiLCJ3ZWJwYWNrOi8vLy4vUGxhdGZvcm0vTW9uby9Nb25vUGxhdGZvcm0udHMiLCJ3ZWJwYWNrOi8vLy4vUGxhdGZvcm0vVXJsLnRzIiwid2VicGFjazovLy8uL1JlbmRlcmluZy9Ccm93c2VyUmVuZGVyZXIudHMiLCJ3ZWJwYWNrOi8vLy4vUmVuZGVyaW5nL0VsZW1lbnRSZWZlcmVuY2VDYXB0dXJlLnRzIiwid2VicGFjazovLy8uL1JlbmRlcmluZy9FdmVudERlbGVnYXRvci50cyIsIndlYnBhY2s6Ly8vLi9SZW5kZXJpbmcvRXZlbnRGb3JEb3ROZXQudHMiLCJ3ZWJwYWNrOi8vLy4vUmVuZGVyaW5nL0xvZ2ljYWxFbGVtZW50cy50cyIsIndlYnBhY2s6Ly8vLi9SZW5kZXJpbmcvUmVuZGVyQmF0Y2gvUmVuZGVyQmF0Y2gudHMiLCJ3ZWJwYWNrOi8vLy4vUmVuZGVyaW5nL1JlbmRlckJhdGNoL1NoYXJlZE1lbW9yeVJlbmRlckJhdGNoLnRzIiwid2VicGFjazovLy8uL1JlbmRlcmluZy9SZW5kZXJlci50cyIsIndlYnBhY2s6Ly8vLi9TZXJ2aWNlcy9IdHRwLnRzIiwid2VicGFjazovLy8uL1NlcnZpY2VzL1VyaUhlbHBlci50cyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGRvdG5ldC9qc2ludGVyb3AvZGlzdC9NaWNyb3NvZnQuSlNJbnRlcm9wLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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RUQsNEJBQTRCLEtBQWlCO0lBQzNDLE9BQU8sS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQztBQUMxRSxDQUFDOzs7Ozs7Ozs7Ozs7O0FDaEdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsdUJBQXVCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qix1QkFBdUI7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUMsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELGdMQUFnTCxFQUFFLG9CQUFvQixnTEFBZ0wsRUFBRTtBQUN4YTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3RUFBd0Usa0NBQWtDLEVBQUU7QUFDNUcsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsdUJBQXVCO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0Qix1QkFBdUI7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLDZCQUE2QixFQUFFO0FBQzNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsQ0FBQyx3QkFBd0I7QUFDekIsK0MiLCJmaWxlIjoiY29tcG9uZW50cy53ZWJhc3NlbWJseS5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vQm9vdC5XZWJBc3NlbWJseS50c1wiKTtcbiIsImltcG9ydCAnQGRvdG5ldC9qc2ludGVyb3AnO1xuaW1wb3J0ICcuL0dsb2JhbEV4cG9ydHMnO1xuaW1wb3J0ICogYXMgRW52aXJvbm1lbnQgZnJvbSAnLi9FbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBtb25vUGxhdGZvcm0gfSBmcm9tICcuL1BsYXRmb3JtL01vbm8vTW9ub1BsYXRmb3JtJztcbmltcG9ydCB7IGdldEFzc2VtYmx5TmFtZUZyb21VcmwgfSBmcm9tICcuL1BsYXRmb3JtL1VybCc7XG5pbXBvcnQgeyByZW5kZXJCYXRjaCB9IGZyb20gJy4vUmVuZGVyaW5nL1JlbmRlcmVyJztcbmltcG9ydCB7IFNoYXJlZE1lbW9yeVJlbmRlckJhdGNoIH0gZnJvbSAnLi9SZW5kZXJpbmcvUmVuZGVyQmF0Y2gvU2hhcmVkTWVtb3J5UmVuZGVyQmF0Y2gnO1xuaW1wb3J0IHsgUG9pbnRlciB9IGZyb20gJy4vUGxhdGZvcm0vUGxhdGZvcm0nO1xuaW1wb3J0IHsgZmV0Y2hCb290Q29uZmlnQXN5bmMsIGxvYWRFbWJlZGRlZFJlc291cmNlc0FzeW5jIH0gZnJvbSAnLi9Cb290Q29tbW9uJztcblxuYXN5bmMgZnVuY3Rpb24gYm9vdCgpIHtcbiAgLy8gQ29uZmlndXJlIGVudmlyb25tZW50IGZvciBleGVjdXRpb24gdW5kZXIgTW9ubyBXZWJBc3NlbWJseSB3aXRoIHNoYXJlZC1tZW1vcnkgcmVuZGVyaW5nXG4gIGNvbnN0IHBsYXRmb3JtID0gRW52aXJvbm1lbnQuc2V0UGxhdGZvcm0obW9ub1BsYXRmb3JtKTtcbiAgd2luZG93WydCbGF6b3InXS5wbGF0Zm9ybSA9IHBsYXRmb3JtO1xuICB3aW5kb3dbJ0JsYXpvciddLl9pbnRlcm5hbC5yZW5kZXJCYXRjaCA9IChicm93c2VyUmVuZGVyZXJJZDogbnVtYmVyLCBiYXRjaEFkZHJlc3M6IFBvaW50ZXIpID0+IHtcbiAgICByZW5kZXJCYXRjaChicm93c2VyUmVuZGVyZXJJZCwgbmV3IFNoYXJlZE1lbW9yeVJlbmRlckJhdGNoKGJhdGNoQWRkcmVzcykpO1xuICB9O1xuXG4gIC8vIEZldGNoIHRoZSBib290IEpTT04gZmlsZVxuICBjb25zdCBib290Q29uZmlnID0gYXdhaXQgZmV0Y2hCb290Q29uZmlnQXN5bmMoKTtcbiAgY29uc3QgZW1iZWRkZWRSZXNvdXJjZXNQcm9taXNlID0gbG9hZEVtYmVkZGVkUmVzb3VyY2VzQXN5bmMoYm9vdENvbmZpZyk7XG5cbiAgaWYgKCFib290Q29uZmlnLmxpbmtlckVuYWJsZWQpIHtcbiAgICBjb25zb2xlLmluZm8oJ0JsYXpvciBpcyBydW5uaW5nIGluIGRldiBtb2RlIHdpdGhvdXQgSUwgc3RyaXBwaW5nLiBUbyBtYWtlIHRoZSBidW5kbGUgc2l6ZSBzaWduaWZpY2FudGx5IHNtYWxsZXIsIHB1Ymxpc2ggdGhlIGFwcGxpY2F0aW9uIG9yIHNlZSBodHRwczovL2dvLm1pY3Jvc29mdC5jb20vZndsaW5rLz9saW5raWQ9ODcwNDE0Jyk7XG4gIH1cblxuICAvLyBEZXRlcm1pbmUgdGhlIFVSTHMgb2YgdGhlIGFzc2VtYmxpZXMgd2Ugd2FudCB0byBsb2FkLCB0aGVuIGJlZ2luIGZldGNoaW5nIHRoZW0gYWxsXG4gIGNvbnN0IGxvYWRBc3NlbWJseVVybHMgPSBbYm9vdENvbmZpZy5tYWluXVxuICAgIC5jb25jYXQoYm9vdENvbmZpZy5hc3NlbWJseVJlZmVyZW5jZXMpXG4gICAgLm1hcChmaWxlbmFtZSA9PiBgX2ZyYW1ld29yay9fYmluLyR7ZmlsZW5hbWV9YCk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBwbGF0Zm9ybS5zdGFydChsb2FkQXNzZW1ibHlVcmxzKTtcbiAgfSBjYXRjaCAoZXgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBzdGFydCBwbGF0Zm9ybS4gUmVhc29uOiAke2V4fWApO1xuICB9XG5cbiAgLy8gQmVmb3JlIHdlIHN0YXJ0IHJ1bm5pbmcgLk5FVCBjb2RlLCBiZSBzdXJlIGVtYmVkZGVkIGNvbnRlbnQgcmVzb3VyY2VzIGFyZSBhbGwgbG9hZGVkXG4gIGF3YWl0IGVtYmVkZGVkUmVzb3VyY2VzUHJvbWlzZTtcblxuICAvLyBTdGFydCB1cCB0aGUgYXBwbGljYXRpb25cbiAgY29uc3QgbWFpbkFzc2VtYmx5TmFtZSA9IGdldEFzc2VtYmx5TmFtZUZyb21VcmwoYm9vdENvbmZpZy5tYWluKTtcbiAgcGxhdGZvcm0uY2FsbEVudHJ5UG9pbnQobWFpbkFzc2VtYmx5TmFtZSwgYm9vdENvbmZpZy5lbnRyeVBvaW50LCBbXSk7XG59XG5cbmJvb3QoKTtcbiIsImV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaEJvb3RDb25maWdBc3luYygpIHtcbiAgLy8gTGF0ZXIgd2UgbWlnaHQgbWFrZSB0aGUgbG9jYXRpb24gb2YgdGhpcyBjb25maWd1cmFibGUgKGUuZy4sIGFzIGFuIGF0dHJpYnV0ZSBvbiB0aGUgPHNjcmlwdD5cbiAgLy8gZWxlbWVudCB0aGF0J3MgaW1wb3J0aW5nIHRoaXMgZmlsZSksIGJ1dCBjdXJyZW50bHkgdGhlcmUgaXNuJ3QgYSB1c2UgY2FzZSBmb3IgdGhhdC5cbiAgY29uc3QgYm9vdENvbmZpZ1Jlc3BvbnNlID0gYXdhaXQgZmV0Y2goJ19mcmFtZXdvcmsvYmxhem9yLmJvb3QuanNvbicsIHsgbWV0aG9kOiAnR2V0JywgY3JlZGVudGlhbHM6ICdpbmNsdWRlJyB9KTtcbiAgcmV0dXJuIGJvb3RDb25maWdSZXNwb25zZS5qc29uKCkgYXMgUHJvbWlzZTxCb290SnNvbkRhdGE+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbG9hZEVtYmVkZGVkUmVzb3VyY2VzQXN5bmMoYm9vdENvbmZpZzogQm9vdEpzb25EYXRhKTogUHJvbWlzZTxhbnk+IHtcbiAgY29uc3QgY3NzTG9hZGluZ1Byb21pc2VzID0gYm9vdENvbmZpZy5jc3NSZWZlcmVuY2VzLm1hcChjc3NSZWZlcmVuY2UgPT4ge1xuICAgIGNvbnN0IGxpbmtFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgIGxpbmtFbGVtZW50LnJlbCA9ICdzdHlsZXNoZWV0JztcbiAgICBsaW5rRWxlbWVudC5ocmVmID0gY3NzUmVmZXJlbmNlO1xuICAgIHJldHVybiBsb2FkUmVzb3VyY2VGcm9tRWxlbWVudChsaW5rRWxlbWVudCk7XG4gIH0pO1xuICBjb25zdCBqc0xvYWRpbmdQcm9taXNlcyA9IGJvb3RDb25maWcuanNSZWZlcmVuY2VzLm1hcChqc1JlZmVyZW5jZSA9PiB7XG4gICAgY29uc3Qgc2NyaXB0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgIHNjcmlwdEVsZW1lbnQuc3JjID0ganNSZWZlcmVuY2U7XG4gICAgcmV0dXJuIGxvYWRSZXNvdXJjZUZyb21FbGVtZW50KHNjcmlwdEVsZW1lbnQpO1xuICB9KTtcbiAgcmV0dXJuIFByb21pc2UuYWxsKGNzc0xvYWRpbmdQcm9taXNlcy5jb25jYXQoanNMb2FkaW5nUHJvbWlzZXMpKTtcbn1cblxuZnVuY3Rpb24gbG9hZFJlc291cmNlRnJvbUVsZW1lbnQoZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBlbGVtZW50Lm9ubG9hZCA9IHJlc29sdmU7XG4gICAgZWxlbWVudC5vbmVycm9yID0gcmVqZWN0O1xuICAgIGRvY3VtZW50LmhlYWQhLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICB9KTtcbn1cblxuLy8gS2VlcCBpbiBzeW5jIHdpdGggQm9vdEpzb25EYXRhIGluIE1pY3Jvc29mdC5Bc3BOZXRDb3JlLkJsYXpvci5CdWlsZFxuaW50ZXJmYWNlIEJvb3RKc29uRGF0YSB7XG4gIG1haW46IHN0cmluZztcbiAgZW50cnlQb2ludDogc3RyaW5nO1xuICBhc3NlbWJseVJlZmVyZW5jZXM6IHN0cmluZ1tdO1xuICBjc3NSZWZlcmVuY2VzOiBzdHJpbmdbXTtcbiAganNSZWZlcmVuY2VzOiBzdHJpbmdbXTtcbiAgbGlua2VyRW5hYmxlZDogYm9vbGVhbjtcbn1cbiIsIi8vIEV4cG9zZSBhbiBleHBvcnQgY2FsbGVkICdwbGF0Zm9ybScgb2YgdGhlIGludGVyZmFjZSB0eXBlICdQbGF0Zm9ybScsXG4vLyBzbyB0aGF0IGNvbnN1bWVycyBjYW4gYmUgYWdub3N0aWMgYWJvdXQgd2hpY2ggaW1wbGVtZW50YXRpb24gdGhleSB1c2UuXG4vLyBCYXNpYyBhbHRlcm5hdGl2ZSB0byBoYXZpbmcgYW4gYWN0dWFsIERJIGNvbnRhaW5lci5cbmltcG9ydCB7IFBsYXRmb3JtIH0gZnJvbSAnLi9QbGF0Zm9ybS9QbGF0Zm9ybSc7XG5cbmV4cG9ydCBsZXQgcGxhdGZvcm06IFBsYXRmb3JtO1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0UGxhdGZvcm0ocGxhdGZvcm1JbnN0YW5jZTogUGxhdGZvcm0pIHtcbiAgcGxhdGZvcm0gPSBwbGF0Zm9ybUluc3RhbmNlO1xuICByZXR1cm4gcGxhdGZvcm07XG59XG4iLCJpbXBvcnQgeyBwbGF0Zm9ybSB9IGZyb20gJy4vRW52aXJvbm1lbnQnO1xuaW1wb3J0IHsgbmF2aWdhdGVUbywgaW50ZXJuYWxGdW5jdGlvbnMgYXMgdXJpSGVscGVySW50ZXJuYWxGdW5jdGlvbnMgfSBmcm9tICcuL1NlcnZpY2VzL1VyaUhlbHBlcic7XG5pbXBvcnQgeyBpbnRlcm5hbEZ1bmN0aW9ucyBhcyBodHRwSW50ZXJuYWxGdW5jdGlvbnMgfSBmcm9tICcuL1NlcnZpY2VzL0h0dHAnO1xuaW1wb3J0IHsgYXR0YWNoUm9vdENvbXBvbmVudFRvRWxlbWVudCB9IGZyb20gJy4vUmVuZGVyaW5nL1JlbmRlcmVyJztcbmltcG9ydCB7IFBvaW50ZXIgfSBmcm9tICcuL1BsYXRmb3JtL1BsYXRmb3JtJztcblxuLy8gTWFrZSB0aGUgZm9sbG93aW5nIEFQSXMgYXZhaWxhYmxlIGluIGdsb2JhbCBzY29wZSBmb3IgaW52b2NhdGlvbiBmcm9tIEpTXG53aW5kb3dbJ0JsYXpvciddID0ge1xuICBuYXZpZ2F0ZVRvLFxuXG4gIF9pbnRlcm5hbDoge1xuICAgIGF0dGFjaFJvb3RDb21wb25lbnRUb0VsZW1lbnQsXG4gICAgaHR0cDogaHR0cEludGVybmFsRnVuY3Rpb25zLFxuICAgIHVyaUhlbHBlcjogdXJpSGVscGVySW50ZXJuYWxGdW5jdGlvbnNcbiAgfVxufTtcbiIsImltcG9ydCB7IGdldEFzc2VtYmx5TmFtZUZyb21VcmwsIGdldEZpbGVOYW1lRnJvbVVybCB9IGZyb20gJy4uL1VybCc7XG5cbmNvbnN0IGN1cnJlbnRCcm93c2VySXNDaHJvbWUgPSAod2luZG93IGFzIGFueSkuY2hyb21lXG4gICYmIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignRWRnZScpIDwgMDsgLy8gRWRnZSBwcmV0ZW5kcyB0byBiZSBDaHJvbWVcblxubGV0IGhhc1JlZmVyZW5jZWRQZGJzID0gZmFsc2U7XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNEZWJ1Z2dpbmdFbmFibGVkKCkge1xuICByZXR1cm4gaGFzUmVmZXJlbmNlZFBkYnMgJiYgY3VycmVudEJyb3dzZXJJc0Nocm9tZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaERlYnVnZ2VySG90a2V5KGxvYWRBc3NlbWJseVVybHM6IHN0cmluZ1tdKSB7XG4gIGhhc1JlZmVyZW5jZWRQZGJzID0gbG9hZEFzc2VtYmx5VXJsc1xuICAgIC5zb21lKHVybCA9PiAvXFwucGRiJC8udGVzdChnZXRGaWxlTmFtZUZyb21VcmwodXJsKSkpO1xuXG4gIC8vIFVzZSB0aGUgY29tYmluYXRpb24gc2hpZnQrYWx0K0QgYmVjYXVzZSBpdCBpc24ndCB1c2VkIGJ5IHRoZSBtYWpvciBicm93c2Vyc1xuICAvLyBmb3IgYW55dGhpbmcgZWxzZSBieSBkZWZhdWx0XG4gIGNvbnN0IGFsdEtleU5hbWUgPSBuYXZpZ2F0b3IucGxhdGZvcm0ubWF0Y2goL15NYWMvaSkgPyAnQ21kJyA6ICdBbHQnO1xuICBpZiAoaGFzRGVidWdnaW5nRW5hYmxlZCgpKSB7XG4gICAgY29uc29sZS5pbmZvKGBEZWJ1Z2dpbmcgaG90a2V5OiBTaGlmdCske2FsdEtleU5hbWV9K0QgKHdoZW4gYXBwbGljYXRpb24gaGFzIGZvY3VzKWApO1xuICB9XG5cbiAgLy8gRXZlbiBpZiBkZWJ1Z2dpbmcgaXNuJ3QgZW5hYmxlZCwgd2UgcmVnaXN0ZXIgdGhlIGhvdGtleSBzbyB3ZSBjYW4gcmVwb3J0IHdoeSBpdCdzIG5vdCBlbmFibGVkXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBldnQgPT4ge1xuICAgIGlmIChldnQuc2hpZnRLZXkgJiYgKGV2dC5tZXRhS2V5IHx8IGV2dC5hbHRLZXkpICYmIGV2dC5jb2RlID09PSAnS2V5RCcpIHtcbiAgICAgIGlmICghaGFzUmVmZXJlbmNlZFBkYnMpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignQ2Fubm90IHN0YXJ0IGRlYnVnZ2luZywgYmVjYXVzZSB0aGUgYXBwbGljYXRpb24gd2FzIG5vdCBjb21waWxlZCB3aXRoIGRlYnVnZ2luZyBlbmFibGVkLicpO1xuICAgICAgfSBlbHNlIGlmICghY3VycmVudEJyb3dzZXJJc0Nocm9tZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdDdXJyZW50bHksIG9ubHkgQ2hyb21lIGlzIHN1cHBvcnRlZCBmb3IgZGVidWdnaW5nLicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGF1bmNoRGVidWdnZXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBsYXVuY2hEZWJ1Z2dlcigpIHtcbiAgLy8gVGhlIG5vb3BlbmVyIGZsYWcgaXMgZXNzZW50aWFsLCBiZWNhdXNlIG90aGVyd2lzZSBDaHJvbWUgdHJhY2tzIHRoZSBhc3NvY2lhdGlvbiB3aXRoIHRoZVxuICAvLyBwYXJlbnQgdGFiLCBhbmQgdGhlbiB3aGVuIHRoZSBwYXJlbnQgdGFiIHBhdXNlcyBpbiB0aGUgZGVidWdnZXIsIHRoZSBjaGlsZCB0YWIgZG9lcyBzb1xuICAvLyB0b28gKGV2ZW4gaWYgaXQncyBzaW5jZSBuYXZpZ2F0ZWQgdG8gYSBkaWZmZXJlbnQgcGFnZSkuIFRoaXMgbWVhbnMgdGhhdCB0aGUgZGVidWdnZXJcbiAgLy8gaXRzZWxmIGZyZWV6ZXMsIGFuZCBub3QganVzdCB0aGUgcGFnZSBiZWluZyBkZWJ1Z2dlZC5cbiAgLy9cbiAgLy8gV2UgaGF2ZSB0byBjb25zdHJ1Y3QgYSBsaW5rIGVsZW1lbnQgYW5kIHNpbXVsYXRlIGEgY2xpY2sgb24gaXQsIGJlY2F1c2UgdGhlIG1vcmUgb2J2aW91c1xuICAvLyB3aW5kb3cub3BlbiguLi4sICdub29wZW5lcicpIGFsd2F5cyBvcGVucyBhIG5ldyB3aW5kb3cgaW5zdGVhZCBvZiBhIG5ldyB0YWIuXG4gIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gIGxpbmsuaHJlZiA9IGBfZnJhbWV3b3JrL2RlYnVnP3VybD0ke2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKX1gO1xuICBsaW5rLnRhcmdldCA9ICdfYmxhbmsnO1xuICBsaW5rLnJlbCA9ICdub29wZW5lciBub3JlZmVycmVyJztcbiAgbGluay5jbGljaygpO1xufVxuIiwiaW1wb3J0IHsgTWV0aG9kSGFuZGxlLCBTeXN0ZW1fT2JqZWN0LCBTeXN0ZW1fU3RyaW5nLCBTeXN0ZW1fQXJyYXksIFBvaW50ZXIsIFBsYXRmb3JtIH0gZnJvbSAnLi4vUGxhdGZvcm0nO1xuaW1wb3J0IHsgZ2V0RmlsZU5hbWVGcm9tVXJsIH0gZnJvbSAnLi4vVXJsJztcbmltcG9ydCB7IGF0dGFjaERlYnVnZ2VySG90a2V5LCBoYXNEZWJ1Z2dpbmdFbmFibGVkIH0gZnJvbSAnLi9Nb25vRGVidWdnZXInO1xuXG5jb25zdCBhc3NlbWJseUhhbmRsZUNhY2hlOiB7IFthc3NlbWJseU5hbWU6IHN0cmluZ106IG51bWJlciB9ID0ge307XG5jb25zdCB0eXBlSGFuZGxlQ2FjaGU6IHsgW2Z1bGx5UXVhbGlmaWVkVHlwZU5hbWU6IHN0cmluZ106IG51bWJlciB9ID0ge307XG5jb25zdCBtZXRob2RIYW5kbGVDYWNoZTogeyBbZnVsbHlRdWFsaWZpZWRNZXRob2ROYW1lOiBzdHJpbmddOiBNZXRob2RIYW5kbGUgfSA9IHt9O1xuXG5sZXQgYXNzZW1ibHlfbG9hZDogKGFzc2VtYmx5TmFtZTogc3RyaW5nKSA9PiBudW1iZXI7XG5sZXQgZmluZF9jbGFzczogKGFzc2VtYmx5SGFuZGxlOiBudW1iZXIsIG5hbWVzcGFjZTogc3RyaW5nLCBjbGFzc05hbWU6IHN0cmluZykgPT4gbnVtYmVyO1xubGV0IGZpbmRfbWV0aG9kOiAodHlwZUhhbmRsZTogbnVtYmVyLCBtZXRob2ROYW1lOiBzdHJpbmcsIHVua25vd25Bcmc6IG51bWJlcikgPT4gTWV0aG9kSGFuZGxlO1xubGV0IGludm9rZV9tZXRob2Q6IChtZXRob2Q6IE1ldGhvZEhhbmRsZSwgdGFyZ2V0OiBTeXN0ZW1fT2JqZWN0LCBhcmdzQXJyYXlQdHI6IG51bWJlciwgZXhjZXB0aW9uRmxhZ0ludFB0cjogbnVtYmVyKSA9PiBTeXN0ZW1fT2JqZWN0O1xubGV0IG1vbm9fc3RyaW5nX2dldF91dGY4OiAobWFuYWdlZFN0cmluZzogU3lzdGVtX1N0cmluZykgPT4gTW9uby5VdGY4UHRyO1xubGV0IG1vbm9fc3RyaW5nOiAoanNTdHJpbmc6IHN0cmluZykgPT4gU3lzdGVtX1N0cmluZztcbmNvbnN0IGFwcEJpbkRpck5hbWUgPSAnYXBwQmluRGlyJztcblxuZXhwb3J0IGNvbnN0IG1vbm9QbGF0Zm9ybTogUGxhdGZvcm0gPSB7XG4gIHN0YXJ0OiBmdW5jdGlvbiBzdGFydChsb2FkQXNzZW1ibHlVcmxzOiBzdHJpbmdbXSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBhdHRhY2hEZWJ1Z2dlckhvdGtleShsb2FkQXNzZW1ibHlVcmxzKTtcblxuICAgICAgLy8gbW9uby5qcyBhc3N1bWVzIHRoZSBleGlzdGVuY2Ugb2YgdGhpc1xuICAgICAgd2luZG93WydCcm93c2VyJ10gPSB7XG4gICAgICAgIGluaXQ6ICgpID0+IHsgfVxuICAgICAgfTtcbiAgICAgIC8vIEVtc2NyaXB0ZW4gd29ya3MgYnkgZXhwZWN0aW5nIHRoZSBtb2R1bGUgY29uZmlnIHRvIGJlIGEgZ2xvYmFsXG4gICAgICB3aW5kb3dbJ01vZHVsZSddID0gY3JlYXRlRW1zY3JpcHRlbk1vZHVsZUluc3RhbmNlKGxvYWRBc3NlbWJseVVybHMsIHJlc29sdmUsIHJlamVjdCk7XG5cbiAgICAgIGFkZFNjcmlwdFRhZ3NUb0RvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0sXG5cbiAgZmluZE1ldGhvZDogZmluZE1ldGhvZCxcblxuICBjYWxsRW50cnlQb2ludDogZnVuY3Rpb24gY2FsbEVudHJ5UG9pbnQoYXNzZW1ibHlOYW1lOiBzdHJpbmcsIGVudHJ5cG9pbnRNZXRob2Q6IHN0cmluZywgYXJnczogU3lzdGVtX09iamVjdFtdKTogdm9pZCB7XG4gICAgLy8gUGFyc2UgdGhlIGVudHJ5cG9pbnRNZXRob2QsIHdoaWNoIGlzIG9mIHRoZSBmb3JtIE15QXBwLk15TmFtZXNwYWNlLk15VHlwZU5hbWU6Ok15TWV0aG9kTmFtZVxuICAgIC8vIE5vdGUgdGhhdCB3ZSBkb24ndCBzdXBwb3J0IHNwZWNpZnlpbmcgYSBtZXRob2Qgb3ZlcmxvYWQsIHNvIGl0IGhhcyB0byBiZSB1bmlxdWVcbiAgICBjb25zdCBlbnRyeXBvaW50U2VnbWVudHMgPSBlbnRyeXBvaW50TWV0aG9kLnNwbGl0KCc6OicpO1xuICAgIGlmIChlbnRyeXBvaW50U2VnbWVudHMubGVuZ3RoICE9IDIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWFsZm9ybWVkIGVudHJ5IHBvaW50IG1ldGhvZCBuYW1lOyBjb3VsZCBub3QgcmVzb2x2ZSBjbGFzcyBuYW1lIGFuZCBtZXRob2QgbmFtZS4nKTtcbiAgICB9XG4gICAgY29uc3QgdHlwZUZ1bGxOYW1lID0gZW50cnlwb2ludFNlZ21lbnRzWzBdO1xuICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBlbnRyeXBvaW50U2VnbWVudHNbMV07XG4gICAgY29uc3QgbGFzdERvdCA9IHR5cGVGdWxsTmFtZS5sYXN0SW5kZXhPZignLicpO1xuICAgIGNvbnN0IG5hbWVzcGFjZSA9IGxhc3REb3QgPiAtMSA/IHR5cGVGdWxsTmFtZS5zdWJzdHJpbmcoMCwgbGFzdERvdCkgOiAnJztcbiAgICBjb25zdCB0eXBlU2hvcnROYW1lID0gbGFzdERvdCA+IC0xID8gdHlwZUZ1bGxOYW1lLnN1YnN0cmluZyhsYXN0RG90ICsgMSkgOiB0eXBlRnVsbE5hbWU7XG5cbiAgICBjb25zdCBlbnRyeVBvaW50TWV0aG9kSGFuZGxlID0gbW9ub1BsYXRmb3JtLmZpbmRNZXRob2QoYXNzZW1ibHlOYW1lLCBuYW1lc3BhY2UsIHR5cGVTaG9ydE5hbWUsIG1ldGhvZE5hbWUpO1xuICAgIG1vbm9QbGF0Zm9ybS5jYWxsTWV0aG9kKGVudHJ5UG9pbnRNZXRob2RIYW5kbGUsIG51bGwsIGFyZ3MpO1xuICB9LFxuXG4gIGNhbGxNZXRob2Q6IGZ1bmN0aW9uIGNhbGxNZXRob2QobWV0aG9kOiBNZXRob2RIYW5kbGUsIHRhcmdldDogU3lzdGVtX09iamVjdCwgYXJnczogU3lzdGVtX09iamVjdFtdKTogU3lzdGVtX09iamVjdCB7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID4gNCkge1xuICAgICAgLy8gSG9wZWZ1bGx5IHRoaXMgcmVzdHJpY3Rpb24gY2FuIGJlIGVhc2VkIHNvb24sIGJ1dCBmb3Igbm93IG1ha2UgaXQgY2xlYXIgd2hhdCdzIGdvaW5nIG9uXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEN1cnJlbnRseSwgTW9ub1BsYXRmb3JtIHN1cHBvcnRzIHBhc3NpbmcgYSBtYXhpbXVtIG9mIDQgYXJndW1lbnRzIGZyb20gSlMgdG8gLk5FVC4gWW91IHRyaWVkIHRvIHBhc3MgJHthcmdzLmxlbmd0aH0uYCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhY2sgPSBNb2R1bGUuc3RhY2tTYXZlKCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgYXJnc0J1ZmZlciA9IE1vZHVsZS5zdGFja0FsbG9jKGFyZ3MubGVuZ3RoKTtcbiAgICAgIGNvbnN0IGV4Y2VwdGlvbkZsYWdNYW5hZ2VkSW50ID0gTW9kdWxlLnN0YWNrQWxsb2MoNCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgTW9kdWxlLnNldFZhbHVlKGFyZ3NCdWZmZXIgKyBpICogNCwgYXJnc1tpXSwgJ2kzMicpO1xuICAgICAgfVxuICAgICAgTW9kdWxlLnNldFZhbHVlKGV4Y2VwdGlvbkZsYWdNYW5hZ2VkSW50LCAwLCAnaTMyJyk7XG5cbiAgICAgIGNvbnN0IHJlcyA9IGludm9rZV9tZXRob2QobWV0aG9kLCB0YXJnZXQsIGFyZ3NCdWZmZXIsIGV4Y2VwdGlvbkZsYWdNYW5hZ2VkSW50KTtcblxuICAgICAgaWYgKE1vZHVsZS5nZXRWYWx1ZShleGNlcHRpb25GbGFnTWFuYWdlZEludCwgJ2kzMicpICE9PSAwKSB7XG4gICAgICAgIC8vIElmIHRoZSBleGNlcHRpb24gZmxhZyBpcyBzZXQsIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBleGNlcHRpb24uVG9TdHJpbmcoKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobW9ub1BsYXRmb3JtLnRvSmF2YVNjcmlwdFN0cmluZyg8U3lzdGVtX1N0cmluZz5yZXMpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9IGZpbmFsbHkge1xuICAgICAgTW9kdWxlLnN0YWNrUmVzdG9yZShzdGFjayk7XG4gICAgfVxuICB9LFxuXG4gIHRvSmF2YVNjcmlwdFN0cmluZzogZnVuY3Rpb24gdG9KYXZhU2NyaXB0U3RyaW5nKG1hbmFnZWRTdHJpbmc6IFN5c3RlbV9TdHJpbmcpIHtcbiAgICAvLyBDb21tZW50cyBmcm9tIG9yaWdpbmFsIE1vbm8gc2FtcGxlOlxuICAgIC8vRklYTUUgdGhpcyBpcyB3YXN0ZWZ1bGwsIHdlIGNvdWxkIHJlbW92ZSB0aGUgdGVtcCBtYWxsb2MgYnkgZ29pbmcgdGhlIFVURjE2IHJvdXRlXG4gICAgLy9GSVhNRSB0aGlzIGlzIHVuc2FmZSwgY3V6IHJhdyBvYmplY3RzIGNvdWxkIGJlIEdDJ2QuXG5cbiAgICBjb25zdCB1dGY4ID0gbW9ub19zdHJpbmdfZ2V0X3V0ZjgobWFuYWdlZFN0cmluZyk7XG4gICAgY29uc3QgcmVzID0gTW9kdWxlLlVURjhUb1N0cmluZyh1dGY4KTtcbiAgICBNb2R1bGUuX2ZyZWUodXRmOCBhcyBhbnkpO1xuICAgIHJldHVybiByZXM7XG4gIH0sXG5cbiAgdG9Eb3ROZXRTdHJpbmc6IGZ1bmN0aW9uIHRvRG90TmV0U3RyaW5nKGpzU3RyaW5nOiBzdHJpbmcpOiBTeXN0ZW1fU3RyaW5nIHtcbiAgICByZXR1cm4gbW9ub19zdHJpbmcoanNTdHJpbmcpO1xuICB9LFxuXG4gIHRvVWludDhBcnJheTogZnVuY3Rpb24gdG9VaW50OEFycmF5KGFycmF5OiBTeXN0ZW1fQXJyYXk8YW55Pik6IFVpbnQ4QXJyYXkge1xuICAgIGNvbnN0IGRhdGFQdHIgPSBnZXRBcnJheURhdGFQb2ludGVyKGFycmF5KTtcbiAgICBjb25zdCBsZW5ndGggPSBNb2R1bGUuZ2V0VmFsdWUoZGF0YVB0ciwgJ2kzMicpO1xuICAgIHJldHVybiBuZXcgVWludDhBcnJheShNb2R1bGUuSEVBUFU4LmJ1ZmZlciwgZGF0YVB0ciArIDQsIGxlbmd0aCk7XG4gIH0sXG5cbiAgZ2V0QXJyYXlMZW5ndGg6IGZ1bmN0aW9uIGdldEFycmF5TGVuZ3RoKGFycmF5OiBTeXN0ZW1fQXJyYXk8YW55Pik6IG51bWJlciB7XG4gICAgcmV0dXJuIE1vZHVsZS5nZXRWYWx1ZShnZXRBcnJheURhdGFQb2ludGVyKGFycmF5KSwgJ2kzMicpO1xuICB9LFxuXG4gIGdldEFycmF5RW50cnlQdHI6IGZ1bmN0aW9uIGdldEFycmF5RW50cnlQdHI8VFB0ciBleHRlbmRzIFBvaW50ZXI+KGFycmF5OiBTeXN0ZW1fQXJyYXk8VFB0cj4sIGluZGV4OiBudW1iZXIsIGl0ZW1TaXplOiBudW1iZXIpOiBUUHRyIHtcbiAgICAvLyBGaXJzdCBieXRlIGlzIGFycmF5IGxlbmd0aCwgZm9sbG93ZWQgYnkgZW50cmllc1xuICAgIGNvbnN0IGFkZHJlc3MgPSBnZXRBcnJheURhdGFQb2ludGVyKGFycmF5KSArIDQgKyBpbmRleCAqIGl0ZW1TaXplO1xuICAgIHJldHVybiBhZGRyZXNzIGFzIGFueSBhcyBUUHRyO1xuICB9LFxuXG4gIGdldE9iamVjdEZpZWxkc0Jhc2VBZGRyZXNzOiBmdW5jdGlvbiBnZXRPYmplY3RGaWVsZHNCYXNlQWRkcmVzcyhyZWZlcmVuY2VUeXBlZE9iamVjdDogU3lzdGVtX09iamVjdCk6IFBvaW50ZXIge1xuICAgIC8vIFRoZSBmaXJzdCB0d28gaW50MzIgdmFsdWVzIGFyZSBpbnRlcm5hbCBNb25vIGRhdGFcbiAgICByZXR1cm4gKHJlZmVyZW5jZVR5cGVkT2JqZWN0IGFzIGFueSBhcyBudW1iZXIgKyA4KSBhcyBhbnkgYXMgUG9pbnRlcjtcbiAgfSxcblxuICByZWFkSW50MzJGaWVsZDogZnVuY3Rpb24gcmVhZEhlYXBJbnQzMihiYXNlQWRkcmVzczogUG9pbnRlciwgZmllbGRPZmZzZXQ/OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBNb2R1bGUuZ2V0VmFsdWUoKGJhc2VBZGRyZXNzIGFzIGFueSBhcyBudW1iZXIpICsgKGZpZWxkT2Zmc2V0IHx8IDApLCAnaTMyJyk7XG4gIH0sXG5cbiAgcmVhZEZsb2F0RmllbGQ6IGZ1bmN0aW9uIHJlYWRIZWFwRmxvYXQoYmFzZUFkZHJlc3M6IFBvaW50ZXIsIGZpZWxkT2Zmc2V0PzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTW9kdWxlLmdldFZhbHVlKChiYXNlQWRkcmVzcyBhcyBhbnkgYXMgbnVtYmVyKSArIChmaWVsZE9mZnNldCB8fCAwKSwgJ2Zsb2F0Jyk7XG4gIH0sXG5cbiAgcmVhZE9iamVjdEZpZWxkOiBmdW5jdGlvbiByZWFkSGVhcE9iamVjdDxUIGV4dGVuZHMgU3lzdGVtX09iamVjdD4oYmFzZUFkZHJlc3M6IFBvaW50ZXIsIGZpZWxkT2Zmc2V0PzogbnVtYmVyKTogVCB7XG4gICAgcmV0dXJuIE1vZHVsZS5nZXRWYWx1ZSgoYmFzZUFkZHJlc3MgYXMgYW55IGFzIG51bWJlcikgKyAoZmllbGRPZmZzZXQgfHwgMCksICdpMzInKSBhcyBhbnkgYXMgVDtcbiAgfSxcblxuICByZWFkU3RyaW5nRmllbGQ6IGZ1bmN0aW9uIHJlYWRIZWFwT2JqZWN0KGJhc2VBZGRyZXNzOiBQb2ludGVyLCBmaWVsZE9mZnNldD86IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IGZpZWxkVmFsdWUgPSBNb2R1bGUuZ2V0VmFsdWUoKGJhc2VBZGRyZXNzIGFzIGFueSBhcyBudW1iZXIpICsgKGZpZWxkT2Zmc2V0IHx8IDApLCAnaTMyJyk7XG4gICAgcmV0dXJuIGZpZWxkVmFsdWUgPT09IDAgPyBudWxsIDogbW9ub1BsYXRmb3JtLnRvSmF2YVNjcmlwdFN0cmluZyhmaWVsZFZhbHVlIGFzIGFueSBhcyBTeXN0ZW1fU3RyaW5nKTtcbiAgfSxcblxuICByZWFkU3RydWN0RmllbGQ6IGZ1bmN0aW9uIHJlYWRTdHJ1Y3RGaWVsZDxUIGV4dGVuZHMgUG9pbnRlcj4oYmFzZUFkZHJlc3M6IFBvaW50ZXIsIGZpZWxkT2Zmc2V0PzogbnVtYmVyKTogVCB7XG4gICAgcmV0dXJuICgoYmFzZUFkZHJlc3MgYXMgYW55IGFzIG51bWJlcikgKyAoZmllbGRPZmZzZXQgfHwgMCkpIGFzIGFueSBhcyBUO1xuICB9LFxufTtcblxuZnVuY3Rpb24gZmluZEFzc2VtYmx5KGFzc2VtYmx5TmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgbGV0IGFzc2VtYmx5SGFuZGxlID0gYXNzZW1ibHlIYW5kbGVDYWNoZVthc3NlbWJseU5hbWVdO1xuICBpZiAoIWFzc2VtYmx5SGFuZGxlKSB7XG4gICAgYXNzZW1ibHlIYW5kbGUgPSBhc3NlbWJseV9sb2FkKGFzc2VtYmx5TmFtZSk7XG4gICAgaWYgKCFhc3NlbWJseUhhbmRsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBhc3NlbWJseSBcIiR7YXNzZW1ibHlOYW1lfVwiYCk7XG4gICAgfVxuICAgIGFzc2VtYmx5SGFuZGxlQ2FjaGVbYXNzZW1ibHlOYW1lXSA9IGFzc2VtYmx5SGFuZGxlO1xuICB9XG4gIHJldHVybiBhc3NlbWJseUhhbmRsZTtcbn1cblxuZnVuY3Rpb24gZmluZFR5cGUoYXNzZW1ibHlOYW1lOiBzdHJpbmcsIG5hbWVzcGFjZTogc3RyaW5nLCBjbGFzc05hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUgPSBgWyR7YXNzZW1ibHlOYW1lfV0ke25hbWVzcGFjZX0uJHtjbGFzc05hbWV9YDtcbiAgbGV0IHR5cGVIYW5kbGUgPSB0eXBlSGFuZGxlQ2FjaGVbZnVsbHlRdWFsaWZpZWRUeXBlTmFtZV07XG4gIGlmICghdHlwZUhhbmRsZSkge1xuICAgIHR5cGVIYW5kbGUgPSBmaW5kX2NsYXNzKGZpbmRBc3NlbWJseShhc3NlbWJseU5hbWUpLCBuYW1lc3BhY2UsIGNsYXNzTmFtZSk7XG4gICAgaWYgKCF0eXBlSGFuZGxlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIHR5cGUgXCIke2NsYXNzTmFtZX1cIiBpbiBuYW1lc3BhY2UgXCIke25hbWVzcGFjZX1cIiBpbiBhc3NlbWJseSBcIiR7YXNzZW1ibHlOYW1lfVwiYCk7XG4gICAgfVxuICAgIHR5cGVIYW5kbGVDYWNoZVtmdWxseVF1YWxpZmllZFR5cGVOYW1lXSA9IHR5cGVIYW5kbGU7XG4gIH1cbiAgcmV0dXJuIHR5cGVIYW5kbGU7XG59XG5cbmZ1bmN0aW9uIGZpbmRNZXRob2QoYXNzZW1ibHlOYW1lOiBzdHJpbmcsIG5hbWVzcGFjZTogc3RyaW5nLCBjbGFzc05hbWU6IHN0cmluZywgbWV0aG9kTmFtZTogc3RyaW5nKTogTWV0aG9kSGFuZGxlIHtcbiAgY29uc3QgZnVsbHlRdWFsaWZpZWRNZXRob2ROYW1lID0gYFske2Fzc2VtYmx5TmFtZX1dJHtuYW1lc3BhY2V9LiR7Y2xhc3NOYW1lfTo6JHttZXRob2ROYW1lfWA7XG4gIGxldCBtZXRob2RIYW5kbGUgPSBtZXRob2RIYW5kbGVDYWNoZVtmdWxseVF1YWxpZmllZE1ldGhvZE5hbWVdO1xuICBpZiAoIW1ldGhvZEhhbmRsZSkge1xuICAgIG1ldGhvZEhhbmRsZSA9IGZpbmRfbWV0aG9kKGZpbmRUeXBlKGFzc2VtYmx5TmFtZSwgbmFtZXNwYWNlLCBjbGFzc05hbWUpLCBtZXRob2ROYW1lLCAtMSk7XG4gICAgaWYgKCFtZXRob2RIYW5kbGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgbWV0aG9kIFwiJHttZXRob2ROYW1lfVwiIG9uIHR5cGUgXCIke25hbWVzcGFjZX0uJHtjbGFzc05hbWV9XCJgKTtcbiAgICB9XG4gICAgbWV0aG9kSGFuZGxlQ2FjaGVbZnVsbHlRdWFsaWZpZWRNZXRob2ROYW1lXSA9IG1ldGhvZEhhbmRsZTtcbiAgfVxuICByZXR1cm4gbWV0aG9kSGFuZGxlO1xufVxuXG5mdW5jdGlvbiBhZGRTY3JpcHRUYWdzVG9Eb2N1bWVudCgpIHtcbiAgY29uc3QgYnJvd3NlclN1cHBvcnRzTmF0aXZlV2ViQXNzZW1ibHkgPSB0eXBlb2YgV2ViQXNzZW1ibHkgIT09ICd1bmRlZmluZWQnICYmIFdlYkFzc2VtYmx5LnZhbGlkYXRlO1xuICBpZiAoIWJyb3dzZXJTdXBwb3J0c05hdGl2ZVdlYkFzc2VtYmx5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBXZWJBc3NlbWJseS4nKTtcbiAgfVxuXG4gIGNvbnN0IHNjcmlwdEVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgc2NyaXB0RWxlbS5zcmMgPSAnX2ZyYW1ld29yay93YXNtL21vbm8uanMnO1xuICBzY3JpcHRFbGVtLmRlZmVyID0gdHJ1ZTtcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzY3JpcHRFbGVtKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRW1zY3JpcHRlbk1vZHVsZUluc3RhbmNlKGxvYWRBc3NlbWJseVVybHM6IHN0cmluZ1tdLCBvblJlYWR5OiAoKSA9PiB2b2lkLCBvbkVycm9yOiAocmVhc29uPzogYW55KSA9PiB2b2lkKSB7XG4gIGNvbnN0IG1vZHVsZSA9IHt9IGFzIHR5cGVvZiBNb2R1bGU7XG4gIGNvbnN0IHdhc21CaW5hcnlGaWxlID0gJ19mcmFtZXdvcmsvd2FzbS9tb25vLndhc20nO1xuICBjb25zdCBzdXBwcmVzc01lc3NhZ2VzID0gWydERUJVR0dJTkcgRU5BQkxFRCddO1xuXG4gIG1vZHVsZS5wcmludCA9IGxpbmUgPT4gKHN1cHByZXNzTWVzc2FnZXMuaW5kZXhPZihsaW5lKSA8IDAgJiYgY29uc29sZS5sb2coYFdBU006ICR7bGluZX1gKSk7XG4gIG1vZHVsZS5wcmludEVyciA9IGxpbmUgPT4gY29uc29sZS5lcnJvcihgV0FTTTogJHtsaW5lfWApO1xuICBtb2R1bGUucHJlUnVuID0gW107XG4gIG1vZHVsZS5wb3N0UnVuID0gW107XG4gIG1vZHVsZS5wcmVsb2FkUGx1Z2lucyA9IFtdO1xuXG4gIG1vZHVsZS5sb2NhdGVGaWxlID0gZmlsZU5hbWUgPT4ge1xuICAgIHN3aXRjaCAoZmlsZU5hbWUpIHtcbiAgICAgIGNhc2UgJ21vbm8ud2FzbSc6IHJldHVybiB3YXNtQmluYXJ5RmlsZTtcbiAgICAgIGRlZmF1bHQ6IHJldHVybiBmaWxlTmFtZTtcbiAgICB9XG4gIH07XG5cbiAgbW9kdWxlLnByZVJ1bi5wdXNoKCgpID0+IHtcbiAgICAvLyBCeSBub3csIGVtc2NyaXB0ZW4gc2hvdWxkIGJlIGluaXRpYWxpc2VkIGVub3VnaCB0aGF0IHdlIGNhbiBjYXB0dXJlIHRoZXNlIG1ldGhvZHMgZm9yIGxhdGVyIHVzZVxuICAgIGNvbnN0IG1vbm9fd2FzbV9hZGRfYXNzZW1ibHkgPSBNb2R1bGUuY3dyYXAoJ21vbm9fd2FzbV9hZGRfYXNzZW1ibHknLCBudWxsLCBbJ3N0cmluZycsICdudW1iZXInLCAnbnVtYmVyJ10pO1xuICAgIGFzc2VtYmx5X2xvYWQgPSBNb2R1bGUuY3dyYXAoJ21vbm9fd2FzbV9hc3NlbWJseV9sb2FkJywgJ251bWJlcicsIFsnc3RyaW5nJ10pO1xuICAgIGZpbmRfY2xhc3MgPSBNb2R1bGUuY3dyYXAoJ21vbm9fd2FzbV9hc3NlbWJseV9maW5kX2NsYXNzJywgJ251bWJlcicsIFsnbnVtYmVyJywgJ3N0cmluZycsICdzdHJpbmcnXSk7XG4gICAgZmluZF9tZXRob2QgPSBNb2R1bGUuY3dyYXAoJ21vbm9fd2FzbV9hc3NlbWJseV9maW5kX21ldGhvZCcsICdudW1iZXInLCBbJ251bWJlcicsICdzdHJpbmcnLCAnbnVtYmVyJ10pO1xuICAgIGludm9rZV9tZXRob2QgPSBNb2R1bGUuY3dyYXAoJ21vbm9fd2FzbV9pbnZva2VfbWV0aG9kJywgJ251bWJlcicsIFsnbnVtYmVyJywgJ251bWJlcicsICdudW1iZXInXSk7XG4gICAgbW9ub19zdHJpbmdfZ2V0X3V0ZjggPSBNb2R1bGUuY3dyYXAoJ21vbm9fd2FzbV9zdHJpbmdfZ2V0X3V0ZjgnLCAnbnVtYmVyJywgWydudW1iZXInXSk7XG4gICAgbW9ub19zdHJpbmcgPSBNb2R1bGUuY3dyYXAoJ21vbm9fd2FzbV9zdHJpbmdfZnJvbV9qcycsICdudW1iZXInLCBbJ3N0cmluZyddKTtcblxuICAgIE1PTk8ubG9hZGVkX2ZpbGVzID0gW107XG5cbiAgICBsb2FkQXNzZW1ibHlVcmxzLmZvckVhY2godXJsID0+IHtcbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gZ2V0RmlsZU5hbWVGcm9tVXJsKHVybCk7XG4gICAgICBjb25zdCBydW5EZXBlbmRlbmN5SWQgPSBgYmxhem9yOiR7ZmlsZW5hbWV9YDtcbiAgICAgIGFkZFJ1bkRlcGVuZGVuY3kocnVuRGVwZW5kZW5jeUlkKTtcbiAgICAgIGFzeW5jTG9hZCh1cmwpLnRoZW4oXG4gICAgICAgIGRhdGEgPT4ge1xuICAgICAgICAgIGNvbnN0IGhlYXBBZGRyZXNzID0gTW9kdWxlLl9tYWxsb2MoZGF0YS5sZW5ndGgpO1xuICAgICAgICAgIGNvbnN0IGhlYXBNZW1vcnkgPSBuZXcgVWludDhBcnJheShNb2R1bGUuSEVBUFU4LmJ1ZmZlciwgaGVhcEFkZHJlc3MsIGRhdGEubGVuZ3RoKTtcbiAgICAgICAgICBoZWFwTWVtb3J5LnNldChkYXRhKTtcbiAgICAgICAgICBtb25vX3dhc21fYWRkX2Fzc2VtYmx5KGZpbGVuYW1lLCBoZWFwQWRkcmVzcywgZGF0YS5sZW5ndGgpO1xuICAgICAgICAgIE1PTk8ubG9hZGVkX2ZpbGVzLnB1c2godG9BYnNvbHV0ZVVybCh1cmwpKTtcbiAgICAgICAgICByZW1vdmVSdW5EZXBlbmRlbmN5KHJ1bkRlcGVuZGVuY3lJZCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9ySW5mbyA9PiB7XG4gICAgICAgICAgLy8gSWYgaXQncyBhIDQwNCBvbiBhIC5wZGIsIHdlIGRvbid0IHdhbnQgdG8gYmxvY2sgdGhlIGFwcCBmcm9tIHN0YXJ0aW5nIHVwLlxuICAgICAgICAgIC8vIFdlJ2xsIGp1c3Qgc2tpcCB0aGF0IGZpbGUgYW5kIGNvbnRpbnVlICh0aG91Z2ggdGhlIDQwNCBpcyBsb2dnZWQgaW4gdGhlIGNvbnNvbGUpLlxuICAgICAgICAgIC8vIFRoaXMgaGFwcGVucyBpZiB5b3UgYnVpbGQgYSBEZWJ1ZyBidWlsZCBidXQgdGhlbiBydW4gaW4gUHJvZHVjdGlvbiBlbnZpcm9ubWVudC5cbiAgICAgICAgICBjb25zdCBpc1BkYjQwNCA9IGVycm9ySW5mbyBpbnN0YW5jZW9mIFhNTEh0dHBSZXF1ZXN0XG4gICAgICAgICAgICAmJiBlcnJvckluZm8uc3RhdHVzID09PSA0MDRcbiAgICAgICAgICAgICYmIGZpbGVuYW1lLm1hdGNoKC9cXC5wZGIkLyk7XG4gICAgICAgICAgaWYgKCFpc1BkYjQwNCkge1xuICAgICAgICAgICAgb25FcnJvcihlcnJvckluZm8pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZW1vdmVSdW5EZXBlbmRlbmN5KHJ1bkRlcGVuZGVuY3lJZCk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIG1vZHVsZS5wb3N0UnVuLnB1c2goKCkgPT4ge1xuICAgIGNvbnN0IGxvYWRfcnVudGltZSA9IE1vZHVsZS5jd3JhcCgnbW9ub193YXNtX2xvYWRfcnVudGltZScsIG51bGwsIFsnc3RyaW5nJywgJ251bWJlciddKTtcbiAgICBsb2FkX3J1bnRpbWUoYXBwQmluRGlyTmFtZSwgaGFzRGVidWdnaW5nRW5hYmxlZCgpID8gMSA6IDApO1xuICAgIE1PTk8ubW9ub193YXNtX3J1bnRpbWVfaXNfcmVhZHkgPSB0cnVlO1xuICAgIGF0dGFjaEludGVyb3BJbnZva2VyKCk7XG4gICAgb25SZWFkeSgpO1xuICB9KTtcblxuICByZXR1cm4gbW9kdWxlO1xufVxuXG5jb25zdCBhbmNob3JUYWdGb3JBYnNvbHV0ZVVybENvbnZlcnNpb25zID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuZnVuY3Rpb24gdG9BYnNvbHV0ZVVybChwb3NzaWJseVJlbGF0aXZlVXJsOiBzdHJpbmcpIHtcbiAgYW5jaG9yVGFnRm9yQWJzb2x1dGVVcmxDb252ZXJzaW9ucy5ocmVmID0gcG9zc2libHlSZWxhdGl2ZVVybDtcbiAgcmV0dXJuIGFuY2hvclRhZ0ZvckFic29sdXRlVXJsQ29udmVyc2lvbnMuaHJlZjtcbn1cblxuZnVuY3Rpb24gYXN5bmNMb2FkKHVybCkge1xuICByZXR1cm4gbmV3IFByb21pc2U8VWludDhBcnJheT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3Q7XG4gICAgeGhyLm9wZW4oJ0dFVCcsIHVybCwgLyogYXN5bmM6ICovIHRydWUpO1xuICAgIHhoci5yZXNwb25zZVR5cGUgPSAnYXJyYXlidWZmZXInO1xuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbiB4aHJfb25sb2FkKCkge1xuICAgICAgaWYgKHhoci5zdGF0dXMgPT0gMjAwIHx8IHhoci5zdGF0dXMgPT0gMCAmJiB4aHIucmVzcG9uc2UpIHtcbiAgICAgICAgdmFyIGFzbSA9IG5ldyBVaW50OEFycmF5KHhoci5yZXNwb25zZSk7XG4gICAgICAgIHJlc29sdmUoYXNtKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlamVjdCh4aHIpO1xuICAgICAgfVxuICAgIH07XG4gICAgeGhyLm9uZXJyb3IgPSByZWplY3Q7XG4gICAgeGhyLnNlbmQodW5kZWZpbmVkKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldEFycmF5RGF0YVBvaW50ZXI8VD4oYXJyYXk6IFN5c3RlbV9BcnJheTxUPik6IG51bWJlciB7XG4gIHJldHVybiA8bnVtYmVyPjxhbnk+YXJyYXkgKyAxMjsgLy8gRmlyc3QgYnl0ZSBmcm9tIGhlcmUgaXMgbGVuZ3RoLCB0aGVuIGZvbGxvd2luZyBieXRlcyBhcmUgZW50cmllc1xufVxuXG5mdW5jdGlvbiBhdHRhY2hJbnRlcm9wSW52b2tlcigpIHtcbiAgY29uc3QgZG90TmV0RGlzcGF0Y2hlckludm9rZU1ldGhvZEhhbmRsZSA9IGZpbmRNZXRob2QoJ01vbm8uV2ViQXNzZW1ibHkuSW50ZXJvcCcsICdNb25vLldlYkFzc2VtYmx5LkludGVyb3AnLCAnTW9ub1dlYkFzc2VtYmx5SlNSdW50aW1lJywgJ0ludm9rZURvdE5ldCcpO1xuICBjb25zdCBkb3ROZXREaXNwYXRjaGVyQmVnaW5JbnZva2VNZXRob2RIYW5kbGUgPSBmaW5kTWV0aG9kKCdNb25vLldlYkFzc2VtYmx5LkludGVyb3AnLCAnTW9uby5XZWJBc3NlbWJseS5JbnRlcm9wJywgJ01vbm9XZWJBc3NlbWJseUpTUnVudGltZScsICdCZWdpbkludm9rZURvdE5ldCcpO1xuXG4gIERvdE5ldC5hdHRhY2hEaXNwYXRjaGVyKHtcbiAgICBiZWdpbkludm9rZURvdE5ldEZyb21KUzogKGNhbGxJZCwgYXNzZW1ibHlOYW1lLCBtZXRob2RJZGVudGlmaWVyLCBkb3ROZXRPYmplY3RJZCwgYXJnc0pzb24pID0+IHtcbiAgICAgIC8vIEFzIGEgY3VycmVudCBsaW1pdGF0aW9uLCB3ZSBjYW4gb25seSBwYXNzIDQgYXJncy4gRm9ydHVuYXRlbHkgd2Ugb25seSBuZWVkIG9uZSBvZlxuICAgICAgLy8gJ2Fzc2VtYmx5TmFtZScgb3IgJ2RvdE5ldE9iamVjdElkJywgc28gb3ZlcmxvYWQgdGhlbSBpbiBhIHNpbmdsZSBzbG90XG4gICAgICBjb25zdCBhc3NlbWJseU5hbWVPckRvdE5ldE9iamVjdElkID0gZG90TmV0T2JqZWN0SWRcbiAgICAgICAgPyBkb3ROZXRPYmplY3RJZC50b1N0cmluZygpXG4gICAgICAgIDogYXNzZW1ibHlOYW1lO1xuICAgICAgXG4gICAgICBtb25vUGxhdGZvcm0uY2FsbE1ldGhvZChkb3ROZXREaXNwYXRjaGVyQmVnaW5JbnZva2VNZXRob2RIYW5kbGUsIG51bGwsIFtcbiAgICAgICAgY2FsbElkID8gbW9ub1BsYXRmb3JtLnRvRG90TmV0U3RyaW5nKGNhbGxJZC50b1N0cmluZygpKSA6IG51bGwsXG4gICAgICAgIG1vbm9QbGF0Zm9ybS50b0RvdE5ldFN0cmluZyhhc3NlbWJseU5hbWVPckRvdE5ldE9iamVjdElkISksXG4gICAgICAgIG1vbm9QbGF0Zm9ybS50b0RvdE5ldFN0cmluZyhtZXRob2RJZGVudGlmaWVyKSxcbiAgICAgICAgbW9ub1BsYXRmb3JtLnRvRG90TmV0U3RyaW5nKGFyZ3NKc29uKVxuICAgICAgXSk7XG4gICAgfSxcblxuICAgIGludm9rZURvdE5ldEZyb21KUzogKGFzc2VtYmx5TmFtZSwgbWV0aG9kSWRlbnRpZmllciwgZG90TmV0T2JqZWN0SWQsIGFyZ3NKc29uKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHRKc29uU3RyaW5nUHRyID0gbW9ub1BsYXRmb3JtLmNhbGxNZXRob2QoZG90TmV0RGlzcGF0Y2hlckludm9rZU1ldGhvZEhhbmRsZSwgbnVsbCwgW1xuICAgICAgICBhc3NlbWJseU5hbWUgPyBtb25vUGxhdGZvcm0udG9Eb3ROZXRTdHJpbmcoYXNzZW1ibHlOYW1lKSA6IG51bGwsXG4gICAgICAgIG1vbm9QbGF0Zm9ybS50b0RvdE5ldFN0cmluZyhtZXRob2RJZGVudGlmaWVyKSxcbiAgICAgICAgZG90TmV0T2JqZWN0SWQgPyBtb25vUGxhdGZvcm0udG9Eb3ROZXRTdHJpbmcoZG90TmV0T2JqZWN0SWQudG9TdHJpbmcoKSkgOiBudWxsLFxuICAgICAgICBtb25vUGxhdGZvcm0udG9Eb3ROZXRTdHJpbmcoYXJnc0pzb24pXG4gICAgICBdKSBhcyBTeXN0ZW1fU3RyaW5nO1xuICAgICAgcmV0dXJuIHJlc3VsdEpzb25TdHJpbmdQdHJcbiAgICAgICAgPyBtb25vUGxhdGZvcm0udG9KYXZhU2NyaXB0U3RyaW5nKHJlc3VsdEpzb25TdHJpbmdQdHIpXG4gICAgICAgIDogbnVsbDtcbiAgICB9LFxuICB9KTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBnZXRGaWxlTmFtZUZyb21VcmwodXJsOiBzdHJpbmcpIHtcbiAgLy8gVGhpcyBjb3VsZCBhbHNvIGJlIGNhbGxlZCBcImdldCBsYXN0IHBhdGggc2VnbWVudCBmcm9tIFVSTFwiLCBidXQgdGhlIHByaW1hcnlcbiAgLy8gdXNlIGNhc2UgaXMgdG8gZXh0cmFjdCB0aGluZ3MgdGhhdCBsb29rIGxpa2UgZmlsZW5hbWVzXG4gIGNvbnN0IGxhc3RTZWdtZW50ID0gdXJsLnN1YnN0cmluZyh1cmwubGFzdEluZGV4T2YoJy8nKSArIDEpO1xuICBjb25zdCBxdWVyeVN0cmluZ1N0YXJ0UG9zID0gbGFzdFNlZ21lbnQuaW5kZXhPZignPycpO1xuICByZXR1cm4gcXVlcnlTdHJpbmdTdGFydFBvcyA8IDAgPyBsYXN0U2VnbWVudCA6IGxhc3RTZWdtZW50LnN1YnN0cmluZygwLCBxdWVyeVN0cmluZ1N0YXJ0UG9zKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFzc2VtYmx5TmFtZUZyb21VcmwodXJsOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGdldEZpbGVOYW1lRnJvbVVybCh1cmwpLnJlcGxhY2UoL1xcLmRsbCQvLCAnJyk7XG59XG4iLCJpbXBvcnQgeyBSZW5kZXJCYXRjaCwgQXJyYXlTZWdtZW50LCBSZW5kZXJUcmVlRWRpdCwgUmVuZGVyVHJlZUZyYW1lLCBFZGl0VHlwZSwgRnJhbWVUeXBlLCBBcnJheVZhbHVlcyB9IGZyb20gJy4vUmVuZGVyQmF0Y2gvUmVuZGVyQmF0Y2gnO1xuaW1wb3J0IHsgRXZlbnREZWxlZ2F0b3IgfSBmcm9tICcuL0V2ZW50RGVsZWdhdG9yJztcbmltcG9ydCB7IEV2ZW50Rm9yRG90TmV0LCBVSUV2ZW50QXJncyB9IGZyb20gJy4vRXZlbnRGb3JEb3ROZXQnO1xuaW1wb3J0IHsgTG9naWNhbEVsZW1lbnQsIHRvTG9naWNhbEVsZW1lbnQsIGluc2VydExvZ2ljYWxDaGlsZCwgcmVtb3ZlTG9naWNhbENoaWxkLCBnZXRMb2dpY2FsUGFyZW50LCBnZXRMb2dpY2FsQ2hpbGQsIGNyZWF0ZUFuZEluc2VydExvZ2ljYWxDb250YWluZXIsIGlzU3ZnRWxlbWVudCB9IGZyb20gJy4vTG9naWNhbEVsZW1lbnRzJztcbmltcG9ydCB7IGFwcGx5Q2FwdHVyZUlkVG9FbGVtZW50IH0gZnJvbSAnLi9FbGVtZW50UmVmZXJlbmNlQ2FwdHVyZSc7XG5jb25zdCBzZWxlY3RWYWx1ZVByb3BuYW1lID0gJ19ibGF6b3JTZWxlY3RWYWx1ZSc7XG5jb25zdCBzaGFyZWRUZW1wbGF0ZUVsZW1Gb3JQYXJzaW5nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTtcbmNvbnN0IHNoYXJlZFN2Z0VsZW1Gb3JQYXJzaW5nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdnJyk7XG5jb25zdCBwcmV2ZW50RGVmYXVsdEV2ZW50czogeyBbZXZlbnRUeXBlOiBzdHJpbmddOiBib29sZWFuIH0gPSB7IHN1Ym1pdDogdHJ1ZSB9O1xuY29uc3Qgcm9vdENvbXBvbmVudHNQZW5kaW5nRmlyc3RSZW5kZXI6IHsgW2NvbXBvbmVudElkOiBudW1iZXJdOiBFbGVtZW50IH0gPSB7fTtcblxuZXhwb3J0IGNsYXNzIEJyb3dzZXJSZW5kZXJlciB7XG4gIHByaXZhdGUgZXZlbnREZWxlZ2F0b3I6IEV2ZW50RGVsZWdhdG9yO1xuICBwcml2YXRlIGNoaWxkQ29tcG9uZW50TG9jYXRpb25zOiB7IFtjb21wb25lbnRJZDogbnVtYmVyXTogTG9naWNhbEVsZW1lbnQgfSA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYnJvd3NlclJlbmRlcmVySWQ6IG51bWJlcikge1xuICAgIHRoaXMuZXZlbnREZWxlZ2F0b3IgPSBuZXcgRXZlbnREZWxlZ2F0b3IoKGV2ZW50LCBldmVudEhhbmRsZXJJZCwgZXZlbnRBcmdzKSA9PiB7XG4gICAgICByYWlzZUV2ZW50KGV2ZW50LCB0aGlzLmJyb3dzZXJSZW5kZXJlcklkLCBldmVudEhhbmRsZXJJZCwgZXZlbnRBcmdzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhdHRhY2hSb290Q29tcG9uZW50VG9FbGVtZW50KGNvbXBvbmVudElkOiBudW1iZXIsIGVsZW1lbnQ6IEVsZW1lbnQpIHtcbiAgICAvLyAnYWxsb3dFeGlzdGluZ0NvbnRlbnRzJyB0byBrZWVwIGFueSBwcmVyZW5kZXJlZCBjb250ZW50IHVudGlsIHdlIGRvIHRoZSBmaXJzdCBjbGllbnQtc2lkZSByZW5kZXJcbiAgICB0aGlzLmF0dGFjaENvbXBvbmVudFRvRWxlbWVudChjb21wb25lbnRJZCwgdG9Mb2dpY2FsRWxlbWVudChlbGVtZW50LCAvKiBhbGxvd0V4aXN0aW5nQ29udGVudHMgKi8gdHJ1ZSkpO1xuICAgIHJvb3RDb21wb25lbnRzUGVuZGluZ0ZpcnN0UmVuZGVyW2NvbXBvbmVudElkXSA9IGVsZW1lbnQ7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlQ29tcG9uZW50KGJhdGNoOiBSZW5kZXJCYXRjaCwgY29tcG9uZW50SWQ6IG51bWJlciwgZWRpdHM6IEFycmF5U2VnbWVudDxSZW5kZXJUcmVlRWRpdD4sIHJlZmVyZW5jZUZyYW1lczogQXJyYXlWYWx1ZXM8UmVuZGVyVHJlZUZyYW1lPikge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmNoaWxkQ29tcG9uZW50TG9jYXRpb25zW2NvbXBvbmVudElkXTtcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gZWxlbWVudCBpcyBjdXJyZW50bHkgYXNzb2NpYXRlZCB3aXRoIGNvbXBvbmVudCAke2NvbXBvbmVudElkfWApO1xuICAgIH1cblxuICAgIC8vIE9uIHRoZSBmaXJzdCByZW5kZXIgZm9yIGVhY2ggcm9vdCBjb21wb25lbnQsIGNsZWFyIGFueSBleGlzdGluZyBjb250ZW50IChlLmcuLCBwcmVyZW5kZXJlZClcbiAgICBjb25zdCByb290RWxlbWVudFRvQ2xlYXIgPSByb290Q29tcG9uZW50c1BlbmRpbmdGaXJzdFJlbmRlcltjb21wb25lbnRJZF07XG4gICAgaWYgKHJvb3RFbGVtZW50VG9DbGVhcikge1xuICAgICAgZGVsZXRlIHJvb3RDb21wb25lbnRzUGVuZGluZ0ZpcnN0UmVuZGVyW2NvbXBvbmVudElkXTtcbiAgICAgIGNsZWFyRWxlbWVudChyb290RWxlbWVudFRvQ2xlYXIpO1xuICAgIH1cblxuICAgIHRoaXMuYXBwbHlFZGl0cyhiYXRjaCwgZWxlbWVudCwgMCwgZWRpdHMsIHJlZmVyZW5jZUZyYW1lcyk7XG4gIH1cblxuICBwdWJsaWMgZGlzcG9zZUNvbXBvbmVudChjb21wb25lbnRJZDogbnVtYmVyKSB7XG4gICAgZGVsZXRlIHRoaXMuY2hpbGRDb21wb25lbnRMb2NhdGlvbnNbY29tcG9uZW50SWRdO1xuICB9XG5cbiAgcHVibGljIGRpc3Bvc2VFdmVudEhhbmRsZXIoZXZlbnRIYW5kbGVySWQ6IG51bWJlcikge1xuICAgIHRoaXMuZXZlbnREZWxlZ2F0b3IucmVtb3ZlTGlzdGVuZXIoZXZlbnRIYW5kbGVySWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhdHRhY2hDb21wb25lbnRUb0VsZW1lbnQoY29tcG9uZW50SWQ6IG51bWJlciwgZWxlbWVudDogTG9naWNhbEVsZW1lbnQpIHtcbiAgICB0aGlzLmNoaWxkQ29tcG9uZW50TG9jYXRpb25zW2NvbXBvbmVudElkXSA9IGVsZW1lbnQ7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5RWRpdHMoYmF0Y2g6IFJlbmRlckJhdGNoLCBwYXJlbnQ6IExvZ2ljYWxFbGVtZW50LCBjaGlsZEluZGV4OiBudW1iZXIsIGVkaXRzOiBBcnJheVNlZ21lbnQ8UmVuZGVyVHJlZUVkaXQ+LCByZWZlcmVuY2VGcmFtZXM6IEFycmF5VmFsdWVzPFJlbmRlclRyZWVGcmFtZT4pIHtcbiAgICBsZXQgY3VycmVudERlcHRoID0gMDtcbiAgICBsZXQgY2hpbGRJbmRleEF0Q3VycmVudERlcHRoID0gY2hpbGRJbmRleDtcblxuICAgIGNvbnN0IGFycmF5U2VnbWVudFJlYWRlciA9IGJhdGNoLmFycmF5U2VnbWVudFJlYWRlcjtcbiAgICBjb25zdCBlZGl0UmVhZGVyID0gYmF0Y2guZWRpdFJlYWRlcjtcbiAgICBjb25zdCBmcmFtZVJlYWRlciA9IGJhdGNoLmZyYW1lUmVhZGVyO1xuICAgIGNvbnN0IGVkaXRzVmFsdWVzID0gYXJyYXlTZWdtZW50UmVhZGVyLnZhbHVlcyhlZGl0cyk7XG4gICAgY29uc3QgZWRpdHNPZmZzZXQgPSBhcnJheVNlZ21lbnRSZWFkZXIub2Zmc2V0KGVkaXRzKTtcbiAgICBjb25zdCBlZGl0c0xlbmd0aCA9IGFycmF5U2VnbWVudFJlYWRlci5jb3VudChlZGl0cyk7XG4gICAgY29uc3QgbWF4RWRpdEluZGV4RXhjbCA9IGVkaXRzT2Zmc2V0ICsgZWRpdHNMZW5ndGg7XG5cbiAgICBmb3IgKGxldCBlZGl0SW5kZXggPSBlZGl0c09mZnNldDsgZWRpdEluZGV4IDwgbWF4RWRpdEluZGV4RXhjbDsgZWRpdEluZGV4KyspIHtcbiAgICAgIGNvbnN0IGVkaXQgPSBiYXRjaC5kaWZmUmVhZGVyLmVkaXRzRW50cnkoZWRpdHNWYWx1ZXMsIGVkaXRJbmRleCk7XG4gICAgICBjb25zdCBlZGl0VHlwZSA9IGVkaXRSZWFkZXIuZWRpdFR5cGUoZWRpdCk7XG4gICAgICBzd2l0Y2ggKGVkaXRUeXBlKSB7XG4gICAgICAgIGNhc2UgRWRpdFR5cGUucHJlcGVuZEZyYW1lOiB7XG4gICAgICAgICAgY29uc3QgZnJhbWVJbmRleCA9IGVkaXRSZWFkZXIubmV3VHJlZUluZGV4KGVkaXQpO1xuICAgICAgICAgIGNvbnN0IGZyYW1lID0gYmF0Y2gucmVmZXJlbmNlRnJhbWVzRW50cnkocmVmZXJlbmNlRnJhbWVzLCBmcmFtZUluZGV4KTtcbiAgICAgICAgICBjb25zdCBzaWJsaW5nSW5kZXggPSBlZGl0UmVhZGVyLnNpYmxpbmdJbmRleChlZGl0KTtcbiAgICAgICAgICB0aGlzLmluc2VydEZyYW1lKGJhdGNoLCBwYXJlbnQsIGNoaWxkSW5kZXhBdEN1cnJlbnREZXB0aCArIHNpYmxpbmdJbmRleCwgcmVmZXJlbmNlRnJhbWVzLCBmcmFtZSwgZnJhbWVJbmRleCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBFZGl0VHlwZS5yZW1vdmVGcmFtZToge1xuICAgICAgICAgIGNvbnN0IHNpYmxpbmdJbmRleCA9IGVkaXRSZWFkZXIuc2libGluZ0luZGV4KGVkaXQpO1xuICAgICAgICAgIHJlbW92ZUxvZ2ljYWxDaGlsZChwYXJlbnQsIGNoaWxkSW5kZXhBdEN1cnJlbnREZXB0aCArIHNpYmxpbmdJbmRleCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBFZGl0VHlwZS5zZXRBdHRyaWJ1dGU6IHtcbiAgICAgICAgICBjb25zdCBmcmFtZUluZGV4ID0gZWRpdFJlYWRlci5uZXdUcmVlSW5kZXgoZWRpdCk7XG4gICAgICAgICAgY29uc3QgZnJhbWUgPSBiYXRjaC5yZWZlcmVuY2VGcmFtZXNFbnRyeShyZWZlcmVuY2VGcmFtZXMsIGZyYW1lSW5kZXgpO1xuICAgICAgICAgIGNvbnN0IHNpYmxpbmdJbmRleCA9IGVkaXRSZWFkZXIuc2libGluZ0luZGV4KGVkaXQpO1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBnZXRMb2dpY2FsQ2hpbGQocGFyZW50LCBjaGlsZEluZGV4QXRDdXJyZW50RGVwdGggKyBzaWJsaW5nSW5kZXgpO1xuICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5hcHBseUF0dHJpYnV0ZShiYXRjaCwgZWxlbWVudCwgZnJhbWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBzZXQgYXR0cmlidXRlIG9uIG5vbi1lbGVtZW50IGNoaWxkYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgRWRpdFR5cGUucmVtb3ZlQXR0cmlidXRlOiB7XG4gICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGRvbid0IGhhdmUgdG8gZGlzcG9zZSB0aGUgaW5mbyB3ZSB0cmFjayBhYm91dCBldmVudCBoYW5kbGVycyBoZXJlLCBiZWNhdXNlIHRoZVxuICAgICAgICAgIC8vIGRpc3Bvc2VkIGV2ZW50IGhhbmRsZXIgSURzIGFyZSBkZWxpdmVyZWQgc2VwYXJhdGVseSAoaW4gdGhlICdkaXNwb3NlZEV2ZW50SGFuZGxlcklkcycgYXJyYXkpXG4gICAgICAgICAgY29uc3Qgc2libGluZ0luZGV4ID0gZWRpdFJlYWRlci5zaWJsaW5nSW5kZXgoZWRpdCk7XG4gICAgICAgICAgY29uc3QgZWxlbWVudCA9IGdldExvZ2ljYWxDaGlsZChwYXJlbnQsIGNoaWxkSW5kZXhBdEN1cnJlbnREZXB0aCArIHNpYmxpbmdJbmRleCk7XG4gICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgYXR0cmlidXRlTmFtZSA9IGVkaXRSZWFkZXIucmVtb3ZlZEF0dHJpYnV0ZU5hbWUoZWRpdCkhO1xuICAgICAgICAgICAgLy8gRmlyc3QgdHJ5IHRvIHJlbW92ZSBhbnkgc3BlY2lhbCBwcm9wZXJ0eSB3ZSB1c2UgZm9yIHRoaXMgYXR0cmlidXRlXG4gICAgICAgICAgICBpZiAoIXRoaXMudHJ5QXBwbHlTcGVjaWFsUHJvcGVydHkoYmF0Y2gsIGVsZW1lbnQsIGF0dHJpYnV0ZU5hbWUsIG51bGwpKSB7XG4gICAgICAgICAgICAgIC8vIElmIHRoYXQncyBub3QgYXBwbGljYWJsZSwgaXQncyBhIHJlZ3VsYXIgRE9NIGF0dHJpYnV0ZSBzbyByZW1vdmUgdGhhdFxuICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVtb3ZlIGF0dHJpYnV0ZSBmcm9tIG5vbi1lbGVtZW50IGNoaWxkYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgRWRpdFR5cGUudXBkYXRlVGV4dDoge1xuICAgICAgICAgIGNvbnN0IGZyYW1lSW5kZXggPSBlZGl0UmVhZGVyLm5ld1RyZWVJbmRleChlZGl0KTtcbiAgICAgICAgICBjb25zdCBmcmFtZSA9IGJhdGNoLnJlZmVyZW5jZUZyYW1lc0VudHJ5KHJlZmVyZW5jZUZyYW1lcywgZnJhbWVJbmRleCk7XG4gICAgICAgICAgY29uc3Qgc2libGluZ0luZGV4ID0gZWRpdFJlYWRlci5zaWJsaW5nSW5kZXgoZWRpdCk7XG4gICAgICAgICAgY29uc3QgdGV4dE5vZGUgPSBnZXRMb2dpY2FsQ2hpbGQocGFyZW50LCBjaGlsZEluZGV4QXRDdXJyZW50RGVwdGggKyBzaWJsaW5nSW5kZXgpO1xuICAgICAgICAgIGlmICh0ZXh0Tm9kZSBpbnN0YW5jZW9mIFRleHQpIHtcbiAgICAgICAgICAgIHRleHROb2RlLnRleHRDb250ZW50ID0gZnJhbWVSZWFkZXIudGV4dENvbnRlbnQoZnJhbWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBzZXQgdGV4dCBjb250ZW50IG9uIG5vbi10ZXh0IGNoaWxkYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgRWRpdFR5cGUudXBkYXRlTWFya3VwOiB7XG4gICAgICAgICAgY29uc3QgZnJhbWVJbmRleCA9IGVkaXRSZWFkZXIubmV3VHJlZUluZGV4KGVkaXQpO1xuICAgICAgICAgIGNvbnN0IGZyYW1lID0gYmF0Y2gucmVmZXJlbmNlRnJhbWVzRW50cnkocmVmZXJlbmNlRnJhbWVzLCBmcmFtZUluZGV4KTtcbiAgICAgICAgICBjb25zdCBzaWJsaW5nSW5kZXggPSBlZGl0UmVhZGVyLnNpYmxpbmdJbmRleChlZGl0KTtcbiAgICAgICAgICByZW1vdmVMb2dpY2FsQ2hpbGQocGFyZW50LCBjaGlsZEluZGV4QXRDdXJyZW50RGVwdGggKyBzaWJsaW5nSW5kZXgpO1xuICAgICAgICAgIHRoaXMuaW5zZXJ0TWFya3VwKGJhdGNoLCBwYXJlbnQsIGNoaWxkSW5kZXhBdEN1cnJlbnREZXB0aCArIHNpYmxpbmdJbmRleCwgZnJhbWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgRWRpdFR5cGUuc3RlcEluOiB7XG4gICAgICAgICAgY29uc3Qgc2libGluZ0luZGV4ID0gZWRpdFJlYWRlci5zaWJsaW5nSW5kZXgoZWRpdCk7XG4gICAgICAgICAgcGFyZW50ID0gZ2V0TG9naWNhbENoaWxkKHBhcmVudCwgY2hpbGRJbmRleEF0Q3VycmVudERlcHRoICsgc2libGluZ0luZGV4KTtcbiAgICAgICAgICBjdXJyZW50RGVwdGgrKztcbiAgICAgICAgICBjaGlsZEluZGV4QXRDdXJyZW50RGVwdGggPSAwO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgRWRpdFR5cGUuc3RlcE91dDoge1xuICAgICAgICAgIHBhcmVudCA9IGdldExvZ2ljYWxQYXJlbnQocGFyZW50KSE7XG4gICAgICAgICAgY3VycmVudERlcHRoLS07XG4gICAgICAgICAgY2hpbGRJbmRleEF0Q3VycmVudERlcHRoID0gY3VycmVudERlcHRoID09PSAwID8gY2hpbGRJbmRleCA6IDA7IC8vIFRoZSBjaGlsZEluZGV4IGlzIG9ubHkgZXZlciBub256ZXJvIGF0IHplcm8gZGVwdGhcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgY29uc3QgdW5rbm93blR5cGU6IG5ldmVyID0gZWRpdFR5cGU7IC8vIENvbXBpbGUtdGltZSB2ZXJpZmljYXRpb24gdGhhdCB0aGUgc3dpdGNoIHdhcyBleGhhdXN0aXZlXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGVkaXQgdHlwZTogJHt1bmtub3duVHlwZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5zZXJ0RnJhbWUoYmF0Y2g6IFJlbmRlckJhdGNoLCBwYXJlbnQ6IExvZ2ljYWxFbGVtZW50LCBjaGlsZEluZGV4OiBudW1iZXIsIGZyYW1lczogQXJyYXlWYWx1ZXM8UmVuZGVyVHJlZUZyYW1lPiwgZnJhbWU6IFJlbmRlclRyZWVGcmFtZSwgZnJhbWVJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBmcmFtZVJlYWRlciA9IGJhdGNoLmZyYW1lUmVhZGVyO1xuICAgIGNvbnN0IGZyYW1lVHlwZSA9IGZyYW1lUmVhZGVyLmZyYW1lVHlwZShmcmFtZSk7XG4gICAgc3dpdGNoIChmcmFtZVR5cGUpIHtcbiAgICAgIGNhc2UgRnJhbWVUeXBlLmVsZW1lbnQ6XG4gICAgICAgIHRoaXMuaW5zZXJ0RWxlbWVudChiYXRjaCwgcGFyZW50LCBjaGlsZEluZGV4LCBmcmFtZXMsIGZyYW1lLCBmcmFtZUluZGV4KTtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICBjYXNlIEZyYW1lVHlwZS50ZXh0OlxuICAgICAgICB0aGlzLmluc2VydFRleHQoYmF0Y2gsIHBhcmVudCwgY2hpbGRJbmRleCwgZnJhbWUpO1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIGNhc2UgRnJhbWVUeXBlLmF0dHJpYnV0ZTpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdHRyaWJ1dGUgZnJhbWVzIHNob3VsZCBvbmx5IGJlIHByZXNlbnQgYXMgbGVhZGluZyBjaGlsZHJlbiBvZiBlbGVtZW50IGZyYW1lcy4nKTtcbiAgICAgIGNhc2UgRnJhbWVUeXBlLmNvbXBvbmVudDpcbiAgICAgICAgdGhpcy5pbnNlcnRDb21wb25lbnQoYmF0Y2gsIHBhcmVudCwgY2hpbGRJbmRleCwgZnJhbWUpO1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIGNhc2UgRnJhbWVUeXBlLnJlZ2lvbjpcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0RnJhbWVSYW5nZShiYXRjaCwgcGFyZW50LCBjaGlsZEluZGV4LCBmcmFtZXMsIGZyYW1lSW5kZXggKyAxLCBmcmFtZUluZGV4ICsgZnJhbWVSZWFkZXIuc3VidHJlZUxlbmd0aChmcmFtZSkpO1xuICAgICAgY2FzZSBGcmFtZVR5cGUuZWxlbWVudFJlZmVyZW5jZUNhcHR1cmU6XG4gICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICAgICAgYXBwbHlDYXB0dXJlSWRUb0VsZW1lbnQocGFyZW50LCBmcmFtZVJlYWRlci5lbGVtZW50UmVmZXJlbmNlQ2FwdHVyZUlkKGZyYW1lKSEpO1xuICAgICAgICAgIHJldHVybiAwOyAvLyBBIFwiY2FwdHVyZVwiIGlzIGEgY2hpbGQgaW4gdGhlIGRpZmYsIGJ1dCBoYXMgbm8gbm9kZSBpbiB0aGUgRE9NXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWZlcmVuY2UgY2FwdHVyZSBmcmFtZXMgY2FuIG9ubHkgYmUgY2hpbGRyZW4gb2YgZWxlbWVudCBmcmFtZXMuJyk7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgRnJhbWVUeXBlLm1hcmt1cDpcbiAgICAgICAgdGhpcy5pbnNlcnRNYXJrdXAoYmF0Y2gsIHBhcmVudCwgY2hpbGRJbmRleCwgZnJhbWUpO1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGNvbnN0IHVua25vd25UeXBlOiBuZXZlciA9IGZyYW1lVHlwZTsgLy8gQ29tcGlsZS10aW1lIHZlcmlmaWNhdGlvbiB0aGF0IHRoZSBzd2l0Y2ggd2FzIGV4aGF1c3RpdmVcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGZyYW1lIHR5cGU6ICR7dW5rbm93blR5cGV9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbnNlcnRFbGVtZW50KGJhdGNoOiBSZW5kZXJCYXRjaCwgcGFyZW50OiBMb2dpY2FsRWxlbWVudCwgY2hpbGRJbmRleDogbnVtYmVyLCBmcmFtZXM6IEFycmF5VmFsdWVzPFJlbmRlclRyZWVGcmFtZT4sIGZyYW1lOiBSZW5kZXJUcmVlRnJhbWUsIGZyYW1lSW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IGZyYW1lUmVhZGVyID0gYmF0Y2guZnJhbWVSZWFkZXI7XG4gICAgY29uc3QgdGFnTmFtZSA9IGZyYW1lUmVhZGVyLmVsZW1lbnROYW1lKGZyYW1lKSE7XG4gICAgY29uc3QgbmV3RG9tRWxlbWVudFJhdyA9IHRhZ05hbWUgPT09ICdzdmcnIHx8IGlzU3ZnRWxlbWVudChwYXJlbnQpID9cbiAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCB0YWdOYW1lKSA6XG4gICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpO1xuICAgIGNvbnN0IG5ld0VsZW1lbnQgPSB0b0xvZ2ljYWxFbGVtZW50KG5ld0RvbUVsZW1lbnRSYXcpO1xuICAgIGluc2VydExvZ2ljYWxDaGlsZChuZXdEb21FbGVtZW50UmF3LCBwYXJlbnQsIGNoaWxkSW5kZXgpO1xuXG4gICAgLy8gQXBwbHkgYXR0cmlidXRlc1xuICAgIGNvbnN0IGRlc2NlbmRhbnRzRW5kSW5kZXhFeGNsID0gZnJhbWVJbmRleCArIGZyYW1lUmVhZGVyLnN1YnRyZWVMZW5ndGgoZnJhbWUpO1xuICAgIGZvciAobGV0IGRlc2NlbmRhbnRJbmRleCA9IGZyYW1lSW5kZXggKyAxOyBkZXNjZW5kYW50SW5kZXggPCBkZXNjZW5kYW50c0VuZEluZGV4RXhjbDsgZGVzY2VuZGFudEluZGV4KyspIHtcbiAgICAgIGNvbnN0IGRlc2NlbmRhbnRGcmFtZSA9IGJhdGNoLnJlZmVyZW5jZUZyYW1lc0VudHJ5KGZyYW1lcywgZGVzY2VuZGFudEluZGV4KTtcbiAgICAgIGlmIChmcmFtZVJlYWRlci5mcmFtZVR5cGUoZGVzY2VuZGFudEZyYW1lKSA9PT0gRnJhbWVUeXBlLmF0dHJpYnV0ZSkge1xuICAgICAgICB0aGlzLmFwcGx5QXR0cmlidXRlKGJhdGNoLCBuZXdEb21FbGVtZW50UmF3LCBkZXNjZW5kYW50RnJhbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQXMgc29vbiBhcyB3ZSBzZWUgYSBub24tYXR0cmlidXRlIGNoaWxkLCBhbGwgdGhlIHN1YnNlcXVlbnQgY2hpbGQgZnJhbWVzIGFyZVxuICAgICAgICAvLyBub3QgYXR0cmlidXRlcywgc28gYmFpbCBvdXQgYW5kIGluc2VydCB0aGUgcmVtbmFudHMgcmVjdXJzaXZlbHlcbiAgICAgICAgdGhpcy5pbnNlcnRGcmFtZVJhbmdlKGJhdGNoLCBuZXdFbGVtZW50LCAwLCBmcmFtZXMsIGRlc2NlbmRhbnRJbmRleCwgZGVzY2VuZGFudHNFbmRJbmRleEV4Y2wpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluc2VydENvbXBvbmVudChiYXRjaDogUmVuZGVyQmF0Y2gsIHBhcmVudDogTG9naWNhbEVsZW1lbnQsIGNoaWxkSW5kZXg6IG51bWJlciwgZnJhbWU6IFJlbmRlclRyZWVGcmFtZSkge1xuICAgIGNvbnN0IGNvbnRhaW5lckVsZW1lbnQgPSBjcmVhdGVBbmRJbnNlcnRMb2dpY2FsQ29udGFpbmVyKHBhcmVudCwgY2hpbGRJbmRleCk7XG5cbiAgICAvLyBBbGwgd2UgaGF2ZSB0byBkbyBpcyBhc3NvY2lhdGUgdGhlIGNoaWxkIGNvbXBvbmVudCBJRCB3aXRoIGl0cyBsb2NhdGlvbi4gV2UgZG9uJ3QgYWN0dWFsbHlcbiAgICAvLyBkbyBhbnkgcmVuZGVyaW5nIGhlcmUsIGJlY2F1c2UgdGhlIGRpZmYgZm9yIHRoZSBjaGlsZCB3aWxsIGFwcGVhciBsYXRlciBpbiB0aGUgcmVuZGVyIGJhdGNoLlxuICAgIGNvbnN0IGNoaWxkQ29tcG9uZW50SWQgPSBiYXRjaC5mcmFtZVJlYWRlci5jb21wb25lbnRJZChmcmFtZSk7XG4gICAgdGhpcy5hdHRhY2hDb21wb25lbnRUb0VsZW1lbnQoY2hpbGRDb21wb25lbnRJZCwgY29udGFpbmVyRWxlbWVudCk7XG4gIH1cblxuICBwcml2YXRlIGluc2VydFRleHQoYmF0Y2g6IFJlbmRlckJhdGNoLCBwYXJlbnQ6IExvZ2ljYWxFbGVtZW50LCBjaGlsZEluZGV4OiBudW1iZXIsIHRleHRGcmFtZTogUmVuZGVyVHJlZUZyYW1lKSB7XG4gICAgY29uc3QgdGV4dENvbnRlbnQgPSBiYXRjaC5mcmFtZVJlYWRlci50ZXh0Q29udGVudCh0ZXh0RnJhbWUpITtcbiAgICBjb25zdCBuZXdUZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHRDb250ZW50KTtcbiAgICBpbnNlcnRMb2dpY2FsQ2hpbGQobmV3VGV4dE5vZGUsIHBhcmVudCwgY2hpbGRJbmRleCk7XG4gIH1cblxuICBwcml2YXRlIGluc2VydE1hcmt1cChiYXRjaDogUmVuZGVyQmF0Y2gsIHBhcmVudDogTG9naWNhbEVsZW1lbnQsIGNoaWxkSW5kZXg6IG51bWJlciwgbWFya3VwRnJhbWU6IFJlbmRlclRyZWVGcmFtZSkge1xuICAgIGNvbnN0IG1hcmt1cENvbnRhaW5lciA9IGNyZWF0ZUFuZEluc2VydExvZ2ljYWxDb250YWluZXIocGFyZW50LCBjaGlsZEluZGV4KTtcblxuICAgIGNvbnN0IG1hcmt1cENvbnRlbnQgPSBiYXRjaC5mcmFtZVJlYWRlci5tYXJrdXBDb250ZW50KG1hcmt1cEZyYW1lKTtcbiAgICBjb25zdCBwYXJzZWRNYXJrdXAgPSBwYXJzZU1hcmt1cChtYXJrdXBDb250ZW50LCBpc1N2Z0VsZW1lbnQocGFyZW50KSk7XG4gICAgbGV0IGxvZ2ljYWxTaWJsaW5nSW5kZXggPSAwO1xuICAgIHdoaWxlIChwYXJzZWRNYXJrdXAuZmlyc3RDaGlsZCkge1xuICAgICAgaW5zZXJ0TG9naWNhbENoaWxkKHBhcnNlZE1hcmt1cC5maXJzdENoaWxkLCBtYXJrdXBDb250YWluZXIsIGxvZ2ljYWxTaWJsaW5nSW5kZXgrKyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUF0dHJpYnV0ZShiYXRjaDogUmVuZGVyQmF0Y2gsIHRvRG9tRWxlbWVudDogRWxlbWVudCwgYXR0cmlidXRlRnJhbWU6IFJlbmRlclRyZWVGcmFtZSkge1xuICAgIGNvbnN0IGZyYW1lUmVhZGVyID0gYmF0Y2guZnJhbWVSZWFkZXI7XG4gICAgY29uc3QgYXR0cmlidXRlTmFtZSA9IGZyYW1lUmVhZGVyLmF0dHJpYnV0ZU5hbWUoYXR0cmlidXRlRnJhbWUpITtcbiAgICBjb25zdCBicm93c2VyUmVuZGVyZXJJZCA9IHRoaXMuYnJvd3NlclJlbmRlcmVySWQ7XG4gICAgY29uc3QgZXZlbnRIYW5kbGVySWQgPSBmcmFtZVJlYWRlci5hdHRyaWJ1dGVFdmVudEhhbmRsZXJJZChhdHRyaWJ1dGVGcmFtZSk7XG5cbiAgICBpZiAoZXZlbnRIYW5kbGVySWQpIHtcbiAgICAgIGNvbnN0IGZpcnN0VHdvQ2hhcnMgPSBhdHRyaWJ1dGVOYW1lLnN1YnN0cmluZygwLCAyKTtcbiAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IGF0dHJpYnV0ZU5hbWUuc3Vic3RyaW5nKDIpO1xuICAgICAgaWYgKGZpcnN0VHdvQ2hhcnMgIT09ICdvbicgfHwgIWV2ZW50TmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEF0dHJpYnV0ZSBoYXMgbm9uemVybyBldmVudCBoYW5kbGVyIElELCBidXQgYXR0cmlidXRlIG5hbWUgJyR7YXR0cmlidXRlTmFtZX0nIGRvZXMgbm90IHN0YXJ0IHdpdGggJ29uJy5gKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXZlbnREZWxlZ2F0b3Iuc2V0TGlzdGVuZXIodG9Eb21FbGVtZW50LCBldmVudE5hbWUsIGV2ZW50SGFuZGxlcklkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGaXJzdCBzZWUgaWYgd2UgaGF2ZSBzcGVjaWFsIGhhbmRsaW5nIGZvciB0aGlzIGF0dHJpYnV0ZVxuICAgIGlmICghdGhpcy50cnlBcHBseVNwZWNpYWxQcm9wZXJ0eShiYXRjaCwgdG9Eb21FbGVtZW50LCBhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVGcmFtZSkpIHtcbiAgICAgIC8vIElmIG5vdCwgdHJlYXQgaXQgYXMgYSByZWd1bGFyIHN0cmluZy12YWx1ZWQgYXR0cmlidXRlXG4gICAgICB0b0RvbUVsZW1lbnQuc2V0QXR0cmlidXRlKFxuICAgICAgICBhdHRyaWJ1dGVOYW1lLFxuICAgICAgICBmcmFtZVJlYWRlci5hdHRyaWJ1dGVWYWx1ZShhdHRyaWJ1dGVGcmFtZSkhXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdHJ5QXBwbHlTcGVjaWFsUHJvcGVydHkoYmF0Y2g6IFJlbmRlckJhdGNoLCBlbGVtZW50OiBFbGVtZW50LCBhdHRyaWJ1dGVOYW1lOiBzdHJpbmcsIGF0dHJpYnV0ZUZyYW1lOiBSZW5kZXJUcmVlRnJhbWUgfCBudWxsKSB7XG4gICAgc3dpdGNoIChhdHRyaWJ1dGVOYW1lKSB7XG4gICAgICBjYXNlICd2YWx1ZSc6XG4gICAgICAgIHJldHVybiB0aGlzLnRyeUFwcGx5VmFsdWVQcm9wZXJ0eShiYXRjaCwgZWxlbWVudCwgYXR0cmlidXRlRnJhbWUpO1xuICAgICAgY2FzZSAnY2hlY2tlZCc6XG4gICAgICAgIHJldHVybiB0aGlzLnRyeUFwcGx5Q2hlY2tlZFByb3BlcnR5KGJhdGNoLCBlbGVtZW50LCBhdHRyaWJ1dGVGcmFtZSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB0cnlBcHBseVZhbHVlUHJvcGVydHkoYmF0Y2g6IFJlbmRlckJhdGNoLCBlbGVtZW50OiBFbGVtZW50LCBhdHRyaWJ1dGVGcmFtZTogUmVuZGVyVHJlZUZyYW1lIHwgbnVsbCkge1xuICAgIC8vIENlcnRhaW4gZWxlbWVudHMgaGF2ZSBidWlsdC1pbiBiZWhhdmlvdXIgZm9yIHRoZWlyICd2YWx1ZScgcHJvcGVydHlcbiAgICBjb25zdCBmcmFtZVJlYWRlciA9IGJhdGNoLmZyYW1lUmVhZGVyO1xuICAgIHN3aXRjaCAoZWxlbWVudC50YWdOYW1lKSB7XG4gICAgICBjYXNlICdJTlBVVCc6XG4gICAgICBjYXNlICdTRUxFQ1QnOlxuICAgICAgY2FzZSAnVEVYVEFSRUEnOiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXR0cmlidXRlRnJhbWUgPyBmcmFtZVJlYWRlci5hdHRyaWJ1dGVWYWx1ZShhdHRyaWJ1dGVGcmFtZSkgOiBudWxsO1xuICAgICAgICAoZWxlbWVudCBhcyBhbnkpLnZhbHVlID0gdmFsdWU7XG5cbiAgICAgICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ1NFTEVDVCcpIHtcbiAgICAgICAgICAvLyA8c2VsZWN0PiBpcyBzcGVjaWFsLCBpbiB0aGF0IGFueXRoaW5nIHdlIHdyaXRlIHRvIC52YWx1ZSB3aWxsIGJlIGxvc3QgaWYgdGhlcmVcbiAgICAgICAgICAvLyBpc24ndCB5ZXQgYSBtYXRjaGluZyA8b3B0aW9uPi4gVG8gbWFpbnRhaW4gdGhlIGV4cGVjdGVkIGJlaGF2aW9yIG5vIG1hdHRlciB0aGVcbiAgICAgICAgICAvLyBlbGVtZW50IGluc2VydGlvbi91cGRhdGUgb3JkZXIsIHByZXNlcnZlIHRoZSBkZXNpcmVkIHZhbHVlIHNlcGFyYXRlbHkgc29cbiAgICAgICAgICAvLyB3ZSBjYW4gcmVjb3ZlciBpdCB3aGVuIGluc2VydGluZyBhbnkgbWF0Y2hpbmcgPG9wdGlvbj4uXG4gICAgICAgICAgZWxlbWVudFtzZWxlY3RWYWx1ZVByb3BuYW1lXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnT1BUSU9OJzoge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGF0dHJpYnV0ZUZyYW1lID8gZnJhbWVSZWFkZXIuYXR0cmlidXRlVmFsdWUoYXR0cmlidXRlRnJhbWUpIDogbnVsbDtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJywgdmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCd2YWx1ZScpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNlZSBhYm92ZSBmb3Igd2h5IHdlIGhhdmUgdGhpcyBzcGVjaWFsIGhhbmRsaW5nIGZvciA8c2VsZWN0Pi88b3B0aW9uPlxuICAgICAgICBjb25zdCBwYXJlbnRFbGVtZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgICAgICBpZiAocGFyZW50RWxlbWVudCAmJiAoc2VsZWN0VmFsdWVQcm9wbmFtZSBpbiBwYXJlbnRFbGVtZW50KSAmJiBwYXJlbnRFbGVtZW50W3NlbGVjdFZhbHVlUHJvcG5hbWVdID09PSB2YWx1ZSkge1xuICAgICAgICAgIHRoaXMudHJ5QXBwbHlWYWx1ZVByb3BlcnR5KGJhdGNoLCBwYXJlbnRFbGVtZW50LCBhdHRyaWJ1dGVGcmFtZSk7XG4gICAgICAgICAgZGVsZXRlIHBhcmVudEVsZW1lbnRbc2VsZWN0VmFsdWVQcm9wbmFtZV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB0cnlBcHBseUNoZWNrZWRQcm9wZXJ0eShiYXRjaDogUmVuZGVyQmF0Y2gsIGVsZW1lbnQ6IEVsZW1lbnQsIGF0dHJpYnV0ZUZyYW1lOiBSZW5kZXJUcmVlRnJhbWUgfCBudWxsKSB7XG4gICAgLy8gQ2VydGFpbiBlbGVtZW50cyBoYXZlIGJ1aWx0LWluIGJlaGF2aW91ciBmb3IgdGhlaXIgJ2NoZWNrZWQnIHByb3BlcnR5XG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ0lOUFVUJykge1xuICAgICAgY29uc3QgdmFsdWUgPSBhdHRyaWJ1dGVGcmFtZSA/IGJhdGNoLmZyYW1lUmVhZGVyLmF0dHJpYnV0ZVZhbHVlKGF0dHJpYnV0ZUZyYW1lKSA6IG51bGw7XG4gICAgICAoZWxlbWVudCBhcyBhbnkpLmNoZWNrZWQgPSB2YWx1ZSAhPT0gbnVsbDtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbnNlcnRGcmFtZVJhbmdlKGJhdGNoOiBSZW5kZXJCYXRjaCwgcGFyZW50OiBMb2dpY2FsRWxlbWVudCwgY2hpbGRJbmRleDogbnVtYmVyLCBmcmFtZXM6IEFycmF5VmFsdWVzPFJlbmRlclRyZWVGcmFtZT4sIHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXhFeGNsOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IG9yaWdDaGlsZEluZGV4ID0gY2hpbGRJbmRleDtcbiAgICBmb3IgKGxldCBpbmRleCA9IHN0YXJ0SW5kZXg7IGluZGV4IDwgZW5kSW5kZXhFeGNsOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBmcmFtZSA9IGJhdGNoLnJlZmVyZW5jZUZyYW1lc0VudHJ5KGZyYW1lcywgaW5kZXgpO1xuICAgICAgY29uc3QgbnVtQ2hpbGRyZW5JbnNlcnRlZCA9IHRoaXMuaW5zZXJ0RnJhbWUoYmF0Y2gsIHBhcmVudCwgY2hpbGRJbmRleCwgZnJhbWVzLCBmcmFtZSwgaW5kZXgpO1xuICAgICAgY2hpbGRJbmRleCArPSBudW1DaGlsZHJlbkluc2VydGVkO1xuXG4gICAgICAvLyBTa2lwIG92ZXIgYW55IGRlc2NlbmRhbnRzLCBzaW5jZSB0aGV5IGFyZSBhbHJlYWR5IGRlYWx0IHdpdGggcmVjdXJzaXZlbHlcbiAgICAgIGluZGV4ICs9IGNvdW50RGVzY2VuZGFudEZyYW1lcyhiYXRjaCwgZnJhbWUpO1xuICAgIH1cblxuICAgIHJldHVybiAoY2hpbGRJbmRleCAtIG9yaWdDaGlsZEluZGV4KTsgLy8gVG90YWwgbnVtYmVyIG9mIGNoaWxkcmVuIGluc2VydGVkXG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VNYXJrdXAobWFya3VwOiBzdHJpbmcsIGlzU3ZnOiBib29sZWFuKSB7XG4gIGlmIChpc1N2Zykge1xuICAgIHNoYXJlZFN2Z0VsZW1Gb3JQYXJzaW5nLmlubmVySFRNTCA9IG1hcmt1cCB8fCAnICc7XG4gICAgcmV0dXJuIHNoYXJlZFN2Z0VsZW1Gb3JQYXJzaW5nO1xuICB9IGVsc2Uge1xuICAgIHNoYXJlZFRlbXBsYXRlRWxlbUZvclBhcnNpbmcuaW5uZXJIVE1MID0gbWFya3VwIHx8ICcgJztcbiAgICByZXR1cm4gc2hhcmVkVGVtcGxhdGVFbGVtRm9yUGFyc2luZy5jb250ZW50O1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvdW50RGVzY2VuZGFudEZyYW1lcyhiYXRjaDogUmVuZGVyQmF0Y2gsIGZyYW1lOiBSZW5kZXJUcmVlRnJhbWUpOiBudW1iZXIge1xuICBjb25zdCBmcmFtZVJlYWRlciA9IGJhdGNoLmZyYW1lUmVhZGVyO1xuICBzd2l0Y2ggKGZyYW1lUmVhZGVyLmZyYW1lVHlwZShmcmFtZSkpIHtcbiAgICAvLyBUaGUgZm9sbG93aW5nIGZyYW1lIHR5cGVzIGhhdmUgYSBzdWJ0cmVlIGxlbmd0aC4gT3RoZXIgZnJhbWVzIG1heSB1c2UgdGhhdCBtZW1vcnkgc2xvdFxuICAgIC8vIHRvIG1lYW4gc29tZXRoaW5nIGVsc2UsIHNvIHdlIG11c3Qgbm90IHJlYWQgaXQuIFdlIHNob3VsZCBjb25zaWRlciBoYXZpbmcgbm9taW5hbCBzdWJ0eXBlc1xuICAgIC8vIG9mIFJlbmRlclRyZWVGcmFtZVBvaW50ZXIgdGhhdCBwcmV2ZW50IGFjY2VzcyB0byBub24tYXBwbGljYWJsZSBmaWVsZHMuXG4gICAgY2FzZSBGcmFtZVR5cGUuY29tcG9uZW50OlxuICAgIGNhc2UgRnJhbWVUeXBlLmVsZW1lbnQ6XG4gICAgY2FzZSBGcmFtZVR5cGUucmVnaW9uOlxuICAgICAgcmV0dXJuIGZyYW1lUmVhZGVyLnN1YnRyZWVMZW5ndGgoZnJhbWUpIC0gMTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIDA7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmFpc2VFdmVudChldmVudDogRXZlbnQsIGJyb3dzZXJSZW5kZXJlcklkOiBudW1iZXIsIGV2ZW50SGFuZGxlcklkOiBudW1iZXIsIGV2ZW50QXJnczogRXZlbnRGb3JEb3ROZXQ8VUlFdmVudEFyZ3M+KSB7XG4gIGlmIChwcmV2ZW50RGVmYXVsdEV2ZW50c1tldmVudC50eXBlXSkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICBjb25zdCBldmVudERlc2NyaXB0b3IgPSB7XG4gICAgYnJvd3NlclJlbmRlcmVySWQsXG4gICAgZXZlbnRIYW5kbGVySWQsXG4gICAgZXZlbnRBcmdzVHlwZTogZXZlbnRBcmdzLnR5cGVcbiAgfTtcblxuICByZXR1cm4gRG90TmV0Lmludm9rZU1ldGhvZEFzeW5jKFxuICAgICdNaWNyb3NvZnQuQXNwTmV0Q29yZS5Db21wb25lbnRzLkJyb3dzZXInLFxuICAgICdEaXNwYXRjaEV2ZW50JyxcbiAgICBldmVudERlc2NyaXB0b3IsXG4gICAgSlNPTi5zdHJpbmdpZnkoZXZlbnRBcmdzLmRhdGEpKTtcbn1cblxuZnVuY3Rpb24gY2xlYXJFbGVtZW50KGVsZW1lbnQ6IEVsZW1lbnQpIHtcbiAgbGV0IGNoaWxkTm9kZTogTm9kZSB8IG51bGw7XG4gIHdoaWxlIChjaGlsZE5vZGUgPSBlbGVtZW50LmZpcnN0Q2hpbGQpIHtcbiAgICBlbGVtZW50LnJlbW92ZUNoaWxkKGNoaWxkTm9kZSk7XG4gIH1cbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBhcHBseUNhcHR1cmVJZFRvRWxlbWVudChlbGVtZW50OiBFbGVtZW50LCByZWZlcmVuY2VDYXB0dXJlSWQ6IHN0cmluZykge1xuICBlbGVtZW50LnNldEF0dHJpYnV0ZShnZXRDYXB0dXJlSWRBdHRyaWJ1dGVOYW1lKHJlZmVyZW5jZUNhcHR1cmVJZCksICcnKTtcbn1cblxuZnVuY3Rpb24gZ2V0RWxlbWVudEJ5Q2FwdHVyZUlkKHJlZmVyZW5jZUNhcHR1cmVJZDogc3RyaW5nKSB7XG4gIGNvbnN0IHNlbGVjdG9yID0gYFske2dldENhcHR1cmVJZEF0dHJpYnV0ZU5hbWUocmVmZXJlbmNlQ2FwdHVyZUlkKX1dYDtcbiAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xufVxuXG5mdW5jdGlvbiBnZXRDYXB0dXJlSWRBdHRyaWJ1dGVOYW1lKHJlZmVyZW5jZUNhcHR1cmVJZDogc3RyaW5nKSB7XG4gIHJldHVybiBgX2JsXyR7cmVmZXJlbmNlQ2FwdHVyZUlkfWA7XG59XG5cbi8vIFN1cHBvcnQgcmVjZWl2aW5nIEVsZW1lbnRSZWYgaW5zdGFuY2VzIGFzIGFyZ3MgaW4gaW50ZXJvcCBjYWxsc1xuY29uc3QgZWxlbWVudFJlZktleSA9ICdfYmxhem9yRWxlbWVudFJlZic7IC8vIEtlZXAgaW4gc3luYyB3aXRoIEVsZW1lbnRSZWYuY3NcbkRvdE5ldC5hdHRhY2hSZXZpdmVyKChrZXksIHZhbHVlKSA9PiB7XG4gIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlLmhhc093blByb3BlcnR5KGVsZW1lbnRSZWZLZXkpICYmIHR5cGVvZiB2YWx1ZVtlbGVtZW50UmVmS2V5XSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZ2V0RWxlbWVudEJ5Q2FwdHVyZUlkKHZhbHVlW2VsZW1lbnRSZWZLZXldKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn0pO1xuIiwiaW1wb3J0IHsgRXZlbnRGb3JEb3ROZXQsIFVJRXZlbnRBcmdzIH0gZnJvbSAnLi9FdmVudEZvckRvdE5ldCc7XG5cbmNvbnN0IG5vbkJ1YmJsaW5nRXZlbnRzID0gdG9Mb29rdXAoW1xuICAnYWJvcnQnLCAnYmx1cicsICdjaGFuZ2UnLCAnZXJyb3InLCAnZm9jdXMnLCAnbG9hZCcsICdsb2FkZW5kJywgJ2xvYWRzdGFydCcsICdtb3VzZWVudGVyJywgJ21vdXNlbGVhdmUnLFxuICAncHJvZ3Jlc3MnLCAncmVzZXQnLCAnc2Nyb2xsJywgJ3N1Ym1pdCcsICd1bmxvYWQnLCAnRE9NTm9kZUluc2VydGVkSW50b0RvY3VtZW50JywgJ0RPTU5vZGVSZW1vdmVkRnJvbURvY3VtZW50J1xuXSk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT25FdmVudENhbGxiYWNrIHtcbiAgKGV2ZW50OiBFdmVudCwgZXZlbnRIYW5kbGVySWQ6IG51bWJlciwgZXZlbnRBcmdzOiBFdmVudEZvckRvdE5ldDxVSUV2ZW50QXJncz4pOiB2b2lkO1xufVxuXG4vLyBSZXNwb25zaWJsZSBmb3IgYWRkaW5nL3JlbW92aW5nIHRoZSBldmVudEluZm8gb24gYW4gZXhwYW5kbyBwcm9wZXJ0eSBvbiBET00gZWxlbWVudHMsIGFuZFxuLy8gY2FsbGluZyBhbiBFdmVudEluZm9TdG9yZSB0aGF0IGRlYWxzIHdpdGggcmVnaXN0ZXJpbmcvdW5yZWdpc3RlcmluZyB0aGUgdW5kZXJseWluZyBkZWxlZ2F0ZWRcbi8vIGV2ZW50IGxpc3RlbmVycyBhcyByZXF1aXJlZCAoYW5kIGFsc28gbWFwcyBhY3R1YWwgZXZlbnRzIGJhY2sgdG8gdGhlIGdpdmVuIGNhbGxiYWNrKS5cbmV4cG9ydCBjbGFzcyBFdmVudERlbGVnYXRvciB7XG4gIHByaXZhdGUgc3RhdGljIG5leHRFdmVudERlbGVnYXRvcklkID0gMDtcbiAgcHJpdmF0ZSBldmVudHNDb2xsZWN0aW9uS2V5OiBzdHJpbmc7XG4gIHByaXZhdGUgZXZlbnRJbmZvU3RvcmU6IEV2ZW50SW5mb1N0b3JlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgb25FdmVudDogT25FdmVudENhbGxiYWNrKSB7XG4gICAgY29uc3QgZXZlbnREZWxlZ2F0b3JJZCA9ICsrRXZlbnREZWxlZ2F0b3IubmV4dEV2ZW50RGVsZWdhdG9ySWQ7XG4gICAgdGhpcy5ldmVudHNDb2xsZWN0aW9uS2V5ID0gYF9ibGF6b3JFdmVudHNfJHtldmVudERlbGVnYXRvcklkfWA7XG4gICAgdGhpcy5ldmVudEluZm9TdG9yZSA9IG5ldyBFdmVudEluZm9TdG9yZSh0aGlzLm9uR2xvYmFsRXZlbnQuYmluZCh0aGlzKSk7XG4gIH1cblxuICBwdWJsaWMgc2V0TGlzdGVuZXIoZWxlbWVudDogRWxlbWVudCwgZXZlbnROYW1lOiBzdHJpbmcsIGV2ZW50SGFuZGxlcklkOiBudW1iZXIpIHtcbiAgICAvLyBFbnN1cmUgd2UgaGF2ZSBhIHBsYWNlIHRvIHN0b3JlIGV2ZW50IGluZm8gZm9yIHRoaXMgZWxlbWVudFxuICAgIGxldCBpbmZvRm9yRWxlbWVudDogRXZlbnRIYW5kbGVySW5mb3NGb3JFbGVtZW50ID0gZWxlbWVudFt0aGlzLmV2ZW50c0NvbGxlY3Rpb25LZXldO1xuICAgIGlmICghaW5mb0ZvckVsZW1lbnQpIHtcbiAgICAgIGluZm9Gb3JFbGVtZW50ID0gZWxlbWVudFt0aGlzLmV2ZW50c0NvbGxlY3Rpb25LZXldID0ge307XG4gICAgfVxuXG4gICAgaWYgKGluZm9Gb3JFbGVtZW50Lmhhc093blByb3BlcnR5KGV2ZW50TmFtZSkpIHtcbiAgICAgIC8vIFdlIGNhbiBjaGVhcGx5IHVwZGF0ZSB0aGUgaW5mbyBvbiB0aGUgZXhpc3Rpbmcgb2JqZWN0IGFuZCBkb24ndCBuZWVkIGFueSBvdGhlciBob3VzZWtlZXBpbmdcbiAgICAgIGNvbnN0IG9sZEluZm8gPSBpbmZvRm9yRWxlbWVudFtldmVudE5hbWVdO1xuICAgICAgdGhpcy5ldmVudEluZm9TdG9yZS51cGRhdGUob2xkSW5mby5ldmVudEhhbmRsZXJJZCwgZXZlbnRIYW5kbGVySWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBHbyB0aHJvdWdoIHRoZSB3aG9sZSBmbG93IHdoaWNoIG1pZ2h0IGludm9sdmUgcmVnaXN0ZXJpbmcgYSBuZXcgZ2xvYmFsIGhhbmRsZXJcbiAgICAgIGNvbnN0IG5ld0luZm8gPSB7IGVsZW1lbnQsIGV2ZW50TmFtZSwgZXZlbnRIYW5kbGVySWQgfTtcbiAgICAgIHRoaXMuZXZlbnRJbmZvU3RvcmUuYWRkKG5ld0luZm8pO1xuICAgICAgaW5mb0ZvckVsZW1lbnRbZXZlbnROYW1lXSA9IG5ld0luZm87XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlbW92ZUxpc3RlbmVyKGV2ZW50SGFuZGxlcklkOiBudW1iZXIpIHtcbiAgICAvLyBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCB3aGVuZXZlciB0aGUgLk5FVC1zaWRlIGNvZGUgcmVwb3J0cyB0aGF0IGEgY2VydGFpbiBldmVudCBoYW5kbGVyXG4gICAgLy8gaGFzIGJlZW4gZGlzcG9zZWQuIEhvd2V2ZXIgd2Ugd2lsbCBhbHJlYWR5IGhhdmUgZGlzcG9zZWQgdGhlIGluZm8gYWJvdXQgdGhhdCBoYW5kbGVyIGlmXG4gICAgLy8gdGhlIGV2ZW50SGFuZGxlcklkIGZvciB0aGUgKGVsZW1lbnQsZXZlbnROYW1lKSBwYWlyIHdhcyByZXBsYWNlZCBkdXJpbmcgZGlmZiBhcHBsaWNhdGlvbi5cbiAgICBjb25zdCBpbmZvID0gdGhpcy5ldmVudEluZm9TdG9yZS5yZW1vdmUoZXZlbnRIYW5kbGVySWQpO1xuICAgIGlmIChpbmZvKSB7XG4gICAgICAvLyBMb29rcyBsaWtlIHRoaXMgZXZlbnQgaGFuZGxlciB3YXNuJ3QgYWxyZWFkeSBkaXNwb3NlZFxuICAgICAgLy8gUmVtb3ZlIHRoZSBhc3NvY2lhdGVkIGRhdGEgZnJvbSB0aGUgRE9NIGVsZW1lbnRcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBpbmZvLmVsZW1lbnQ7XG4gICAgICBpZiAoZWxlbWVudC5oYXNPd25Qcm9wZXJ0eSh0aGlzLmV2ZW50c0NvbGxlY3Rpb25LZXkpKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRFdmVudEluZm9zOiBFdmVudEhhbmRsZXJJbmZvc0ZvckVsZW1lbnQgPSBlbGVtZW50W3RoaXMuZXZlbnRzQ29sbGVjdGlvbktleV07XG4gICAgICAgIGRlbGV0ZSBlbGVtZW50RXZlbnRJbmZvc1tpbmZvLmV2ZW50TmFtZV07XG4gICAgICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlbGVtZW50RXZlbnRJbmZvcykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgZGVsZXRlIGVsZW1lbnRbdGhpcy5ldmVudHNDb2xsZWN0aW9uS2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25HbG9iYWxFdmVudChldnQ6IEV2ZW50KSB7XG4gICAgaWYgKCEoZXZ0LnRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2NhbiB1cCB0aGUgZWxlbWVudCBoaWVyYXJjaHksIGxvb2tpbmcgZm9yIGFueSBtYXRjaGluZyByZWdpc3RlcmVkIGV2ZW50IGhhbmRsZXJzXG4gICAgbGV0IGNhbmRpZGF0ZUVsZW1lbnQgPSBldnQudGFyZ2V0IGFzIEVsZW1lbnQgfCBudWxsO1xuICAgIGxldCBldmVudEFyZ3M6IEV2ZW50Rm9yRG90TmV0PFVJRXZlbnRBcmdzPiB8IG51bGwgPSBudWxsOyAvLyBQb3B1bGF0ZSBsYXppbHlcbiAgICBjb25zdCBldmVudElzTm9uQnViYmxpbmcgPSBub25CdWJibGluZ0V2ZW50cy5oYXNPd25Qcm9wZXJ0eShldnQudHlwZSk7XG4gICAgd2hpbGUgKGNhbmRpZGF0ZUVsZW1lbnQpIHtcbiAgICAgIGlmIChjYW5kaWRhdGVFbGVtZW50Lmhhc093blByb3BlcnR5KHRoaXMuZXZlbnRzQ29sbGVjdGlvbktleSkpIHtcbiAgICAgICAgY29uc3QgaGFuZGxlckluZm9zID0gY2FuZGlkYXRlRWxlbWVudFt0aGlzLmV2ZW50c0NvbGxlY3Rpb25LZXldO1xuICAgICAgICBpZiAoaGFuZGxlckluZm9zLmhhc093blByb3BlcnR5KGV2dC50eXBlKSkge1xuICAgICAgICAgIC8vIFdlIGFyZSBnb2luZyB0byByYWlzZSBhbiBldmVudCBmb3IgdGhpcyBlbGVtZW50LCBzbyBwcmVwYXJlIGluZm8gbmVlZGVkIGJ5IHRoZSAuTkVUIGNvZGVcbiAgICAgICAgICBpZiAoIWV2ZW50QXJncykge1xuICAgICAgICAgICAgZXZlbnRBcmdzID0gRXZlbnRGb3JEb3ROZXQuZnJvbURPTUV2ZW50KGV2dCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgaGFuZGxlckluZm8gPSBoYW5kbGVySW5mb3NbZXZ0LnR5cGVdO1xuICAgICAgICAgIHRoaXMub25FdmVudChldnQsIGhhbmRsZXJJbmZvLmV2ZW50SGFuZGxlcklkLCBldmVudEFyZ3MpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNhbmRpZGF0ZUVsZW1lbnQgPSBldmVudElzTm9uQnViYmxpbmcgPyBudWxsIDogY2FuZGlkYXRlRWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgIH1cbiAgfVxufVxuXG4vLyBSZXNwb25zaWJsZSBmb3IgYWRkaW5nIGFuZCByZW1vdmluZyB0aGUgZ2xvYmFsIGxpc3RlbmVyIHdoZW4gdGhlIG51bWJlciBvZiBsaXN0ZW5lcnNcbi8vIGZvciBhIGdpdmVuIGV2ZW50IG5hbWUgY2hhbmdlcyBiZXR3ZWVuIHplcm8gYW5kIG5vbnplcm9cbmNsYXNzIEV2ZW50SW5mb1N0b3JlIHtcbiAgcHJpdmF0ZSBpbmZvc0J5RXZlbnRIYW5kbGVySWQ6IHsgW2V2ZW50SGFuZGxlcklkOiBudW1iZXJdOiBFdmVudEhhbmRsZXJJbmZvIH0gPSB7fTtcbiAgcHJpdmF0ZSBjb3VudEJ5RXZlbnROYW1lOiB7IFtldmVudE5hbWU6IHN0cmluZ106IG51bWJlciB9ID0ge307XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBnbG9iYWxMaXN0ZW5lcjogRXZlbnRMaXN0ZW5lcikge1xuICB9XG5cbiAgcHVibGljIGFkZChpbmZvOiBFdmVudEhhbmRsZXJJbmZvKSB7XG4gICAgaWYgKHRoaXMuaW5mb3NCeUV2ZW50SGFuZGxlcklkW2luZm8uZXZlbnRIYW5kbGVySWRdKSB7XG4gICAgICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuLCBidXQgd2Ugd2FudCB0byBrbm93IGlmIGl0IGRvZXNcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXZlbnQgJHtpbmZvLmV2ZW50SGFuZGxlcklkfSBpcyBhbHJlYWR5IHRyYWNrZWRgKTtcbiAgICB9XG5cbiAgICB0aGlzLmluZm9zQnlFdmVudEhhbmRsZXJJZFtpbmZvLmV2ZW50SGFuZGxlcklkXSA9IGluZm87XG5cbiAgICBjb25zdCBldmVudE5hbWUgPSBpbmZvLmV2ZW50TmFtZTtcbiAgICBpZiAodGhpcy5jb3VudEJ5RXZlbnROYW1lLmhhc093blByb3BlcnR5KGV2ZW50TmFtZSkpIHtcbiAgICAgIHRoaXMuY291bnRCeUV2ZW50TmFtZVtldmVudE5hbWVdKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY291bnRCeUV2ZW50TmFtZVtldmVudE5hbWVdID0gMTtcblxuICAgICAgLy8gVG8gbWFrZSBkZWxlZ2F0aW9uIHdvcmsgd2l0aCBub24tYnViYmxpbmcgZXZlbnRzLCByZWdpc3RlciBhICdjYXB0dXJlJyBsaXN0ZW5lci5cbiAgICAgIC8vIFdlIHByZXNlcnZlIHRoZSBub24tYnViYmxpbmcgYmVoYXZpb3IgYnkgb25seSBkaXNwYXRjaGluZyBzdWNoIGV2ZW50cyB0byB0aGUgdGFyZ2V0ZWQgZWxlbWVudC5cbiAgICAgIGNvbnN0IHVzZUNhcHR1cmUgPSBub25CdWJibGluZ0V2ZW50cy5oYXNPd25Qcm9wZXJ0eShldmVudE5hbWUpO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIHRoaXMuZ2xvYmFsTGlzdGVuZXIsIHVzZUNhcHR1cmUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGUob2xkRXZlbnRIYW5kbGVySWQ6IG51bWJlciwgbmV3RXZlbnRIYW5kbGVySWQ6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmluZm9zQnlFdmVudEhhbmRsZXJJZC5oYXNPd25Qcm9wZXJ0eShuZXdFdmVudEhhbmRsZXJJZCkpIHtcbiAgICAgIC8vIFNob3VsZCBuZXZlciBoYXBwZW4sIGJ1dCB3ZSB3YW50IHRvIGtub3cgaWYgaXQgZG9lc1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFdmVudCAke25ld0V2ZW50SGFuZGxlcklkfSBpcyBhbHJlYWR5IHRyYWNrZWRgKTtcbiAgICB9XG5cbiAgICAvLyBTaW5jZSB3ZSdyZSBqdXN0IHVwZGF0aW5nIHRoZSBldmVudCBoYW5kbGVyIElELCB0aGVyZSdzIG5vIG5lZWQgdG8gdXBkYXRlIHRoZSBnbG9iYWwgY291bnRzXG4gICAgY29uc3QgaW5mbyA9IHRoaXMuaW5mb3NCeUV2ZW50SGFuZGxlcklkW29sZEV2ZW50SGFuZGxlcklkXTtcbiAgICBkZWxldGUgdGhpcy5pbmZvc0J5RXZlbnRIYW5kbGVySWRbb2xkRXZlbnRIYW5kbGVySWRdO1xuICAgIGluZm8uZXZlbnRIYW5kbGVySWQgPSBuZXdFdmVudEhhbmRsZXJJZDtcbiAgICB0aGlzLmluZm9zQnlFdmVudEhhbmRsZXJJZFtuZXdFdmVudEhhbmRsZXJJZF0gPSBpbmZvO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZShldmVudEhhbmRsZXJJZDogbnVtYmVyKTogRXZlbnRIYW5kbGVySW5mbyB7XG4gICAgY29uc3QgaW5mbyA9IHRoaXMuaW5mb3NCeUV2ZW50SGFuZGxlcklkW2V2ZW50SGFuZGxlcklkXTtcbiAgICBpZiAoaW5mbykge1xuICAgICAgZGVsZXRlIHRoaXMuaW5mb3NCeUV2ZW50SGFuZGxlcklkW2V2ZW50SGFuZGxlcklkXTtcblxuICAgICAgY29uc3QgZXZlbnROYW1lID0gaW5mby5ldmVudE5hbWU7XG4gICAgICBpZiAoLS10aGlzLmNvdW50QnlFdmVudE5hbWVbZXZlbnROYW1lXSA9PT0gMCkge1xuICAgICAgICBkZWxldGUgdGhpcy5jb3VudEJ5RXZlbnROYW1lW2V2ZW50TmFtZV07XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCB0aGlzLmdsb2JhbExpc3RlbmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaW5mbztcbiAgfVxufVxuXG5pbnRlcmZhY2UgRXZlbnRIYW5kbGVySW5mb3NGb3JFbGVtZW50IHtcbiAgLy8gQWx0aG91Z2ggd2UgKmNvdWxkKiB0cmFjayBtdWx0aXBsZSBldmVudCBoYW5kbGVycyBwZXIgKGVsZW1lbnQsIGV2ZW50TmFtZSkgcGFpclxuICAvLyAoc2luY2UgdGhleSBoYXZlIGRpc3RpbmN0IGV2ZW50SGFuZGxlcklkIHZhbHVlcyksIHRoZXJlJ3Mgbm8gcG9pbnQgZG9pbmcgc28gYmVjYXVzZVxuICAvLyBvdXIgcHJvZ3JhbW1pbmcgbW9kZWwgaXMgdGhhdCB5b3UgZGVjbGFyZSBldmVudCBoYW5kbGVycyBhcyBhdHRyaWJ1dGVzLiBBbiBlbGVtZW50XG4gIC8vIGNhbiBvbmx5IGhhdmUgb25lIGF0dHJpYnV0ZSB3aXRoIGEgZ2l2ZW4gbmFtZSwgaGVuY2Ugb25seSBvbmUgZXZlbnQgaGFuZGxlciB3aXRoXG4gIC8vIHRoYXQgbmFtZSBhdCBhbnkgb25lIHRpbWUuXG4gIC8vIFNvIHRvIGtlZXAgdGhpbmdzIHNpbXBsZSwgb25seSB0cmFjayBvbmUgRXZlbnRIYW5kbGVySW5mbyBwZXIgKGVsZW1lbnQsIGV2ZW50TmFtZSlcbiAgW2V2ZW50TmFtZTogc3RyaW5nXTogRXZlbnRIYW5kbGVySW5mb1xufVxuXG5pbnRlcmZhY2UgRXZlbnRIYW5kbGVySW5mbyB7XG4gIGVsZW1lbnQ6IEVsZW1lbnQ7XG4gIGV2ZW50TmFtZTogc3RyaW5nO1xuICBldmVudEhhbmRsZXJJZDogbnVtYmVyO1xufVxuXG5mdW5jdGlvbiB0b0xvb2t1cChpdGVtczogc3RyaW5nW10pOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSB7XG4gIGNvbnN0IHJlc3VsdCA9IHt9O1xuICBpdGVtcy5mb3JFYWNoKHZhbHVlID0+IHsgcmVzdWx0W3ZhbHVlXSA9IHRydWU7IH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuIiwiZXhwb3J0IGNsYXNzIEV2ZW50Rm9yRG90TmV0PFREYXRhIGV4dGVuZHMgVUlFdmVudEFyZ3M+IHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHR5cGU6IEV2ZW50QXJnc1R5cGUsIHB1YmxpYyByZWFkb25seSBkYXRhOiBURGF0YSkge1xuICB9XG5cbiAgc3RhdGljIGZyb21ET01FdmVudChldmVudDogRXZlbnQpOiBFdmVudEZvckRvdE5ldDxVSUV2ZW50QXJncz4ge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBldmVudC50YXJnZXQgYXMgRWxlbWVudDtcbiAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcblxuICAgICAgY2FzZSAnaW5wdXQnOlxuICAgICAgY2FzZSAnY2hhbmdlJzoge1xuICAgICAgICBjb25zdCB0YXJnZXRJc0NoZWNrYm94ID0gaXNDaGVja2JveChlbGVtZW50KTtcbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSB0YXJnZXRJc0NoZWNrYm94ID8gISFlbGVtZW50WydjaGVja2VkJ10gOiBlbGVtZW50Wyd2YWx1ZSddO1xuICAgICAgICByZXR1cm4gbmV3IEV2ZW50Rm9yRG90TmV0PFVJQ2hhbmdlRXZlbnRBcmdzPignY2hhbmdlJywgeyB0eXBlOiBldmVudC50eXBlLCB2YWx1ZTogbmV3VmFsdWUgfSk7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2NvcHknOlxuICAgICAgY2FzZSAnY3V0JzpcbiAgICAgIGNhc2UgJ3Bhc3RlJzpcbiAgICAgICAgcmV0dXJuIG5ldyBFdmVudEZvckRvdE5ldDxVSUNsaXBib2FyZEV2ZW50QXJncz4oJ2NsaXBib2FyZCcsIHsgdHlwZTogZXZlbnQudHlwZSB9KTtcblxuICAgICAgY2FzZSAnZHJhZyc6XG4gICAgICBjYXNlICdkcmFnZW5kJzpcbiAgICAgIGNhc2UgJ2RyYWdlbnRlcic6XG4gICAgICBjYXNlICdkcmFnbGVhdmUnOlxuICAgICAgY2FzZSAnZHJhZ292ZXInOlxuICAgICAgY2FzZSAnZHJhZ3N0YXJ0JzpcbiAgICAgIGNhc2UgJ2Ryb3AnOlxuICAgICAgICByZXR1cm4gbmV3IEV2ZW50Rm9yRG90TmV0PFVJRHJhZ0V2ZW50QXJncz4oJ2RyYWcnLCBwYXJzZURyYWdFdmVudChldmVudCkpO1xuXG4gICAgICBjYXNlICdmb2N1cyc6XG4gICAgICBjYXNlICdibHVyJzpcbiAgICAgIGNhc2UgJ2ZvY3VzaW4nOlxuICAgICAgY2FzZSAnZm9jdXNvdXQnOlxuICAgICAgICByZXR1cm4gbmV3IEV2ZW50Rm9yRG90TmV0PFVJRm9jdXNFdmVudEFyZ3M+KCdmb2N1cycsIHsgdHlwZTogZXZlbnQudHlwZSB9KTtcblxuICAgICAgY2FzZSAna2V5ZG93bic6XG4gICAgICBjYXNlICdrZXl1cCc6XG4gICAgICBjYXNlICdrZXlwcmVzcyc6XG4gICAgICAgIHJldHVybiBuZXcgRXZlbnRGb3JEb3ROZXQ8VUlLZXlib2FyZEV2ZW50QXJncz4oJ2tleWJvYXJkJywgcGFyc2VLZXlib2FyZEV2ZW50KDxLZXlib2FyZEV2ZW50PmV2ZW50KSk7XG5cbiAgICAgIGNhc2UgJ2NvbnRleHRtZW51JzpcbiAgICAgIGNhc2UgJ2NsaWNrJzpcbiAgICAgIGNhc2UgJ21vdXNlb3Zlcic6XG4gICAgICBjYXNlICdtb3VzZW91dCc6XG4gICAgICBjYXNlICdtb3VzZW1vdmUnOlxuICAgICAgY2FzZSAnbW91c2Vkb3duJzpcbiAgICAgIGNhc2UgJ21vdXNldXAnOlxuICAgICAgY2FzZSAnZGJsY2xpY2snOlxuICAgICAgICByZXR1cm4gbmV3IEV2ZW50Rm9yRG90TmV0PFVJTW91c2VFdmVudEFyZ3M+KCdtb3VzZScsIHBhcnNlTW91c2VFdmVudCg8TW91c2VFdmVudD5ldmVudCkpO1xuXG4gICAgICBjYXNlICdlcnJvcic6XG4gICAgICAgIHJldHVybiBuZXcgRXZlbnRGb3JEb3ROZXQ8VUlFcnJvckV2ZW50QXJncz4oJ2Vycm9yJywgcGFyc2VFcnJvckV2ZW50KDxFcnJvckV2ZW50PmV2ZW50KSk7XG5cbiAgICAgIGNhc2UgJ2xvYWRzdGFydCc6XG4gICAgICBjYXNlICd0aW1lb3V0JzpcbiAgICAgIGNhc2UgJ2Fib3J0JzpcbiAgICAgIGNhc2UgJ2xvYWQnOlxuICAgICAgY2FzZSAnbG9hZGVuZCc6XG4gICAgICBjYXNlICdwcm9ncmVzcyc6XG4gICAgICAgIHJldHVybiBuZXcgRXZlbnRGb3JEb3ROZXQ8VUlQcm9ncmVzc0V2ZW50QXJncz4oJ3Byb2dyZXNzJywgcGFyc2VQcm9ncmVzc0V2ZW50KDxQcm9ncmVzc0V2ZW50PmV2ZW50KSk7XG5cbiAgICAgIGNhc2UgJ3RvdWNoY2FuY2VsJzpcbiAgICAgIGNhc2UgJ3RvdWNoZW5kJzpcbiAgICAgIGNhc2UgJ3RvdWNobW92ZSc6XG4gICAgICBjYXNlICd0b3VjaGVudGVyJzpcbiAgICAgIGNhc2UgJ3RvdWNobGVhdmUnOlxuICAgICAgY2FzZSAndG91Y2hzdGFydCc6XG4gICAgICAgIHJldHVybiBuZXcgRXZlbnRGb3JEb3ROZXQ8VUlUb3VjaEV2ZW50QXJncz4oJ3RvdWNoJywgcGFyc2VUb3VjaEV2ZW50KDxUb3VjaEV2ZW50PmV2ZW50KSk7XG5cbiAgICAgIGNhc2UgJ2dvdHBvaW50ZXJjYXB0dXJlJzpcbiAgICAgIGNhc2UgJ2xvc3Rwb2ludGVyY2FwdHVyZSc6XG4gICAgICBjYXNlICdwb2ludGVyY2FuY2VsJzpcbiAgICAgIGNhc2UgJ3BvaW50ZXJkb3duJzpcbiAgICAgIGNhc2UgJ3BvaW50ZXJlbnRlcic6XG4gICAgICBjYXNlICdwb2ludGVybGVhdmUnOlxuICAgICAgY2FzZSAncG9pbnRlcm1vdmUnOlxuICAgICAgY2FzZSAncG9pbnRlcm91dCc6XG4gICAgICBjYXNlICdwb2ludGVyb3Zlcic6XG4gICAgICBjYXNlICdwb2ludGVydXAnOlxuICAgICAgICByZXR1cm4gbmV3IEV2ZW50Rm9yRG90TmV0PFVJUG9pbnRlckV2ZW50QXJncz4oJ3BvaW50ZXInLCBwYXJzZVBvaW50ZXJFdmVudCg8UG9pbnRlckV2ZW50PmV2ZW50KSk7XG5cbiAgICAgIGNhc2UgJ3doZWVsJzpcbiAgICAgIGNhc2UgJ21vdXNld2hlZWwnOlxuICAgICAgICByZXR1cm4gbmV3IEV2ZW50Rm9yRG90TmV0PFVJV2hlZWxFdmVudEFyZ3M+KCd3aGVlbCcsIHBhcnNlV2hlZWxFdmVudCg8V2hlZWxFdmVudD5ldmVudCkpO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbmV3IEV2ZW50Rm9yRG90TmV0PFVJRXZlbnRBcmdzPigndW5rbm93bicsIHsgdHlwZTogZXZlbnQudHlwZSB9KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VEcmFnRXZlbnQoZXZlbnQ6IGFueSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IGV2ZW50LnR5cGUsXG4gICAgZGV0YWlsOiBldmVudC5kZXRhaWwsXG4gICAgZGF0YVRyYW5zZmVyOiBldmVudC5kYXRhVHJhbnNmZXIsXG4gICAgc2NyZWVuWDogZXZlbnQuc2NyZWVuWCxcbiAgICBzY3JlZW5ZOiBldmVudC5zY3JlZW5ZLFxuICAgIGNsaWVudFg6IGV2ZW50LmNsaWVudFgsXG4gICAgY2xpZW50WTogZXZlbnQuY2xpZW50WSxcbiAgICBidXR0b246IGV2ZW50LmJ1dHRvbixcbiAgICBidXR0b25zOiBldmVudC5idXR0b25zLFxuICAgIGN0cmxLZXk6IGV2ZW50LmN0cmxLZXksXG4gICAgc2hpZnRLZXk6IGV2ZW50LnNoaWZ0S2V5LFxuICAgIGFsdEtleTogZXZlbnQuYWx0S2V5LFxuICAgIG1ldGFLZXk6IGV2ZW50Lm1ldGFLZXlcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZVdoZWVsRXZlbnQoZXZlbnQ6IFdoZWVsRXZlbnQpIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5wYXJzZU1vdXNlRXZlbnQoZXZlbnQpLFxuICAgIGRlbHRhWDogZXZlbnQuZGVsdGFYLFxuICAgIGRlbHRhWTogZXZlbnQuZGVsdGFZLFxuICAgIGRlbHRhWjogZXZlbnQuZGVsdGFaLFxuICAgIGRlbHRhTW9kZTogZXZlbnQuZGVsdGFNb2RlXG4gIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlRXJyb3JFdmVudChldmVudDogRXJyb3JFdmVudCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IGV2ZW50LnR5cGUsXG4gICAgbWVzc2FnZTogZXZlbnQubWVzc2FnZSxcbiAgICBmaWxlbmFtZTogZXZlbnQuZmlsZW5hbWUsXG4gICAgbGluZW5vOiBldmVudC5saW5lbm8sXG4gICAgY29sbm86IGV2ZW50LmNvbG5vXG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VQcm9ncmVzc0V2ZW50KGV2ZW50OiBQcm9ncmVzc0V2ZW50KSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogZXZlbnQudHlwZSxcbiAgICBsZW5ndGhDb21wdXRhYmxlOiBldmVudC5sZW5ndGhDb21wdXRhYmxlLFxuICAgIGxvYWRlZDogZXZlbnQubG9hZGVkLFxuICAgIHRvdGFsOiBldmVudC50b3RhbFxuICB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZVRvdWNoRXZlbnQoZXZlbnQ6IFRvdWNoRXZlbnQpIHtcblxuICBmdW5jdGlvbiBwYXJzZVRvdWNoKHRvdWNoTGlzdDogVG91Y2hMaXN0KSB7XG4gICAgY29uc3QgdG91Y2hlczogVUlUb3VjaFBvaW50W10gPSBbXTtcbiAgICBcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvdWNoTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdG91Y2ggPSB0b3VjaExpc3RbaV07XG4gICAgICB0b3VjaGVzLnB1c2goe1xuICAgICAgICBpZGVudGlmaWVyOiB0b3VjaC5pZGVudGlmaWVyLFxuICAgICAgICBjbGllbnRYOiB0b3VjaC5jbGllbnRYLFxuICAgICAgICBjbGllbnRZOiB0b3VjaC5jbGllbnRZLFxuICAgICAgICBzY3JlZW5YOiB0b3VjaC5zY3JlZW5YLFxuICAgICAgICBzY3JlZW5ZOiB0b3VjaC5zY3JlZW5ZLFxuICAgICAgICBwYWdlWDogdG91Y2gucGFnZVgsXG4gICAgICAgIHBhZ2VZOiB0b3VjaC5wYWdlWVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0b3VjaGVzO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBldmVudC50eXBlLFxuICAgIGRldGFpbDogZXZlbnQuZGV0YWlsLFxuICAgIHRvdWNoZXM6IHBhcnNlVG91Y2goZXZlbnQudG91Y2hlcyksXG4gICAgdGFyZ2V0VG91Y2hlczogcGFyc2VUb3VjaChldmVudC50YXJnZXRUb3VjaGVzKSxcbiAgICBjaGFuZ2VkVG91Y2hlczogcGFyc2VUb3VjaChldmVudC5jaGFuZ2VkVG91Y2hlcyksXG4gICAgY3RybEtleTogZXZlbnQuY3RybEtleSxcbiAgICBzaGlmdEtleTogZXZlbnQuc2hpZnRLZXksXG4gICAgYWx0S2V5OiBldmVudC5hbHRLZXksXG4gICAgbWV0YUtleTogZXZlbnQubWV0YUtleVxuICB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZUtleWJvYXJkRXZlbnQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBldmVudC50eXBlLFxuICAgIGtleTogZXZlbnQua2V5LFxuICAgIGNvZGU6IGV2ZW50LmNvZGUsXG4gICAgbG9jYXRpb246IGV2ZW50LmxvY2F0aW9uLFxuICAgIHJlcGVhdDogZXZlbnQucmVwZWF0LFxuICAgIGN0cmxLZXk6IGV2ZW50LmN0cmxLZXksXG4gICAgc2hpZnRLZXk6IGV2ZW50LnNoaWZ0S2V5LFxuICAgIGFsdEtleTogZXZlbnQuYWx0S2V5LFxuICAgIG1ldGFLZXk6IGV2ZW50Lm1ldGFLZXlcbiAgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VQb2ludGVyRXZlbnQoZXZlbnQ6IFBvaW50ZXJFdmVudCkge1xuICByZXR1cm4ge1xuICAgIC4uLnBhcnNlTW91c2VFdmVudChldmVudCksXG4gICAgcG9pbnRlcklkOiBldmVudC5wb2ludGVySWQsXG4gICAgd2lkdGg6IGV2ZW50LndpZHRoLFxuICAgIGhlaWdodDogZXZlbnQuaGVpZ2h0LFxuICAgIHByZXNzdXJlOiBldmVudC5wcmVzc3VyZSxcbiAgICB0aWx0WDogZXZlbnQudGlsdFgsXG4gICAgdGlsdFk6IGV2ZW50LnRpbHRZLFxuICAgIHBvaW50ZXJUeXBlOiBldmVudC5wb2ludGVyVHlwZSxcbiAgICBpc1ByaW1hcnk6IGV2ZW50LmlzUHJpbWFyeVxuICB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZU1vdXNlRXZlbnQoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBldmVudC50eXBlLFxuICAgIGRldGFpbDogZXZlbnQuZGV0YWlsLFxuICAgIHNjcmVlblg6IGV2ZW50LnNjcmVlblgsXG4gICAgc2NyZWVuWTogZXZlbnQuc2NyZWVuWSxcbiAgICBjbGllbnRYOiBldmVudC5jbGllbnRYLFxuICAgIGNsaWVudFk6IGV2ZW50LmNsaWVudFksXG4gICAgYnV0dG9uOiBldmVudC5idXR0b24sXG4gICAgYnV0dG9uczogZXZlbnQuYnV0dG9ucyxcbiAgICBjdHJsS2V5OiBldmVudC5jdHJsS2V5LFxuICAgIHNoaWZ0S2V5OiBldmVudC5zaGlmdEtleSxcbiAgICBhbHRLZXk6IGV2ZW50LmFsdEtleSxcbiAgICBtZXRhS2V5OiBldmVudC5tZXRhS2V5XG4gIH07XG59XG5cbmZ1bmN0aW9uIGlzQ2hlY2tib3goZWxlbWVudDogRWxlbWVudCB8IG51bGwpIHtcbiAgcmV0dXJuIGVsZW1lbnQgJiYgZWxlbWVudC50YWdOYW1lID09PSAnSU5QVVQnICYmIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd0eXBlJykgPT09ICdjaGVja2JveCc7XG59XG5cbi8vIFRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlcyBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBVSUV2ZW50QXJncyBDIyBjbGFzc2VzXG5cbnR5cGUgRXZlbnRBcmdzVHlwZSA9ICdjaGFuZ2UnIHwgJ2NsaXBib2FyZCcgfCAnZHJhZycgfCAnZXJyb3InIHwgJ2ZvY3VzJyB8ICdrZXlib2FyZCcgfCAnbW91c2UnIHwgJ3BvaW50ZXInIHwgJ3Byb2dyZXNzJyB8ICd0b3VjaCcgfCAndW5rbm93bicgfCAnd2hlZWwnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVJRXZlbnRBcmdzIHtcbiAgdHlwZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgVUlDaGFuZ2VFdmVudEFyZ3MgZXh0ZW5kcyBVSUV2ZW50QXJncyB7XG4gIHZhbHVlOiBzdHJpbmcgfCBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgVUlDbGlwYm9hcmRFdmVudEFyZ3MgZXh0ZW5kcyBVSUV2ZW50QXJncyB7XG59XG5cbmludGVyZmFjZSBVSURyYWdFdmVudEFyZ3MgZXh0ZW5kcyBVSUV2ZW50QXJncyB7XG4gIGRldGFpbDogbnVtYmVyO1xuICBkYXRhVHJhbnNmZXI6IFVJRGF0YVRyYW5zZmVyO1xuICBzY3JlZW5YOiBudW1iZXI7XG4gIHNjcmVlblk6IG51bWJlcjtcbiAgY2xpZW50WDogbnVtYmVyO1xuICBjbGllbnRZOiBudW1iZXI7XG4gIGJ1dHRvbjogbnVtYmVyO1xuICBidXR0b25zOiBudW1iZXI7XG4gIGN0cmxLZXk6IGJvb2xlYW47XG4gIHNoaWZ0S2V5OiBib29sZWFuO1xuICBhbHRLZXk6IGJvb2xlYW47XG4gIG1ldGFLZXk6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBVSURhdGFUcmFuc2ZlciB7XG4gIGRyb3BFZmZlY3Q6IHN0cmluZztcbiAgZWZmZWN0QWxsb3dlZDogc3RyaW5nO1xuICBmaWxlczogc3RyaW5nW107XG4gIGl0ZW1zOiBVSURhdGFUcmFuc2Zlckl0ZW1bXTtcbiAgdHlwZXM6IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgVUlEYXRhVHJhbnNmZXJJdGVtIHtcbiAga2luZDogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBVSUVycm9yRXZlbnRBcmdzIGV4dGVuZHMgVUlFdmVudEFyZ3Mge1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGZpbGVuYW1lOiBzdHJpbmc7XG4gIGxpbmVubzogbnVtYmVyO1xuICBjb2xubzogbnVtYmVyO1xuXG4gIC8vIG9taXR0aW5nICdlcnJvcicgaGVyZSBzaW5jZSB3ZSdkIGhhdmUgdG8gc2VyaWFsaXplIGl0LCBhbmQgaXQncyBub3QgY2xlYXIgd2Ugd2lsbCB3YW50IHRvXG4gIC8vIGRvIHRoYXQuIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FcnJvckV2ZW50XG59XG5cbmludGVyZmFjZSBVSUZvY3VzRXZlbnRBcmdzIGV4dGVuZHMgVUlFdmVudEFyZ3Mge1xufVxuXG5pbnRlcmZhY2UgVUlLZXlib2FyZEV2ZW50QXJncyBleHRlbmRzIFVJRXZlbnRBcmdzIHtcbiAga2V5OiBzdHJpbmc7XG4gIGNvZGU6IHN0cmluZztcbiAgbG9jYXRpb246IG51bWJlcjtcbiAgcmVwZWF0OiBib29sZWFuO1xuICBjdHJsS2V5OiBib29sZWFuO1xuICBzaGlmdEtleTogYm9vbGVhbjtcbiAgYWx0S2V5OiBib29sZWFuO1xuICBtZXRhS2V5OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgVUlNb3VzZUV2ZW50QXJncyBleHRlbmRzIFVJRXZlbnRBcmdzIHtcbiAgZGV0YWlsOiBudW1iZXI7XG4gIHNjcmVlblg6IG51bWJlcjtcbiAgc2NyZWVuWTogbnVtYmVyO1xuICBjbGllbnRYOiBudW1iZXI7XG4gIGNsaWVudFk6IG51bWJlcjtcbiAgYnV0dG9uOiBudW1iZXI7XG4gIGJ1dHRvbnM6IG51bWJlcjtcbiAgY3RybEtleTogYm9vbGVhbjtcbiAgc2hpZnRLZXk6IGJvb2xlYW47XG4gIGFsdEtleTogYm9vbGVhbjtcbiAgbWV0YUtleTogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIFVJUG9pbnRlckV2ZW50QXJncyBleHRlbmRzIFVJTW91c2VFdmVudEFyZ3Mge1xuICBwb2ludGVySWQ6IG51bWJlcjtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIHByZXNzdXJlOiBudW1iZXI7XG4gIHRpbHRYOiBudW1iZXI7XG4gIHRpbHRZOiBudW1iZXI7XG4gIHBvaW50ZXJUeXBlOiBzdHJpbmc7XG4gIGlzUHJpbWFyeTogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIFVJUHJvZ3Jlc3NFdmVudEFyZ3MgZXh0ZW5kcyBVSUV2ZW50QXJncyB7XG4gIGxlbmd0aENvbXB1dGFibGU6IGJvb2xlYW47XG4gIGxvYWRlZDogbnVtYmVyO1xuICB0b3RhbDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgVUlUb3VjaEV2ZW50QXJncyBleHRlbmRzIFVJRXZlbnRBcmdzIHtcbiAgZGV0YWlsOiBudW1iZXI7XG4gIHRvdWNoZXM6IFVJVG91Y2hQb2ludFtdO1xuICB0YXJnZXRUb3VjaGVzOiBVSVRvdWNoUG9pbnRbXTtcbiAgY2hhbmdlZFRvdWNoZXM6IFVJVG91Y2hQb2ludFtdO1xuICBjdHJsS2V5OiBib29sZWFuO1xuICBzaGlmdEtleTogYm9vbGVhbjtcbiAgYWx0S2V5OiBib29sZWFuO1xuICBtZXRhS2V5OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgVUlUb3VjaFBvaW50IHtcbiAgaWRlbnRpZmllcjogbnVtYmVyO1xuICBzY3JlZW5YOiBudW1iZXI7XG4gIHNjcmVlblk6IG51bWJlcjtcbiAgY2xpZW50WDogbnVtYmVyO1xuICBjbGllbnRZOiBudW1iZXI7XG4gIHBhZ2VYOiBudW1iZXI7XG4gIHBhZ2VZOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBVSVdoZWVsRXZlbnRBcmdzIGV4dGVuZHMgVUlNb3VzZUV2ZW50QXJncyB7XG4gIGRlbHRhWDogbnVtYmVyO1xuICBkZWx0YVk6IG51bWJlcjtcbiAgZGVsdGFaOiBudW1iZXI7XG4gIGRlbHRhTW9kZTogbnVtYmVyO1xufVxuIiwiLypcbiAgQSBMb2dpY2FsRWxlbWVudCBwbGF5cyB0aGUgc2FtZSByb2xlIGFzIGFuIEVsZW1lbnQgaW5zdGFuY2UgZnJvbSB0aGUgcG9pbnQgb2YgdmlldyBvZiB0aGVcbiAgQVBJIGNvbnN1bWVyLiBJbnNlcnRpbmcgYW5kIHJlbW92aW5nIGxvZ2ljYWwgZWxlbWVudHMgdXBkYXRlcyB0aGUgYnJvd3NlciBET00ganVzdCB0aGUgc2FtZS5cblxuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0LCB1bmxpa2UgcmVndWxhciBET00gbXV0YXRpb24gQVBJcywgdGhlIExvZ2ljYWxFbGVtZW50IEFQSXMgZG9uJ3QgdXNlXG4gIHRoZSB1bmRlcmx5aW5nIERPTSBzdHJ1Y3R1cmUgYXMgdGhlIGRhdGEgc3RvcmFnZSBmb3IgdGhlIGVsZW1lbnQgaGllcmFyY2h5LiBJbnN0ZWFkLCB0aGVcbiAgTG9naWNhbEVsZW1lbnQgQVBJcyB0YWtlIGNhcmUgb2YgdHJhY2tpbmcgaGllcmFyY2hpY2FsIHJlbGF0aW9uc2hpcHMgc2VwYXJhdGVseS4gVGhlIHBvaW50XG4gIG9mIHRoaXMgaXMgdG8gcGVybWl0IGEgbG9naWNhbCB0cmVlIHN0cnVjdHVyZSBpbiB3aGljaCBwYXJlbnQvY2hpbGQgcmVsYXRpb25zaGlwcyBkb24ndFxuICBoYXZlIHRvIGJlIG1hdGVyaWFsaXplZCBpbiB0ZXJtcyBvZiBET00gZWxlbWVudCBwYXJlbnQvY2hpbGQgcmVsYXRpb25zaGlwcy4gQW5kIHRoZSByZWFzb25cbiAgd2h5IHdlIHdhbnQgdGhhdCBpcyBzbyB0aGF0IGhpZXJhcmNoaWVzIG9mIEJsYXpvciBjb21wb25lbnRzIGNhbiBiZSB0cmFja2VkIGV2ZW4gd2hlbiB0aG9zZVxuICBjb21wb25lbnRzJyByZW5kZXIgb3V0cHV0IG5lZWQgbm90IGJlIGEgc2luZ2xlIGxpdGVyYWwgRE9NIGVsZW1lbnQuXG5cbiAgQ29uc3VtZXJzIG9mIHRoZSBBUEkgZG9uJ3QgbmVlZCB0byBrbm93IGFib3V0IHRoZSBpbXBsZW1lbnRhdGlvbiwgYnV0IGhvdyBpdCdzIGRvbmUgaXM6XG4gIC0gRWFjaCBMb2dpY2FsRWxlbWVudCBpcyBtYXRlcmlhbGl6ZWQgaW4gdGhlIERPTSBhcyBlaXRoZXI6XG4gICAgLSBBIE5vZGUgaW5zdGFuY2UsIGZvciBhY3R1YWwgTm9kZSBpbnN0YW5jZXMgaW5zZXJ0ZWQgdXNpbmcgJ2luc2VydExvZ2ljYWxDaGlsZCcgb3JcbiAgICAgIGZvciBFbGVtZW50IGluc3RhbmNlcyBwcm9tb3RlZCB0byBMb2dpY2FsRWxlbWVudCB2aWEgJ3RvTG9naWNhbEVsZW1lbnQnXG4gICAgLSBBIENvbW1lbnQgaW5zdGFuY2UsIGZvciAnbG9naWNhbCBjb250YWluZXInIGluc3RhbmNlcyBpbnNlcnRlZCB1c2luZyAnY3JlYXRlQW5kSW5zZXJ0TG9naWNhbENvbnRhaW5lcidcbiAgLSBUaGVuLCBvbiB0aGF0IGluc3RhbmNlIChpLmUuLCB0aGUgTm9kZSBvciBDb21tZW50KSwgd2Ugc3RvcmUgYW4gYXJyYXkgb2YgJ2xvZ2ljYWwgY2hpbGRyZW4nXG4gICAgaW5zdGFuY2VzLCBlLmcuLFxuICAgICAgW2ZpcnN0Q2hpbGQsIHNlY29uZENoaWxkLCB0aGlyZENoaWxkLCAuLi5dXG4gICAgLi4uIHBsdXMgd2Ugc3RvcmUgYSByZWZlcmVuY2UgdG8gdGhlICdsb2dpY2FsIHBhcmVudCcgKGlmIGFueSlcbiAgLSBUaGUgJ2xvZ2ljYWwgY2hpbGRyZW4nIGFycmF5IG1lYW5zIHdlIGNhbiBsb29rIHVwIGluIE8oMSk6XG4gICAgLSBUaGUgbnVtYmVyIG9mIGxvZ2ljYWwgY2hpbGRyZW4gKG5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQgYmVjYXVzZSBub3QgcmVxdWlyZWQsIGJ1dCB0cml2aWFsKVxuICAgIC0gVGhlIGxvZ2ljYWwgY2hpbGQgYXQgYW55IGdpdmVuIGluZGV4XG4gIC0gV2hlbmV2ZXIgYSBsb2dpY2FsIGNoaWxkIGlzIGFkZGVkIG9yIHJlbW92ZWQsIHdlIHVwZGF0ZSB0aGUgcGFyZW50J3MgYXJyYXkgb2YgbG9naWNhbCBjaGlsZHJlblxuKi9cblxuY29uc3QgbG9naWNhbENoaWxkcmVuUHJvcG5hbWUgPSBjcmVhdGVTeW1ib2xPckZhbGxiYWNrKCdfYmxhem9yTG9naWNhbENoaWxkcmVuJyk7XG5jb25zdCBsb2dpY2FsUGFyZW50UHJvcG5hbWUgPSBjcmVhdGVTeW1ib2xPckZhbGxiYWNrKCdfYmxhem9yTG9naWNhbFBhcmVudCcpO1xuXG5leHBvcnQgZnVuY3Rpb24gdG9Mb2dpY2FsRWxlbWVudChlbGVtZW50OiBFbGVtZW50LCBhbGxvd0V4aXN0aW5nQ29udGVudHM/OiBib29sZWFuKSB7XG4gIC8vIE5vcm1hbGx5IGl0J3MgZ29vZCB0byBhc3NlcnQgdGhhdCB0aGUgZWxlbWVudCBoYXMgc3RhcnRlZCBlbXB0eSwgYmVjYXVzZSB0aGF0J3MgdGhlIHVzdWFsXG4gIC8vIHNpdHVhdGlvbiBhbmQgd2UgcHJvYmFibHkgaGF2ZSBhIGJ1ZyBpZiBpdCdzIG5vdC4gQnV0IGZvciB0aGUgZWxlbWVudCB0aGF0IGNvbnRhaW4gcHJlcmVuZGVyZWRcbiAgLy8gcm9vdCBjb21wb25lbnRzLCB3ZSB3YW50IHRvIGxldCB0aGVtIGtlZXAgdGhlaXIgY29udGVudCB1bnRpbCB3ZSByZXBsYWNlIGl0LlxuICBpZiAoZWxlbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA+IDAgJiYgIWFsbG93RXhpc3RpbmdDb250ZW50cykge1xuICAgIHRocm93IG5ldyBFcnJvcignTmV3IGxvZ2ljYWwgZWxlbWVudHMgbXVzdCBzdGFydCBlbXB0eSwgb3IgYWxsb3dFeGlzdGluZ0NvbnRlbnRzIG11c3QgYmUgdHJ1ZScpO1xuICB9XG5cbiAgZWxlbWVudFtsb2dpY2FsQ2hpbGRyZW5Qcm9wbmFtZV0gPSBbXTtcbiAgcmV0dXJuIGVsZW1lbnQgYXMgYW55IGFzIExvZ2ljYWxFbGVtZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQW5kSW5zZXJ0TG9naWNhbENvbnRhaW5lcihwYXJlbnQ6IExvZ2ljYWxFbGVtZW50LCBjaGlsZEluZGV4OiBudW1iZXIpOiBMb2dpY2FsRWxlbWVudCB7XG4gIGNvbnN0IGNvbnRhaW5lckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVDb21tZW50KCchJyk7XG4gIGluc2VydExvZ2ljYWxDaGlsZChjb250YWluZXJFbGVtZW50LCBwYXJlbnQsIGNoaWxkSW5kZXgpO1xuICByZXR1cm4gY29udGFpbmVyRWxlbWVudCBhcyBhbnkgYXMgTG9naWNhbEVsZW1lbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRMb2dpY2FsQ2hpbGQoY2hpbGQ6IE5vZGUsIHBhcmVudDogTG9naWNhbEVsZW1lbnQsIGNoaWxkSW5kZXg6IG51bWJlcikge1xuICBjb25zdCBjaGlsZEFzTG9naWNhbEVsZW1lbnQgPSBjaGlsZCBhcyBhbnkgYXMgTG9naWNhbEVsZW1lbnQ7XG4gIGlmIChjaGlsZCBpbnN0YW5jZW9mIENvbW1lbnQpIHtcbiAgICBjb25zdCBleGlzdGluZ0dyYW5kY2hpbGRyZW4gPSBnZXRMb2dpY2FsQ2hpbGRyZW5BcnJheShjaGlsZEFzTG9naWNhbEVsZW1lbnQpO1xuICAgIGlmIChleGlzdGluZ0dyYW5kY2hpbGRyZW4gJiYgZ2V0TG9naWNhbENoaWxkcmVuQXJyYXkoY2hpbGRBc0xvZ2ljYWxFbGVtZW50KS5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBUaGVyZSdzIG5vdGhpbmcgdG8gc3RvcCB1cyBpbXBsZW1lbnRpbmcgc3VwcG9ydCBmb3IgdGhpcyBzY2VuYXJpbywgYW5kIGl0J3Mgbm90IGRpZmZpY3VsdFxuICAgICAgLy8gKGFmdGVyIGluc2VydGluZyAnY2hpbGQnIGl0c2VsZiwgYWxzbyBpdGVyYXRlIHRocm91Z2ggaXRzIGxvZ2ljYWwgY2hpbGRyZW4gYW5kIHBoeXNpY2FsbHlcbiAgICAgIC8vIHB1dCB0aGVtIGFzIGZvbGxvd2luZy1zaWJsaW5ncyBpbiB0aGUgRE9NKS4gSG93ZXZlciB0aGVyZSdzIG5vIHNjZW5hcmlvIHRoYXQgcmVxdWlyZXMgaXRcbiAgICAgIC8vIHByZXNlbnRseSwgc28gaWYgd2UgZGlkIGltcGxlbWVudCBpdCB0aGVyZSdkIGJlIG5vIGdvb2Qgd2F5IHRvIGhhdmUgdGVzdHMgZm9yIGl0LlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQ6IGluc2VydGluZyBub24tZW1wdHkgbG9naWNhbCBjb250YWluZXInKTtcbiAgICB9XG4gIH1cblxuICBpZiAoZ2V0TG9naWNhbFBhcmVudChjaGlsZEFzTG9naWNhbEVsZW1lbnQpKSB7XG4gICAgLy8gTGlrZXdpc2UsIHdlIGNvdWxkIGVhc2lseSBzdXBwb3J0IHRoaXMgc2NlbmFyaW8gdG9vIChpbiB0aGlzICdpZicgYmxvY2ssIGp1c3Qgc3BsaWNlXG4gICAgLy8gb3V0ICdjaGlsZCcgZnJvbSB0aGUgbG9naWNhbCBjaGlsZHJlbiBhcnJheSBvZiBpdHMgcHJldmlvdXMgbG9naWNhbCBwYXJlbnQgYnkgdXNpbmdcbiAgICAvLyBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiB0byBkZXRlcm1pbmUgaXRzIHByZXZpb3VzIHNpYmxpbmcgaW5kZXgpLlxuICAgIC8vIEJ1dCBhZ2Fpbiwgc2luY2UgdGhlcmUncyBub3QgY3VycmVudGx5IGFueSBzY2VuYXJpbyB0aGF0IHdvdWxkIHVzZSBpdCwgd2Ugd291bGQgbm90XG4gICAgLy8gaGF2ZSBhbnkgdGVzdCBjb3ZlcmFnZSBmb3Igc3VjaCBhbiBpbXBsZW1lbnRhdGlvbi5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZDogbW92aW5nIGV4aXN0aW5nIGxvZ2ljYWwgY2hpbGRyZW4nKTtcbiAgfVxuXG4gIGNvbnN0IG5ld1NpYmxpbmdzID0gZ2V0TG9naWNhbENoaWxkcmVuQXJyYXkocGFyZW50KTtcbiAgaWYgKGNoaWxkSW5kZXggPCBuZXdTaWJsaW5ncy5sZW5ndGgpIHtcbiAgICAvLyBJbnNlcnRcbiAgICBjb25zdCBuZXh0U2libGluZyA9IG5ld1NpYmxpbmdzW2NoaWxkSW5kZXhdIGFzIGFueSBhcyBOb2RlO1xuICAgIG5leHRTaWJsaW5nLnBhcmVudE5vZGUhLmluc2VydEJlZm9yZShjaGlsZCwgbmV4dFNpYmxpbmcpO1xuICAgIG5ld1NpYmxpbmdzLnNwbGljZShjaGlsZEluZGV4LCAwLCBjaGlsZEFzTG9naWNhbEVsZW1lbnQpO1xuICB9IGVsc2Uge1xuICAgIC8vIEFwcGVuZFxuICAgIGFwcGVuZERvbU5vZGUoY2hpbGQsIHBhcmVudCk7XG4gICAgbmV3U2libGluZ3MucHVzaChjaGlsZEFzTG9naWNhbEVsZW1lbnQpO1xuICB9XG5cbiAgY2hpbGRBc0xvZ2ljYWxFbGVtZW50W2xvZ2ljYWxQYXJlbnRQcm9wbmFtZV0gPSBwYXJlbnQ7XG4gIGlmICghKGxvZ2ljYWxDaGlsZHJlblByb3BuYW1lIGluIGNoaWxkQXNMb2dpY2FsRWxlbWVudCkpIHtcbiAgICBjaGlsZEFzTG9naWNhbEVsZW1lbnRbbG9naWNhbENoaWxkcmVuUHJvcG5hbWVdID0gW107XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUxvZ2ljYWxDaGlsZChwYXJlbnQ6IExvZ2ljYWxFbGVtZW50LCBjaGlsZEluZGV4OiBudW1iZXIpIHtcbiAgY29uc3QgY2hpbGRyZW5BcnJheSA9IGdldExvZ2ljYWxDaGlsZHJlbkFycmF5KHBhcmVudCk7XG4gIGNvbnN0IGNoaWxkVG9SZW1vdmUgPSBjaGlsZHJlbkFycmF5LnNwbGljZShjaGlsZEluZGV4LCAxKVswXTtcblxuICAvLyBJZiBpdCdzIGEgbG9naWNhbCBjb250YWluZXIsIGFsc28gcmVtb3ZlIGl0cyBkZXNjZW5kYW50c1xuICBpZiAoY2hpbGRUb1JlbW92ZSBpbnN0YW5jZW9mIENvbW1lbnQpIHtcbiAgICBjb25zdCBncmFuZGNoaWxkcmVuQXJyYXkgPSBnZXRMb2dpY2FsQ2hpbGRyZW5BcnJheShjaGlsZFRvUmVtb3ZlKTtcbiAgICB3aGlsZSAoZ3JhbmRjaGlsZHJlbkFycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgIHJlbW92ZUxvZ2ljYWxDaGlsZChjaGlsZFRvUmVtb3ZlLCAwKTtcbiAgICB9XG4gIH1cblxuICAvLyBGaW5hbGx5LCByZW1vdmUgdGhlIG5vZGUgaXRzZWxmXG4gIGNvbnN0IGRvbU5vZGVUb1JlbW92ZSA9IGNoaWxkVG9SZW1vdmUgYXMgYW55IGFzIE5vZGU7XG4gIGRvbU5vZGVUb1JlbW92ZS5wYXJlbnROb2RlIS5yZW1vdmVDaGlsZChkb21Ob2RlVG9SZW1vdmUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9naWNhbFBhcmVudChlbGVtZW50OiBMb2dpY2FsRWxlbWVudCk6IExvZ2ljYWxFbGVtZW50IHwgbnVsbCB7XG4gIHJldHVybiAoZWxlbWVudFtsb2dpY2FsUGFyZW50UHJvcG5hbWVdIGFzIExvZ2ljYWxFbGVtZW50KSB8fCBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9naWNhbENoaWxkKHBhcmVudDogTG9naWNhbEVsZW1lbnQsIGNoaWxkSW5kZXg6IG51bWJlcik6IExvZ2ljYWxFbGVtZW50IHtcbiAgcmV0dXJuIGdldExvZ2ljYWxDaGlsZHJlbkFycmF5KHBhcmVudClbY2hpbGRJbmRleF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1N2Z0VsZW1lbnQoZWxlbWVudDogTG9naWNhbEVsZW1lbnQpIHtcbiAgcmV0dXJuIGdldENsb3Nlc3REb21FbGVtZW50KGVsZW1lbnQpLm5hbWVzcGFjZVVSSSA9PT0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJztcbn1cblxuZnVuY3Rpb24gZ2V0TG9naWNhbENoaWxkcmVuQXJyYXkoZWxlbWVudDogTG9naWNhbEVsZW1lbnQpIHtcbiAgcmV0dXJuIGVsZW1lbnRbbG9naWNhbENoaWxkcmVuUHJvcG5hbWVdIGFzIExvZ2ljYWxFbGVtZW50W107XG59XG5cbmZ1bmN0aW9uIGdldExvZ2ljYWxOZXh0U2libGluZyhlbGVtZW50OiBMb2dpY2FsRWxlbWVudCk6IExvZ2ljYWxFbGVtZW50IHwgbnVsbCB7XG4gIGNvbnN0IHNpYmxpbmdzID0gZ2V0TG9naWNhbENoaWxkcmVuQXJyYXkoZ2V0TG9naWNhbFBhcmVudChlbGVtZW50KSEpO1xuICBjb25zdCBzaWJsaW5nSW5kZXggPSBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKHNpYmxpbmdzLCBlbGVtZW50KTtcbiAgcmV0dXJuIHNpYmxpbmdzW3NpYmxpbmdJbmRleCArIDFdIHx8IG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldENsb3Nlc3REb21FbGVtZW50KGxvZ2ljYWxFbGVtZW50OiBMb2dpY2FsRWxlbWVudCkge1xuICBpZiAobG9naWNhbEVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgcmV0dXJuIGxvZ2ljYWxFbGVtZW50O1xuICB9IGVsc2UgaWYgKGxvZ2ljYWxFbGVtZW50IGluc3RhbmNlb2YgQ29tbWVudCkge1xuICAgIHJldHVybiBsb2dpY2FsRWxlbWVudC5wYXJlbnROb2RlISBhcyBFbGVtZW50O1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignTm90IGEgdmFsaWQgbG9naWNhbCBlbGVtZW50Jyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXBwZW5kRG9tTm9kZShjaGlsZDogTm9kZSwgcGFyZW50OiBMb2dpY2FsRWxlbWVudCkge1xuICAvLyBUaGlzIGZ1bmN0aW9uIG9ubHkgcHV0cyAnY2hpbGQnIGludG8gdGhlIERPTSBpbiB0aGUgcmlnaHQgcGxhY2UgcmVsYXRpdmUgdG8gJ3BhcmVudCdcbiAgLy8gSXQgZG9lcyBub3QgdXBkYXRlIHRoZSBsb2dpY2FsIGNoaWxkcmVuIGFycmF5IG9mIGFueXRoaW5nXG4gIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgcGFyZW50LmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgfSBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBDb21tZW50KSB7XG4gICAgY29uc3QgcGFyZW50TG9naWNhbE5leHRTaWJsaW5nID0gZ2V0TG9naWNhbE5leHRTaWJsaW5nKHBhcmVudCkgYXMgYW55IGFzIE5vZGU7XG4gICAgaWYgKHBhcmVudExvZ2ljYWxOZXh0U2libGluZykge1xuICAgICAgLy8gU2luY2UgdGhlIHBhcmVudCBoYXMgYSBsb2dpY2FsIG5leHQtc2libGluZywgaXRzIGFwcGVuZGVkIGNoaWxkIGdvZXMgcmlnaHQgYmVmb3JlIHRoYXRcbiAgICAgIHBhcmVudExvZ2ljYWxOZXh0U2libGluZy5wYXJlbnROb2RlIS5pbnNlcnRCZWZvcmUoY2hpbGQsIHBhcmVudExvZ2ljYWxOZXh0U2libGluZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNpbmNlIHRoZSBwYXJlbnQgaGFzIG5vIGxvZ2ljYWwgbmV4dC1zaWJsaW5nLCBrZWVwIHJlY3Vyc2luZyB1cHdhcmRzIHVudGlsIHdlIGZpbmRcbiAgICAgIC8vIGEgbG9naWNhbCBhbmNlc3RvciB0aGF0IGRvZXMgaGF2ZSBhIG5leHQtc2libGluZyBvciBpcyBhIHBoeXNpY2FsIGVsZW1lbnQuXG4gICAgICBhcHBlbmREb21Ob2RlKGNoaWxkLCBnZXRMb2dpY2FsUGFyZW50KHBhcmVudCkhKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gU2hvdWxkIG5ldmVyIGhhcHBlblxuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGFwcGVuZCBub2RlIGJlY2F1c2UgdGhlIHBhcmVudCBpcyBub3QgYSB2YWxpZCBsb2dpY2FsIGVsZW1lbnQuIFBhcmVudDogJHtwYXJlbnR9YCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlU3ltYm9sT3JGYWxsYmFjayhmYWxsYmFjazogc3RyaW5nKTogc3ltYm9sIHwgc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgPyBTeW1ib2woKSA6IGZhbGxiYWNrO1xufVxuXG4vLyBOb21pbmFsIHR5cGUgdG8gcmVwcmVzZW50IGEgbG9naWNhbCBlbGVtZW50IHdpdGhvdXQgbmVlZGluZyB0byBhbGxvY2F0ZSBhbnkgb2JqZWN0IGZvciBpbnN0YW5jZXNcbmV4cG9ydCBpbnRlcmZhY2UgTG9naWNhbEVsZW1lbnQgeyBMb2dpY2FsRWxlbWVudF9fRE9fTk9UX0lNUExFTUVOVDogYW55IH07XG4iLCJleHBvcnQgaW50ZXJmYWNlIFJlbmRlckJhdGNoIHtcbiAgdXBkYXRlZENvbXBvbmVudHMoKTogQXJyYXlSYW5nZTxSZW5kZXJUcmVlRGlmZj47XG4gIHJlZmVyZW5jZUZyYW1lcygpOiBBcnJheVJhbmdlPFJlbmRlclRyZWVGcmFtZT47XG4gIGRpc3Bvc2VkQ29tcG9uZW50SWRzKCk6IEFycmF5UmFuZ2U8bnVtYmVyPjtcbiAgZGlzcG9zZWRFdmVudEhhbmRsZXJJZHMoKTogQXJyYXlSYW5nZTxudW1iZXI+O1xuXG4gIHVwZGF0ZWRDb21wb25lbnRzRW50cnkodmFsdWVzOiBBcnJheVZhbHVlczxSZW5kZXJUcmVlRGlmZj4sIGluZGV4OiBudW1iZXIpOiBSZW5kZXJUcmVlRGlmZjtcbiAgcmVmZXJlbmNlRnJhbWVzRW50cnkodmFsdWVzOiBBcnJheVZhbHVlczxSZW5kZXJUcmVlRnJhbWU+LCBpbmRleDogbnVtYmVyKTogUmVuZGVyVHJlZUZyYW1lO1xuICBkaXNwb3NlZENvbXBvbmVudElkc0VudHJ5KHZhbHVlczogQXJyYXlWYWx1ZXM8bnVtYmVyPiwgaW5kZXg6IG51bWJlcik6IG51bWJlcjtcbiAgZGlzcG9zZWRFdmVudEhhbmRsZXJJZHNFbnRyeSh2YWx1ZXM6IEFycmF5VmFsdWVzPG51bWJlcj4sIGluZGV4OiBudW1iZXIpOiBudW1iZXI7XG5cbiAgZGlmZlJlYWRlcjogUmVuZGVyVHJlZURpZmZSZWFkZXI7XG4gIGVkaXRSZWFkZXI6IFJlbmRlclRyZWVFZGl0UmVhZGVyO1xuICBmcmFtZVJlYWRlcjogUmVuZGVyVHJlZUZyYW1lUmVhZGVyO1xuICBhcnJheVJhbmdlUmVhZGVyOiBBcnJheVJhbmdlUmVhZGVyO1xuICBhcnJheVNlZ21lbnRSZWFkZXI6IEFycmF5U2VnbWVudFJlYWRlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcnJheVJhbmdlUmVhZGVyIHtcbiAgY291bnQ8VD4oYXJyYXlSYW5nZTogQXJyYXlSYW5nZTxUPik6IG51bWJlcjtcbiAgdmFsdWVzPFQ+KGFycmF5UmFuZ2U6IEFycmF5UmFuZ2U8VD4pOiBBcnJheVZhbHVlczxUPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcnJheVNlZ21lbnRSZWFkZXIge1xuICBvZmZzZXQ8VD4oYXJyYXlTZWdtZW50OiBBcnJheVNlZ21lbnQ8VD4pOiBudW1iZXI7XG4gIGNvdW50PFQ+KGFycmF5U2VnbWVudDogQXJyYXlTZWdtZW50PFQ+KTogbnVtYmVyO1xuICB2YWx1ZXM8VD4oYXJyYXlTZWdtZW50OiBBcnJheVNlZ21lbnQ8VD4pOiBBcnJheVZhbHVlczxUPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZW5kZXJUcmVlRGlmZlJlYWRlciB7XG4gIGNvbXBvbmVudElkKGRpZmY6IFJlbmRlclRyZWVEaWZmKTogbnVtYmVyO1xuICBlZGl0cyhkaWZmOiBSZW5kZXJUcmVlRGlmZik6IEFycmF5U2VnbWVudDxSZW5kZXJUcmVlRWRpdD47XG4gIGVkaXRzRW50cnkodmFsdWVzOiBBcnJheVZhbHVlczxSZW5kZXJUcmVlRWRpdD4sIGluZGV4OiBudW1iZXIpOiBSZW5kZXJUcmVlRWRpdDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZW5kZXJUcmVlRWRpdFJlYWRlciB7XG4gIGVkaXRUeXBlKGVkaXQ6IFJlbmRlclRyZWVFZGl0KTogRWRpdFR5cGU7XG4gIHNpYmxpbmdJbmRleChlZGl0OiBSZW5kZXJUcmVlRWRpdCk6IG51bWJlcjtcbiAgbmV3VHJlZUluZGV4KGVkaXQ6IFJlbmRlclRyZWVFZGl0KTogbnVtYmVyO1xuICByZW1vdmVkQXR0cmlidXRlTmFtZShlZGl0OiBSZW5kZXJUcmVlRWRpdCk6IHN0cmluZyB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVuZGVyVHJlZUZyYW1lUmVhZGVyIHtcbiAgZnJhbWVUeXBlKGZyYW1lOiBSZW5kZXJUcmVlRnJhbWUpOiBGcmFtZVR5cGU7XG4gIHN1YnRyZWVMZW5ndGgoZnJhbWU6IFJlbmRlclRyZWVGcmFtZSk6IG51bWJlcjtcbiAgZWxlbWVudFJlZmVyZW5jZUNhcHR1cmVJZChmcmFtZTogUmVuZGVyVHJlZUZyYW1lKTogc3RyaW5nIHwgbnVsbDtcbiAgY29tcG9uZW50SWQoZnJhbWU6IFJlbmRlclRyZWVGcmFtZSk6IG51bWJlcjtcbiAgZWxlbWVudE5hbWUoZnJhbWU6IFJlbmRlclRyZWVGcmFtZSk6IHN0cmluZyB8IG51bGw7XG4gIHRleHRDb250ZW50KGZyYW1lOiBSZW5kZXJUcmVlRnJhbWUpOiBzdHJpbmcgfCBudWxsO1xuICBtYXJrdXBDb250ZW50KGZyYW1lOiBSZW5kZXJUcmVlRnJhbWUpOiBzdHJpbmc7XG4gIGF0dHJpYnV0ZU5hbWUoZnJhbWU6IFJlbmRlclRyZWVGcmFtZSk6IHN0cmluZyB8IG51bGw7XG4gIGF0dHJpYnV0ZVZhbHVlKGZyYW1lOiBSZW5kZXJUcmVlRnJhbWUpOiBzdHJpbmcgfCBudWxsO1xuICBhdHRyaWJ1dGVFdmVudEhhbmRsZXJJZChmcmFtZTogUmVuZGVyVHJlZUZyYW1lKTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFycmF5UmFuZ2U8VD4geyBBcnJheVJhbmdlX19ET19OT1RfSU1QTEVNRU5UOiBhbnkgfVxuZXhwb3J0IGludGVyZmFjZSBBcnJheVNlZ21lbnQ8VD4geyBBcnJheVNlZ21lbnRfX0RPX05PVF9JTVBMRU1FTlQ6IGFueSB9XG5leHBvcnQgaW50ZXJmYWNlIEFycmF5VmFsdWVzPFQ+IHsgQXJyYXlWYWx1ZXNfX0RPX05PVF9JTVBMRU1FTlQ6IGFueSB9XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVuZGVyVHJlZURpZmYgeyBSZW5kZXJUcmVlRGlmZl9fRE9fTk9UX0lNUExFTUVOVDogYW55IH1cbmV4cG9ydCBpbnRlcmZhY2UgUmVuZGVyVHJlZUZyYW1lIHsgUmVuZGVyVHJlZUZyYW1lX19ET19OT1RfSU1QTEVNRU5UOiBhbnkgfVxuZXhwb3J0IGludGVyZmFjZSBSZW5kZXJUcmVlRWRpdCB7IFJlbmRlclRyZWVFZGl0X19ET19OT1RfSU1QTEVNRU5UOiBhbnkgfVxuXG5leHBvcnQgZW51bSBFZGl0VHlwZSB7XG4gIC8vIFRoZSB2YWx1ZXMgbXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgLk5FVCBlcXVpdmFsZW50IGluIFJlbmRlclRyZWVFZGl0VHlwZS5jc1xuICBwcmVwZW5kRnJhbWUgPSAxLFxuICByZW1vdmVGcmFtZSA9IDIsXG4gIHNldEF0dHJpYnV0ZSA9IDMsXG4gIHJlbW92ZUF0dHJpYnV0ZSA9IDQsXG4gIHVwZGF0ZVRleHQgPSA1LFxuICBzdGVwSW4gPSA2LFxuICBzdGVwT3V0ID0gNyxcbiAgdXBkYXRlTWFya3VwID0gOCxcbn1cblxuZXhwb3J0IGVudW0gRnJhbWVUeXBlIHtcbiAgLy8gVGhlIHZhbHVlcyBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSAuTkVUIGVxdWl2YWxlbnQgaW4gUmVuZGVyVHJlZUZyYW1lVHlwZS5jc1xuICBlbGVtZW50ID0gMSxcbiAgdGV4dCA9IDIsXG4gIGF0dHJpYnV0ZSA9IDMsXG4gIGNvbXBvbmVudCA9IDQsXG4gIHJlZ2lvbiA9IDUsXG4gIGVsZW1lbnRSZWZlcmVuY2VDYXB0dXJlID0gNixcbiAgbWFya3VwID0gOCxcbn1cbiIsImltcG9ydCB7IHBsYXRmb3JtIH0gZnJvbSAnLi4vLi4vRW52aXJvbm1lbnQnO1xuaW1wb3J0IHsgUmVuZGVyQmF0Y2gsIEFycmF5UmFuZ2UsIEFycmF5UmFuZ2VSZWFkZXIsIEFycmF5U2VnbWVudCwgUmVuZGVyVHJlZURpZmYsIFJlbmRlclRyZWVFZGl0LCBSZW5kZXJUcmVlRnJhbWUsIEFycmF5VmFsdWVzLCBFZGl0VHlwZSwgRnJhbWVUeXBlLCBSZW5kZXJUcmVlRnJhbWVSZWFkZXIgfSBmcm9tICcuL1JlbmRlckJhdGNoJztcbmltcG9ydCB7IFBvaW50ZXIsIFN5c3RlbV9BcnJheSB9IGZyb20gJy4uLy4uL1BsYXRmb3JtL1BsYXRmb3JtJztcblxuLy8gVXNlZCB3aGVuIHJ1bm5pbmcgb24gTW9ubyBXZWJBc3NlbWJseSBmb3Igc2hhcmVkLW1lbW9yeSBpbnRlcm9wLiBUaGUgY29kZSBoZXJlIGVuY2Fwc3VsYXRlc1xuLy8gb3VyIGtub3dsZWRnZSBvZiB0aGUgbWVtb3J5IGxheW91dCBvZiBSZW5kZXJCYXRjaCBhbmQgYWxsIHJlZmVyZW5jZWQgdHlwZXMuXG4vL1xuLy8gSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwgYWxsIHRoZSBEVE8gdHlwZXMgYXJlIHJlYWxseSBoZWFwIHBvaW50ZXJzIGF0IHJ1bnRpbWUsIGhlbmNlIGFsbFxuLy8gdGhlIGNhc3RzIHRvICdhbnknIHdoZW5ldmVyIHdlIHBhc3MgdGhlbSB0byBwbGF0Zm9ybS5yZWFkLlxuXG5leHBvcnQgY2xhc3MgU2hhcmVkTWVtb3J5UmVuZGVyQmF0Y2ggaW1wbGVtZW50cyBSZW5kZXJCYXRjaCB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYmF0Y2hBZGRyZXNzOiBQb2ludGVyKSB7XG4gIH1cblxuICAvLyBLZWVwIGluIHN5bmMgd2l0aCBtZW1vcnkgbGF5b3V0IGluIFJlbmRlckJhdGNoLmNzXG4gIHVwZGF0ZWRDb21wb25lbnRzKCkgeyByZXR1cm4gcGxhdGZvcm0ucmVhZFN0cnVjdEZpZWxkPFBvaW50ZXI+KHRoaXMuYmF0Y2hBZGRyZXNzLCAwKSBhcyBhbnkgYXMgQXJyYXlSYW5nZTxSZW5kZXJUcmVlRGlmZj47IH1cbiAgcmVmZXJlbmNlRnJhbWVzKCkgeyByZXR1cm4gcGxhdGZvcm0ucmVhZFN0cnVjdEZpZWxkPFBvaW50ZXI+KHRoaXMuYmF0Y2hBZGRyZXNzLCBhcnJheVJhbmdlUmVhZGVyLnN0cnVjdExlbmd0aCkgYXMgYW55IGFzIEFycmF5UmFuZ2U8UmVuZGVyVHJlZURpZmY+OyB9XG4gIGRpc3Bvc2VkQ29tcG9uZW50SWRzKCkgeyByZXR1cm4gcGxhdGZvcm0ucmVhZFN0cnVjdEZpZWxkPFBvaW50ZXI+KHRoaXMuYmF0Y2hBZGRyZXNzLCBhcnJheVJhbmdlUmVhZGVyLnN0cnVjdExlbmd0aCAqIDIpIGFzIGFueSBhcyBBcnJheVJhbmdlPG51bWJlcj47IH1cbiAgZGlzcG9zZWRFdmVudEhhbmRsZXJJZHMoKSB7IHJldHVybiBwbGF0Zm9ybS5yZWFkU3RydWN0RmllbGQ8UG9pbnRlcj4odGhpcy5iYXRjaEFkZHJlc3MsIGFycmF5UmFuZ2VSZWFkZXIuc3RydWN0TGVuZ3RoICogMykgYXMgYW55IGFzIEFycmF5UmFuZ2U8bnVtYmVyPjsgfVxuXG4gIHVwZGF0ZWRDb21wb25lbnRzRW50cnkodmFsdWVzOiBBcnJheVZhbHVlczxSZW5kZXJUcmVlRGlmZj4sIGluZGV4OiBudW1iZXIpIHtcbiAgICByZXR1cm4gYXJyYXlWYWx1ZXNFbnRyeSh2YWx1ZXMsIGluZGV4LCBkaWZmUmVhZGVyLnN0cnVjdExlbmd0aCk7XG4gIH1cbiAgcmVmZXJlbmNlRnJhbWVzRW50cnkodmFsdWVzOiBBcnJheVZhbHVlczxSZW5kZXJUcmVlRnJhbWU+LCBpbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIGFycmF5VmFsdWVzRW50cnkodmFsdWVzLCBpbmRleCwgZnJhbWVSZWFkZXIuc3RydWN0TGVuZ3RoKTtcbiAgfVxuICBkaXNwb3NlZENvbXBvbmVudElkc0VudHJ5KHZhbHVlczogQXJyYXlWYWx1ZXM8bnVtYmVyPiwgaW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IHBvaW50ZXIgPSBhcnJheVZhbHVlc0VudHJ5KHZhbHVlcywgaW5kZXgsIC8qIGludCBsZW5ndGggKi8gNCk7XG4gICAgcmV0dXJuIHBsYXRmb3JtLnJlYWRJbnQzMkZpZWxkKHBvaW50ZXIgYXMgYW55IGFzIFBvaW50ZXIpO1xuICB9XG4gIGRpc3Bvc2VkRXZlbnRIYW5kbGVySWRzRW50cnkodmFsdWVzOiBBcnJheVZhbHVlczxudW1iZXI+LCBpbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3QgcG9pbnRlciA9IGFycmF5VmFsdWVzRW50cnkodmFsdWVzLCBpbmRleCwgLyogaW50IGxlbmd0aCAqLyA0KTtcbiAgICByZXR1cm4gcGxhdGZvcm0ucmVhZEludDMyRmllbGQocG9pbnRlciBhcyBhbnkgYXMgUG9pbnRlcik7XG4gIH1cblxuICBhcnJheVJhbmdlUmVhZGVyID0gYXJyYXlSYW5nZVJlYWRlcjtcbiAgYXJyYXlTZWdtZW50UmVhZGVyID0gYXJyYXlTZWdtZW50UmVhZGVyO1xuICBkaWZmUmVhZGVyID0gZGlmZlJlYWRlcjtcbiAgZWRpdFJlYWRlciA9IGVkaXRSZWFkZXI7XG4gIGZyYW1lUmVhZGVyID0gZnJhbWVSZWFkZXI7XG59XG5cbi8vIEtlZXAgaW4gc3luYyB3aXRoIG1lbW9yeSBsYXlvdXQgaW4gQXJyYXlSYW5nZS5jc1xuY29uc3QgYXJyYXlSYW5nZVJlYWRlciA9IHtcbiAgc3RydWN0TGVuZ3RoOiA4LFxuICB2YWx1ZXM6IDxUPihhcnJheVJhbmdlOiBBcnJheVJhbmdlPFQ+KSA9PiBwbGF0Zm9ybS5yZWFkT2JqZWN0RmllbGQ8U3lzdGVtX0FycmF5PFQ+PihhcnJheVJhbmdlIGFzIGFueSwgMCkgYXMgYW55IGFzIEFycmF5VmFsdWVzPFQ+LFxuICBjb3VudDogPFQ+KGFycmF5UmFuZ2U6IEFycmF5UmFuZ2U8VD4pID0+IHBsYXRmb3JtLnJlYWRJbnQzMkZpZWxkKGFycmF5UmFuZ2UgYXMgYW55LCA0KSxcbn07XG5cbi8vIEtlZXAgaW4gc3luYyB3aXRoIG1lbW9yeSBsYXlvdXQgaW4gQXJyYXlTZWdtZW50XG5jb25zdCBhcnJheVNlZ21lbnRSZWFkZXIgPSB7XG4gIHN0cnVjdExlbmd0aDogMTIsXG4gIHZhbHVlczogPFQ+KGFycmF5U2VnbWVudDogQXJyYXlTZWdtZW50PFQ+KSA9PiBwbGF0Zm9ybS5yZWFkT2JqZWN0RmllbGQ8U3lzdGVtX0FycmF5PFQ+PihhcnJheVNlZ21lbnQgYXMgYW55LCAwKSBhcyBhbnkgYXMgQXJyYXlWYWx1ZXM8VD4sXG4gIG9mZnNldDogPFQ+KGFycmF5U2VnbWVudDogQXJyYXlTZWdtZW50PFQ+KSA9PiBwbGF0Zm9ybS5yZWFkSW50MzJGaWVsZChhcnJheVNlZ21lbnQgYXMgYW55LCA0KSxcbiAgY291bnQ6IDxUPihhcnJheVNlZ21lbnQ6IEFycmF5U2VnbWVudDxUPikgPT4gcGxhdGZvcm0ucmVhZEludDMyRmllbGQoYXJyYXlTZWdtZW50IGFzIGFueSwgOCksXG59O1xuXG4vLyBLZWVwIGluIHN5bmMgd2l0aCBtZW1vcnkgbGF5b3V0IGluIFJlbmRlclRyZWVEaWZmLmNzXG5jb25zdCBkaWZmUmVhZGVyID0ge1xuICBzdHJ1Y3RMZW5ndGg6IDQgKyBhcnJheVNlZ21lbnRSZWFkZXIuc3RydWN0TGVuZ3RoLFxuICBjb21wb25lbnRJZDogKGRpZmY6IFJlbmRlclRyZWVEaWZmKSA9PiBwbGF0Zm9ybS5yZWFkSW50MzJGaWVsZChkaWZmIGFzIGFueSwgMCksXG4gIGVkaXRzOiAoZGlmZjogUmVuZGVyVHJlZURpZmYpID0+IHBsYXRmb3JtLnJlYWRTdHJ1Y3RGaWVsZDxQb2ludGVyPihkaWZmIGFzIGFueSwgNCkgYXMgYW55IGFzIEFycmF5U2VnbWVudDxSZW5kZXJUcmVlRWRpdD4sXG4gIGVkaXRzRW50cnk6ICh2YWx1ZXM6IEFycmF5VmFsdWVzPFJlbmRlclRyZWVFZGl0PiwgaW5kZXg6IG51bWJlcikgPT4gYXJyYXlWYWx1ZXNFbnRyeSh2YWx1ZXMsIGluZGV4LCBlZGl0UmVhZGVyLnN0cnVjdExlbmd0aCksXG59O1xuXG4vLyBLZWVwIGluIHN5bmMgd2l0aCBtZW1vcnkgbGF5b3V0IGluIFJlbmRlclRyZWVFZGl0LmNzXG5jb25zdCBlZGl0UmVhZGVyID0ge1xuICBzdHJ1Y3RMZW5ndGg6IDE2LFxuICBlZGl0VHlwZTogKGVkaXQ6IFJlbmRlclRyZWVFZGl0KSA9PiBwbGF0Zm9ybS5yZWFkSW50MzJGaWVsZChlZGl0IGFzIGFueSwgMCkgYXMgRWRpdFR5cGUsXG4gIHNpYmxpbmdJbmRleDogKGVkaXQ6IFJlbmRlclRyZWVFZGl0KSA9PiBwbGF0Zm9ybS5yZWFkSW50MzJGaWVsZChlZGl0IGFzIGFueSwgNCksXG4gIG5ld1RyZWVJbmRleDogKGVkaXQ6IFJlbmRlclRyZWVFZGl0KSA9PiBwbGF0Zm9ybS5yZWFkSW50MzJGaWVsZChlZGl0IGFzIGFueSwgOCksXG4gIHJlbW92ZWRBdHRyaWJ1dGVOYW1lOiAoZWRpdDogUmVuZGVyVHJlZUVkaXQpID0+IHBsYXRmb3JtLnJlYWRTdHJpbmdGaWVsZChlZGl0IGFzIGFueSwgMTIpLFxufTtcblxuLy8gS2VlcCBpbiBzeW5jIHdpdGggbWVtb3J5IGxheW91dCBpbiBSZW5kZXJUcmVlRnJhbWUuY3NcbmNvbnN0IGZyYW1lUmVhZGVyID0ge1xuICBzdHJ1Y3RMZW5ndGg6IDI4LFxuICBmcmFtZVR5cGU6IChmcmFtZTogUmVuZGVyVHJlZUZyYW1lKSA9PiBwbGF0Zm9ybS5yZWFkSW50MzJGaWVsZChmcmFtZSBhcyBhbnksIDQpIGFzIEZyYW1lVHlwZSxcbiAgc3VidHJlZUxlbmd0aDogKGZyYW1lOiBSZW5kZXJUcmVlRnJhbWUpID0+IHBsYXRmb3JtLnJlYWRJbnQzMkZpZWxkKGZyYW1lIGFzIGFueSwgOCksXG4gIGVsZW1lbnRSZWZlcmVuY2VDYXB0dXJlSWQ6IChmcmFtZTogUmVuZGVyVHJlZUZyYW1lKSA9PiBwbGF0Zm9ybS5yZWFkU3RyaW5nRmllbGQoZnJhbWUgYXMgYW55LCAxNiksXG4gIGNvbXBvbmVudElkOiAoZnJhbWU6IFJlbmRlclRyZWVGcmFtZSkgPT4gcGxhdGZvcm0ucmVhZEludDMyRmllbGQoZnJhbWUgYXMgYW55LCAxMiksXG4gIGVsZW1lbnROYW1lOiAoZnJhbWU6IFJlbmRlclRyZWVGcmFtZSkgPT4gcGxhdGZvcm0ucmVhZFN0cmluZ0ZpZWxkKGZyYW1lIGFzIGFueSwgMTYpLFxuICB0ZXh0Q29udGVudDogKGZyYW1lOiBSZW5kZXJUcmVlRnJhbWUpID0+IHBsYXRmb3JtLnJlYWRTdHJpbmdGaWVsZChmcmFtZSBhcyBhbnksIDE2KSxcbiAgbWFya3VwQ29udGVudDogKGZyYW1lOiBSZW5kZXJUcmVlRnJhbWUpID0+IHBsYXRmb3JtLnJlYWRTdHJpbmdGaWVsZChmcmFtZSBhcyBhbnksIDE2KSEsXG4gIGF0dHJpYnV0ZU5hbWU6IChmcmFtZTogUmVuZGVyVHJlZUZyYW1lKSA9PiBwbGF0Zm9ybS5yZWFkU3RyaW5nRmllbGQoZnJhbWUgYXMgYW55LCAxNiksXG4gIGF0dHJpYnV0ZVZhbHVlOiAoZnJhbWU6IFJlbmRlclRyZWVGcmFtZSkgPT4gcGxhdGZvcm0ucmVhZFN0cmluZ0ZpZWxkKGZyYW1lIGFzIGFueSwgMjQpLFxuICBhdHRyaWJ1dGVFdmVudEhhbmRsZXJJZDogKGZyYW1lOiBSZW5kZXJUcmVlRnJhbWUpID0+IHBsYXRmb3JtLnJlYWRJbnQzMkZpZWxkKGZyYW1lIGFzIGFueSwgOCksXG59O1xuXG5mdW5jdGlvbiBhcnJheVZhbHVlc0VudHJ5PFQ+KGFycmF5VmFsdWVzOiBBcnJheVZhbHVlczxUPiwgaW5kZXg6IG51bWJlciwgaXRlbVNpemU6IG51bWJlcik6IFQge1xuICByZXR1cm4gcGxhdGZvcm0uZ2V0QXJyYXlFbnRyeVB0cihhcnJheVZhbHVlcyBhcyBhbnkgYXMgU3lzdGVtX0FycmF5PFQ+LCBpbmRleCwgaXRlbVNpemUpIGFzIGFueSBhcyBUO1xufVxuIiwiaW1wb3J0IHsgU3lzdGVtX09iamVjdCwgU3lzdGVtX1N0cmluZywgU3lzdGVtX0FycmF5LCBNZXRob2RIYW5kbGUsIFBvaW50ZXIgfSBmcm9tICcuLi9QbGF0Zm9ybS9QbGF0Zm9ybSc7XG5pbXBvcnQgeyBwbGF0Zm9ybSB9IGZyb20gJy4uL0Vudmlyb25tZW50JztcbmltcG9ydCB7IFJlbmRlckJhdGNoIH0gZnJvbSAnLi9SZW5kZXJCYXRjaC9SZW5kZXJCYXRjaCc7XG5pbXBvcnQgeyBCcm93c2VyUmVuZGVyZXIgfSBmcm9tICcuL0Jyb3dzZXJSZW5kZXJlcic7XG5cbnR5cGUgQnJvd3NlclJlbmRlcmVyUmVnaXN0cnkgPSB7IFticm93c2VyUmVuZGVyZXJJZDogbnVtYmVyXTogQnJvd3NlclJlbmRlcmVyIH07XG5jb25zdCBicm93c2VyUmVuZGVyZXJzOiBCcm93c2VyUmVuZGVyZXJSZWdpc3RyeSA9IHt9O1xuXG5leHBvcnQgZnVuY3Rpb24gYXR0YWNoUm9vdENvbXBvbmVudFRvRWxlbWVudChicm93c2VyUmVuZGVyZXJJZDogbnVtYmVyLCBlbGVtZW50U2VsZWN0b3I6IHN0cmluZywgY29tcG9uZW50SWQ6IG51bWJlcikge1xuICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbGVtZW50U2VsZWN0b3IpO1xuICBpZiAoIWVsZW1lbnQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIGFueSBlbGVtZW50IG1hdGNoaW5nIHNlbGVjdG9yICcke2VsZW1lbnRTZWxlY3Rvcn0nLmApO1xuICB9XG5cbiAgbGV0IGJyb3dzZXJSZW5kZXJlciA9IGJyb3dzZXJSZW5kZXJlcnNbYnJvd3NlclJlbmRlcmVySWRdO1xuICBpZiAoIWJyb3dzZXJSZW5kZXJlcikge1xuICAgIGJyb3dzZXJSZW5kZXJlciA9IGJyb3dzZXJSZW5kZXJlcnNbYnJvd3NlclJlbmRlcmVySWRdID0gbmV3IEJyb3dzZXJSZW5kZXJlcihicm93c2VyUmVuZGVyZXJJZCk7XG4gIH1cbiAgYnJvd3NlclJlbmRlcmVyLmF0dGFjaFJvb3RDb21wb25lbnRUb0VsZW1lbnQoY29tcG9uZW50SWQsIGVsZW1lbnQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyQmF0Y2goYnJvd3NlclJlbmRlcmVySWQ6IG51bWJlciwgYmF0Y2g6IFJlbmRlckJhdGNoKSB7XG4gIGNvbnN0IGJyb3dzZXJSZW5kZXJlciA9IGJyb3dzZXJSZW5kZXJlcnNbYnJvd3NlclJlbmRlcmVySWRdO1xuICBpZiAoIWJyb3dzZXJSZW5kZXJlcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlcmUgaXMgbm8gYnJvd3NlciByZW5kZXJlciB3aXRoIElEICR7YnJvd3NlclJlbmRlcmVySWR9LmApO1xuICB9XG5cbiAgY29uc3QgYXJyYXlSYW5nZVJlYWRlciA9IGJhdGNoLmFycmF5UmFuZ2VSZWFkZXI7XG4gIGNvbnN0IHVwZGF0ZWRDb21wb25lbnRzUmFuZ2UgPSBiYXRjaC51cGRhdGVkQ29tcG9uZW50cygpO1xuICBjb25zdCB1cGRhdGVkQ29tcG9uZW50c1ZhbHVlcyA9IGFycmF5UmFuZ2VSZWFkZXIudmFsdWVzKHVwZGF0ZWRDb21wb25lbnRzUmFuZ2UpO1xuICBjb25zdCB1cGRhdGVkQ29tcG9uZW50c0xlbmd0aCA9IGFycmF5UmFuZ2VSZWFkZXIuY291bnQodXBkYXRlZENvbXBvbmVudHNSYW5nZSk7XG4gIGNvbnN0IHJlZmVyZW5jZUZyYW1lcyA9IGJhdGNoLnJlZmVyZW5jZUZyYW1lcygpO1xuICBjb25zdCByZWZlcmVuY2VGcmFtZXNWYWx1ZXMgPSBhcnJheVJhbmdlUmVhZGVyLnZhbHVlcyhyZWZlcmVuY2VGcmFtZXMpO1xuICBjb25zdCBkaWZmUmVhZGVyID0gYmF0Y2guZGlmZlJlYWRlcjtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHVwZGF0ZWRDb21wb25lbnRzTGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBkaWZmID0gYmF0Y2gudXBkYXRlZENvbXBvbmVudHNFbnRyeSh1cGRhdGVkQ29tcG9uZW50c1ZhbHVlcywgaSk7XG4gICAgY29uc3QgY29tcG9uZW50SWQgPSBkaWZmUmVhZGVyLmNvbXBvbmVudElkKGRpZmYpO1xuICAgIGNvbnN0IGVkaXRzID0gZGlmZlJlYWRlci5lZGl0cyhkaWZmKTtcbiAgICBicm93c2VyUmVuZGVyZXIudXBkYXRlQ29tcG9uZW50KGJhdGNoLCBjb21wb25lbnRJZCwgZWRpdHMsIHJlZmVyZW5jZUZyYW1lc1ZhbHVlcyk7XG4gIH1cblxuICBjb25zdCBkaXNwb3NlZENvbXBvbmVudElkc1JhbmdlID0gYmF0Y2guZGlzcG9zZWRDb21wb25lbnRJZHMoKTtcbiAgY29uc3QgZGlzcG9zZWRDb21wb25lbnRJZHNWYWx1ZXMgPSBhcnJheVJhbmdlUmVhZGVyLnZhbHVlcyhkaXNwb3NlZENvbXBvbmVudElkc1JhbmdlKTtcbiAgY29uc3QgZGlzcG9zZWRDb21wb25lbnRJZHNMZW5ndGggPSBhcnJheVJhbmdlUmVhZGVyLmNvdW50KGRpc3Bvc2VkQ29tcG9uZW50SWRzUmFuZ2UpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGRpc3Bvc2VkQ29tcG9uZW50SWRzTGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjb21wb25lbnRJZCA9IGJhdGNoLmRpc3Bvc2VkQ29tcG9uZW50SWRzRW50cnkoZGlzcG9zZWRDb21wb25lbnRJZHNWYWx1ZXMsIGkpO1xuICAgIGJyb3dzZXJSZW5kZXJlci5kaXNwb3NlQ29tcG9uZW50KGNvbXBvbmVudElkKTtcbiAgfVxuXG4gIGNvbnN0IGRpc3Bvc2VkRXZlbnRIYW5kbGVySWRzUmFuZ2UgPSBiYXRjaC5kaXNwb3NlZEV2ZW50SGFuZGxlcklkcygpO1xuICBjb25zdCBkaXNwb3NlZEV2ZW50SGFuZGxlcklkc1ZhbHVlcyA9IGFycmF5UmFuZ2VSZWFkZXIudmFsdWVzKGRpc3Bvc2VkRXZlbnRIYW5kbGVySWRzUmFuZ2UpO1xuICBjb25zdCBkaXNwb3NlZEV2ZW50SGFuZGxlcklkc0xlbmd0aCA9IGFycmF5UmFuZ2VSZWFkZXIuY291bnQoZGlzcG9zZWRFdmVudEhhbmRsZXJJZHNSYW5nZSk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGlzcG9zZWRFdmVudEhhbmRsZXJJZHNMZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGV2ZW50SGFuZGxlcklkID0gYmF0Y2guZGlzcG9zZWRFdmVudEhhbmRsZXJJZHNFbnRyeShkaXNwb3NlZEV2ZW50SGFuZGxlcklkc1ZhbHVlcywgaSk7XG4gICAgYnJvd3NlclJlbmRlcmVyLmRpc3Bvc2VFdmVudEhhbmRsZXIoZXZlbnRIYW5kbGVySWQpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBwbGF0Zm9ybSB9IGZyb20gJy4uL0Vudmlyb25tZW50JztcbmltcG9ydCB7IE1ldGhvZEhhbmRsZSwgU3lzdGVtX1N0cmluZywgU3lzdGVtX0FycmF5IH0gZnJvbSAnLi4vUGxhdGZvcm0vUGxhdGZvcm0nO1xuY29uc3QgaHR0cENsaWVudEFzc2VtYmx5ID0gJ01pY3Jvc29mdC5Bc3BOZXRDb3JlLkJsYXpvcic7XG5jb25zdCBodHRwQ2xpZW50TmFtZXNwYWNlID0gYCR7aHR0cENsaWVudEFzc2VtYmx5fS5IdHRwYDtcbmNvbnN0IGh0dHBDbGllbnRUeXBlTmFtZSA9ICdXZWJBc3NlbWJseUh0dHBNZXNzYWdlSGFuZGxlcic7XG5sZXQgcmVjZWl2ZVJlc3BvbnNlTWV0aG9kOiBNZXRob2RIYW5kbGU7XG5sZXQgYWxsb2NhdGVBcnJheU1ldGhvZDogTWV0aG9kSGFuZGxlO1xuXG4vLyBUaGVzZSBhcmUgdGhlIGZ1bmN0aW9ucyB3ZSdyZSBtYWtpbmcgYXZhaWxhYmxlIGZvciBpbnZvY2F0aW9uIGZyb20gLk5FVFxuZXhwb3J0IGNvbnN0IGludGVybmFsRnVuY3Rpb25zID0ge1xuICBzZW5kQXN5bmNcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2VuZEFzeW5jKGlkOiBudW1iZXIsIGJvZHk6IFN5c3RlbV9BcnJheTxhbnk+LCBqc29uRmV0Y2hBcmdzOiBTeXN0ZW1fU3RyaW5nKSB7XG4gIGxldCByZXNwb25zZTogUmVzcG9uc2U7XG4gIGxldCByZXNwb25zZURhdGE6IEFycmF5QnVmZmVyO1xuXG4gIGNvbnN0IGZldGNoT3B0aW9uczogRmV0Y2hPcHRpb25zID0gSlNPTi5wYXJzZShwbGF0Zm9ybS50b0phdmFTY3JpcHRTdHJpbmcoanNvbkZldGNoQXJncykpO1xuICBjb25zdCByZXF1ZXN0SW5pdDogUmVxdWVzdEluaXQgPSBPYmplY3QuYXNzaWduKGZldGNoT3B0aW9ucy5yZXF1ZXN0SW5pdCwgZmV0Y2hPcHRpb25zLnJlcXVlc3RJbml0T3ZlcnJpZGVzKTtcblxuICBpZiAoYm9keSkge1xuICAgIHJlcXVlc3RJbml0LmJvZHkgPSBwbGF0Zm9ybS50b1VpbnQ4QXJyYXkoYm9keSk7XG4gIH1cblxuICB0cnkge1xuICAgIHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goZmV0Y2hPcHRpb25zLnJlcXVlc3RVcmksIHJlcXVlc3RJbml0KTtcbiAgICByZXNwb25zZURhdGEgPSBhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpO1xuICB9IGNhdGNoIChleCkge1xuICAgIGRpc3BhdGNoRXJyb3JSZXNwb25zZShpZCwgZXgudG9TdHJpbmcoKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZGlzcGF0Y2hTdWNjZXNzUmVzcG9uc2UoaWQsIHJlc3BvbnNlLCByZXNwb25zZURhdGEpO1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaFN1Y2Nlc3NSZXNwb25zZShpZDogbnVtYmVyLCByZXNwb25zZTogUmVzcG9uc2UsIHJlc3BvbnNlRGF0YTogQXJyYXlCdWZmZXIpIHtcbiAgY29uc3QgcmVzcG9uc2VEZXNjcmlwdG9yOiBSZXNwb25zZURlc2NyaXB0b3IgPSB7XG4gICAgc3RhdHVzQ29kZTogcmVzcG9uc2Uuc3RhdHVzLFxuICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsXG4gICAgaGVhZGVyczogW11cbiAgfTtcbiAgcmVzcG9uc2UuaGVhZGVycy5mb3JFYWNoKCh2YWx1ZSwgbmFtZSkgPT4ge1xuICAgIHJlc3BvbnNlRGVzY3JpcHRvci5oZWFkZXJzLnB1c2goW25hbWUsIHZhbHVlXSk7XG4gIH0pO1xuXG4gIGlmICghYWxsb2NhdGVBcnJheU1ldGhvZCkge1xuICAgIGFsbG9jYXRlQXJyYXlNZXRob2QgPSBwbGF0Zm9ybS5maW5kTWV0aG9kKFxuICAgICAgaHR0cENsaWVudEFzc2VtYmx5LFxuICAgICAgaHR0cENsaWVudE5hbWVzcGFjZSxcbiAgICAgIGh0dHBDbGllbnRUeXBlTmFtZSxcbiAgICAgICdBbGxvY2F0ZUFycmF5J1xuICAgICk7XG4gIH1cblxuICAvLyBhbGxvY2F0ZSBhIG1hbmFnZWQgYnl0ZVtdIG9mIHRoZSByaWdodCBzaXplXG4gIGNvbnN0IGRvdE5ldEFycmF5ID0gcGxhdGZvcm0uY2FsbE1ldGhvZChhbGxvY2F0ZUFycmF5TWV0aG9kLCBudWxsLCBbcGxhdGZvcm0udG9Eb3ROZXRTdHJpbmcocmVzcG9uc2VEYXRhLmJ5dGVMZW5ndGgudG9TdHJpbmcoKSldKSBhcyBTeXN0ZW1fQXJyYXk8YW55PjtcblxuICAvLyBnZXQgYW4gVWludDhBcnJheSB2aWV3IG9mIGl0XG4gIGNvbnN0IGFycmF5ID0gcGxhdGZvcm0udG9VaW50OEFycmF5KGRvdE5ldEFycmF5KTtcblxuICAvLyBjb3B5IHRoZSByZXNwb25zZURhdGEgdG8gb3VyIG1hbmFnZWQgYnl0ZVtdXG4gIGFycmF5LnNldChuZXcgVWludDhBcnJheShyZXNwb25zZURhdGEpKTtcblxuICBkaXNwYXRjaFJlc3BvbnNlKFxuICAgIGlkLFxuICAgIHBsYXRmb3JtLnRvRG90TmV0U3RyaW5nKEpTT04uc3RyaW5naWZ5KHJlc3BvbnNlRGVzY3JpcHRvcikpLFxuICAgIGRvdE5ldEFycmF5LFxuICAgIC8qIGVycm9yTWVzc2FnZSAqLyBudWxsXG4gICk7XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXJyb3JSZXNwb25zZShpZDogbnVtYmVyLCBlcnJvck1lc3NhZ2U6IHN0cmluZykge1xuICBkaXNwYXRjaFJlc3BvbnNlKFxuICAgIGlkLFxuICAgIC8qIHJlc3BvbnNlRGVzY3JpcHRvciAqLyBudWxsLFxuICAgIC8qIHJlc3BvbnNlVGV4dCAqLyBudWxsLFxuICAgIHBsYXRmb3JtLnRvRG90TmV0U3RyaW5nKGVycm9yTWVzc2FnZSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hSZXNwb25zZShpZDogbnVtYmVyLCByZXNwb25zZURlc2NyaXB0b3I6IFN5c3RlbV9TdHJpbmcgfCBudWxsLCByZXNwb25zZURhdGE6IFN5c3RlbV9BcnJheTxhbnk+IHwgbnVsbCwgZXJyb3JNZXNzYWdlOiBTeXN0ZW1fU3RyaW5nIHwgbnVsbCkge1xuICBpZiAoIXJlY2VpdmVSZXNwb25zZU1ldGhvZCkge1xuICAgIHJlY2VpdmVSZXNwb25zZU1ldGhvZCA9IHBsYXRmb3JtLmZpbmRNZXRob2QoXG4gICAgICBodHRwQ2xpZW50QXNzZW1ibHksXG4gICAgICBodHRwQ2xpZW50TmFtZXNwYWNlLFxuICAgICAgaHR0cENsaWVudFR5cGVOYW1lLFxuICAgICAgJ1JlY2VpdmVSZXNwb25zZSdcbiAgICApO1xuICB9XG5cbiAgcGxhdGZvcm0uY2FsbE1ldGhvZChyZWNlaXZlUmVzcG9uc2VNZXRob2QsIG51bGwsIFtcbiAgICBwbGF0Zm9ybS50b0RvdE5ldFN0cmluZyhpZC50b1N0cmluZygpKSxcbiAgICByZXNwb25zZURlc2NyaXB0b3IsXG4gICAgcmVzcG9uc2VEYXRhLFxuICAgIGVycm9yTWVzc2FnZSxcbiAgXSk7XG59XG5cbi8vIEtlZXAgdGhlc2UgaW4gc3luYyB3aXRoIHRoZSAuTkVUIGVxdWl2YWxlbnQgaW4gV2ViQXNzZW1ibHlIdHRwTWVzc2FnZUhhbmRsZXIuY3NcbmludGVyZmFjZSBGZXRjaE9wdGlvbnMge1xuICByZXF1ZXN0VXJpOiBzdHJpbmc7XG4gIHJlcXVlc3RJbml0OiBSZXF1ZXN0SW5pdDtcbiAgcmVxdWVzdEluaXRPdmVycmlkZXM6IFJlcXVlc3RJbml0O1xufVxuXG5pbnRlcmZhY2UgUmVzcG9uc2VEZXNjcmlwdG9yIHtcbiAgLy8gV2UgZG9uJ3QgaGF2ZSBCb2R5VGV4dCBpbiBoZXJlIGJlY2F1c2UgaWYgd2UgZGlkLCB0aGVuIGluIHRoZSBKU09OLXJlc3BvbnNlIGNhc2UgKHdoaWNoXG4gIC8vIGlzIHRoZSBtb3N0IGNvbW1vbiBjYXNlKSwgd2UnZCBiZSBkb3VibGUtZW5jb2RpbmcgaXQsIHNpbmNlIHRoZSBlbnRpcmUgUmVzcG9uc2VEZXNjcmlwdG9yXG4gIC8vIGFsc28gZ2V0cyBKU09OIGVuY29kZWQuIEl0IHdvdWxkIHdvcmsgYnV0IGlzIHR3aWNlIHRoZSBhbW91bnQgb2Ygc3RyaW5nIHByb2Nlc3NpbmcuXG4gIHN0YXR1c0NvZGU6IG51bWJlcjtcbiAgc3RhdHVzVGV4dDogc3RyaW5nO1xuICBoZWFkZXJzOiBzdHJpbmdbXVtdO1xufVxuIiwiaW1wb3J0ICdAZG90bmV0L2pzaW50ZXJvcCc7XG5cbmxldCBoYXNSZWdpc3RlcmVkRXZlbnRMaXN0ZW5lcnMgPSBmYWxzZTtcblxuLy8gV2lsbCBiZSBpbml0aWFsaXplZCBvbmNlIHNvbWVvbmUgcmVnaXN0ZXJzXG5sZXQgbm90aWZ5TG9jYXRpb25DaGFuZ2VkQ2FsbGJhY2s6IHsgYXNzZW1ibHlOYW1lOiBzdHJpbmcsIGZ1bmN0aW9uTmFtZTogc3RyaW5nIH0gfCBudWxsID0gbnVsbDtcblxuLy8gVGhlc2UgYXJlIHRoZSBmdW5jdGlvbnMgd2UncmUgbWFraW5nIGF2YWlsYWJsZSBmb3IgaW52b2NhdGlvbiBmcm9tIC5ORVRcbmV4cG9ydCBjb25zdCBpbnRlcm5hbEZ1bmN0aW9ucyA9IHtcbiAgZW5hYmxlTmF2aWdhdGlvbkludGVyY2VwdGlvbixcbiAgbmF2aWdhdGVUbyxcbiAgZ2V0QmFzZVVSSTogKCkgPT4gZG9jdW1lbnQuYmFzZVVSSSxcbiAgZ2V0TG9jYXRpb25IcmVmOiAoKSA9PiBsb2NhdGlvbi5ocmVmLFxufVxuXG5mdW5jdGlvbiBlbmFibGVOYXZpZ2F0aW9uSW50ZXJjZXB0aW9uKGFzc2VtYmx5TmFtZTogc3RyaW5nLCBmdW5jdGlvbk5hbWU6IHN0cmluZykge1xuICBpZiAoaGFzUmVnaXN0ZXJlZEV2ZW50TGlzdGVuZXJzIHx8IGFzc2VtYmx5TmFtZSA9PT0gdW5kZWZpbmVkIHx8IGZ1bmN0aW9uTmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbm90aWZ5TG9jYXRpb25DaGFuZ2VkQ2FsbGJhY2sgPSB7IGFzc2VtYmx5TmFtZSwgZnVuY3Rpb25OYW1lIH07XG4gIGhhc1JlZ2lzdGVyZWRFdmVudExpc3RlbmVycyA9IHRydWU7XG5cbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBldmVudCA9PiB7XG4gICAgLy8gSW50ZXJjZXB0IGNsaWNrcyBvbiBhbGwgPGE+IGVsZW1lbnRzIHdoZXJlIHRoZSBocmVmIGlzIHdpdGhpbiB0aGUgPGJhc2UgaHJlZj4gVVJJIHNwYWNlXG4gICAgLy8gV2UgbXVzdCBleHBsaWNpdGx5IGNoZWNrIGlmIGl0IGhhcyBhbiAnaHJlZicgYXR0cmlidXRlLCBiZWNhdXNlIGlmIGl0IGRvZXNuJ3QsIHRoZSByZXN1bHQgbWlnaHQgYmUgbnVsbCBvciBhbiBlbXB0eSBzdHJpbmcgZGVwZW5kaW5nIG9uIHRoZSBicm93c2VyXG4gICAgY29uc3QgYW5jaG9yVGFyZ2V0ID0gZmluZENsb3Nlc3RBbmNlc3RvcihldmVudC50YXJnZXQgYXMgRWxlbWVudCB8IG51bGwsICdBJykgYXMgSFRNTEFuY2hvckVsZW1lbnQ7XG4gICAgY29uc3QgaHJlZkF0dHJpYnV0ZU5hbWUgPSAnaHJlZic7XG4gICAgaWYgKGFuY2hvclRhcmdldCAmJiBhbmNob3JUYXJnZXQuaGFzQXR0cmlidXRlKGhyZWZBdHRyaWJ1dGVOYW1lKSAmJiBldmVudC5idXR0b24gPT09IDApIHtcbiAgICAgIGNvbnN0IGhyZWYgPSBhbmNob3JUYXJnZXQuZ2V0QXR0cmlidXRlKGhyZWZBdHRyaWJ1dGVOYW1lKSE7XG4gICAgICBjb25zdCBhYnNvbHV0ZUhyZWYgPSB0b0Fic29sdXRlVXJpKGhyZWYpO1xuICAgICAgY29uc3QgdGFyZ2V0QXR0cmlidXRlVmFsdWUgPSBhbmNob3JUYXJnZXQuZ2V0QXR0cmlidXRlKCd0YXJnZXQnKTtcbiAgICAgIGNvbnN0IG9wZW5zSW5TYW1lRnJhbWUgPSAhdGFyZ2V0QXR0cmlidXRlVmFsdWUgfHwgdGFyZ2V0QXR0cmlidXRlVmFsdWUgPT09ICdfc2VsZic7XG5cbiAgICAgIC8vIERvbid0IHN0b3AgY3RybC9tZXRhLWNsaWNrIChldGMpIGZyb20gb3BlbmluZyBsaW5rcyBpbiBuZXcgdGFicy93aW5kb3dzXG4gICAgICBpZiAoaXNXaXRoaW5CYXNlVXJpU3BhY2UoYWJzb2x1dGVIcmVmKSAmJiAhZXZlbnRIYXNTcGVjaWFsS2V5KGV2ZW50KSAmJiBvcGVuc0luU2FtZUZyYW1lKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHBlcmZvcm1JbnRlcm5hbE5hdmlnYXRpb24oYWJzb2x1dGVIcmVmKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwb3BzdGF0ZScsIGhhbmRsZUludGVybmFsTmF2aWdhdGlvbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBuYXZpZ2F0ZVRvKHVyaTogc3RyaW5nLCBmb3JjZUxvYWQ6IGJvb2xlYW4pIHtcbiAgY29uc3QgYWJzb2x1dGVVcmkgPSB0b0Fic29sdXRlVXJpKHVyaSk7XG5cbiAgaWYgKCFmb3JjZUxvYWQgJiYgaXNXaXRoaW5CYXNlVXJpU3BhY2UoYWJzb2x1dGVVcmkpKSB7XG4gICAgcGVyZm9ybUludGVybmFsTmF2aWdhdGlvbihhYnNvbHV0ZVVyaSk7XG4gIH0gZWxzZSB7XG4gICAgbG9jYXRpb24uaHJlZiA9IHVyaTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwZXJmb3JtSW50ZXJuYWxOYXZpZ2F0aW9uKGFic29sdXRlSW50ZXJuYWxIcmVmOiBzdHJpbmcpIHtcbiAgaGlzdG9yeS5wdXNoU3RhdGUobnVsbCwgLyogaWdub3JlZCB0aXRsZSAqLyAnJywgYWJzb2x1dGVJbnRlcm5hbEhyZWYpO1xuICBoYW5kbGVJbnRlcm5hbE5hdmlnYXRpb24oKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlSW50ZXJuYWxOYXZpZ2F0aW9uKCkge1xuICBpZiAobm90aWZ5TG9jYXRpb25DaGFuZ2VkQ2FsbGJhY2spIHtcbiAgICBhd2FpdCBEb3ROZXQuaW52b2tlTWV0aG9kQXN5bmMoXG4gICAgICBub3RpZnlMb2NhdGlvbkNoYW5nZWRDYWxsYmFjay5hc3NlbWJseU5hbWUsXG4gICAgICBub3RpZnlMb2NhdGlvbkNoYW5nZWRDYWxsYmFjay5mdW5jdGlvbk5hbWUsXG4gICAgICBsb2NhdGlvbi5ocmVmXG4gICAgKTtcbiAgfVxufVxuXG5sZXQgdGVzdEFuY2hvcjogSFRNTEFuY2hvckVsZW1lbnQ7XG5mdW5jdGlvbiB0b0Fic29sdXRlVXJpKHJlbGF0aXZlVXJpOiBzdHJpbmcpIHtcbiAgdGVzdEFuY2hvciA9IHRlc3RBbmNob3IgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICB0ZXN0QW5jaG9yLmhyZWYgPSByZWxhdGl2ZVVyaTtcbiAgcmV0dXJuIHRlc3RBbmNob3IuaHJlZjtcbn1cblxuZnVuY3Rpb24gZmluZENsb3Nlc3RBbmNlc3RvcihlbGVtZW50OiBFbGVtZW50IHwgbnVsbCwgdGFnTmFtZTogc3RyaW5nKSB7XG4gIHJldHVybiAhZWxlbWVudFxuICAgID8gbnVsbFxuICAgIDogZWxlbWVudC50YWdOYW1lID09PSB0YWdOYW1lXG4gICAgICA/IGVsZW1lbnRcbiAgICAgIDogZmluZENsb3Nlc3RBbmNlc3RvcihlbGVtZW50LnBhcmVudEVsZW1lbnQsIHRhZ05hbWUpXG59XG5cbmZ1bmN0aW9uIGlzV2l0aGluQmFzZVVyaVNwYWNlKGhyZWY6IHN0cmluZykge1xuICBjb25zdCBiYXNlVXJpV2l0aFRyYWlsaW5nU2xhc2ggPSB0b0Jhc2VVcmlXaXRoVHJhaWxpbmdTbGFzaChkb2N1bWVudC5iYXNlVVJJISk7IC8vIFRPRE86IE1pZ2h0IGJhc2VVUkkgcmVhbGx5IGJlIG51bGw/XG4gIHJldHVybiBocmVmLnN0YXJ0c1dpdGgoYmFzZVVyaVdpdGhUcmFpbGluZ1NsYXNoKTtcbn1cblxuZnVuY3Rpb24gdG9CYXNlVXJpV2l0aFRyYWlsaW5nU2xhc2goYmFzZVVyaTogc3RyaW5nKSB7XG4gIHJldHVybiBiYXNlVXJpLnN1YnN0cigwLCBiYXNlVXJpLmxhc3RJbmRleE9mKCcvJykgKyAxKTtcbn1cblxuZnVuY3Rpb24gZXZlbnRIYXNTcGVjaWFsS2V5KGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gIHJldHVybiBldmVudC5jdHJsS2V5IHx8IGV2ZW50LnNoaWZ0S2V5IHx8IGV2ZW50LmFsdEtleSB8fCBldmVudC5tZXRhS2V5O1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbi8vIFRoaXMgaXMgYSBzaW5nbGUtZmlsZSBzZWxmLWNvbnRhaW5lZCBtb2R1bGUgdG8gYXZvaWQgdGhlIG5lZWQgZm9yIGEgV2VicGFjayBidWlsZFxyXG52YXIgRG90TmV0O1xyXG4oZnVuY3Rpb24gKERvdE5ldCkge1xyXG4gICAgd2luZG93LkRvdE5ldCA9IERvdE5ldDsgLy8gRW5zdXJlIHJlYWNoYWJsZSBmcm9tIGFueXdoZXJlXHJcbiAgICB2YXIganNvblJldml2ZXJzID0gW107XHJcbiAgICB2YXIgcGVuZGluZ0FzeW5jQ2FsbHMgPSB7fTtcclxuICAgIHZhciBjYWNoZWRKU0Z1bmN0aW9ucyA9IHt9O1xyXG4gICAgdmFyIG5leHRBc3luY0NhbGxJZCA9IDE7IC8vIFN0YXJ0IGF0IDEgYmVjYXVzZSB6ZXJvIHNpZ25hbHMgXCJubyByZXNwb25zZSBuZWVkZWRcIlxyXG4gICAgdmFyIGRvdE5ldERpc3BhdGNoZXIgPSBudWxsO1xyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBzcGVjaWZpZWQgLk5FVCBjYWxsIGRpc3BhdGNoZXIgYXMgdGhlIGN1cnJlbnQgaW5zdGFuY2Ugc28gdGhhdCBpdCB3aWxsIGJlIHVzZWRcclxuICAgICAqIGZvciBmdXR1cmUgaW52b2NhdGlvbnMuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGRpc3BhdGNoZXIgQW4gb2JqZWN0IHRoYXQgY2FuIGRpc3BhdGNoIGNhbGxzIGZyb20gSmF2YVNjcmlwdCB0byBhIC5ORVQgcnVudGltZS5cclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gYXR0YWNoRGlzcGF0Y2hlcihkaXNwYXRjaGVyKSB7XHJcbiAgICAgICAgZG90TmV0RGlzcGF0Y2hlciA9IGRpc3BhdGNoZXI7XHJcbiAgICB9XHJcbiAgICBEb3ROZXQuYXR0YWNoRGlzcGF0Y2hlciA9IGF0dGFjaERpc3BhdGNoZXI7XHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBKU09OIHJldml2ZXIgY2FsbGJhY2sgdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiBwYXJzaW5nIGFyZ3VtZW50cyByZWNlaXZlZCBmcm9tIC5ORVQuXHJcbiAgICAgKiBAcGFyYW0gcmV2aXZlciBUaGUgcmV2aXZlciB0byBhZGQuXHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIGF0dGFjaFJldml2ZXIocmV2aXZlcikge1xyXG4gICAgICAgIGpzb25SZXZpdmVycy5wdXNoKHJldml2ZXIpO1xyXG4gICAgfVxyXG4gICAgRG90TmV0LmF0dGFjaFJldml2ZXIgPSBhdHRhY2hSZXZpdmVyO1xyXG4gICAgLyoqXHJcbiAgICAgKiBJbnZva2VzIHRoZSBzcGVjaWZpZWQgLk5FVCBwdWJsaWMgbWV0aG9kIHN5bmNocm9ub3VzbHkuIE5vdCBhbGwgaG9zdGluZyBzY2VuYXJpb3Mgc3VwcG9ydFxyXG4gICAgICogc3luY2hyb25vdXMgaW52b2NhdGlvbiwgc28gaWYgcG9zc2libGUgdXNlIGludm9rZU1ldGhvZEFzeW5jIGluc3RlYWQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGFzc2VtYmx5TmFtZSBUaGUgc2hvcnQgbmFtZSAod2l0aG91dCBrZXkvdmVyc2lvbiBvciAuZGxsIGV4dGVuc2lvbikgb2YgdGhlIC5ORVQgYXNzZW1ibHkgY29udGFpbmluZyB0aGUgbWV0aG9kLlxyXG4gICAgICogQHBhcmFtIG1ldGhvZElkZW50aWZpZXIgVGhlIGlkZW50aWZpZXIgb2YgdGhlIG1ldGhvZCB0byBpbnZva2UuIFRoZSBtZXRob2QgbXVzdCBoYXZlIGEgW0pTSW52b2thYmxlXSBhdHRyaWJ1dGUgc3BlY2lmeWluZyB0aGlzIGlkZW50aWZpZXIuXHJcbiAgICAgKiBAcGFyYW0gYXJncyBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbWV0aG9kLCBlYWNoIG9mIHdoaWNoIG11c3QgYmUgSlNPTi1zZXJpYWxpemFibGUuXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uXHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIGludm9rZU1ldGhvZChhc3NlbWJseU5hbWUsIG1ldGhvZElkZW50aWZpZXIpIHtcclxuICAgICAgICB2YXIgYXJncyA9IFtdO1xyXG4gICAgICAgIGZvciAodmFyIF9pID0gMjsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgIGFyZ3NbX2kgLSAyXSA9IGFyZ3VtZW50c1tfaV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpbnZva2VQb3NzaWJsZUluc3RhbmNlTWV0aG9kKGFzc2VtYmx5TmFtZSwgbWV0aG9kSWRlbnRpZmllciwgbnVsbCwgYXJncyk7XHJcbiAgICB9XHJcbiAgICBEb3ROZXQuaW52b2tlTWV0aG9kID0gaW52b2tlTWV0aG9kO1xyXG4gICAgLyoqXHJcbiAgICAgKiBJbnZva2VzIHRoZSBzcGVjaWZpZWQgLk5FVCBwdWJsaWMgbWV0aG9kIGFzeW5jaHJvbm91c2x5LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBhc3NlbWJseU5hbWUgVGhlIHNob3J0IG5hbWUgKHdpdGhvdXQga2V5L3ZlcnNpb24gb3IgLmRsbCBleHRlbnNpb24pIG9mIHRoZSAuTkVUIGFzc2VtYmx5IGNvbnRhaW5pbmcgdGhlIG1ldGhvZC5cclxuICAgICAqIEBwYXJhbSBtZXRob2RJZGVudGlmaWVyIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBtZXRob2QgdG8gaW52b2tlLiBUaGUgbWV0aG9kIG11c3QgaGF2ZSBhIFtKU0ludm9rYWJsZV0gYXR0cmlidXRlIHNwZWNpZnlpbmcgdGhpcyBpZGVudGlmaWVyLlxyXG4gICAgICogQHBhcmFtIGFyZ3MgQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZCwgZWFjaCBvZiB3aGljaCBtdXN0IGJlIEpTT04tc2VyaWFsaXphYmxlLlxyXG4gICAgICogQHJldHVybnMgQSBwcm9taXNlIHJlcHJlc2VudGluZyB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uXHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIGludm9rZU1ldGhvZEFzeW5jKGFzc2VtYmx5TmFtZSwgbWV0aG9kSWRlbnRpZmllcikge1xyXG4gICAgICAgIHZhciBhcmdzID0gW107XHJcbiAgICAgICAgZm9yICh2YXIgX2kgPSAyOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgYXJnc1tfaSAtIDJdID0gYXJndW1lbnRzW19pXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGludm9rZVBvc3NpYmxlSW5zdGFuY2VNZXRob2RBc3luYyhhc3NlbWJseU5hbWUsIG1ldGhvZElkZW50aWZpZXIsIG51bGwsIGFyZ3MpO1xyXG4gICAgfVxyXG4gICAgRG90TmV0Lmludm9rZU1ldGhvZEFzeW5jID0gaW52b2tlTWV0aG9kQXN5bmM7XHJcbiAgICBmdW5jdGlvbiBpbnZva2VQb3NzaWJsZUluc3RhbmNlTWV0aG9kKGFzc2VtYmx5TmFtZSwgbWV0aG9kSWRlbnRpZmllciwgZG90TmV0T2JqZWN0SWQsIGFyZ3MpIHtcclxuICAgICAgICB2YXIgZGlzcGF0Y2hlciA9IGdldFJlcXVpcmVkRGlzcGF0Y2hlcigpO1xyXG4gICAgICAgIGlmIChkaXNwYXRjaGVyLmludm9rZURvdE5ldEZyb21KUykge1xyXG4gICAgICAgICAgICB2YXIgYXJnc0pzb24gPSBKU09OLnN0cmluZ2lmeShhcmdzLCBhcmdSZXBsYWNlcik7XHJcbiAgICAgICAgICAgIHZhciByZXN1bHRKc29uID0gZGlzcGF0Y2hlci5pbnZva2VEb3ROZXRGcm9tSlMoYXNzZW1ibHlOYW1lLCBtZXRob2RJZGVudGlmaWVyLCBkb3ROZXRPYmplY3RJZCwgYXJnc0pzb24pO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0SnNvbiA/IHBhcnNlSnNvbldpdGhSZXZpdmVycyhyZXN1bHRKc29uKSA6IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBjdXJyZW50IGRpc3BhdGNoZXIgZG9lcyBub3Qgc3VwcG9ydCBzeW5jaHJvbm91cyBjYWxscyBmcm9tIEpTIHRvIC5ORVQuIFVzZSBpbnZva2VNZXRob2RBc3luYyBpbnN0ZWFkLicpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGludm9rZVBvc3NpYmxlSW5zdGFuY2VNZXRob2RBc3luYyhhc3NlbWJseU5hbWUsIG1ldGhvZElkZW50aWZpZXIsIGRvdE5ldE9iamVjdElkLCBhcmdzKSB7XHJcbiAgICAgICAgdmFyIGFzeW5jQ2FsbElkID0gbmV4dEFzeW5jQ2FsbElkKys7XHJcbiAgICAgICAgdmFyIHJlc3VsdFByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgICAgIHBlbmRpbmdBc3luY0NhbGxzW2FzeW5jQ2FsbElkXSA9IHsgcmVzb2x2ZTogcmVzb2x2ZSwgcmVqZWN0OiByZWplY3QgfTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgYXJnc0pzb24gPSBKU09OLnN0cmluZ2lmeShhcmdzLCBhcmdSZXBsYWNlcik7XHJcbiAgICAgICAgICAgIGdldFJlcXVpcmVkRGlzcGF0Y2hlcigpLmJlZ2luSW52b2tlRG90TmV0RnJvbUpTKGFzeW5jQ2FsbElkLCBhc3NlbWJseU5hbWUsIG1ldGhvZElkZW50aWZpZXIsIGRvdE5ldE9iamVjdElkLCBhcmdzSnNvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICAvLyBTeW5jaHJvbm91cyBmYWlsdXJlXHJcbiAgICAgICAgICAgIGNvbXBsZXRlUGVuZGluZ0NhbGwoYXN5bmNDYWxsSWQsIGZhbHNlLCBleCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHRQcm9taXNlO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gZ2V0UmVxdWlyZWREaXNwYXRjaGVyKCkge1xyXG4gICAgICAgIGlmIChkb3ROZXREaXNwYXRjaGVyICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBkb3ROZXREaXNwYXRjaGVyO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIC5ORVQgY2FsbCBkaXNwYXRjaGVyIGhhcyBiZWVuIHNldC4nKTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGNvbXBsZXRlUGVuZGluZ0NhbGwoYXN5bmNDYWxsSWQsIHN1Y2Nlc3MsIHJlc3VsdE9yRXJyb3IpIHtcclxuICAgICAgICBpZiAoIXBlbmRpbmdBc3luY0NhbGxzLmhhc093blByb3BlcnR5KGFzeW5jQ2FsbElkKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGVyZSBpcyBubyBwZW5kaW5nIGFzeW5jIGNhbGwgd2l0aCBJRCBcIiArIGFzeW5jQ2FsbElkICsgXCIuXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgYXN5bmNDYWxsID0gcGVuZGluZ0FzeW5jQ2FsbHNbYXN5bmNDYWxsSWRdO1xyXG4gICAgICAgIGRlbGV0ZSBwZW5kaW5nQXN5bmNDYWxsc1thc3luY0NhbGxJZF07XHJcbiAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgYXN5bmNDYWxsLnJlc29sdmUocmVzdWx0T3JFcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBhc3luY0NhbGwucmVqZWN0KHJlc3VsdE9yRXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmVjZWl2ZXMgaW5jb21pbmcgY2FsbHMgZnJvbSAuTkVUIGFuZCBkaXNwYXRjaGVzIHRoZW0gdG8gSmF2YVNjcmlwdC5cclxuICAgICAqL1xyXG4gICAgRG90TmV0LmpzQ2FsbERpc3BhdGNoZXIgPSB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogRmluZHMgdGhlIEphdmFTY3JpcHQgZnVuY3Rpb24gbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBpZGVudGlmaWVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQHBhcmFtIGlkZW50aWZpZXIgSWRlbnRpZmllcyB0aGUgZ2xvYmFsbHktcmVhY2hhYmxlIGZ1bmN0aW9uIHRvIGJlIHJldHVybmVkLlxyXG4gICAgICAgICAqIEByZXR1cm5zIEEgRnVuY3Rpb24gaW5zdGFuY2UuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZmluZEpTRnVuY3Rpb246IGZpbmRKU0Z1bmN0aW9uLFxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEludm9rZXMgdGhlIHNwZWNpZmllZCBzeW5jaHJvbm91cyBKYXZhU2NyaXB0IGZ1bmN0aW9uLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQHBhcmFtIGlkZW50aWZpZXIgSWRlbnRpZmllcyB0aGUgZ2xvYmFsbHktcmVhY2hhYmxlIGZ1bmN0aW9uIHRvIGludm9rZS5cclxuICAgICAgICAgKiBAcGFyYW0gYXJnc0pzb24gSlNPTiByZXByZXNlbnRhdGlvbiBvZiBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbi5cclxuICAgICAgICAgKiBAcmV0dXJucyBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnZvY2F0aW9uIHJlc3VsdC5cclxuICAgICAgICAgKi9cclxuICAgICAgICBpbnZva2VKU0Zyb21Eb3ROZXQ6IGZ1bmN0aW9uIChpZGVudGlmaWVyLCBhcmdzSnNvbikge1xyXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZmluZEpTRnVuY3Rpb24oaWRlbnRpZmllcikuYXBwbHkobnVsbCwgcGFyc2VKc29uV2l0aFJldml2ZXJzKGFyZ3NKc29uKSk7XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgICAgID8gbnVsbFxyXG4gICAgICAgICAgICAgICAgOiBKU09OLnN0cmluZ2lmeShyZXN1bHQsIGFyZ1JlcGxhY2VyKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEludm9rZXMgdGhlIHNwZWNpZmllZCBzeW5jaHJvbm91cyBvciBhc3luY2hyb25vdXMgSmF2YVNjcmlwdCBmdW5jdGlvbi5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBwYXJhbSBhc3luY0hhbmRsZSBBIHZhbHVlIGlkZW50aWZ5aW5nIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uLiBUaGlzIHZhbHVlIHdpbGwgYmUgcGFzc2VkIGJhY2sgaW4gYSBsYXRlciBjYWxsIHRvIGVuZEludm9rZUpTRnJvbURvdE5ldC5cclxuICAgICAgICAgKiBAcGFyYW0gaWRlbnRpZmllciBJZGVudGlmaWVzIHRoZSBnbG9iYWxseS1yZWFjaGFibGUgZnVuY3Rpb24gdG8gaW52b2tlLlxyXG4gICAgICAgICAqIEBwYXJhbSBhcmdzSnNvbiBKU09OIHJlcHJlc2VudGF0aW9uIG9mIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGJlZ2luSW52b2tlSlNGcm9tRG90TmV0OiBmdW5jdGlvbiAoYXN5bmNIYW5kbGUsIGlkZW50aWZpZXIsIGFyZ3NKc29uKSB7XHJcbiAgICAgICAgICAgIC8vIENvZXJjZSBzeW5jaHJvbm91cyBmdW5jdGlvbnMgaW50byBhc3luYyBvbmVzLCBwbHVzIHRyZWF0XHJcbiAgICAgICAgICAgIC8vIHN5bmNocm9ub3VzIGV4Y2VwdGlvbnMgdGhlIHNhbWUgYXMgYXN5bmMgb25lc1xyXG4gICAgICAgICAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgc3luY2hyb25vdXNSZXN1bHRPclByb21pc2UgPSBmaW5kSlNGdW5jdGlvbihpZGVudGlmaWVyKS5hcHBseShudWxsLCBwYXJzZUpzb25XaXRoUmV2aXZlcnMoYXJnc0pzb24pKTtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoc3luY2hyb25vdXNSZXN1bHRPclByb21pc2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgLy8gV2Ugb25seSBsaXN0ZW4gZm9yIGEgcmVzdWx0IGlmIHRoZSBjYWxsZXIgd2FudHMgdG8gYmUgbm90aWZpZWQgYWJvdXQgaXRcclxuICAgICAgICAgICAgaWYgKGFzeW5jSGFuZGxlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBPbiBjb21wbGV0aW9uLCBkaXNwYXRjaCByZXN1bHQgYmFjayB0byAuTkVUXHJcbiAgICAgICAgICAgICAgICAvLyBOb3QgdXNpbmcgXCJhd2FpdFwiIGJlY2F1c2UgaXQgY29kZWdlbnMgYSBsb3Qgb2YgYm9pbGVycGxhdGVcclxuICAgICAgICAgICAgICAgIHByb21pc2UudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7IHJldHVybiBnZXRSZXF1aXJlZERpc3BhdGNoZXIoKS5iZWdpbkludm9rZURvdE5ldEZyb21KUygwLCAnTWljcm9zb2Z0LkpTSW50ZXJvcCcsICdEb3ROZXREaXNwYXRjaGVyLkVuZEludm9rZScsIG51bGwsIEpTT04uc3RyaW5naWZ5KFthc3luY0hhbmRsZSwgdHJ1ZSwgcmVzdWx0XSwgYXJnUmVwbGFjZXIpKTsgfSwgZnVuY3Rpb24gKGVycm9yKSB7IHJldHVybiBnZXRSZXF1aXJlZERpc3BhdGNoZXIoKS5iZWdpbkludm9rZURvdE5ldEZyb21KUygwLCAnTWljcm9zb2Z0LkpTSW50ZXJvcCcsICdEb3ROZXREaXNwYXRjaGVyLkVuZEludm9rZScsIG51bGwsIEpTT04uc3RyaW5naWZ5KFthc3luY0hhbmRsZSwgZmFsc2UsIGZvcm1hdEVycm9yKGVycm9yKV0pKTsgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFJlY2VpdmVzIG5vdGlmaWNhdGlvbiB0aGF0IGFuIGFzeW5jIGNhbGwgZnJvbSBKUyB0byAuTkVUIGhhcyBjb21wbGV0ZWQuXHJcbiAgICAgICAgICogQHBhcmFtIGFzeW5jQ2FsbElkIFRoZSBpZGVudGlmaWVyIHN1cHBsaWVkIGluIGFuIGVhcmxpZXIgY2FsbCB0byBiZWdpbkludm9rZURvdE5ldEZyb21KUy5cclxuICAgICAgICAgKiBAcGFyYW0gc3VjY2VzcyBBIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuXHJcbiAgICAgICAgICogQHBhcmFtIHJlc3VsdE9yRXhjZXB0aW9uTWVzc2FnZSBFaXRoZXIgdGhlIG9wZXJhdGlvbiByZXN1bHQgb3IgYW4gZXJyb3IgbWVzc2FnZS5cclxuICAgICAgICAgKi9cclxuICAgICAgICBlbmRJbnZva2VEb3ROZXRGcm9tSlM6IGZ1bmN0aW9uIChhc3luY0NhbGxJZCwgc3VjY2VzcywgcmVzdWx0T3JFeGNlcHRpb25NZXNzYWdlKSB7XHJcbiAgICAgICAgICAgIHZhciByZXN1bHRPckVycm9yID0gc3VjY2VzcyA/IHJlc3VsdE9yRXhjZXB0aW9uTWVzc2FnZSA6IG5ldyBFcnJvcihyZXN1bHRPckV4Y2VwdGlvbk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICBjb21wbGV0ZVBlbmRpbmdDYWxsKHBhcnNlSW50KGFzeW5jQ2FsbElkKSwgc3VjY2VzcywgcmVzdWx0T3JFcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIGZ1bmN0aW9uIHBhcnNlSnNvbldpdGhSZXZpdmVycyhqc29uKSB7XHJcbiAgICAgICAgcmV0dXJuIGpzb24gPyBKU09OLnBhcnNlKGpzb24sIGZ1bmN0aW9uIChrZXksIGluaXRpYWxWYWx1ZSkge1xyXG4gICAgICAgICAgICAvLyBJbnZva2UgZWFjaCByZXZpdmVyIGluIG9yZGVyLCBwYXNzaW5nIHRoZSBvdXRwdXQgZnJvbSB0aGUgcHJldmlvdXMgcmV2aXZlcixcclxuICAgICAgICAgICAgLy8gc28gdGhhdCBlYWNoIG9uZSBnZXRzIGEgY2hhbmNlIHRvIHRyYW5zZm9ybSB0aGUgdmFsdWVcclxuICAgICAgICAgICAgcmV0dXJuIGpzb25SZXZpdmVycy5yZWR1Y2UoZnVuY3Rpb24gKGxhdGVzdFZhbHVlLCByZXZpdmVyKSB7IHJldHVybiByZXZpdmVyKGtleSwgbGF0ZXN0VmFsdWUpOyB9LCBpbml0aWFsVmFsdWUpO1xyXG4gICAgICAgIH0pIDogbnVsbDtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGZvcm1hdEVycm9yKGVycm9yKSB7XHJcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGVycm9yLm1lc3NhZ2UgKyBcIlxcblwiICsgZXJyb3Iuc3RhY2s7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gZXJyb3IgPyBlcnJvci50b1N0cmluZygpIDogJ251bGwnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGZpbmRKU0Z1bmN0aW9uKGlkZW50aWZpZXIpIHtcclxuICAgICAgICBpZiAoY2FjaGVkSlNGdW5jdGlvbnMuaGFzT3duUHJvcGVydHkoaWRlbnRpZmllcikpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZEpTRnVuY3Rpb25zW2lkZW50aWZpZXJdO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgcmVzdWx0ID0gd2luZG93O1xyXG4gICAgICAgIHZhciByZXN1bHRJZGVudGlmaWVyID0gJ3dpbmRvdyc7XHJcbiAgICAgICAgaWRlbnRpZmllci5zcGxpdCgnLicpLmZvckVhY2goZnVuY3Rpb24gKHNlZ21lbnQpIHtcclxuICAgICAgICAgICAgaWYgKHNlZ21lbnQgaW4gcmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHRbc2VnbWVudF07XHJcbiAgICAgICAgICAgICAgICByZXN1bHRJZGVudGlmaWVyICs9ICcuJyArIHNlZ21lbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgZmluZCAnXCIgKyBzZWdtZW50ICsgXCInIGluICdcIiArIHJlc3VsdElkZW50aWZpZXIgKyBcIicuXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgdmFsdWUgJ1wiICsgcmVzdWx0SWRlbnRpZmllciArIFwiJyBpcyBub3QgYSBmdW5jdGlvbi5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgdmFyIERvdE5ldE9iamVjdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBmdW5jdGlvbiBEb3ROZXRPYmplY3QoX2lkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2lkID0gX2lkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBEb3ROZXRPYmplY3QucHJvdG90eXBlLmludm9rZU1ldGhvZCA9IGZ1bmN0aW9uIChtZXRob2RJZGVudGlmaWVyKSB7XHJcbiAgICAgICAgICAgIHZhciBhcmdzID0gW107XHJcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBhcmdzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBpbnZva2VQb3NzaWJsZUluc3RhbmNlTWV0aG9kKG51bGwsIG1ldGhvZElkZW50aWZpZXIsIHRoaXMuX2lkLCBhcmdzKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIERvdE5ldE9iamVjdC5wcm90b3R5cGUuaW52b2tlTWV0aG9kQXN5bmMgPSBmdW5jdGlvbiAobWV0aG9kSWRlbnRpZmllcikge1xyXG4gICAgICAgICAgICB2YXIgYXJncyA9IFtdO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICAgICAgYXJnc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gaW52b2tlUG9zc2libGVJbnN0YW5jZU1ldGhvZEFzeW5jKG51bGwsIG1ldGhvZElkZW50aWZpZXIsIHRoaXMuX2lkLCBhcmdzKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIERvdE5ldE9iamVjdC5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIHByb21pc2UgPSBpbnZva2VNZXRob2RBc3luYygnTWljcm9zb2Z0LkpTSW50ZXJvcCcsICdEb3ROZXREaXNwYXRjaGVyLlJlbGVhc2VEb3ROZXRPYmplY3QnLCB0aGlzLl9pZCk7XHJcbiAgICAgICAgICAgIHByb21pc2UuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7IHJldHVybiBjb25zb2xlLmVycm9yKGVycm9yKTsgfSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBEb3ROZXRPYmplY3QucHJvdG90eXBlLnNlcmlhbGl6ZUFzQXJnID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gXCJfX2RvdE5ldE9iamVjdDpcIiArIHRoaXMuX2lkO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIERvdE5ldE9iamVjdDtcclxuICAgIH0oKSk7XHJcbiAgICB2YXIgZG90TmV0T2JqZWN0VmFsdWVGb3JtYXQgPSAvXl9fZG90TmV0T2JqZWN0XFw6KFxcZCspJC87XHJcbiAgICBhdHRhY2hSZXZpdmVyKGZ1bmN0aW9uIHJldml2ZURvdE5ldE9iamVjdChrZXksIHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgdmFyIG1hdGNoID0gdmFsdWUubWF0Y2goZG90TmV0T2JqZWN0VmFsdWVGb3JtYXQpO1xyXG4gICAgICAgICAgICBpZiAobWF0Y2gpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRG90TmV0T2JqZWN0KHBhcnNlSW50KG1hdGNoWzFdKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVW5yZWNvZ25pemVkIC0gbGV0IGFub3RoZXIgcmV2aXZlciBoYW5kbGUgaXRcclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9KTtcclxuICAgIGZ1bmN0aW9uIGFyZ1JlcGxhY2VyKGtleSwgdmFsdWUpIHtcclxuICAgICAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEb3ROZXRPYmplY3QgPyB2YWx1ZS5zZXJpYWxpemVBc0FyZygpIDogdmFsdWU7XHJcbiAgICB9XHJcbn0pKERvdE5ldCB8fCAoRG90TmV0ID0ge30pKTtcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWljcm9zb2Z0LkpTSW50ZXJvcC5qcy5tYXAiXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/wasm/mono.js b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/wasm/mono.js
new file mode 100755
index 0000000..099ffb3
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/wasm/mono.js
@@ -0,0 +1,4 @@
+var Module=typeof Module!=="undefined"?Module:{};var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}Module["arguments"]=[];Module["thisProgram"]="./this.program";Module["quit"]=(function(status,toThrow){throw toThrow});Module["preRun"]=[];Module["postRun"]=[];var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}else{return scriptDirectory+path}}if(ENVIRONMENT_IS_NODE){scriptDirectory=__dirname+"/";var nodeFS;var nodePath;Module["read"]=function shell_read(filename,binary){var ret;if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);ret=nodeFS["readFileSync"](filename);return binary?ret:ret.toString()};Module["readBinary"]=function readBinary(filename){var ret=Module["read"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}Module["arguments"]=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));process["on"]("unhandledRejection",abort);Module["quit"]=(function(status){process["exit"](status)});Module["inspect"]=(function(){return"[Emscripten Module object]"})}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){Module["read"]=function shell_read(f){return read(f)}}Module["readBinary"]=function readBinary(f){var data;if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof quit==="function"){Module["quit"]=(function(status){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(document.currentScript){scriptDirectory=document.currentScript.src}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.lastIndexOf("/")+1)}else{scriptDirectory=""}Module["read"]=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){Module["readBinary"]=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}Module["readAsync"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)};Module["setWindowTitle"]=(function(title){document.title=title})}else{}var out=Module["print"]||(typeof console!=="undefined"?console.log.bind(console):typeof print!=="undefined"?print:null);var err=Module["printErr"]||(typeof printErr!=="undefined"?printErr:typeof console!=="undefined"&&console.warn.bind(console)||out);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var STACK_ALIGN=16;function staticAlloc(size){var ret=STATICTOP;STATICTOP=STATICTOP+size+15&-16;return ret}function dynamicAlloc(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=ret+size+15&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}function alignMemory(size,factor){if(!factor)factor=STACK_ALIGN;var ret=size=Math.ceil(size/factor)*factor;return ret}function getNativeTypeSize(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return 4}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}var asm2wasmImports={"f64-rem":(function(x,y){return x%y}),"debugger":(function(){debugger})};var functionPointers=new Array(0);var GLOBAL_BASE=1024;var ABORT=false;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];assert(func,"Cannot call unknown function "+ident+", make sure it is exported");return func}var JSfuncs={"stackSave":(function(){stackSave()}),"stackRestore":(function(){stackRestore()}),"arrayToC":(function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),"stringToC":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={"string":JSfuncs["stringToC"],"array":JSfuncs["arrayToC"]};function ccall(ident,returnType,argTypes,args,opts){function convertReturnValue(ret){if(returnType==="string")return Pointer_stringify(ret);if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);ret=convertReturnValue(ret);if(stack!==0)stackRestore(stack);return ret}function cwrap(ident,returnType,argTypes,opts){argTypes=argTypes||[];var numericArgs=argTypes.every((function(type){return type==="number"}));var numericRet=returnType!=="string";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return(function(){return ccall(ident,returnType,argTypes,arguments,opts)})}function setValue(ptr,value,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";switch(type){case"i1":HEAP8[ptr>>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}function getValue(ptr,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";switch(type){case"i1":return HEAP8[ptr>>0];case"i8":return HEAP8[ptr>>0];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":return HEAP32[ptr>>2];case"float":return HEAPF32[ptr>>2];case"double":return HEAPF64[ptr>>3];default:abort("invalid type for getValue: "+type)}return null}var ALLOC_NORMAL=0;var ALLOC_STATIC=2;var ALLOC_NONE=4;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab==="number"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types==="string"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[typeof _malloc==="function"?_malloc:staticAlloc,stackAlloc,staticAlloc,dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var stop;ptr=ret;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr<stop;ptr+=4){HEAP32[ptr>>2]=0}stop=ret+size;while(ptr<stop){HEAP8[ptr++>>0]=0}return ret}if(singleType==="i8"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i<size){var curr=slab[i];type=singleType||types[i];if(type===0){i++;continue}if(type=="i64")type="i32";setValue(ret+i,curr,type);if(previousType!==type){typeSize=getNativeTypeSize(type);previousType=type}i+=typeSize}return ret}function getMemory(size){if(!staticSealed)return staticAlloc(size);if(!runtimeInitialized)return dynamicAlloc(size);return _malloc(size)}function Pointer_stringify(ptr,length){if(length===0||!ptr)return"";var hasUtf=0;var t;var i=0;while(1){t=HEAPU8[ptr+i>>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret="";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return UTF8ToString(ptr)}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str="";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function stringToUTF16(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite<str.length*2?maxBytesToWrite/2:str.length;for(var i=0;i<numCharsToWrite;++i){var codeUnit=str.charCodeAt(i);HEAP16[outPtr>>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr}function allocateUTF8(str){var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8Array(str,HEAP8,ret,size);return ret}function demangle(func){return func}function demangleAll(text){var regex=/__Z[\w\d_]+/g;return text.replace(regex,(function(x){var y=demangle(x);return x===y?x:y+" ["+x+"]"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return"(no stack trace available)"}}return err.stack.toString()}function stackTrace(){var js=jsStackTrace();if(Module["extraStackTrace"])js+="\n"+Module["extraStackTrace"]();return demangleAll(js)}var PAGE_SIZE=16384;var WASM_PAGE_SIZE=65536;var ASMJS_PAGE_SIZE=16777216;var MIN_TOTAL_MEMORY=16777216;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBuffer(buf){Module["buffer"]=buffer=buf}function updateGlobalBufferViews(){Module["HEAP8"]=HEAP8=new Int8Array(buffer);Module["HEAP16"]=HEAP16=new Int16Array(buffer);Module["HEAP32"]=HEAP32=new Int32Array(buffer);Module["HEAPU8"]=HEAPU8=new Uint8Array(buffer);Module["HEAPU16"]=HEAPU16=new Uint16Array(buffer);Module["HEAPU32"]=HEAPU32=new Uint32Array(buffer);Module["HEAPF32"]=HEAPF32=new Float32Array(buffer);Module["HEAPF64"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}if(!Module["reallocBuffer"])Module["reallocBuffer"]=(function(size){var ret;try{var oldHEAP8=HEAP8;ret=new ArrayBuffer(size);var temp=new Int8Array(ret);temp.set(oldHEAP8)}catch(e){return false}var success=_emscripten_replace_memory(ret);if(!success)return false;return ret});function enlargeMemory(){var PAGE_MULTIPLE=Module["usingWasm"]?WASM_PAGE_SIZE:ASMJS_PAGE_SIZE;var LIMIT=2147483648-PAGE_MULTIPLE;if(HEAP32[DYNAMICTOP_PTR>>2]>LIMIT){return false}var OLD_TOTAL_MEMORY=TOTAL_MEMORY;TOTAL_MEMORY=Math.max(TOTAL_MEMORY,MIN_TOTAL_MEMORY);while(TOTAL_MEMORY<HEAP32[DYNAMICTOP_PTR>>2]){if(TOTAL_MEMORY<=536870912){TOTAL_MEMORY=alignUp(2*TOTAL_MEMORY,PAGE_MULTIPLE)}else{TOTAL_MEMORY=Math.min(alignUp((3*TOTAL_MEMORY+2147483648)/4,PAGE_MULTIPLE),LIMIT)}}var replacement=Module["reallocBuffer"](TOTAL_MEMORY);if(!replacement||replacement.byteLength!=TOTAL_MEMORY){TOTAL_MEMORY=OLD_TOTAL_MEMORY;return false}updateGlobalBuffer(replacement);updateGlobalBufferViews();return true}var byteLength;try{byteLength=Function.prototype.call.bind(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype,"byteLength").get);byteLength(new ArrayBuffer(4))}catch(e){byteLength=(function(buffer){return buffer.byteLength})}var TOTAL_STACK=Module["TOTAL_STACK"]||5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||16777216;if(TOTAL_MEMORY<TOTAL_STACK)err("TOTAL_MEMORY should be larger than TOTAL_STACK, was "+TOTAL_MEMORY+"! (TOTAL_STACK="+TOTAL_STACK+")");if(Module["buffer"]){buffer=Module["buffer"]}else{if(typeof WebAssembly==="object"&&typeof WebAssembly.Memory==="function"){Module["wasmMemory"]=new WebAssembly.Memory({"initial":TOTAL_MEMORY/WASM_PAGE_SIZE});buffer=Module["wasmMemory"].buffer}else{buffer=new ArrayBuffer(TOTAL_MEMORY)}Module["buffer"]=buffer}updateGlobalBufferViews();function getTotalMemory(){return TOTAL_MEMORY}function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var Math_abs=Math.abs;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_min=Math.min;var Math_trunc=Math.trunc;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return String.prototype.startsWith?filename.startsWith(dataURIPrefix):filename.indexOf(dataURIPrefix)===0}function integrateWasmJS(){var wasmTextFile="mono.wast";var wasmBinaryFile="mono.wasm";var asmjsCodeFile="mono.temp.asm.js";if(!isDataURI(wasmTextFile)){wasmTextFile=locateFile(wasmTextFile)}if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}if(!isDataURI(asmjsCodeFile)){asmjsCodeFile=locateFile(asmjsCodeFile)}var wasmPageSize=64*1024;var info={"global":null,"env":null,"asm2wasm":asm2wasmImports,"parent":Module};var exports=null;function mergeMemory(newBuffer){var oldBuffer=Module["buffer"];if(newBuffer.byteLength<oldBuffer.byteLength){err("the new buffer in mergeMemory is smaller than the previous one. in native wasm, we should grow memory here")}var oldView=new Int8Array(oldBuffer);var newView=new Int8Array(newBuffer);newView.set(oldView);updateGlobalBuffer(newBuffer);updateGlobalBufferViews()}function fixImports(imports){return imports}function getBinary(){try{if(Module["wasmBinary"]){return new Uint8Array(Module["wasmBinary"])}if(Module["readBinary"]){return Module["readBinary"](wasmBinaryFile)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!Module["wasmBinary"]&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then((function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()})).catch((function(){return getBinary()}))}return new Promise((function(resolve,reject){resolve(getBinary())}))}function doNativeWasm(global,env,providedBuffer){if(typeof WebAssembly!=="object"){err("no native wasm support detected");return false}if(!(Module["wasmMemory"]instanceof WebAssembly.Memory)){err("no native wasm Memory in use");return false}env["memory"]=Module["wasmMemory"];info["global"]={"NaN":NaN,"Infinity":Infinity};info["global.Math"]=Math;info["env"]=env;function receiveInstance(instance,module){exports=instance.exports;if(exports.memory)mergeMemory(exports.memory);Module["asm"]=exports;Module["usingWasm"]=true;removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");if(Module["instantiateWasm"]){try{return Module["instantiateWasm"](info,receiveInstance)}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}function receiveInstantiatedSource(output){receiveInstance(output["instance"],output["module"])}function instantiateArrayBuffer(receiver){getBinaryPromise().then((function(binary){return WebAssembly.instantiate(binary,info)})).then(receiver,(function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)}))}if(!Module["wasmBinary"]&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&typeof fetch==="function"){WebAssembly.instantiateStreaming(fetch(wasmBinaryFile,{credentials:"same-origin"}),info).then(receiveInstantiatedSource,(function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");instantiateArrayBuffer(receiveInstantiatedSource)}))}else{instantiateArrayBuffer(receiveInstantiatedSource)}return{}}Module["asmPreload"]=Module["asm"];var asmjsReallocBuffer=Module["reallocBuffer"];var wasmReallocBuffer=(function(size){var PAGE_MULTIPLE=Module["usingWasm"]?WASM_PAGE_SIZE:ASMJS_PAGE_SIZE;size=alignUp(size,PAGE_MULTIPLE);var old=Module["buffer"];var oldSize=old.byteLength;if(Module["usingWasm"]){try{var result=Module["wasmMemory"].grow((size-oldSize)/wasmPageSize);if(result!==(-1|0)){return Module["buffer"]=Module["wasmMemory"].buffer}else{return null}}catch(e){return null}}});Module["reallocBuffer"]=(function(size){if(finalMethod==="asmjs"){return asmjsReallocBuffer(size)}else{return wasmReallocBuffer(size)}});var finalMethod="";Module["asm"]=(function(global,env,providedBuffer){env=fixImports(env);if(!env["table"]){var TABLE_SIZE=Module["wasmTableSize"];if(TABLE_SIZE===undefined)TABLE_SIZE=1024;var MAX_TABLE_SIZE=Module["wasmMaxTableSize"];if(typeof WebAssembly==="object"&&typeof WebAssembly.Table==="function"){if(MAX_TABLE_SIZE!==undefined){env["table"]=new WebAssembly.Table({"initial":TABLE_SIZE,"maximum":MAX_TABLE_SIZE,"element":"anyfunc"})}else{env["table"]=new WebAssembly.Table({"initial":TABLE_SIZE,element:"anyfunc"})}}else{env["table"]=new Array(TABLE_SIZE)}Module["wasmTable"]=env["table"]}if(!env["memoryBase"]){env["memoryBase"]=Module["STATIC_BASE"]}if(!env["tableBase"]){env["tableBase"]=0}var exports;exports=doNativeWasm(global,env,providedBuffer);assert(exports,"no binaryen method succeeded.");return exports})}integrateWasmJS();var ASM_CONSTS=[(function(){var err=new Error;console.log("Stacktrace: \n");console.log(err.stack)}),(function($0,$1){var str=UTF8ToString($0);try{var res=eval(str);if(res===null||res==undefined)return 0;res=res.toString();setValue($1,0,"i32")}catch(e){res=e.toString();setValue($1,1,"i32");if(res===null||res===undefined)res="unknown exception"}var buff=Module._malloc((res.length+1)*2);stringToUTF16(res,buff,(res.length+1)*2);return buff}),(function(){return STACK_BASE}),(function(){return TOTAL_STACK})];function _emscripten_asm_const_i(code){return ASM_CONSTS[code]()}function _emscripten_asm_const_iii(code,a0,a1){return ASM_CONSTS[code](a0,a1)}STATIC_BASE=GLOBAL_BASE;STATICTOP=STATIC_BASE+784960;__ATINIT__.push({func:(function(){___emscripten_environ_constructor()})});var STATIC_BUMP=784960;Module["STATIC_BASE"]=STATIC_BASE;Module["STATIC_BUMP"]=STATIC_BUMP;STATICTOP+=16;function ___assert_fail(condition,filename,line,func){abort("Assertion failed: "+Pointer_stringify(condition)+", at: "+[filename?Pointer_stringify(filename):"unknown filename",line,func?Pointer_stringify(func):"unknown function"])}var ENV={};function ___buildEnvironment(environ){var MAX_ENV_VALUES=64;var TOTAL_ENV_SIZE=1024;var poolPtr;var envPtr;if(!___buildEnvironment.called){___buildEnvironment.called=true;ENV["USER"]=ENV["LOGNAME"]="web_user";ENV["PATH"]="/";ENV["PWD"]="/";ENV["HOME"]="/home/web_user";ENV["LANG"]="C.UTF-8";ENV["_"]=Module["thisProgram"];poolPtr=getMemory(TOTAL_ENV_SIZE);envPtr=getMemory(MAX_ENV_VALUES*4);HEAP32[envPtr>>2]=poolPtr;HEAP32[environ>>2]=envPtr}else{envPtr=HEAP32[environ>>2];poolPtr=HEAP32[envPtr>>2]}var strings=[];var totalSize=0;for(var key in ENV){if(typeof ENV[key]==="string"){var line=key+"="+ENV[key];strings.push(line);totalSize+=line.length}}if(totalSize>TOTAL_ENV_SIZE){throw new Error("Environment size exceeded TOTAL_ENV_SIZE!")}var ptrSize=4;for(var i=0;i<strings.length;i++){var line=strings[i];writeAsciiToMemory(line,poolPtr);HEAP32[envPtr+i*ptrSize>>2]=poolPtr;poolPtr+=line.length+1}HEAP32[envPtr+strings.length*ptrSize>>2]=0}function _emscripten_get_now(){abort()}function _emscripten_get_now_is_monotonic(){return ENVIRONMENT_IS_NODE||typeof dateNow!=="undefined"||(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&self["performance"]&&self["performance"]["now"]}var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}function _clock_gettime(clk_id,tp){var now;if(clk_id===0){now=Date.now()}else if(clk_id===1&&_emscripten_get_now_is_monotonic()){now=_emscripten_get_now()}else{___setErrNo(ERRNO_CODES.EINVAL);return-1}HEAP32[tp>>2]=now/1e3|0;HEAP32[tp+4>>2]=now%1e3*1e3*1e3|0;return 0}function ___clock_gettime(){return _clock_gettime.apply(null,arguments)}function ___cxa_allocate_exception(size){return _malloc(size)}function __ZSt18uncaught_exceptionv(){return!!__ZSt18uncaught_exceptionv.uncaught_exception}var EXCEPTIONS={last:0,caught:[],infos:{},deAdjust:(function(adjusted){if(!adjusted||EXCEPTIONS.infos[adjusted])return adjusted;for(var key in EXCEPTIONS.infos){var ptr=+key;var info=EXCEPTIONS.infos[ptr];if(info.adjusted===adjusted){return ptr}}return adjusted}),addRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];info.refcount++}),decRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];assert(info.refcount>0);info.refcount--;if(info.refcount===0&&!info.rethrown){if(info.destructor){Module["dynCall_vi"](info.destructor,ptr)}delete EXCEPTIONS.infos[ptr];___cxa_free_exception(ptr)}}),clearRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];info.refcount=0})};function ___cxa_throw(ptr,type,destructor){EXCEPTIONS.infos[ptr]={ptr:ptr,adjusted:ptr,type:type,destructor:destructor,refcount:0,caught:false,rethrown:false};EXCEPTIONS.last=ptr;if(!("uncaught_exception"in __ZSt18uncaught_exceptionv)){__ZSt18uncaught_exceptionv.uncaught_exception=1}else{__ZSt18uncaught_exceptionv.uncaught_exception++}throw ptr+" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch."}function ___lock(){}var ERRNO_MESSAGES={0:"Success",1:"Not super-user",2:"No such file or directory",3:"No such process",4:"Interrupted system call",5:"I/O error",6:"No such device or address",7:"Arg list too long",8:"Exec format error",9:"Bad file number",10:"No children",11:"No more processes",12:"Not enough core",13:"Permission denied",14:"Bad address",15:"Block device required",16:"Mount device busy",17:"File exists",18:"Cross-device link",19:"No such device",20:"Not a directory",21:"Is a directory",22:"Invalid argument",23:"Too many open files in system",24:"Too many open files",25:"Not a typewriter",26:"Text file busy",27:"File too large",28:"No space left on device",29:"Illegal seek",30:"Read only file system",31:"Too many links",32:"Broken pipe",33:"Math arg out of domain of func",34:"Math result not representable",35:"File locking deadlock error",36:"File or path name too long",37:"No record locks available",38:"Function not implemented",39:"Directory not empty",40:"Too many symbolic links",42:"No message of desired type",43:"Identifier removed",44:"Channel number out of range",45:"Level 2 not synchronized",46:"Level 3 halted",47:"Level 3 reset",48:"Link number out of range",49:"Protocol driver not attached",50:"No CSI structure available",51:"Level 2 halted",52:"Invalid exchange",53:"Invalid request descriptor",54:"Exchange full",55:"No anode",56:"Invalid request code",57:"Invalid slot",59:"Bad font file fmt",60:"Device not a stream",61:"No data (for no delay io)",62:"Timer expired",63:"Out of streams resources",64:"Machine is not on the network",65:"Package not installed",66:"The object is remote",67:"The link has been severed",68:"Advertise error",69:"Srmount error",70:"Communication error on send",71:"Protocol error",72:"Multihop attempted",73:"Cross mount point (not really error)",74:"Trying to read unreadable message",75:"Value too large for defined data type",76:"Given log. name not unique",77:"f.d. invalid for this operation",78:"Remote address changed",79:"Can access a needed shared lib",80:"Accessing a corrupted shared lib",81:".lib section in a.out corrupted",82:"Attempting to link in too many libs",83:"Attempting to exec a shared library",84:"Illegal byte sequence",86:"Streams pipe error",87:"Too many users",88:"Socket operation on non-socket",89:"Destination address required",90:"Message too long",91:"Protocol wrong type for socket",92:"Protocol not available",93:"Unknown protocol",94:"Socket type not supported",95:"Not supported",96:"Protocol family not supported",97:"Address family not supported by protocol family",98:"Address already in use",99:"Address not available",100:"Network interface is not configured",101:"Network is unreachable",102:"Connection reset by network",103:"Connection aborted",104:"Connection reset by peer",105:"No buffer space available",106:"Socket is already connected",107:"Socket is not connected",108:"Can't send after socket shutdown",109:"Too many references",110:"Connection timed out",111:"Connection refused",112:"Host is down",113:"Host is unreachable",114:"Socket already connected",115:"Connection already in progress",116:"Stale file handle",122:"Quota exceeded",123:"No medium (in tape drive)",125:"Operation canceled",130:"Previous owner died",131:"State not recoverable"};var PATH={splitPath:(function(filename){var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)}),normalizeArray:(function(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts}),normalize:(function(path){var isAbsolute=path.charAt(0)==="/",trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter((function(p){return!!p})),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path}),dirname:(function(path){var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir}),basename:(function(path){if(path==="/")return"/";var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)}),extname:(function(path){return PATH.splitPath(path)[3]}),join:(function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join("/"))}),join2:(function(l,r){return PATH.normalize(l+"/"+r)}),resolve:(function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!=="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=path.charAt(0)==="/"}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter((function(p){return!!p})),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."}),relative:(function(from,to){from=PATH.resolve(from).substr(1);to=PATH.resolve(to).substr(1);function trim(arr){var start=0;for(;start<arr.length;start++){if(arr[start]!=="")break}var end=arr.length-1;for(;end>=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i<length;i++){if(fromParts[i]!==toParts[i]){samePartsLength=i;break}}var outputParts=[];for(var i=samePartsLength;i<fromParts.length;i++){outputParts.push("..")}outputParts=outputParts.concat(toParts.slice(samePartsLength));return outputParts.join("/")})};var TTY={ttys:[],init:(function(){}),shutdown:(function(){}),register:(function(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops};FS.registerDevice(dev,TTY.stream_ops)}),stream_ops:{open:(function(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}stream.tty=tty;stream.seekable=false}),close:(function(stream){stream.tty.ops.flush(stream.tty)}),flush:(function(stream){stream.tty.ops.flush(stream.tty)}),read:(function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(ERRNO_CODES.ENXIO)}var bytesRead=0;for(var i=0;i<length;i++){var result;try{result=stream.tty.ops.get_char(stream.tty)}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EIO)}if(result===undefined&&bytesRead===0){throw new FS.ErrnoError(ERRNO_CODES.EAGAIN)}if(result===null||result===undefined)break;bytesRead++;buffer[offset+i]=result}if(bytesRead){stream.node.timestamp=Date.now()}return bytesRead}),write:(function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.put_char){throw new FS.ErrnoError(ERRNO_CODES.ENXIO)}for(var i=0;i<length;i++){try{stream.tty.ops.put_char(stream.tty,buffer[offset+i])}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EIO)}}if(length){stream.node.timestamp=Date.now()}return i})},default_tty_ops:{get_char:(function(tty){if(!tty.input.length){var result=null;if(ENVIRONMENT_IS_NODE){var BUFSIZE=256;var buf=new Buffer(BUFSIZE);var bytesRead=0;var isPosixPlatform=process.platform!="win32";var fd=process.stdin.fd;if(isPosixPlatform){var usingDevice=false;try{fd=fs.openSync("/dev/stdin","r");usingDevice=true}catch(e){}}try{bytesRead=fs.readSync(fd,buf,0,BUFSIZE,null)}catch(e){if(e.toString().indexOf("EOF")!=-1)bytesRead=0;else throw e}if(usingDevice){fs.closeSync(fd)}if(bytesRead>0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()}),put_char:(function(tty,val){if(val===null||val===10){out(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}}),flush:(function(tty){if(tty.output&&tty.output.length>0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}})},default_tty1_ops:{put_char:(function(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}}),flush:(function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}})}};var MEMFS={ops_table:null,mount:(function(mount){return MEMFS.createNode(null,"/",16384|511,0)}),createNode:(function(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node}return node}),getFileDataAsRegularArray:(function(node){if(node.contents&&node.contents.subarray){var arr=[];for(var i=0;i<node.usedBytes;++i)arr.push(node.contents[i]);return arr}return node.contents}),getFileDataAsTypedArray:(function(node){if(!node.contents)return new Uint8Array;if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)}),expandFileStorage:(function(node,newCapacity){if(node.contents&&node.contents.subarray&&newCapacity>node.contents.length){node.contents=MEMFS.getFileDataAsRegularArray(node);node.usedBytes=node.contents.length}if(!node.contents||node.contents.subarray){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity<CAPACITY_DOUBLING_MAX?2:1.125)|0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0);return}if(!node.contents&&newCapacity>0)node.contents=[];while(node.contents.length<newCapacity)node.contents.push(0)}),resizeFileStorage:(function(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0;return}if(!node.contents||node.contents.subarray){var oldContents=node.contents;node.contents=new Uint8Array(new ArrayBuffer(newSize));if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize;return}if(!node.contents)node.contents=[];if(node.contents.length>newSize)node.contents.length=newSize;else while(node.contents.length<newSize)node.contents.push(0);node.usedBytes=newSize}),node_ops:{getattr:(function(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr}),setattr:(function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}}),lookup:(function(parent,name){throw FS.genericErrors[ERRNO_CODES.ENOENT]}),mknod:(function(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)}),rename:(function(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)}}}delete old_node.parent.contents[old_node.name];old_node.name=new_name;new_dir.contents[new_name]=old_node;old_node.parent=new_dir}),unlink:(function(parent,name){delete parent.contents[name]}),rmdir:(function(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)}delete parent.contents[name]}),readdir:(function(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries}),symlink:(function(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node}),readlink:(function(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return node.link})},stream_ops:{read:(function(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);assert(size>=0);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i<size;i++)buffer[offset+i]=contents[position+i]}return size}),write:(function(stream,buffer,offset,length,position,canOwn){canOwn=false;if(!length)return 0;var node=stream.node;node.timestamp=Date.now();if(buffer.subarray&&(!node.contents||node.contents.subarray)){if(canOwn){node.contents=buffer.subarray(offset,offset+length);node.usedBytes=length;return length}else if(node.usedBytes===0&&position===0){node.contents=new Uint8Array(buffer.subarray(offset,offset+length));node.usedBytes=length;return length}else if(position+length<=node.usedBytes){node.contents.set(buffer.subarray(offset,offset+length),position);return length}}MEMFS.expandFileStorage(node,position+length);if(node.contents.subarray&&buffer.subarray)node.contents.set(buffer.subarray(offset,offset+length),position);else{for(var i=0;i<length;i++){node.contents[position+i]=buffer[offset+i]}}node.usedBytes=Math.max(node.usedBytes,position+length);return length}),llseek:(function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.usedBytes}}if(position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return position}),allocate:(function(stream,offset,length){MEMFS.expandFileStorage(stream.node,offset+length);stream.node.usedBytes=Math.max(stream.node.usedBytes,offset+length)}),mmap:(function(stream,buffer,offset,length,position,prot,flags){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}var ptr;var allocated;var contents=stream.node.contents;if(!(flags&2)&&(contents.buffer===buffer||contents.buffer===buffer.buffer)){allocated=false;ptr=contents.byteOffset}else{if(position>0||position+length<stream.node.usedBytes){if(contents.subarray){contents=contents.subarray(position,position+length)}else{contents=Array.prototype.slice.call(contents,position,position+length)}}allocated=true;ptr=_malloc(length);if(!ptr){throw new FS.ErrnoError(ERRNO_CODES.ENOMEM)}buffer.set(contents,ptr)}return{ptr:ptr,allocated:allocated}}),msync:(function(stream,buffer,offset,length,mmapFlags){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}if(mmapFlags&2){return 0}var bytesWritten=MEMFS.stream_ops.write(stream,buffer,0,length,offset,false);return 0})}};var IDBFS={dbs:{},indexedDB:(function(){if(typeof indexedDB!=="undefined")return indexedDB;var ret=null;if(typeof window==="object")ret=window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB;assert(ret,"IDBFS used, but indexedDB not supported");return ret}),DB_VERSION:21,DB_STORE_NAME:"FILE_DATA",mount:(function(mount){return MEMFS.mount.apply(null,arguments)}),syncfs:(function(mount,populate,callback){IDBFS.getLocalSet(mount,(function(err,local){if(err)return callback(err);IDBFS.getRemoteSet(mount,(function(err,remote){if(err)return callback(err);var src=populate?remote:local;var dst=populate?local:remote;IDBFS.reconcile(src,dst,callback)}))}))}),getDB:(function(name,callback){var db=IDBFS.dbs[name];if(db){return callback(null,db)}var req;try{req=IDBFS.indexedDB().open(name,IDBFS.DB_VERSION)}catch(e){return callback(e)}if(!req){return callback("Unable to connect to IndexedDB")}req.onupgradeneeded=(function(e){var db=e.target.result;var transaction=e.target.transaction;var fileStore;if(db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)){fileStore=transaction.objectStore(IDBFS.DB_STORE_NAME)}else{fileStore=db.createObjectStore(IDBFS.DB_STORE_NAME)}if(!fileStore.indexNames.contains("timestamp")){fileStore.createIndex("timestamp","timestamp",{unique:false})}});req.onsuccess=(function(){db=req.result;IDBFS.dbs[name]=db;callback(null,db)});req.onerror=(function(e){callback(this.error);e.preventDefault()})}),getLocalSet:(function(mount,callback){var entries={};function isRealDir(p){return p!=="."&&p!==".."}function toAbsolute(root){return(function(p){return PATH.join2(root,p)})}var check=FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint));while(check.length){var path=check.pop();var stat;try{stat=FS.stat(path)}catch(e){return callback(e)}if(FS.isDir(stat.mode)){check.push.apply(check,FS.readdir(path).filter(isRealDir).map(toAbsolute(path)))}entries[path]={timestamp:stat.mtime}}return callback(null,{type:"local",entries:entries})}),getRemoteSet:(function(mount,callback){var entries={};IDBFS.getDB(mount.mountpoint,(function(err,db){if(err)return callback(err);try{var transaction=db.transaction([IDBFS.DB_STORE_NAME],"readonly");transaction.onerror=(function(e){callback(this.error);e.preventDefault()});var store=transaction.objectStore(IDBFS.DB_STORE_NAME);var index=store.index("timestamp");index.openKeyCursor().onsuccess=(function(event){var cursor=event.target.result;if(!cursor){return callback(null,{type:"remote",db:db,entries:entries})}entries[cursor.primaryKey]={timestamp:cursor.key};cursor.continue()})}catch(e){return callback(e)}}))}),loadLocalEntry:(function(path,callback){var stat,node;try{var lookup=FS.lookupPath(path);node=lookup.node;stat=FS.stat(path)}catch(e){return callback(e)}if(FS.isDir(stat.mode)){return callback(null,{timestamp:stat.mtime,mode:stat.mode})}else if(FS.isFile(stat.mode)){node.contents=MEMFS.getFileDataAsTypedArray(node);return callback(null,{timestamp:stat.mtime,mode:stat.mode,contents:node.contents})}else{return callback(new Error("node type not supported"))}}),storeLocalEntry:(function(path,entry,callback){try{if(FS.isDir(entry.mode)){FS.mkdir(path,entry.mode)}else if(FS.isFile(entry.mode)){FS.writeFile(path,entry.contents,{canOwn:true})}else{return callback(new Error("node type not supported"))}FS.chmod(path,entry.mode);FS.utime(path,entry.timestamp,entry.timestamp)}catch(e){return callback(e)}callback(null)}),removeLocalEntry:(function(path,callback){try{var lookup=FS.lookupPath(path);var stat=FS.stat(path);if(FS.isDir(stat.mode)){FS.rmdir(path)}else if(FS.isFile(stat.mode)){FS.unlink(path)}}catch(e){return callback(e)}callback(null)}),loadRemoteEntry:(function(store,path,callback){var req=store.get(path);req.onsuccess=(function(event){callback(null,event.target.result)});req.onerror=(function(e){callback(this.error);e.preventDefault()})}),storeRemoteEntry:(function(store,path,entry,callback){var req=store.put(entry,path);req.onsuccess=(function(){callback(null)});req.onerror=(function(e){callback(this.error);e.preventDefault()})}),removeRemoteEntry:(function(store,path,callback){var req=store.delete(path);req.onsuccess=(function(){callback(null)});req.onerror=(function(e){callback(this.error);e.preventDefault()})}),reconcile:(function(src,dst,callback){var total=0;var create=[];Object.keys(src.entries).forEach((function(key){var e=src.entries[key];var e2=dst.entries[key];if(!e2||e.timestamp>e2.timestamp){create.push(key);total++}}));var remove=[];Object.keys(dst.entries).forEach((function(key){var e=dst.entries[key];var e2=src.entries[key];if(!e2){remove.push(key);total++}}));if(!total){return callback(null)}var completed=0;var db=src.type==="remote"?src.db:dst.db;var transaction=db.transaction([IDBFS.DB_STORE_NAME],"readwrite");var store=transaction.objectStore(IDBFS.DB_STORE_NAME);function done(err){if(err){if(!done.errored){done.errored=true;return callback(err)}return}if(++completed>=total){return callback(null)}}transaction.onerror=(function(e){done(this.error);e.preventDefault()});create.sort().forEach((function(path){if(dst.type==="local"){IDBFS.loadRemoteEntry(store,path,(function(err,entry){if(err)return done(err);IDBFS.storeLocalEntry(path,entry,done)}))}else{IDBFS.loadLocalEntry(path,(function(err,entry){if(err)return done(err);IDBFS.storeRemoteEntry(store,path,entry,done)}))}}));remove.sort().reverse().forEach((function(path){if(dst.type==="local"){IDBFS.removeLocalEntry(path,done)}else{IDBFS.removeRemoteEntry(store,path,done)}}))})};var NODEFS={isWindows:false,staticInit:(function(){NODEFS.isWindows=!!process.platform.match(/^win/);var flags=process["binding"]("constants");if(flags["fs"]){flags=flags["fs"]}NODEFS.flagsForNodeMap={"1024":flags["O_APPEND"],"64":flags["O_CREAT"],"128":flags["O_EXCL"],"0":flags["O_RDONLY"],"2":flags["O_RDWR"],"4096":flags["O_SYNC"],"512":flags["O_TRUNC"],"1":flags["O_WRONLY"]}}),bufferFrom:(function(arrayBuffer){return Buffer.alloc?Buffer.from(arrayBuffer):new Buffer(arrayBuffer)}),mount:(function(mount){assert(ENVIRONMENT_IS_NODE);return NODEFS.createNode(null,"/",NODEFS.getMode(mount.opts.root),0)}),createNode:(function(parent,name,mode,dev){if(!FS.isDir(mode)&&!FS.isFile(mode)&&!FS.isLink(mode)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node=FS.createNode(parent,name,mode);node.node_ops=NODEFS.node_ops;node.stream_ops=NODEFS.stream_ops;return node}),getMode:(function(path){var stat;try{stat=fs.lstatSync(path);if(NODEFS.isWindows){stat.mode=stat.mode|(stat.mode&292)>>2}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return stat.mode}),realPath:(function(node){var parts=[];while(node.parent!==node){parts.push(node.name);node=node.parent}parts.push(node.mount.opts.root);parts.reverse();return PATH.join.apply(null,parts)}),flagsForNode:(function(flags){flags&=~2097152;flags&=~2048;flags&=~32768;flags&=~524288;var newFlags=0;for(var k in NODEFS.flagsForNodeMap){if(flags&k){newFlags|=NODEFS.flagsForNodeMap[k];flags^=k}}if(!flags){return newFlags}else{throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}}),node_ops:{getattr:(function(node){var path=NODEFS.realPath(node);var stat;try{stat=fs.lstatSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}if(NODEFS.isWindows&&!stat.blksize){stat.blksize=4096}if(NODEFS.isWindows&&!stat.blocks){stat.blocks=(stat.size+stat.blksize-1)/stat.blksize|0}return{dev:stat.dev,ino:stat.ino,mode:stat.mode,nlink:stat.nlink,uid:stat.uid,gid:stat.gid,rdev:stat.rdev,size:stat.size,atime:stat.atime,mtime:stat.mtime,ctime:stat.ctime,blksize:stat.blksize,blocks:stat.blocks}}),setattr:(function(node,attr){var path=NODEFS.realPath(node);try{if(attr.mode!==undefined){fs.chmodSync(path,attr.mode);node.mode=attr.mode}if(attr.timestamp!==undefined){var date=new Date(attr.timestamp);fs.utimesSync(path,date,date)}if(attr.size!==undefined){fs.truncateSync(path,attr.size)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),lookup:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);var mode=NODEFS.getMode(path);return NODEFS.createNode(parent,name,mode)}),mknod:(function(parent,name,mode,dev){var node=NODEFS.createNode(parent,name,mode,dev);var path=NODEFS.realPath(node);try{if(FS.isDir(node.mode)){fs.mkdirSync(path,node.mode)}else{fs.writeFileSync(path,"",{mode:node.mode})}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return node}),rename:(function(oldNode,newDir,newName){var oldPath=NODEFS.realPath(oldNode);var newPath=PATH.join2(NODEFS.realPath(newDir),newName);try{fs.renameSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),unlink:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.unlinkSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),rmdir:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.rmdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),readdir:(function(node){var path=NODEFS.realPath(node);try{return fs.readdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),symlink:(function(parent,newName,oldPath){var newPath=PATH.join2(NODEFS.realPath(parent),newName);try{fs.symlinkSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),readlink:(function(node){var path=NODEFS.realPath(node);try{path=fs.readlinkSync(path);path=NODEJS_PATH.relative(NODEJS_PATH.resolve(node.mount.opts.root),path);return path}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}})},stream_ops:{open:(function(stream){var path=NODEFS.realPath(stream.node);try{if(FS.isFile(stream.node.mode)){stream.nfd=fs.openSync(path,NODEFS.flagsForNode(stream.flags))}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),close:(function(stream){try{if(FS.isFile(stream.node.mode)&&stream.nfd){fs.closeSync(stream.nfd)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),read:(function(stream,buffer,offset,length,position){if(length===0)return 0;try{return fs.readSync(stream.nfd,NODEFS.bufferFrom(buffer.buffer),offset,length,position)}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),write:(function(stream,buffer,offset,length,position){try{return fs.writeSync(stream.nfd,NODEFS.bufferFrom(buffer.buffer),offset,length,position)}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),llseek:(function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){try{var stat=fs.fstatSync(stream.nfd);position+=stat.size}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}}}if(position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return position})}};var WORKERFS={DIR_MODE:16895,FILE_MODE:33279,reader:null,mount:(function(mount){assert(ENVIRONMENT_IS_WORKER);if(!WORKERFS.reader)WORKERFS.reader=new FileReaderSync;var root=WORKERFS.createNode(null,"/",WORKERFS.DIR_MODE,0);var createdParents={};function ensureParent(path){var parts=path.split("/");var parent=root;for(var i=0;i<parts.length-1;i++){var curr=parts.slice(0,i+1).join("/");if(!createdParents[curr]){createdParents[curr]=WORKERFS.createNode(parent,parts[i],WORKERFS.DIR_MODE,0)}parent=createdParents[curr]}return parent}function base(path){var parts=path.split("/");return parts[parts.length-1]}Array.prototype.forEach.call(mount.opts["files"]||[],(function(file){WORKERFS.createNode(ensureParent(file.name),base(file.name),WORKERFS.FILE_MODE,0,file,file.lastModifiedDate)}));(mount.opts["blobs"]||[]).forEach((function(obj){WORKERFS.createNode(ensureParent(obj["name"]),base(obj["name"]),WORKERFS.FILE_MODE,0,obj["data"])}));(mount.opts["packages"]||[]).forEach((function(pack){pack["metadata"].files.forEach((function(file){var name=file.filename.substr(1);WORKERFS.createNode(ensureParent(name),base(name),WORKERFS.FILE_MODE,0,pack["blob"].slice(file.start,file.end))}))}));return root}),createNode:(function(parent,name,mode,dev,contents,mtime){var node=FS.createNode(parent,name,mode);node.mode=mode;node.node_ops=WORKERFS.node_ops;node.stream_ops=WORKERFS.stream_ops;node.timestamp=(mtime||new Date).getTime();assert(WORKERFS.FILE_MODE!==WORKERFS.DIR_MODE);if(mode===WORKERFS.FILE_MODE){node.size=contents.size;node.contents=contents}else{node.size=4096;node.contents={}}if(parent){parent.contents[name]=node}return node}),node_ops:{getattr:(function(node){return{dev:1,ino:undefined,mode:node.mode,nlink:1,uid:0,gid:0,rdev:undefined,size:node.size,atime:new Date(node.timestamp),mtime:new Date(node.timestamp),ctime:new Date(node.timestamp),blksize:4096,blocks:Math.ceil(node.size/4096)}}),setattr:(function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}}),lookup:(function(parent,name){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}),mknod:(function(parent,name,mode,dev){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}),rename:(function(oldNode,newDir,newName){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}),unlink:(function(parent,name){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}),rmdir:(function(parent,name){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}),readdir:(function(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries}),symlink:(function(parent,newName,oldPath){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}),readlink:(function(node){throw new FS.ErrnoError(ERRNO_CODES.EPERM)})},stream_ops:{read:(function(stream,buffer,offset,length,position){if(position>=stream.node.size)return 0;var chunk=stream.node.contents.slice(position,position+length);var ab=WORKERFS.reader.readAsArrayBuffer(chunk);buffer.set(new Uint8Array(ab),offset);return chunk.size}),write:(function(stream,buffer,offset,length,position){throw new FS.ErrnoError(ERRNO_CODES.EIO)}),llseek:(function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.size}}if(position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return position})}};STATICTOP+=16;STATICTOP+=16;STATICTOP+=16;var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,handleFSError:(function(e){if(!(e instanceof FS.ErrnoError))throw e+" : "+stackTrace();return ___setErrNo(e.errno)}),lookupPath:(function(path,opts){path=PATH.resolve(FS.cwd(),path);opts=opts||{};if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};for(var key in defaults){if(opts[key]===undefined){opts[key]=defaults[key]}}if(opts.recurse_count>8){throw new FS.ErrnoError(ERRNO_CODES.ELOOP)}var parts=PATH.normalizeArray(path.split("/").filter((function(p){return!!p})),false);var current=FS.root;var current_path="/";for(var i=0;i<parts.length;i++){var islast=i===parts.length-1;if(islast&&opts.parent){break}current=FS.lookupNode(current,parts[i]);current_path=PATH.join2(current_path,parts[i]);if(FS.isMountpoint(current)){if(!islast||islast&&opts.follow_mount){current=current.mounted.root}}if(!islast||opts.follow){var count=0;while(FS.isLink(current.mode)){var link=FS.readlink(current_path);current_path=PATH.resolve(PATH.dirname(current_path),link);var lookup=FS.lookupPath(current_path,{recurse_count:opts.recurse_count});current=lookup.node;if(count++>40){throw new FS.ErrnoError(ERRNO_CODES.ELOOP)}}}}return{path:current_path,node:current}}),getPath:(function(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?mount+"/"+path:mount+path}path=path?node.name+"/"+path:node.name;node=node.parent}}),hashName:(function(parentid,name){var hash=0;for(var i=0;i<name.length;i++){hash=(hash<<5)-hash+name.charCodeAt(i)|0}return(parentid+hash>>>0)%FS.nameTable.length}),hashAddNode:(function(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node}),hashRemoveNode:(function(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}}),lookupNode:(function(parent,name){var err=FS.mayLookup(parent);if(err){throw new FS.ErrnoError(err,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)}),createNode:(function(parent,name,mode,rdev){if(!FS.FSNode){FS.FSNode=(function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev});FS.FSNode.prototype={};var readMode=292|73;var writeMode=146;Object.defineProperties(FS.FSNode.prototype,{read:{get:(function(){return(this.mode&readMode)===readMode}),set:(function(val){val?this.mode|=readMode:this.mode&=~readMode})},write:{get:(function(){return(this.mode&writeMode)===writeMode}),set:(function(val){val?this.mode|=writeMode:this.mode&=~writeMode})},isFolder:{get:(function(){return FS.isDir(this.mode)})},isDevice:{get:(function(){return FS.isChrdev(this.mode)})}})}var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node}),destroyNode:(function(node){FS.hashRemoveNode(node)}),isRoot:(function(node){return node===node.parent}),isMountpoint:(function(node){return!!node.mounted}),isFile:(function(mode){return(mode&61440)===32768}),isDir:(function(mode){return(mode&61440)===16384}),isLink:(function(mode){return(mode&61440)===40960}),isChrdev:(function(mode){return(mode&61440)===8192}),isBlkdev:(function(mode){return(mode&61440)===24576}),isFIFO:(function(mode){return(mode&61440)===4096}),isSocket:(function(mode){return(mode&49152)===49152}),flagModes:{"r":0,"rs":1052672,"r+":2,"w":577,"wx":705,"xw":705,"w+":578,"wx+":706,"xw+":706,"a":1089,"ax":1217,"xa":1217,"a+":1090,"ax+":1218,"xa+":1218},modeStringToFlags:(function(str){var flags=FS.flagModes[str];if(typeof flags==="undefined"){throw new Error("Unknown file open mode: "+str)}return flags}),flagsToPermissionString:(function(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms}),nodePermissions:(function(node,perms){if(FS.ignorePermissions){return 0}if(perms.indexOf("r")!==-1&&!(node.mode&292)){return ERRNO_CODES.EACCES}else if(perms.indexOf("w")!==-1&&!(node.mode&146)){return ERRNO_CODES.EACCES}else if(perms.indexOf("x")!==-1&&!(node.mode&73)){return ERRNO_CODES.EACCES}return 0}),mayLookup:(function(dir){var err=FS.nodePermissions(dir,"x");if(err)return err;if(!dir.node_ops.lookup)return ERRNO_CODES.EACCES;return 0}),mayCreate:(function(dir,name){try{var node=FS.lookupNode(dir,name);return ERRNO_CODES.EEXIST}catch(e){}return FS.nodePermissions(dir,"wx")}),mayDelete:(function(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var err=FS.nodePermissions(dir,"wx");if(err){return err}if(isdir){if(!FS.isDir(node.mode)){return ERRNO_CODES.ENOTDIR}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return ERRNO_CODES.EBUSY}}else{if(FS.isDir(node.mode)){return ERRNO_CODES.EISDIR}}return 0}),mayOpen:(function(node,flags){if(!node){return ERRNO_CODES.ENOENT}if(FS.isLink(node.mode)){return ERRNO_CODES.ELOOP}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return ERRNO_CODES.EISDIR}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))}),MAX_OPEN_FDS:4096,nextfd:(function(fd_start,fd_end){fd_start=fd_start||0;fd_end=fd_end||FS.MAX_OPEN_FDS;for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(ERRNO_CODES.EMFILE)}),getStream:(function(fd){return FS.streams[fd]}),createStream:(function(stream,fd_start,fd_end){if(!FS.FSStream){FS.FSStream=(function(){});FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get:(function(){return this.node}),set:(function(val){this.node=val})},isRead:{get:(function(){return(this.flags&2097155)!==1})},isWrite:{get:(function(){return(this.flags&2097155)!==0})},isAppend:{get:(function(){return this.flags&1024})}})}var newStream=new FS.FSStream;for(var p in stream){newStream[p]=stream[p]}stream=newStream;var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream}),closeStream:(function(fd){FS.streams[fd]=null}),chrdev_stream_ops:{open:(function(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}}),llseek:(function(){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)})},major:(function(dev){return dev>>8}),minor:(function(dev){return dev&255}),makedev:(function(ma,mi){return ma<<8|mi}),registerDevice:(function(dev,ops){FS.devices[dev]={stream_ops:ops}}),getDevice:(function(dev){return FS.devices[dev]}),getMounts:(function(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts}),syncfs:(function(populate,callback){if(typeof populate==="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){console.log("warning: "+FS.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work")}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(err){assert(FS.syncFSRequests>0);FS.syncFSRequests--;return callback(err)}function done(err){if(err){if(!done.errored){done.errored=true;return doCallback(err)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach((function(mount){if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)}))}),mount:(function(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot}),unmount:(function(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach((function(hash){var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.indexOf(current.mount)!==-1){FS.destroyNode(current)}current=next}}));node.mounted=null;var idx=node.mount.mounts.indexOf(mount);assert(idx!==-1);node.mount.mounts.splice(idx,1)}),lookup:(function(parent,name){return parent.node_ops.lookup(parent,name)}),mknod:(function(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var err=FS.mayCreate(parent,name);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}return parent.node_ops.mknod(parent,name,mode,dev)}),create:(function(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)}),mkdir:(function(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)}),mkdirTree:(function(path,mode){var dirs=path.split("/");var d="";for(var i=0;i<dirs.length;++i){if(!dirs[i])continue;d+="/"+dirs[i];try{FS.mkdir(d,mode)}catch(e){if(e.errno!=ERRNO_CODES.EEXIST)throw e}}}),mkdev:(function(path,mode,dev){if(typeof dev==="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)}),symlink:(function(oldpath,newpath){if(!PATH.resolve(oldpath)){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}var newname=PATH.basename(newpath);var err=FS.mayCreate(parent,newname);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}return parent.node_ops.symlink(parent,newname,oldpath)}),rename:(function(old_path,new_path){var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;try{lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}if(!old_dir||!new_dir)throw new FS.ErrnoError(ERRNO_CODES.ENOENT);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(ERRNO_CODES.EXDEV)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}relative=PATH.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var err=FS.mayDelete(old_dir,old_name,isdir);if(err){throw new FS.ErrnoError(err)}err=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(err){throw new FS.ErrnoError(err)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}if(new_dir!==old_dir){err=FS.nodePermissions(old_dir,"w");if(err){throw new FS.ErrnoError(err)}}try{if(FS.trackingDelegate["willMovePath"]){FS.trackingDelegate["willMovePath"](old_path,new_path)}}catch(e){console.log("FS.trackingDelegate['willMovePath']('"+old_path+"', '"+new_path+"') threw an exception: "+e.message)}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name)}catch(e){throw e}finally{FS.hashAddNode(old_node)}try{if(FS.trackingDelegate["onMovePath"])FS.trackingDelegate["onMovePath"](old_path,new_path)}catch(e){console.log("FS.trackingDelegate['onMovePath']('"+old_path+"', '"+new_path+"') threw an exception: "+e.message)}}),rmdir:(function(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var err=FS.mayDelete(parent,name,true);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}try{if(FS.trackingDelegate["willDeletePath"]){FS.trackingDelegate["willDeletePath"](path)}}catch(e){console.log("FS.trackingDelegate['willDeletePath']('"+path+"') threw an exception: "+e.message)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node);try{if(FS.trackingDelegate["onDeletePath"])FS.trackingDelegate["onDeletePath"](path)}catch(e){console.log("FS.trackingDelegate['onDeletePath']('"+path+"') threw an exception: "+e.message)}}),readdir:(function(path){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node.node_ops.readdir){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}return node.node_ops.readdir(node)}),unlink:(function(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var err=FS.mayDelete(parent,name,false);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}try{if(FS.trackingDelegate["willDeletePath"]){FS.trackingDelegate["willDeletePath"](path)}}catch(e){console.log("FS.trackingDelegate['willDeletePath']('"+path+"') threw an exception: "+e.message)}parent.node_ops.unlink(parent,name);FS.destroyNode(node);try{if(FS.trackingDelegate["onDeletePath"])FS.trackingDelegate["onDeletePath"](path)}catch(e){console.log("FS.trackingDelegate['onDeletePath']('"+path+"') threw an exception: "+e.message)}}),readlink:(function(path){var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}if(!link.node_ops.readlink){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return PATH.resolve(FS.getPath(link.parent),link.node_ops.readlink(link))}),stat:(function(path,dontFollow){var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;if(!node){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}if(!node.node_ops.getattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}return node.node_ops.getattr(node)}),lstat:(function(path){return FS.stat(path,true)}),chmod:(function(path,mode,dontFollow){var node;if(typeof path==="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}node.node_ops.setattr(node,{mode:mode&4095|node.mode&~4095,timestamp:Date.now()})}),lchmod:(function(path,mode){FS.chmod(path,mode,true)}),fchmod:(function(fd,mode){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}FS.chmod(stream.node,mode)}),chown:(function(path,uid,gid,dontFollow){var node;if(typeof path==="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}node.node_ops.setattr(node,{timestamp:Date.now()})}),lchown:(function(path,uid,gid){FS.chown(path,uid,gid,true)}),fchown:(function(fd,uid,gid){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}FS.chown(stream.node,uid,gid)}),truncate:(function(path,len){if(len<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node;if(typeof path==="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isDir(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EISDIR)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var err=FS.nodePermissions(node,"w");if(err){throw new FS.ErrnoError(err)}node.node_ops.setattr(node,{size:len,timestamp:Date.now()})}),ftruncate:(function(fd,len){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}FS.truncate(stream.node,len)}),utime:(function(path,atime,mtime){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;node.node_ops.setattr(node,{timestamp:Math.max(atime,mtime)})}),open:(function(path,flags,mode,fd_start,fd_end){if(path===""){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}flags=typeof flags==="string"?FS.modeStringToFlags(flags):flags;mode=typeof mode==="undefined"?438:mode;if(flags&64){mode=mode&4095|32768}else{mode=0}var node;if(typeof path==="object"){node=path}else{path=PATH.normalize(path);try{var lookup=FS.lookupPath(path,{follow:!(flags&131072)});node=lookup.node}catch(e){}}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(ERRNO_CODES.EEXIST)}}else{node=FS.mknod(path,mode,0);created=true}}if(!node){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}if(!created){var err=FS.mayOpen(node,flags);if(err){throw new FS.ErrnoError(err)}}if(flags&512){FS.truncate(node,0)}flags&=~(128|512);var stream=FS.createStream({node:node,path:FS.getPath(node),flags:flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false},fd_start,fd_end);if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(Module["logReadFiles"]&&!(flags&1)){if(!FS.readFiles)FS.readFiles={};if(!(path in FS.readFiles)){FS.readFiles[path]=1;err("read file: "+path)}}try{if(FS.trackingDelegate["onOpenFile"]){var trackingFlags=0;if((flags&2097155)!==1){trackingFlags|=FS.tracking.openFlags.READ}if((flags&2097155)!==0){trackingFlags|=FS.tracking.openFlags.WRITE}FS.trackingDelegate["onOpenFile"](path,trackingFlags)}}catch(e){console.log("FS.trackingDelegate['onOpenFile']('"+path+"', flags) threw an exception: "+e.message)}return stream}),close:(function(stream){if(FS.isClosed(stream)){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null}),isClosed:(function(stream){return stream.fd===null}),llseek:(function(stream,offset,whence){if(FS.isClosed(stream)){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position}),read:(function(stream,buffer,offset,length,position){if(length<0||position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}if(FS.isClosed(stream)){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EISDIR)}if(!stream.stream_ops.read){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var seeking=typeof position!=="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead}),write:(function(stream,buffer,offset,length,position,canOwn){if(length<0||position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}if(FS.isClosed(stream)){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EISDIR)}if(!stream.stream_ops.write){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}if(stream.flags&1024){FS.llseek(stream,0,2)}var seeking=typeof position!=="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;try{if(stream.path&&FS.trackingDelegate["onWriteToFile"])FS.trackingDelegate["onWriteToFile"](stream.path)}catch(e){console.log("FS.trackingDelegate['onWriteToFile']('"+path+"') threw an exception: "+e.message)}return bytesWritten}),allocate:(function(stream,offset,length){if(FS.isClosed(stream)){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if(offset<0||length<=0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if(!FS.isFile(stream.node.mode)&&!FS.isDir(stream.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}if(!stream.stream_ops.allocate){throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP)}stream.stream_ops.allocate(stream,offset,length)}),mmap:(function(stream,buffer,offset,length,position,prot,flags){if((stream.flags&2097155)===1){throw new FS.ErrnoError(ERRNO_CODES.EACCES)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}return stream.stream_ops.mmap(stream,buffer,offset,length,position,prot,flags)}),msync:(function(stream,buffer,offset,length,mmapFlags){if(!stream||!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)}),munmap:(function(stream){return 0}),ioctl:(function(stream,cmd,arg){if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(ERRNO_CODES.ENOTTY)}return stream.stream_ops.ioctl(stream,cmd,arg)}),readFile:(function(path,opts){opts=opts||{};opts.flags=opts.flags||"r";opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error('Invalid encoding type "'+opts.encoding+'"')}var ret;var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){ret=UTF8ArrayToString(buf,0)}else if(opts.encoding==="binary"){ret=buf}FS.close(stream);return ret}),writeFile:(function(path,data,opts){opts=opts||{};opts.flags=opts.flags||"w";var stream=FS.open(path,opts.flags,opts.mode);if(typeof data==="string"){var buf=new Uint8Array(lengthBytesUTF8(data)+1);var actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,undefined,opts.canOwn)}else if(ArrayBuffer.isView(data)){FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn)}else{throw new Error("Unsupported data type")}FS.close(stream)}),cwd:(function(){return FS.currentPath}),chdir:(function(path){var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}var err=FS.nodePermissions(lookup.node,"x");if(err){throw new FS.ErrnoError(err)}FS.currentPath=lookup.path}),createDefaultDirectories:(function(){FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")}),createDefaultDevices:(function(){FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:(function(){return 0}),write:(function(stream,buffer,offset,length,pos){return length})});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var random_device;if(typeof crypto!=="undefined"){var randomBuffer=new Uint8Array(1);random_device=(function(){crypto.getRandomValues(randomBuffer);return randomBuffer[0]})}else if(ENVIRONMENT_IS_NODE){random_device=(function(){return require("crypto")["randomBytes"](1)[0]})}else{random_device=(function(){abort("random_device")})}FS.createDevice("/dev","random",random_device);FS.createDevice("/dev","urandom",random_device);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")}),createSpecialDirectories:(function(){FS.mkdir("/proc");FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount:(function(){var node=FS.createNode("/proc/self","fd",16384|511,73);node.node_ops={lookup:(function(parent,name){var fd=+name;var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(ERRNO_CODES.EBADF);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:(function(){return stream.path})}};ret.parent=ret;return ret})};return node})},{},"/proc/self/fd")}),createStandardStreams:(function(){if(Module["stdin"]){FS.createDevice("/dev","stdin",Module["stdin"])}else{FS.symlink("/dev/tty","/dev/stdin")}if(Module["stdout"]){FS.createDevice("/dev","stdout",null,Module["stdout"])}else{FS.symlink("/dev/tty","/dev/stdout")}if(Module["stderr"]){FS.createDevice("/dev","stderr",null,Module["stderr"])}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin","r");assert(stdin.fd===0,"invalid handle for stdin ("+stdin.fd+")");var stdout=FS.open("/dev/stdout","w");assert(stdout.fd===1,"invalid handle for stdout ("+stdout.fd+")");var stderr=FS.open("/dev/stderr","w");assert(stderr.fd===2,"invalid handle for stderr ("+stderr.fd+")")}),ensureErrnoError:(function(){if(FS.ErrnoError)return;FS.ErrnoError=function ErrnoError(errno,node){this.node=node;this.setErrno=(function(errno){this.errno=errno;for(var key in ERRNO_CODES){if(ERRNO_CODES[key]===errno){this.code=key;break}}});this.setErrno(errno);this.message=ERRNO_MESSAGES[errno];if(this.stack)Object.defineProperty(this,"stack",{value:(new Error).stack,writable:true})};FS.ErrnoError.prototype=new Error;FS.ErrnoError.prototype.constructor=FS.ErrnoError;[ERRNO_CODES.ENOENT].forEach((function(code){FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack="<generic error, no stack>"}))}),staticInit:(function(){FS.ensureErrnoError();FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={"MEMFS":MEMFS,"IDBFS":IDBFS,"NODEFS":NODEFS,"WORKERFS":WORKERFS}}),init:(function(input,output,error){assert(!FS.init.initialized,"FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)");FS.init.initialized=true;FS.ensureErrnoError();Module["stdin"]=input||Module["stdin"];Module["stdout"]=output||Module["stdout"];Module["stderr"]=error||Module["stderr"];FS.createStandardStreams()}),quit:(function(){FS.init.initialized=false;var fflush=Module["_fflush"];if(fflush)fflush(0);for(var i=0;i<FS.streams.length;i++){var stream=FS.streams[i];if(!stream){continue}FS.close(stream)}}),getMode:(function(canRead,canWrite){var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode}),joinPath:(function(parts,forceRelative){var path=PATH.join.apply(null,parts);if(forceRelative&&path[0]=="/")path=path.substr(1);return path}),absolutePath:(function(relative,base){return PATH.resolve(base,relative)}),standardizePath:(function(path){return PATH.normalize(path)}),findObject:(function(path,dontResolveLastLink){var ret=FS.analyzePath(path,dontResolveLastLink);if(ret.exists){return ret.object}else{___setErrNo(ret.error);return null}}),analyzePath:(function(path,dontResolveLastLink){try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret}),createFolder:(function(parent,name,canRead,canWrite){var path=PATH.join2(typeof parent==="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(canRead,canWrite);return FS.mkdir(path,mode)}),createPath:(function(parent,path,canRead,canWrite){parent=typeof parent==="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){}parent=current}return current}),createFile:(function(parent,name,properties,canRead,canWrite){var path=PATH.join2(typeof parent==="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(canRead,canWrite);return FS.create(path,mode)}),createDataFile:(function(parent,name,data,canRead,canWrite,canOwn){var path=name?PATH.join2(typeof parent==="string"?parent:FS.getPath(parent),name):parent;var mode=FS.getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){if(typeof data==="string"){var arr=new Array(data.length);for(var i=0,len=data.length;i<len;++i)arr[i]=data.charCodeAt(i);data=arr}FS.chmod(node,mode|146);var stream=FS.open(node,"w");FS.write(stream,data,0,data.length,0,canOwn);FS.close(stream);FS.chmod(node,mode)}return node}),createDevice:(function(parent,name,input,output){var path=PATH.join2(typeof parent==="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(!!input,!!output);if(!FS.createDevice.major)FS.createDevice.major=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open:(function(stream){stream.seekable=false}),close:(function(stream){if(output&&output.buffer&&output.buffer.length){output(10)}}),read:(function(stream,buffer,offset,length,pos){var bytesRead=0;for(var i=0;i<length;i++){var result;try{result=input()}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EIO)}if(result===undefined&&bytesRead===0){throw new FS.ErrnoError(ERRNO_CODES.EAGAIN)}if(result===null||result===undefined)break;bytesRead++;buffer[offset+i]=result}if(bytesRead){stream.node.timestamp=Date.now()}return bytesRead}),write:(function(stream,buffer,offset,length,pos){for(var i=0;i<length;i++){try{output(buffer[offset+i])}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EIO)}}if(length){stream.node.timestamp=Date.now()}return i})});return FS.mkdev(path,mode,dev)}),createLink:(function(parent,name,target,canRead,canWrite){var path=PATH.join2(typeof parent==="string"?parent:FS.getPath(parent),name);return FS.symlink(target,path)}),forceLoadFile:(function(obj){if(obj.isDevice||obj.isFolder||obj.link||obj.contents)return true;var success=true;if(typeof XMLHttpRequest!=="undefined"){throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.")}else if(Module["read"]){try{obj.contents=intArrayFromString(Module["read"](obj.url),true);obj.usedBytes=obj.contents.length}catch(e){success=false}}else{throw new Error("Cannot load without read() or XMLHttpRequest.")}if(!success)___setErrNo(ERRNO_CODES.EIO);return success}),createLazyFile:(function(parent,name,url,canRead,canWrite){function LazyUint8Array(){this.lengthKnown=false;this.chunks=[]}LazyUint8Array.prototype.get=function LazyUint8Array_get(idx){if(idx>this.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(function(from,to){if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);if(typeof Uint8Array!="undefined")xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}else{return intArrayFromString(xhr.responseText||"",true)}});var lazyArray=this;lazyArray.setDataGetter((function(chunkNum){var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]==="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]==="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]}));if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;console.log("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!=="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:(function(){if(!this.lengthKnown){this.cacheLength()}return this._length})},chunkSize:{get:(function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize})}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:(function(){return this.contents.length})}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach((function(key){var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(ERRNO_CODES.EIO)}return fn.apply(null,arguments)}}));stream_ops.read=function stream_ops_read(stream,buffer,offset,length,position){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(ERRNO_CODES.EIO)}var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);assert(size>=0);if(contents.slice){for(var i=0;i<size;i++){buffer[offset+i]=contents[position+i]}}else{for(var i=0;i<size;i++){buffer[offset+i]=contents.get(position+i)}}return size};node.stream_ops=stream_ops;return node}),createPreloadedFile:(function(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish){Browser.init();var fullname=name?PATH.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency("cp "+fullname);function processData(byteArray){function finish(byteArray){if(preFinish)preFinish();if(!dontCreateFile){FS.createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}if(onload)onload();removeRunDependency(dep)}var handled=false;Module["preloadPlugins"].forEach((function(plugin){if(handled)return;if(plugin["canHandle"](fullname)){plugin["handle"](byteArray,fullname,finish,(function(){if(onerror)onerror();removeRunDependency(dep)}));handled=true}}));if(!handled)finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){Browser.asyncLoad(url,(function(byteArray){processData(byteArray)}),onerror)}else{processData(url)}}),indexedDB:(function(){return window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB}),DB_NAME:(function(){return"EM_FS_"+window.location.pathname}),DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:(function(paths,onload,onerror){onload=onload||(function(){});onerror=onerror||(function(){});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=function openRequest_onupgradeneeded(){console.log("creating db");var db=openRequest.result;db.createObjectStore(FS.DB_STORE_NAME)};openRequest.onsuccess=function openRequest_onsuccess(){var db=openRequest.result;var transaction=db.transaction([FS.DB_STORE_NAME],"readwrite");var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach((function(path){var putRequest=files.put(FS.analyzePath(path).object.contents,path);putRequest.onsuccess=function putRequest_onsuccess(){ok++;if(ok+fail==total)finish()};putRequest.onerror=function putRequest_onerror(){fail++;if(ok+fail==total)finish()}}));transaction.onerror=onerror};openRequest.onerror=onerror}),loadFilesFromDB:(function(paths,onload,onerror){onload=onload||(function(){});onerror=onerror||(function(){});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=onerror;openRequest.onsuccess=function openRequest_onsuccess(){var db=openRequest.result;try{var transaction=db.transaction([FS.DB_STORE_NAME],"readonly")}catch(e){onerror(e);return}var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach((function(path){var getRequest=files.get(path);getRequest.onsuccess=function getRequest_onsuccess(){if(FS.analyzePath(path).exists){FS.unlink(path)}FS.createDataFile(PATH.dirname(path),PATH.basename(path),getRequest.result,true,true,true);ok++;if(ok+fail==total)finish()};getRequest.onerror=function getRequest_onerror(){fail++;if(ok+fail==total)finish()}}));transaction.onerror=onerror};openRequest.onerror=onerror})};var SYSCALLS={DEFAULT_POLLMASK:5,mappings:{},umask:511,calculateAt:(function(dirfd,path){if(path[0]!=="/"){var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=FS.getStream(dirfd);if(!dirstream)throw new FS.ErrnoError(ERRNO_CODES.EBADF);dir=dirstream.path}path=PATH.join2(dir,path)}return path}),doStat:(function(func,path,buf){try{var stat=func(path)}catch(e){if(e&&e.node&&PATH.normalize(path)!==PATH.normalize(FS.getPath(e.node))){return-ERRNO_CODES.ENOTDIR}throw e}HEAP32[buf>>2]=stat.dev;HEAP32[buf+4>>2]=0;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAP32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP32[buf+32>>2]=0;HEAP32[buf+36>>2]=stat.size;HEAP32[buf+40>>2]=4096;HEAP32[buf+44>>2]=stat.blocks;HEAP32[buf+48>>2]=stat.atime.getTime()/1e3|0;HEAP32[buf+52>>2]=0;HEAP32[buf+56>>2]=stat.mtime.getTime()/1e3|0;HEAP32[buf+60>>2]=0;HEAP32[buf+64>>2]=stat.ctime.getTime()/1e3|0;HEAP32[buf+68>>2]=0;HEAP32[buf+72>>2]=stat.ino;return 0}),doMsync:(function(addr,stream,len,flags){var buffer=new Uint8Array(HEAPU8.subarray(addr,addr+len));FS.msync(stream,buffer,0,len,flags)}),doMkdir:(function(path,mode){path=PATH.normalize(path);if(path[path.length-1]==="/")path=path.substr(0,path.length-1);FS.mkdir(path,mode,0);return 0}),doMknod:(function(path,mode,dev){switch(mode&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-ERRNO_CODES.EINVAL}FS.mknod(path,mode,dev);return 0}),doReadlink:(function(path,buf,bufsize){if(bufsize<=0)return-ERRNO_CODES.EINVAL;var ret=FS.readlink(path);var len=Math.min(bufsize,lengthBytesUTF8(ret));var endChar=HEAP8[buf+len];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len]=endChar;return len}),doAccess:(function(path,amode){if(amode&~7){return-ERRNO_CODES.EINVAL}var node;var lookup=FS.lookupPath(path,{follow:true});node=lookup.node;var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-ERRNO_CODES.EACCES}return 0}),doDup:(function(path,flags,suggestFD){var suggest=FS.getStream(suggestFD);if(suggest)FS.close(suggest);return FS.open(path,flags,0,suggestFD,suggestFD).fd}),doReadv:(function(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr<len)break}return ret}),doWritev:(function(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr}return ret}),varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),getStreamFromFD:(function(){var stream=FS.getStream(SYSCALLS.get());if(!stream)throw new FS.ErrnoError(ERRNO_CODES.EBADF);return stream}),getSocketFromFD:(function(){var socket=SOCKFS.getSocket(SYSCALLS.get());if(!socket)throw new FS.ErrnoError(ERRNO_CODES.EBADF);return socket}),getSocketAddress:(function(allowNull){var addrp=SYSCALLS.get(),addrlen=SYSCALLS.get();if(allowNull&&addrp===0)return null;var info=__read_sockaddr(addrp,addrlen);if(info.errno)throw new FS.ErrnoError(info.errno);info.addr=DNS.lookup_addr(info.addr)||info.addr;return info}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall10(which,varargs){SYSCALLS.varargs=varargs;try{var path=SYSCALLS.getStr();FS.unlink(path);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}var SOCKFS={mount:(function(mount){Module["websocket"]=Module["websocket"]&&"object"===typeof Module["websocket"]?Module["websocket"]:{};Module["websocket"]._callbacks={};Module["websocket"]["on"]=(function(event,callback){if("function"===typeof callback){this._callbacks[event]=callback}return this});Module["websocket"].emit=(function(event,param){if("function"===typeof this._callbacks[event]){this._callbacks[event].call(this,param)}});return FS.createNode(null,"/",16384|511,0)}),createSocket:(function(family,type,protocol){var streaming=type==1;if(protocol){assert(streaming==(protocol==6))}var sock={family:family,type:type,protocol:protocol,server:null,error:null,peers:{},pending:[],recv_queue:[],sock_ops:SOCKFS.websocket_sock_ops};var name=SOCKFS.nextname();var node=FS.createNode(SOCKFS.root,name,49152,0);node.sock=sock;var stream=FS.createStream({path:name,node:node,flags:FS.modeStringToFlags("r+"),seekable:false,stream_ops:SOCKFS.stream_ops});sock.stream=stream;return sock}),getSocket:(function(fd){var stream=FS.getStream(fd);if(!stream||!FS.isSocket(stream.node.mode)){return null}return stream.node.sock}),stream_ops:{poll:(function(stream){var sock=stream.node.sock;return sock.sock_ops.poll(sock)}),ioctl:(function(stream,request,varargs){var sock=stream.node.sock;return sock.sock_ops.ioctl(sock,request,varargs)}),read:(function(stream,buffer,offset,length,position){var sock=stream.node.sock;var msg=sock.sock_ops.recvmsg(sock,length);if(!msg){return 0}buffer.set(msg.buffer,offset);return msg.buffer.length}),write:(function(stream,buffer,offset,length,position){var sock=stream.node.sock;return sock.sock_ops.sendmsg(sock,buffer,offset,length)}),close:(function(stream){var sock=stream.node.sock;sock.sock_ops.close(sock)})},nextname:(function(){if(!SOCKFS.nextname.current){SOCKFS.nextname.current=0}return"socket["+SOCKFS.nextname.current++ +"]"}),websocket_sock_ops:{createPeer:(function(sock,addr,port){var ws;if(typeof addr==="object"){ws=addr;addr=null;port=null}if(ws){if(ws._socket){addr=ws._socket.remoteAddress;port=ws._socket.remotePort}else{var result=/ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url);if(!result){throw new Error("WebSocket URL must be in the format ws(s)://address:port")}addr=result[1];port=parseInt(result[2],10)}}else{try{var runtimeConfig=Module["websocket"]&&"object"===typeof Module["websocket"];var url="ws:#".replace("#","//");if(runtimeConfig){if("string"===typeof Module["websocket"]["url"]){url=Module["websocket"]["url"]}}if(url==="ws://"||url==="wss://"){var parts=addr.split("/");url=url+parts[0]+":"+port+"/"+parts.slice(1).join("/")}var subProtocols="binary";if(runtimeConfig){if("string"===typeof Module["websocket"]["subprotocol"]){subProtocols=Module["websocket"]["subprotocol"]}}subProtocols=subProtocols.replace(/^ +| +$/g,"").split(/ *, */);var opts=ENVIRONMENT_IS_NODE?{"protocol":subProtocols.toString()}:subProtocols;if(runtimeConfig&&null===Module["websocket"]["subprotocol"]){subProtocols="null";opts=undefined}var WebSocketConstructor;if(ENVIRONMENT_IS_NODE){WebSocketConstructor=require("ws")}else if(ENVIRONMENT_IS_WEB){WebSocketConstructor=window["WebSocket"]}else{WebSocketConstructor=WebSocket}ws=new WebSocketConstructor(url,opts);ws.binaryType="arraybuffer"}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EHOSTUNREACH)}}var peer={addr:addr,port:port,socket:ws,dgram_send_queue:[]};SOCKFS.websocket_sock_ops.addPeer(sock,peer);SOCKFS.websocket_sock_ops.handlePeerEvents(sock,peer);if(sock.type===2&&typeof sock.sport!=="undefined"){peer.dgram_send_queue.push(new Uint8Array([255,255,255,255,"p".charCodeAt(0),"o".charCodeAt(0),"r".charCodeAt(0),"t".charCodeAt(0),(sock.sport&65280)>>8,sock.sport&255]))}return peer}),getPeer:(function(sock,addr,port){return sock.peers[addr+":"+port]}),addPeer:(function(sock,peer){sock.peers[peer.addr+":"+peer.port]=peer}),removePeer:(function(sock,peer){delete sock.peers[peer.addr+":"+peer.port]}),handlePeerEvents:(function(sock,peer){var first=true;var handleOpen=(function(){Module["websocket"].emit("open",sock.stream.fd);try{var queued=peer.dgram_send_queue.shift();while(queued){peer.socket.send(queued);queued=peer.dgram_send_queue.shift()}}catch(e){peer.socket.close()}});function handleMessage(data){assert(typeof data!=="string"&&data.byteLength!==undefined);if(data.byteLength==0){return}data=new Uint8Array(data);var wasfirst=first;first=false;if(wasfirst&&data.length===10&&data[0]===255&&data[1]===255&&data[2]===255&&data[3]===255&&data[4]==="p".charCodeAt(0)&&data[5]==="o".charCodeAt(0)&&data[6]==="r".charCodeAt(0)&&data[7]==="t".charCodeAt(0)){var newport=data[8]<<8|data[9];SOCKFS.websocket_sock_ops.removePeer(sock,peer);peer.port=newport;SOCKFS.websocket_sock_ops.addPeer(sock,peer);return}sock.recv_queue.push({addr:peer.addr,port:peer.port,data:data});Module["websocket"].emit("message",sock.stream.fd)}if(ENVIRONMENT_IS_NODE){peer.socket.on("open",handleOpen);peer.socket.on("message",(function(data,flags){if(!flags.binary){return}handleMessage((new Uint8Array(data)).buffer)}));peer.socket.on("close",(function(){Module["websocket"].emit("close",sock.stream.fd)}));peer.socket.on("error",(function(error){sock.error=ERRNO_CODES.ECONNREFUSED;Module["websocket"].emit("error",[sock.stream.fd,sock.error,"ECONNREFUSED: Connection refused"])}))}else{peer.socket.onopen=handleOpen;peer.socket.onclose=(function(){Module["websocket"].emit("close",sock.stream.fd)});peer.socket.onmessage=function peer_socket_onmessage(event){handleMessage(event.data)};peer.socket.onerror=(function(error){sock.error=ERRNO_CODES.ECONNREFUSED;Module["websocket"].emit("error",[sock.stream.fd,sock.error,"ECONNREFUSED: Connection refused"])})}}),poll:(function(sock){if(sock.type===1&&sock.server){return sock.pending.length?64|1:0}var mask=0;var dest=sock.type===1?SOCKFS.websocket_sock_ops.getPeer(sock,sock.daddr,sock.dport):null;if(sock.recv_queue.length||!dest||dest&&dest.socket.readyState===dest.socket.CLOSING||dest&&dest.socket.readyState===dest.socket.CLOSED){mask|=64|1}if(!dest||dest&&dest.socket.readyState===dest.socket.OPEN){mask|=4}if(dest&&dest.socket.readyState===dest.socket.CLOSING||dest&&dest.socket.readyState===dest.socket.CLOSED){mask|=16}return mask}),ioctl:(function(sock,request,arg){switch(request){case 21531:var bytes=0;if(sock.recv_queue.length){bytes=sock.recv_queue[0].data.length}HEAP32[arg>>2]=bytes;return 0;default:return ERRNO_CODES.EINVAL}}),close:(function(sock){if(sock.server){try{sock.server.close()}catch(e){}sock.server=null}var peers=Object.keys(sock.peers);for(var i=0;i<peers.length;i++){var peer=sock.peers[peers[i]];try{peer.socket.close()}catch(e){}SOCKFS.websocket_sock_ops.removePeer(sock,peer)}return 0}),bind:(function(sock,addr,port){if(typeof sock.saddr!=="undefined"||typeof sock.sport!=="undefined"){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}sock.saddr=addr;sock.sport=port;if(sock.type===2){if(sock.server){sock.server.close();sock.server=null}try{sock.sock_ops.listen(sock,0)}catch(e){if(!(e instanceof FS.ErrnoError))throw e;if(e.errno!==ERRNO_CODES.EOPNOTSUPP)throw e}}}),connect:(function(sock,addr,port){if(sock.server){throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP)}if(typeof sock.daddr!=="undefined"&&typeof sock.dport!=="undefined"){var dest=SOCKFS.websocket_sock_ops.getPeer(sock,sock.daddr,sock.dport);if(dest){if(dest.socket.readyState===dest.socket.CONNECTING){throw new FS.ErrnoError(ERRNO_CODES.EALREADY)}else{throw new FS.ErrnoError(ERRNO_CODES.EISCONN)}}}var peer=SOCKFS.websocket_sock_ops.createPeer(sock,addr,port);sock.daddr=peer.addr;sock.dport=peer.port;throw new FS.ErrnoError(ERRNO_CODES.EINPROGRESS)}),listen:(function(sock,backlog){if(!ENVIRONMENT_IS_NODE){throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP)}if(sock.server){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var WebSocketServer=require("ws").Server;var host=sock.saddr;sock.server=new WebSocketServer({host:host,port:sock.sport});Module["websocket"].emit("listen",sock.stream.fd);sock.server.on("connection",(function(ws){if(sock.type===1){var newsock=SOCKFS.createSocket(sock.family,sock.type,sock.protocol);var peer=SOCKFS.websocket_sock_ops.createPeer(newsock,ws);newsock.daddr=peer.addr;newsock.dport=peer.port;sock.pending.push(newsock);Module["websocket"].emit("connection",newsock.stream.fd)}else{SOCKFS.websocket_sock_ops.createPeer(sock,ws);Module["websocket"].emit("connection",sock.stream.fd)}}));sock.server.on("closed",(function(){Module["websocket"].emit("close",sock.stream.fd);sock.server=null}));sock.server.on("error",(function(error){sock.error=ERRNO_CODES.EHOSTUNREACH;Module["websocket"].emit("error",[sock.stream.fd,sock.error,"EHOSTUNREACH: Host is unreachable"])}))}),accept:(function(listensock){if(!listensock.server){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var newsock=listensock.pending.shift();newsock.stream.flags=listensock.stream.flags;return newsock}),getname:(function(sock,peer){var addr,port;if(peer){if(sock.daddr===undefined||sock.dport===undefined){throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN)}addr=sock.daddr;port=sock.dport}else{addr=sock.saddr||0;port=sock.sport||0}return{addr:addr,port:port}}),sendmsg:(function(sock,buffer,offset,length,addr,port){if(sock.type===2){if(addr===undefined||port===undefined){addr=sock.daddr;port=sock.dport}if(addr===undefined||port===undefined){throw new FS.ErrnoError(ERRNO_CODES.EDESTADDRREQ)}}else{addr=sock.daddr;port=sock.dport}var dest=SOCKFS.websocket_sock_ops.getPeer(sock,addr,port);if(sock.type===1){if(!dest||dest.socket.readyState===dest.socket.CLOSING||dest.socket.readyState===dest.socket.CLOSED){throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN)}else if(dest.socket.readyState===dest.socket.CONNECTING){throw new FS.ErrnoError(ERRNO_CODES.EAGAIN)}}if(ArrayBuffer.isView(buffer)){offset+=buffer.byteOffset;buffer=buffer.buffer}var data;data=buffer.slice(offset,offset+length);if(sock.type===2){if(!dest||dest.socket.readyState!==dest.socket.OPEN){if(!dest||dest.socket.readyState===dest.socket.CLOSING||dest.socket.readyState===dest.socket.CLOSED){dest=SOCKFS.websocket_sock_ops.createPeer(sock,addr,port)}dest.dgram_send_queue.push(data);return length}}try{dest.socket.send(data);return length}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}}),recvmsg:(function(sock,length){if(sock.type===1&&sock.server){throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN)}var queued=sock.recv_queue.shift();if(!queued){if(sock.type===1){var dest=SOCKFS.websocket_sock_ops.getPeer(sock,sock.daddr,sock.dport);if(!dest){throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN)}else if(dest.socket.readyState===dest.socket.CLOSING||dest.socket.readyState===dest.socket.CLOSED){return null}else{throw new FS.ErrnoError(ERRNO_CODES.EAGAIN)}}else{throw new FS.ErrnoError(ERRNO_CODES.EAGAIN)}}var queuedLength=queued.data.byteLength||queued.data.length;var queuedOffset=queued.data.byteOffset||0;var queuedBuffer=queued.data.buffer||queued.data;var bytesRead=Math.min(length,queuedLength);var res={buffer:new Uint8Array(queuedBuffer,queuedOffset,bytesRead),addr:queued.addr,port:queued.port};if(sock.type===1&&bytesRead<queuedLength){var bytesRemaining=queuedLength-bytesRead;queued.data=new Uint8Array(queuedBuffer,queuedOffset+bytesRead,bytesRemaining);sock.recv_queue.unshift(queued)}return res})}};function __inet_pton4_raw(str){var b=str.split(".");for(var i=0;i<4;i++){var tmp=Number(b[i]);if(isNaN(tmp))return null;b[i]=tmp}return(b[0]|b[1]<<8|b[2]<<16|b[3]<<24)>>>0}function __inet_pton6_raw(str){var words;var w,offset,z;var valid6regx=/^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i;var parts=[];if(!valid6regx.test(str)){return null}if(str==="::"){return[0,0,0,0,0,0,0,0]}if(str.indexOf("::")===0){str=str.replace("::","Z:")}else{str=str.replace("::",":Z:")}if(str.indexOf(".")>0){str=str.replace(new RegExp("[.]","g"),":");words=str.split(":");words[words.length-4]=parseInt(words[words.length-4])+parseInt(words[words.length-3])*256;words[words.length-3]=parseInt(words[words.length-2])+parseInt(words[words.length-1])*256;words=words.slice(0,words.length-2)}else{words=str.split(":")}offset=0;z=0;for(w=0;w<words.length;w++){if(typeof words[w]==="string"){if(words[w]==="Z"){for(z=0;z<8-words.length+1;z++){parts[w+z]=0}offset=z-1}else{parts[w+offset]=_htons(parseInt(words[w],16))}}else{parts[w+offset]=words[w]}}return[parts[1]<<16|parts[0],parts[3]<<16|parts[2],parts[5]<<16|parts[4],parts[7]<<16|parts[6]]}var DNS={address_map:{id:1,addrs:{},names:{}},lookup_name:(function(name){var res=__inet_pton4_raw(name);if(res!==null){return name}res=__inet_pton6_raw(name);if(res!==null){return name}var addr;if(DNS.address_map.addrs[name]){addr=DNS.address_map.addrs[name]}else{var id=DNS.address_map.id++;assert(id<65535,"exceeded max address mappings of 65535");addr="172.29."+(id&255)+"."+(id&65280);DNS.address_map.names[addr]=name;DNS.address_map.addrs[name]=addr}return addr}),lookup_addr:(function(addr){if(DNS.address_map.names[addr]){return DNS.address_map.names[addr]}return null})};function __inet_ntop4_raw(addr){return(addr&255)+"."+(addr>>8&255)+"."+(addr>>16&255)+"."+(addr>>24&255)}function __inet_ntop6_raw(ints){var str="";var word=0;var longest=0;var lastzero=0;var zstart=0;var len=0;var i=0;var parts=[ints[0]&65535,ints[0]>>16,ints[1]&65535,ints[1]>>16,ints[2]&65535,ints[2]>>16,ints[3]&65535,ints[3]>>16];var hasipv4=true;var v4part="";for(i=0;i<5;i++){if(parts[i]!==0){hasipv4=false;break}}if(hasipv4){v4part=__inet_ntop4_raw(parts[6]|parts[7]<<16);if(parts[5]===-1){str="::ffff:";str+=v4part;return str}if(parts[5]===0){str="::";if(v4part==="0.0.0.0")v4part="";if(v4part==="0.0.0.1")v4part="1";str+=v4part;return str}}for(word=0;word<8;word++){if(parts[word]===0){if(word-lastzero>1){len=0}lastzero=word;len++}if(len>longest){longest=len;zstart=word-longest+1}}for(word=0;word<8;word++){if(longest>1){if(parts[word]===0&&word>=zstart&&word<zstart+longest){if(word===zstart){str+=":";if(zstart===0)str+=":"}continue}}str+=Number(_ntohs(parts[word]&65535)).toString(16);str+=word<7?":":""}return str}function __read_sockaddr(sa,salen){var family=HEAP16[sa>>1];var port=_ntohs(HEAP16[sa+2>>1]);var addr;switch(family){case 2:if(salen!==16){return{errno:ERRNO_CODES.EINVAL}}addr=HEAP32[sa+4>>2];addr=__inet_ntop4_raw(addr);break;case 10:if(salen!==28){return{errno:ERRNO_CODES.EINVAL}}addr=[HEAP32[sa+8>>2],HEAP32[sa+12>>2],HEAP32[sa+16>>2],HEAP32[sa+20>>2]];addr=__inet_ntop6_raw(addr);break;default:return{errno:ERRNO_CODES.EAFNOSUPPORT}}return{family:family,addr:addr,port:port}}function __write_sockaddr(sa,family,addr,port){switch(family){case 2:addr=__inet_pton4_raw(addr);HEAP16[sa>>1]=family;HEAP32[sa+4>>2]=addr;HEAP16[sa+2>>1]=_htons(port);break;case 10:addr=__inet_pton6_raw(addr);HEAP32[sa>>2]=family;HEAP32[sa+8>>2]=addr[0];HEAP32[sa+12>>2]=addr[1];HEAP32[sa+16>>2]=addr[2];HEAP32[sa+20>>2]=addr[3];HEAP16[sa+2>>1]=_htons(port);HEAP32[sa+4>>2]=0;HEAP32[sa+24>>2]=0;break;default:return{errno:ERRNO_CODES.EAFNOSUPPORT}}return{}}function ___syscall102(which,varargs){SYSCALLS.varargs=varargs;try{var call=SYSCALLS.get(),socketvararg=SYSCALLS.get();SYSCALLS.varargs=socketvararg;switch(call){case 1:{var domain=SYSCALLS.get(),type=SYSCALLS.get(),protocol=SYSCALLS.get();var sock=SOCKFS.createSocket(domain,type,protocol);assert(sock.stream.fd<64);return sock.stream.fd};case 2:{var sock=SYSCALLS.getSocketFromFD(),info=SYSCALLS.getSocketAddress();sock.sock_ops.bind(sock,info.addr,info.port);return 0};case 3:{var sock=SYSCALLS.getSocketFromFD(),info=SYSCALLS.getSocketAddress();sock.sock_ops.connect(sock,info.addr,info.port);return 0};case 4:{var sock=SYSCALLS.getSocketFromFD(),backlog=SYSCALLS.get();sock.sock_ops.listen(sock,backlog);return 0};case 5:{var sock=SYSCALLS.getSocketFromFD(),addr=SYSCALLS.get(),addrlen=SYSCALLS.get();var newsock=sock.sock_ops.accept(sock);if(addr){var res=__write_sockaddr(addr,newsock.family,DNS.lookup_name(newsock.daddr),newsock.dport);assert(!res.errno)}return newsock.stream.fd};case 6:{var sock=SYSCALLS.getSocketFromFD(),addr=SYSCALLS.get(),addrlen=SYSCALLS.get();var res=__write_sockaddr(addr,sock.family,DNS.lookup_name(sock.saddr||"0.0.0.0"),sock.sport);assert(!res.errno);return 0};case 7:{var sock=SYSCALLS.getSocketFromFD(),addr=SYSCALLS.get(),addrlen=SYSCALLS.get();if(!sock.daddr){return-ERRNO_CODES.ENOTCONN}var res=__write_sockaddr(addr,sock.family,DNS.lookup_name(sock.daddr),sock.dport);assert(!res.errno);return 0};case 11:{var sock=SYSCALLS.getSocketFromFD(),message=SYSCALLS.get(),length=SYSCALLS.get(),flags=SYSCALLS.get(),dest=SYSCALLS.getSocketAddress(true);if(!dest){return FS.write(sock.stream,HEAP8,message,length)}else{return sock.sock_ops.sendmsg(sock,HEAP8,message,length,dest.addr,dest.port)}};case 12:{var sock=SYSCALLS.getSocketFromFD(),buf=SYSCALLS.get(),len=SYSCALLS.get(),flags=SYSCALLS.get(),addr=SYSCALLS.get(),addrlen=SYSCALLS.get();var msg=sock.sock_ops.recvmsg(sock,len);if(!msg)return 0;if(addr){var res=__write_sockaddr(addr,sock.family,DNS.lookup_name(msg.addr),msg.port);assert(!res.errno)}HEAPU8.set(msg.buffer,buf);return msg.buffer.byteLength};case 14:{return-ERRNO_CODES.ENOPROTOOPT};case 15:{var sock=SYSCALLS.getSocketFromFD(),level=SYSCALLS.get(),optname=SYSCALLS.get(),optval=SYSCALLS.get(),optlen=SYSCALLS.get();if(level===1){if(optname===4){HEAP32[optval>>2]=sock.error;HEAP32[optlen>>2]=4;sock.error=null;return 0}}return-ERRNO_CODES.ENOPROTOOPT};case 16:{var sock=SYSCALLS.getSocketFromFD(),message=SYSCALLS.get(),flags=SYSCALLS.get();var iov=HEAP32[message+8>>2];var num=HEAP32[message+12>>2];var addr,port;var name=HEAP32[message>>2];var namelen=HEAP32[message+4>>2];if(name){var info=__read_sockaddr(name,namelen);if(info.errno)return-info.errno;port=info.port;addr=DNS.lookup_addr(info.addr)||info.addr}var total=0;for(var i=0;i<num;i++){total+=HEAP32[iov+(8*i+4)>>2]}var view=new Uint8Array(total);var offset=0;for(var i=0;i<num;i++){var iovbase=HEAP32[iov+(8*i+0)>>2];var iovlen=HEAP32[iov+(8*i+4)>>2];for(var j=0;j<iovlen;j++){view[offset++]=HEAP8[iovbase+j>>0]}}return sock.sock_ops.sendmsg(sock,view,0,total,addr,port)};case 17:{var sock=SYSCALLS.getSocketFromFD(),message=SYSCALLS.get(),flags=SYSCALLS.get();var iov=HEAP32[message+8>>2];var num=HEAP32[message+12>>2];var total=0;for(var i=0;i<num;i++){total+=HEAP32[iov+(8*i+4)>>2]}var msg=sock.sock_ops.recvmsg(sock,total);if(!msg)return 0;var name=HEAP32[message>>2];if(name){var res=__write_sockaddr(name,sock.family,DNS.lookup_name(msg.addr),msg.port);assert(!res.errno)}var bytesRead=0;var bytesRemaining=msg.buffer.byteLength;for(var i=0;bytesRemaining>0&&i<num;i++){var iovbase=HEAP32[iov+(8*i+0)>>2];var iovlen=HEAP32[iov+(8*i+4)>>2];if(!iovlen){continue}var length=Math.min(iovlen,bytesRemaining);var buf=msg.buffer.subarray(bytesRead,bytesRead+length);HEAPU8.set(buf,iovbase+bytesRead);bytesRead+=length;bytesRemaining-=length}return bytesRead};default:abort("unsupported socketcall syscall "+call)}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall118(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall12(which,varargs){SYSCALLS.varargs=varargs;try{var path=SYSCALLS.getStr();FS.chdir(path);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall122(which,varargs){SYSCALLS.varargs=varargs;try{var buf=SYSCALLS.get();if(!buf)return-ERRNO_CODES.EFAULT;var layout={"sysname":0,"nodename":65,"domainname":325,"machine":260,"version":195,"release":130,"__size__":390};function copyString(element,value){var offset=layout[element];writeAsciiToMemory(value,buf+offset)}copyString("sysname","Emscripten");copyString("nodename","emscripten");copyString("release","1.0");copyString("version","#1");copyString("machine","x86-JS");return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall125(which,varargs){SYSCALLS.varargs=varargs;try{return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall142(which,varargs){SYSCALLS.varargs=varargs;try{var nfds=SYSCALLS.get(),readfds=SYSCALLS.get(),writefds=SYSCALLS.get(),exceptfds=SYSCALLS.get(),timeout=SYSCALLS.get();assert(nfds<=64,"nfds must be less than or equal to 64");assert(!exceptfds,"exceptfds not supported");var total=0;var srcReadLow=readfds?HEAP32[readfds>>2]:0,srcReadHigh=readfds?HEAP32[readfds+4>>2]:0;var srcWriteLow=writefds?HEAP32[writefds>>2]:0,srcWriteHigh=writefds?HEAP32[writefds+4>>2]:0;var srcExceptLow=exceptfds?HEAP32[exceptfds>>2]:0,srcExceptHigh=exceptfds?HEAP32[exceptfds+4>>2]:0;var dstReadLow=0,dstReadHigh=0;var dstWriteLow=0,dstWriteHigh=0;var dstExceptLow=0,dstExceptHigh=0;var allLow=(readfds?HEAP32[readfds>>2]:0)|(writefds?HEAP32[writefds>>2]:0)|(exceptfds?HEAP32[exceptfds>>2]:0);var allHigh=(readfds?HEAP32[readfds+4>>2]:0)|(writefds?HEAP32[writefds+4>>2]:0)|(exceptfds?HEAP32[exceptfds+4>>2]:0);function check(fd,low,high,val){return fd<32?low&val:high&val}for(var fd=0;fd<nfds;fd++){var mask=1<<fd%32;if(!check(fd,allLow,allHigh,mask)){continue}var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(ERRNO_CODES.EBADF);var flags=SYSCALLS.DEFAULT_POLLMASK;if(stream.stream_ops.poll){flags=stream.stream_ops.poll(stream)}if(flags&1&&check(fd,srcReadLow,srcReadHigh,mask)){fd<32?dstReadLow=dstReadLow|mask:dstReadHigh=dstReadHigh|mask;total++}if(flags&4&&check(fd,srcWriteLow,srcWriteHigh,mask)){fd<32?dstWriteLow=dstWriteLow|mask:dstWriteHigh=dstWriteHigh|mask;total++}if(flags&2&&check(fd,srcExceptLow,srcExceptHigh,mask)){fd<32?dstExceptLow=dstExceptLow|mask:dstExceptHigh=dstExceptHigh|mask;total++}}if(readfds){HEAP32[readfds>>2]=dstReadLow;HEAP32[readfds+4>>2]=dstReadHigh}if(writefds){HEAP32[writefds>>2]=dstWriteLow;HEAP32[writefds+4>>2]=dstWriteHigh}if(exceptfds){HEAP32[exceptfds>>2]=dstExceptLow;HEAP32[exceptfds+4>>2]=dstExceptHigh}return total}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall144(which,varargs){SYSCALLS.varargs=varargs;try{var addr=SYSCALLS.get(),len=SYSCALLS.get(),flags=SYSCALLS.get();var info=SYSCALLS.mappings[addr];if(!info)return 0;SYSCALLS.doMsync(addr,FS.getStream(info.fd),len,info.flags);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall145(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();return SYSCALLS.doReadv(stream,iov,iovcnt)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();return SYSCALLS.doWritev(stream,iov,iovcnt)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall15(which,varargs){SYSCALLS.varargs=varargs;try{var path=SYSCALLS.getStr(),mode=SYSCALLS.get();FS.chmod(path,mode);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall153(which,varargs){SYSCALLS.varargs=varargs;try{return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall150(){return ___syscall153.apply(null,arguments)}function ___syscall151(){return ___syscall153.apply(null,arguments)}function ___syscall168(which,varargs){SYSCALLS.varargs=varargs;try{var fds=SYSCALLS.get(),nfds=SYSCALLS.get(),timeout=SYSCALLS.get();var nonzero=0;for(var i=0;i<nfds;i++){var pollfd=fds+8*i;var fd=HEAP32[pollfd>>2];var events=HEAP16[pollfd+4>>1];var mask=32;var stream=FS.getStream(fd);if(stream){mask=SYSCALLS.DEFAULT_POLLMASK;if(stream.stream_ops.poll){mask=stream.stream_ops.poll(stream)}}mask&=events|8|16;if(mask)nonzero++;HEAP16[pollfd+6>>1]=mask}return nonzero}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall183(which,varargs){SYSCALLS.varargs=varargs;try{var buf=SYSCALLS.get(),size=SYSCALLS.get();if(size===0)return-ERRNO_CODES.EINVAL;var cwd=FS.cwd();var cwdLengthInBytes=lengthBytesUTF8(cwd);if(size<cwdLengthInBytes+1)return-ERRNO_CODES.ERANGE;stringToUTF8(cwd,buf,size);return buf}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall191(which,varargs){SYSCALLS.varargs=varargs;try{var resource=SYSCALLS.get(),rlim=SYSCALLS.get();HEAP32[rlim>>2]=-1;HEAP32[rlim+4>>2]=-1;HEAP32[rlim+8>>2]=-1;HEAP32[rlim+12>>2]=-1;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall192(which,varargs){SYSCALLS.varargs=varargs;try{var addr=SYSCALLS.get(),len=SYSCALLS.get(),prot=SYSCALLS.get(),flags=SYSCALLS.get(),fd=SYSCALLS.get(),off=SYSCALLS.get();off<<=12;var ptr;var allocated=false;if(fd===-1){ptr=_memalign(PAGE_SIZE,len);if(!ptr)return-ERRNO_CODES.ENOMEM;_memset(ptr,0,len);allocated=true}else{var info=FS.getStream(fd);if(!info)return-ERRNO_CODES.EBADF;var res=FS.mmap(info,HEAPU8,addr,len,off,prot,flags);ptr=res.ptr;allocated=res.allocated}SYSCALLS.mappings[ptr]={malloc:ptr,len:len,allocated:allocated,fd:fd,flags:flags};return ptr}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall194(which,varargs){SYSCALLS.varargs=varargs;try{var fd=SYSCALLS.get(),zero=SYSCALLS.getZero(),length=SYSCALLS.get64();FS.ftruncate(fd,length);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall195(which,varargs){SYSCALLS.varargs=varargs;try{var path=SYSCALLS.getStr(),buf=SYSCALLS.get();return SYSCALLS.doStat(FS.stat,path,buf)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall196(which,varargs){SYSCALLS.varargs=varargs;try{var path=SYSCALLS.getStr(),buf=SYSCALLS.get();return SYSCALLS.doStat(FS.lstat,path,buf)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall197(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),buf=SYSCALLS.get();return SYSCALLS.doStat(FS.stat,stream.path,buf)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall202(which,varargs){SYSCALLS.varargs=varargs;try{return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall199(){return ___syscall202.apply(null,arguments)}var PROCINFO={ppid:1,pid:42,sid:42,pgid:42};function ___syscall20(which,varargs){SYSCALLS.varargs=varargs;try{return PROCINFO.pid}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall201(){return ___syscall202.apply(null,arguments)}function ___syscall211(which,varargs){SYSCALLS.varargs=varargs;try{var ruid=SYSCALLS.get(),euid=SYSCALLS.get(),suid=SYSCALLS.get();HEAP32[ruid>>2]=0;HEAP32[euid>>2]=0;HEAP32[suid>>2]=0;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall209(){return ___syscall211.apply(null,arguments)}function ___syscall219(which,varargs){SYSCALLS.varargs=varargs;try{return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall220(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),dirp=SYSCALLS.get(),count=SYSCALLS.get();if(!stream.getdents){stream.getdents=FS.readdir(stream.path)}var pos=0;while(stream.getdents.length>0&&pos+268<=count){var id;var type;var name=stream.getdents.pop();if(name[0]==="."){id=1;type=4}else{var child=FS.lookupNode(stream.node,name);id=child.id;type=FS.isChrdev(child.mode)?2:FS.isDir(child.mode)?4:FS.isLink(child.mode)?10:8}HEAP32[dirp+pos>>2]=id;HEAP32[dirp+pos+4>>2]=stream.position;HEAP16[dirp+pos+8>>1]=268;HEAP8[dirp+pos+10>>0]=type;stringToUTF8(name,dirp+pos+11,256);pos+=268}return pos}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall221(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),cmd=SYSCALLS.get();switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-ERRNO_CODES.EINVAL}var newStream;newStream=FS.open(stream.path,stream.flags,0,arg);return newStream.fd};case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0};case 12:case 12:{var arg=SYSCALLS.get();var offset=0;HEAP16[arg+offset>>1]=2;return 0};case 13:case 14:case 13:case 14:return 0;case 16:case 8:return-ERRNO_CODES.EINVAL;case 9:___setErrNo(ERRNO_CODES.EINVAL);return-1;default:{return-ERRNO_CODES.EINVAL}}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall268(which,varargs){SYSCALLS.varargs=varargs;try{var path=SYSCALLS.getStr(),size=SYSCALLS.get(),buf=SYSCALLS.get();assert(size===64);HEAP32[buf+4>>2]=4096;HEAP32[buf+40>>2]=4096;HEAP32[buf+8>>2]=1e6;HEAP32[buf+12>>2]=5e5;HEAP32[buf+16>>2]=5e5;HEAP32[buf+20>>2]=FS.nextInode;HEAP32[buf+24>>2]=1e6;HEAP32[buf+28>>2]=42;HEAP32[buf+44>>2]=2;HEAP32[buf+36>>2]=255;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall272(which,varargs){SYSCALLS.varargs=varargs;try{return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall3(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),buf=SYSCALLS.get(),count=SYSCALLS.get();return FS.read(stream,HEAP8,buf,count)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall320(which,varargs){SYSCALLS.varargs=varargs;try{var dirfd=SYSCALLS.get(),path=SYSCALLS.getStr(),times=SYSCALLS.get(),flags=SYSCALLS.get();assert(flags===0);path=SYSCALLS.calculateAt(dirfd,path);var seconds=HEAP32[times>>2];var nanoseconds=HEAP32[times+4>>2];var atime=seconds*1e3+nanoseconds/(1e3*1e3);times+=8;seconds=HEAP32[times>>2];nanoseconds=HEAP32[times+4>>2];var mtime=seconds*1e3+nanoseconds/(1e3*1e3);FS.utime(path,atime,mtime);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall33(which,varargs){SYSCALLS.varargs=varargs;try{var path=SYSCALLS.getStr(),amode=SYSCALLS.get();return SYSCALLS.doAccess(path,amode)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall331(which,varargs){SYSCALLS.varargs=varargs;try{return-ERRNO_CODES.ENOSYS}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall340(which,varargs){SYSCALLS.varargs=varargs;try{var pid=SYSCALLS.get(),resource=SYSCALLS.get(),new_limit=SYSCALLS.get(),old_limit=SYSCALLS.get();if(old_limit){HEAP32[old_limit>>2]=-1;HEAP32[old_limit+4>>2]=-1;HEAP32[old_limit+8>>2]=-1;HEAP32[old_limit+12>>2]=-1}return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall36(which,varargs){SYSCALLS.varargs=varargs;try{return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall38(which,varargs){SYSCALLS.varargs=varargs;try{var old_path=SYSCALLS.getStr(),new_path=SYSCALLS.getStr();FS.rename(old_path,new_path);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall39(which,varargs){SYSCALLS.varargs=varargs;try{var path=SYSCALLS.getStr(),mode=SYSCALLS.get();return SYSCALLS.doMkdir(path,mode)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall4(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),buf=SYSCALLS.get(),count=SYSCALLS.get();return FS.write(stream,HEAP8,buf,count)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall40(which,varargs){SYSCALLS.varargs=varargs;try{var path=SYSCALLS.getStr();FS.rmdir(path);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall41(which,varargs){SYSCALLS.varargs=varargs;try{var old=SYSCALLS.getStreamFromFD();return FS.open(old.path,old.flags,0).fd}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}var PIPEFS={BUCKET_BUFFER_SIZE:8192,mount:(function(mount){return FS.createNode(null,"/",16384|511,0)}),createPipe:(function(){var pipe={buckets:[]};pipe.buckets.push({buffer:new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE),offset:0,roffset:0});var rName=PIPEFS.nextname();var wName=PIPEFS.nextname();var rNode=FS.createNode(PIPEFS.root,rName,4096,0);var wNode=FS.createNode(PIPEFS.root,wName,4096,0);rNode.pipe=pipe;wNode.pipe=pipe;var readableStream=FS.createStream({path:rName,node:rNode,flags:FS.modeStringToFlags("r"),seekable:false,stream_ops:PIPEFS.stream_ops});rNode.stream=readableStream;var writableStream=FS.createStream({path:wName,node:wNode,flags:FS.modeStringToFlags("w"),seekable:false,stream_ops:PIPEFS.stream_ops});wNode.stream=writableStream;return{readable_fd:readableStream.fd,writable_fd:writableStream.fd}}),stream_ops:{poll:(function(stream){var pipe=stream.node.pipe;if((stream.flags&2097155)===1){return 256|4}else{if(pipe.buckets.length>0){for(var i=0;i<pipe.buckets.length;i++){var bucket=pipe.buckets[i];if(bucket.offset-bucket.roffset>0){return 64|1}}}}return 0}),ioctl:(function(stream,request,varargs){return ERRNO_CODES.EINVAL}),read:(function(stream,buffer,offset,length,position){var pipe=stream.node.pipe;var currentLength=0;for(var i=0;i<pipe.buckets.length;i++){var bucket=pipe.buckets[i];currentLength+=bucket.offset-bucket.roffset}assert(buffer instanceof ArrayBuffer||ArrayBuffer.isView(buffer));var data=buffer.subarray(offset,offset+length);if(length<=0){return 0}if(currentLength==0){throw new FS.ErrnoError(ERRNO_CODES.EAGAIN)}var toRead=Math.min(currentLength,length);var totalRead=toRead;var toRemove=0;for(var i=0;i<pipe.buckets.length;i++){var currBucket=pipe.buckets[i];var bucketSize=currBucket.offset-currBucket.roffset;if(toRead<=bucketSize){var tmpSlice=currBucket.buffer.subarray(currBucket.roffset,currBucket.offset);if(toRead<bucketSize){tmpSlice=tmpSlice.subarray(0,toRead);currBucket.roffset+=toRead}else{toRemove++}data.set(tmpSlice);break}else{var tmpSlice=currBucket.buffer.subarray(currBucket.roffset,currBucket.offset);data.set(tmpSlice);data=data.subarray(tmpSlice.byteLength);toRead-=tmpSlice.byteLength;toRemove++}}if(toRemove&&toRemove==pipe.buckets.length){toRemove--;pipe.buckets[toRemove].offset=0;pipe.buckets[toRemove].roffset=0}pipe.buckets.splice(0,toRemove);return totalRead}),write:(function(stream,buffer,offset,length,position){var pipe=stream.node.pipe;assert(buffer instanceof ArrayBuffer||ArrayBuffer.isView(buffer));var data=buffer.subarray(offset,offset+length);var dataLen=data.byteLength;if(dataLen<=0){return 0}var currBucket=null;if(pipe.buckets.length==0){currBucket={buffer:new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE),offset:0,roffset:0};pipe.buckets.push(currBucket)}else{currBucket=pipe.buckets[pipe.buckets.length-1]}assert(currBucket.offset<=PIPEFS.BUCKET_BUFFER_SIZE);var freeBytesInCurrBuffer=PIPEFS.BUCKET_BUFFER_SIZE-currBucket.offset;if(freeBytesInCurrBuffer>=dataLen){currBucket.buffer.set(data,currBucket.offset);currBucket.offset+=dataLen;return dataLen}else if(freeBytesInCurrBuffer>0){currBucket.buffer.set(data.subarray(0,freeBytesInCurrBuffer),currBucket.offset);currBucket.offset+=freeBytesInCurrBuffer;data=data.subarray(freeBytesInCurrBuffer,data.byteLength)}var numBuckets=data.byteLength/PIPEFS.BUCKET_BUFFER_SIZE|0;var remElements=data.byteLength%PIPEFS.BUCKET_BUFFER_SIZE;for(var i=0;i<numBuckets;i++){var newBucket={buffer:new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE),offset:PIPEFS.BUCKET_BUFFER_SIZE,roffset:0};pipe.buckets.push(newBucket);newBucket.buffer.set(data.subarray(0,PIPEFS.BUCKET_BUFFER_SIZE));data=data.subarray(PIPEFS.BUCKET_BUFFER_SIZE,data.byteLength)}if(remElements>0){var newBucket={buffer:new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE),offset:data.byteLength,roffset:0};pipe.buckets.push(newBucket);newBucket.buffer.set(data)}return dataLen}),close:(function(stream){var pipe=stream.node.pipe;pipe.buckets=null})},nextname:(function(){if(!PIPEFS.nextname.current){PIPEFS.nextname.current=0}return"pipe["+PIPEFS.nextname.current++ +"]"})};function ___syscall42(which,varargs){SYSCALLS.varargs=varargs;try{var fdPtr=SYSCALLS.get();if(fdPtr==0){throw new FS.ErrnoError(ERRNO_CODES.EFAULT)}var res=PIPEFS.createPipe();HEAP32[fdPtr>>2]=res.readable_fd;HEAP32[fdPtr+4>>2]=res.writable_fd;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall5(which,varargs){SYSCALLS.varargs=varargs;try{var pathname=SYSCALLS.getStr(),flags=SYSCALLS.get(),mode=SYSCALLS.get();var stream=FS.open(pathname,flags,mode);return stream.fd}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),op=SYSCALLS.get();switch(op){case 21509:case 21505:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};case 21519:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0};case 21520:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return-ERRNO_CODES.EINVAL};case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)};case 21523:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};case 21524:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};default:abort("bad ioctl syscall "+op)}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();FS.close(stream);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall63(which,varargs){SYSCALLS.varargs=varargs;try{var old=SYSCALLS.getStreamFromFD(),suggestFD=SYSCALLS.get();if(old.fd===suggestFD)return suggestFD;return SYSCALLS.doDup(old.path,old.flags,suggestFD)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall77(which,varargs){SYSCALLS.varargs=varargs;try{var who=SYSCALLS.get(),usage=SYSCALLS.get();_memset(usage,0,136);HEAP32[usage>>2]=1;HEAP32[usage+4>>2]=2;HEAP32[usage+8>>2]=3;HEAP32[usage+12>>2]=4;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall85(which,varargs){SYSCALLS.varargs=varargs;try{var path=SYSCALLS.getStr(),buf=SYSCALLS.get(),bufsize=SYSCALLS.get();return SYSCALLS.doReadlink(path,buf,bufsize)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall9(which,varargs){SYSCALLS.varargs=varargs;try{var oldpath=SYSCALLS.get(),newpath=SYSCALLS.get();return-ERRNO_CODES.EMLINK}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall91(which,varargs){SYSCALLS.varargs=varargs;try{var addr=SYSCALLS.get(),len=SYSCALLS.get();var info=SYSCALLS.mappings[addr];if(!info)return 0;if(len===info.len){var stream=FS.getStream(info.fd);SYSCALLS.doMsync(addr,stream,len,info.flags);FS.munmap(stream);SYSCALLS.mappings[addr]=null;if(info.allocated){_free(info.malloc)}}return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall94(which,varargs){SYSCALLS.varargs=varargs;try{var fd=SYSCALLS.get(),mode=SYSCALLS.get();FS.fchmod(fd,mode);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall96(which,varargs){SYSCALLS.varargs=varargs;try{return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall97(which,varargs){SYSCALLS.varargs=varargs;try{return-ERRNO_CODES.EPERM}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___unlock(){}function __exit(status){exit(status)}function _abort(){Module["abort"]()}function _atexit(func,arg){__ATEXIT__.unshift({func:func,arg:arg})}function _emscripten_get_now_res(){if(ENVIRONMENT_IS_NODE){return 1}else if(typeof dateNow!=="undefined"||(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&self["performance"]&&self["performance"]["now"]){return 1e3}else{return 1e3*1e3}}function _clock_getres(clk_id,res){var nsec;if(clk_id===0){nsec=1e3*1e3}else if(clk_id===1&&_emscripten_get_now_is_monotonic()){nsec=_emscripten_get_now_res()}else{___setErrNo(ERRNO_CODES.EINVAL);return-1}HEAP32[res>>2]=nsec/1e9|0;HEAP32[res+4>>2]=nsec;return 0}function _execl(){___setErrNo(ERRNO_CODES.ENOEXEC);return-1}function _execve(){return _execl.apply(null,arguments)}function _exit(status){__exit(status)}function _flock(fd,operation){return 0}function _fork(){___setErrNo(ERRNO_CODES.EAGAIN);return-1}function _getaddrinfo(node,service,hint,out){var addr=0;var port=0;var flags=0;var family=0;var type=0;var proto=0;var ai;function allocaddrinfo(family,type,proto,canon,addr,port){var sa,salen,ai;var res;salen=family===10?28:16;addr=family===10?__inet_ntop6_raw(addr):__inet_ntop4_raw(addr);sa=_malloc(salen);res=__write_sockaddr(sa,family,addr,port);assert(!res.errno);ai=_malloc(32);HEAP32[ai+4>>2]=family;HEAP32[ai+8>>2]=type;HEAP32[ai+12>>2]=proto;HEAP32[ai+24>>2]=canon;HEAP32[ai+20>>2]=sa;if(family===10){HEAP32[ai+16>>2]=28}else{HEAP32[ai+16>>2]=16}HEAP32[ai+28>>2]=0;return ai}if(hint){flags=HEAP32[hint>>2];family=HEAP32[hint+4>>2];type=HEAP32[hint+8>>2];proto=HEAP32[hint+12>>2]}if(type&&!proto){proto=type===2?17:6}if(!type&&proto){type=proto===17?2:1}if(proto===0){proto=6}if(type===0){type=1}if(!node&&!service){return-2}if(flags&~(1|2|4|1024|8|16|32)){return-1}if(hint!==0&&HEAP32[hint>>2]&2&&!node){return-1}if(flags&32){return-2}if(type!==0&&type!==1&&type!==2){return-7}if(family!==0&&family!==2&&family!==10){return-6}if(service){service=Pointer_stringify(service);port=parseInt(service,10);if(isNaN(port)){if(flags&1024){return-2}return-8}}if(!node){if(family===0){family=2}if((flags&1)===0){if(family===2){addr=_htonl(2130706433)}else{addr=[0,0,0,1]}}ai=allocaddrinfo(family,type,proto,null,addr,port);HEAP32[out>>2]=ai;return 0}node=Pointer_stringify(node);addr=__inet_pton4_raw(node);if(addr!==null){if(family===0||family===2){family=2}else if(family===10&&flags&8){addr=[0,0,_htonl(65535),addr];family=10}else{return-2}}else{addr=__inet_pton6_raw(node);if(addr!==null){if(family===0||family===10){family=10}else{return-2}}}if(addr!=null){ai=allocaddrinfo(family,type,proto,node,addr,port);HEAP32[out>>2]=ai;return 0}if(flags&4){return-2}node=DNS.lookup_name(node);addr=__inet_pton4_raw(node);if(family===0){family=2}else if(family===10){addr=[0,0,_htonl(65535),addr]}ai=allocaddrinfo(family,type,proto,null,addr,port);HEAP32[out>>2]=ai;return 0}function _getenv(name){if(name===0)return 0;name=Pointer_stringify(name);if(!ENV.hasOwnProperty(name))return 0;if(_getenv.ret)_free(_getenv.ret);_getenv.ret=allocateUTF8(ENV[name]);return _getenv.ret}function _getnameinfo(sa,salen,node,nodelen,serv,servlen,flags){var info=__read_sockaddr(sa,salen);if(info.errno){return-6}var port=info.port;var addr=info.addr;var overflowed=false;if(node&&nodelen){var lookup;if(flags&1||!(lookup=DNS.lookup_addr(addr))){if(flags&8){return-2}}else{addr=lookup}var numBytesWrittenExclNull=stringToUTF8(addr,node,nodelen);if(numBytesWrittenExclNull+1>=nodelen){overflowed=true}}if(serv&&servlen){port=""+port;var numBytesWrittenExclNull=stringToUTF8(port,serv,servlen);if(numBytesWrittenExclNull+1>=servlen){overflowed=true}}if(overflowed){return-12}return 0}var Protocols={list:[],map:{}};function _setprotoent(stayopen){function allocprotoent(name,proto,aliases){var nameBuf=_malloc(name.length+1);writeAsciiToMemory(name,nameBuf);var j=0;var length=aliases.length;var aliasListBuf=_malloc((length+1)*4);for(var i=0;i<length;i++,j+=4){var alias=aliases[i];var aliasBuf=_malloc(alias.length+1);writeAsciiToMemory(alias,aliasBuf);HEAP32[aliasListBuf+j>>2]=aliasBuf}HEAP32[aliasListBuf+j>>2]=0;var pe=_malloc(12);HEAP32[pe>>2]=nameBuf;HEAP32[pe+4>>2]=aliasListBuf;HEAP32[pe+8>>2]=proto;return pe}var list=Protocols.list;var map=Protocols.map;if(list.length===0){var entry=allocprotoent("tcp",6,["TCP"]);list.push(entry);map["tcp"]=map["6"]=entry;entry=allocprotoent("udp",17,["UDP"]);list.push(entry);map["udp"]=map["17"]=entry}_setprotoent.index=0}function _getprotobyname(name){name=Pointer_stringify(name);_setprotoent(true);var result=Protocols.map[name];return result}function _getpwuid(uid){return 0}function _gettimeofday(ptr){var now=Date.now();HEAP32[ptr>>2]=now/1e3|0;HEAP32[ptr+4>>2]=now%1e3*1e3|0;return 0}var ___tm_timezone=allocate(intArrayFromString("GMT"),"i8",ALLOC_STATIC);function _gmtime_r(time,tmPtr){var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getUTCSeconds();HEAP32[tmPtr+4>>2]=date.getUTCMinutes();HEAP32[tmPtr+8>>2]=date.getUTCHours();HEAP32[tmPtr+12>>2]=date.getUTCDate();HEAP32[tmPtr+16>>2]=date.getUTCMonth();HEAP32[tmPtr+20>>2]=date.getUTCFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getUTCDay();HEAP32[tmPtr+36>>2]=0;HEAP32[tmPtr+32>>2]=0;var start=Date.UTC(date.getUTCFullYear(),0,1,0,0,0,0);var yday=(date.getTime()-start)/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+40>>2]=___tm_timezone;return tmPtr}function _kill(pid,sig){___setErrNo(ERRNO_CODES.EPERM);return-1}function _llvm_log10_f32(x){return Math.log(x)/Math.LN10}function _llvm_log10_f64(){return _llvm_log10_f32.apply(null,arguments)}function _llvm_trap(){abort("trap!")}var _llvm_trunc_f32=Math_trunc;var _llvm_trunc_f64=Math_trunc;function _tzset(){if(_tzset.called)return;_tzset.called=true;HEAP32[__get_timezone()>>2]=(new Date).getTimezoneOffset()*60;var winter=new Date(2e3,0,1);var summer=new Date(2e3,6,1);HEAP32[__get_daylight()>>2]=Number(winter.getTimezoneOffset()!=summer.getTimezoneOffset());function extractZone(date){var match=date.toTimeString().match(/\(([A-Za-z ]+)\)$/);return match?match[1]:"GMT"}var winterName=extractZone(winter);var summerName=extractZone(summer);var winterNamePtr=allocate(intArrayFromString(winterName),"i8",ALLOC_NORMAL);var summerNamePtr=allocate(intArrayFromString(summerName),"i8",ALLOC_NORMAL);if(summer.getTimezoneOffset()<winter.getTimezoneOffset()){HEAP32[__get_tzname()>>2]=winterNamePtr;HEAP32[__get_tzname()+4>>2]=summerNamePtr}else{HEAP32[__get_tzname()>>2]=summerNamePtr;HEAP32[__get_tzname()+4>>2]=winterNamePtr}}function _localtime_r(time,tmPtr){_tzset();var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var start=new Date(date.getFullYear(),0,1);var yday=(date.getTime()-start.getTime())/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var summerOffset=(new Date(2e3,6,1)).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>2]=dst;var zonePtr=HEAP32[__get_tzname()+(dst?4:0)>>2];HEAP32[tmPtr+40>>2]=zonePtr;return tmPtr}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}var MONO={pump_count:0,timeout_queue:[],mono_wasm_runtime_is_ready:false,pump_message:(function(){if(!this.mono_background_exec)this.mono_background_exec=Module.cwrap("mono_background_exec","void",[]);while(MONO.timeout_queue.length>0){--MONO.pump_count;MONO.timeout_queue.shift()()}while(MONO.pump_count>0){--MONO.pump_count;this.mono_background_exec()}}),mono_wasm_get_call_stack:(function(){if(!this.mono_wasm_current_bp_id)this.mono_wasm_current_bp_id=Module.cwrap("mono_wasm_current_bp_id","number",[]);if(!this.mono_wasm_enum_frames)this.mono_wasm_enum_frames=Module.cwrap("mono_wasm_enum_frames","void",[]);var bp_id=this.mono_wasm_current_bp_id();this.active_frames=[];this.mono_wasm_enum_frames();var the_frames=this.active_frames;this.active_frames=[];return{"breakpoint_id":bp_id,"frames":the_frames}}),mono_wasm_get_variables:(function(scope,var_list){if(!this.mono_wasm_get_var_info)this.mono_wasm_get_var_info=Module.cwrap("mono_wasm_get_var_info","void",["number","number"]);this.var_info=[];for(var i=0;i<var_list.length;++i)this.mono_wasm_get_var_info(scope,var_list[i]);var res=this.var_info;this.var_info=[];return res}),mono_wasm_start_single_stepping:(function(kind){console.log(">> mono_wasm_start_single_stepping "+kind);if(!this.mono_wasm_setup_single_step)this.mono_wasm_setup_single_step=Module.cwrap("mono_wasm_setup_single_step","void",["number"]);this.mono_wasm_setup_single_step(kind)}),mono_wasm_runtime_ready:(function(){console.log(">>mono_wasm_runtime_ready");this.mono_wasm_runtime_is_ready=true;debugger}),mono_wasm_set_breakpoint:(function(assembly,method_token,il_offset){if(!this.mono_wasm_set_bp)this.mono_wasm_set_bp=Module.cwrap("mono_wasm_set_breakpoint","number",["string","number","number"]);return this.mono_wasm_set_bp(assembly,method_token,il_offset)}),mono_wasm_remove_breakpoint:(function(breakpoint_id){if(!this.mono_wasm_del_bp)this.mono_wasm_del_bp=Module.cwrap("mono_wasm_remove_breakpoint","number",["number"]);return this.mono_wasm_del_bp(breakpoint_id)}),mono_wasm_setenv:(function(name,value){if(!this.wasm_setenv)this.wasm_setenv=Module.cwrap("mono_wasm_setenv","void",["string","string"]);this.wasm_setenv(name,value)}),mono_load_runtime_and_bcl:(function(vfs_prefix,deploy_prefix,enable_debugging,file_list,loaded_cb,fetch_file_cb){var pending=file_list.length;var loaded_files=[];var mono_wasm_add_assembly=Module.cwrap("mono_wasm_add_assembly",null,["string","number","number"]);if(!fetch_file_cb){if(ENVIRONMENT_IS_NODE){var fs=require("fs");fetch_file_cb=(function(asset){console.log("Loading... "+asset);var binary=fs.readFileSync(asset);var resolve_func2=(function(resolve,reject){resolve(new Uint8Array(binary))});var resolve_func1=(function(resolve,reject){var response={ok:true,url:asset,arrayBuffer:(function(){return new Promise(resolve_func2)})};resolve(response)});return new Promise(resolve_func1)})}else{fetch_file_cb=(function(asset){return fetch(asset,{credentials:"same-origin"})})}}file_list.forEach((function(file_name){var fetch_promise=fetch_file_cb(locateFile(deploy_prefix+"/"+file_name));fetch_promise.then((function(response){if(!response.ok)throw"failed to load '"+file_name+"'";loaded_files.push(response.url);return response["arrayBuffer"]()})).then((function(blob){var asm=new Uint8Array(blob);var memory=Module._malloc(asm.length);var heapBytes=new Uint8Array(Module.HEAPU8.buffer,memory,asm.length);heapBytes.set(asm);mono_wasm_add_assembly(file_name,memory,asm.length);console.log("Loaded: "+file_name);--pending;if(pending==0){MONO.loaded_files=loaded_files;var load_runtime=Module.cwrap("mono_wasm_load_runtime",null,["string","number"]);console.log("initializing mono runtime");if(ENVIRONMENT_IS_SHELL){try{load_runtime(vfs_prefix,enable_debugging)}catch(ex){print("load_runtime () failed: "+ex);var err=new Error;print("Stacktrace: \n");print(err.stack);var wasm_exit=Module.cwrap("mono_wasm_exit","void",["number"]);wasm_exit(1)}}else{load_runtime(vfs_prefix,enable_debugging)}MONO.mono_wasm_runtime_ready();loaded_cb()}}))}))}),mono_wasm_get_loaded_files:(function(){console.log(">>>mono_wasm_get_loaded_files");return this.loaded_files}),mono_wasm_clear_all_breakpoints:(function(){if(this.mono_clear_bps)this.mono_clear_bps=Module.cwrap("mono_wasm_clear_all_breakpoints","void",[]);this.mono_clear_bps()})};function _mono_set_timeout(timeout,id){if(!this.mono_set_timeout_exec)this.mono_set_timeout_exec=Module.cwrap("mono_set_timeout_exec","void",["number"]);if(ENVIRONMENT_IS_WEB){window.setTimeout((function(){this.mono_set_timeout_exec(id)}),timeout)}else{++MONO.pump_count;MONO.timeout_queue.push((function(){this.mono_set_timeout_exec(id)}))}}function _mono_wasm_add_bool_var(var_value){MONO.var_info.push({value:{type:"boolean",value:var_value!=0}})}function _mono_wasm_add_float_var(var_value){MONO.var_info.push({value:{type:"number",value:var_value}})}function _mono_wasm_add_frame(il,method,name){MONO.active_frames.push({il_pos:il,method_token:method,assembly_name:Module.UTF8ToString(name)})}function _mono_wasm_add_int_var(var_value){MONO.var_info.push({value:{type:"number",value:var_value}})}function _mono_wasm_add_long_var(var_value){MONO.var_info.push({value:{type:"number",value:var_value}})}function _mono_wasm_add_string_var(var_value){if(var_value==0){MONO.var_info.push({value:{type:"object",subtype:"null"}})}else{MONO.var_info.push({value:{type:"string",value:Module.UTF8ToString(var_value)}})}}function _mono_wasm_fire_bp(){console.log("mono_wasm_fire_bp");debugger}var BINDING={BINDING_ASM:"[binding_tests]WebAssembly.Runtime",mono_wasm_object_registry:[],mono_wasm_ref_counter:0,mono_wasm_free_list:[],mono_wasm_marshal_enum_as_int:false,mono_bindings_init:(function(binding_asm){this.BINDING_ASM=binding_asm}),export_functions:(function(module){module["mono_bindings_init"]=BINDING.mono_bindings_init.bind(BINDING);module["mono_method_invoke"]=BINDING.call_method.bind(BINDING);module["mono_method_get_call_signature"]=BINDING.mono_method_get_call_signature.bind(BINDING);module["mono_method_resolve"]=BINDING.resolve_method_fqn.bind(BINDING);module["mono_bind_static_method"]=BINDING.bind_static_method.bind(BINDING);module["mono_call_static_method"]=BINDING.call_static_method.bind(BINDING)}),bindings_lazy_init:(function(){if(this.init)return;this.assembly_load=Module.cwrap("mono_wasm_assembly_load","number",["string"]);this.find_class=Module.cwrap("mono_wasm_assembly_find_class","number",["number","string","string"]);this.find_method=Module.cwrap("mono_wasm_assembly_find_method","number",["number","string","number"]);this.invoke_method=Module.cwrap("mono_wasm_invoke_method","number",["number","number","number","number"]);this.mono_string_get_utf8=Module.cwrap("mono_wasm_string_get_utf8","number",["number"]);this.js_string_to_mono_string=Module.cwrap("mono_wasm_string_from_js","number",["string"]);this.mono_get_obj_type=Module.cwrap("mono_wasm_get_obj_type","number",["number"]);this.mono_unbox_int=Module.cwrap("mono_unbox_int","number",["number"]);this.mono_unbox_float=Module.cwrap("mono_wasm_unbox_float","number",["number"]);this.mono_array_length=Module.cwrap("mono_wasm_array_length","number",["number"]);this.mono_array_get=Module.cwrap("mono_wasm_array_get","number",["number","number"]);this.mono_obj_array_new=Module.cwrap("mono_wasm_obj_array_new","number",["number"]);this.mono_obj_array_set=Module.cwrap("mono_wasm_obj_array_set","void",["number","number","number"]);this.mono_unbox_enum=Module.cwrap("mono_wasm_unbox_enum","number",["number"]);this.mono_typed_array_new=Module.cwrap("mono_wasm_typed_array_new","number",["number","number","number","number"]);this.mono_array_to_heap=Module.cwrap("mono_wasm_array_to_heap","void",["number","number"]);var binding_fqn_asm=this.BINDING_ASM.substring(this.BINDING_ASM.indexOf("[")+1,this.BINDING_ASM.indexOf("]")).trim();var binding_fqn_class=this.BINDING_ASM.substring(this.BINDING_ASM.indexOf("]")+1).trim();this.binding_module=this.assembly_load(binding_fqn_asm);if(!this.binding_module)throw"Can't find bindings module assembly: "+binding_fqn_asm;if(binding_fqn_class!==null&&typeof binding_fqn_class!=="undefined"){var namespace="WebAssembly";var classname=binding_fqn_class.length>0?binding_fqn_class:"Runtime";if(binding_fqn_class.indexOf(".")!=-1){var idx=binding_fqn_class.lastIndexOf(".");namespace=binding_fqn_class.substring(0,idx);classname=binding_fqn_class.substring(idx+1)}}var wasm_runtime_class=this.find_class(this.binding_module,namespace,classname);if(!wasm_runtime_class)throw"Can't find "+binding_fqn_class+" class";var get_method=(function(method_name){var res=BINDING.find_method(wasm_runtime_class,method_name,-1);if(!res)throw"Can't find method "+namespace+"."+classname+":"+method_name;return res});this.bind_js_obj=get_method("BindJSObject");this.bind_existing_obj=get_method("BindExistingObject");this.unbind_js_obj=get_method("UnBindJSObject");this.unbind_js_obj_and_free=get_method("UnBindJSObjectAndFree");this.unbind_raw_obj_and_free=get_method("UnBindRawJSObjectAndFree");this.get_js_id=get_method("GetJSObjectId");this.get_raw_mono_obj=get_method("GetMonoObject");this.box_js_int=get_method("BoxInt");this.box_js_double=get_method("BoxDouble");this.box_js_bool=get_method("BoxBool");this.setup_js_cont=get_method("SetupJSContinuation");this.create_tcs=get_method("CreateTaskSource");this.set_tcs_result=get_method("SetTaskSourceResult");this.set_tcs_failure=get_method("SetTaskSourceFailure");this.tcs_get_task_and_bind=get_method("GetTaskAndBind");this.get_call_sig=get_method("GetCallSignature");this.object_to_string=get_method("ObjectToString");this.object_to_enum=get_method("ObjectToEnum");this.init=true}),get_js_obj:(function(js_handle){if(js_handle>0)return this.mono_wasm_require_handle(js_handle);return null}),conv_string:(function(mono_obj){if(mono_obj==0)return null;var raw=this.mono_string_get_utf8(mono_obj);var res=Module.UTF8ToString(raw);Module._free(raw);return res}),mono_array_to_js_array:(function(mono_array){if(mono_array==0)return null;var res=[];var len=this.mono_array_length(mono_array);for(var i=0;i<len;++i)res.push(this.unbox_mono_obj(this.mono_array_get(mono_array,i)));return res}),js_array_to_mono_array:(function(js_array){var mono_array=this.mono_obj_array_new(js_array.length);for(var i=0;i<js_array.length;++i){this.mono_obj_array_set(mono_array,i,this.js_to_mono_obj(js_array[i]))}return mono_array}),unbox_mono_obj:(function(mono_obj){if(mono_obj==0)return undefined;var type=this.mono_get_obj_type(mono_obj);switch(type){case 1:return this.mono_unbox_int(mono_obj);case 2:return this.mono_unbox_float(mono_obj);case 3:return this.conv_string(mono_obj);case 4:throw new Error("no idea on how to unbox value types");case 5:{var obj=this.extract_js_obj(mono_obj);return(function(){return BINDING.invoke_delegate(obj,arguments)})};case 6:{if(typeof Promise==="undefined"||typeof Promise.resolve==="undefined")throw new Error("Promises are not supported thus C# Tasks can not work in this context.");var obj=this.extract_js_obj(mono_obj);var cont_obj=null;var promise=new Promise((function(resolve,reject){cont_obj={resolve:resolve,reject:reject}}));this.call_method(this.setup_js_cont,null,"mo",[mono_obj,cont_obj]);obj.__mono_js_cont__=cont_obj.__mono_gchandle__;cont_obj.__mono_js_task__=obj.__mono_gchandle__;return promise};case 7:return this.extract_js_obj(mono_obj);case 8:return this.mono_unbox_int(mono_obj)!=0;case 9:if(this.mono_wasm_marshal_enum_as_int){return this.mono_unbox_enum(mono_obj)}else{enumValue=this.call_method(this.object_to_string,null,"m",[mono_obj])}return enumValue;case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:{var res=this.mono_array_to_js_typedarray(type,mono_obj);return res};default:throw new Error("no idea on how to unbox object kind "+type)}}),create_task_completion_source:(function(){return this.call_method(this.create_tcs,null,"i",[-1])}),set_task_result:(function(tcs,result){tcs.is_mono_tcs_result_set=true;this.call_method(this.set_tcs_result,null,"oo",[tcs,result]);if(tcs.is_mono_tcs_task_bound)this.free_task_completion_source(tcs)}),set_task_failure:(function(tcs,reason){tcs.is_mono_tcs_result_set=true;this.call_method(this.set_tcs_failure,null,"os",[tcs,reason.toString()]);if(tcs.is_mono_tcs_task_bound)this.free_task_completion_source(tcs)}),js_typedarray_to_heap:(function(typedArray){var numBytes=typedArray.length*typedArray.BYTES_PER_ELEMENT;var ptr=Module._malloc(numBytes);var heapBytes=new Uint8Array(Module.HEAPU8.buffer,ptr,numBytes);heapBytes.set(new Uint8Array(typedArray.buffer));return heapBytes}),mono_array_to_js_typedarray:(function(type,mono_array){var szLength=this.mono_array_length(mono_array);var bytes_per_element=0;switch(type){case 11:bytes_per_element=Int8Array.BYTES_PER_ELEMENT;break;case 12:bytes_per_element=Uint8Array.BYTES_PER_ELEMENT;break;case 13:bytes_per_element=Int16Array.BYTES_PER_ELEMENT;break;case 14:bytes_per_element=Uint16Array.BYTES_PER_ELEMENT;break;case 15:bytes_per_element=Int32Array.BYTES_PER_ELEMENT;break;case 16:bytes_per_element=Uint32Array.BYTES_PER_ELEMENT;break;case 17:bytes_per_element=Float32Array.BYTES_PER_ELEMENT;break;case 18:bytes_per_element=Float64Array.BYTES_PER_ELEMENT;break}var bufferSize=szLength*bytes_per_element;var bufferPtr=Module._malloc(bufferSize);this.mono_array_to_heap(mono_array,bufferPtr);var res=null;switch(type){case 11:res=Module.HEAP8.slice(bufferPtr/bytes_per_element,bufferPtr/bytes_per_element+szLength);break;case 12:res=Module.HEAPU8.slice(bufferPtr/bytes_per_element,bufferPtr/bytes_per_element+szLength);break;case 13:res=Module.HEAP16.slice(bufferPtr/bytes_per_element,bufferPtr/bytes_per_element+szLength);break;case 14:res=Module.HEAPU16.slice(bufferPtr/bytes_per_element,bufferPtr/bytes_per_element+szLength);break;case 15:res=Module.HEAP32.slice(bufferPtr/bytes_per_element,bufferPtr/bytes_per_element+szLength);break;case 16:res=Module.HEAPU32.slice(bufferPtr/bytes_per_element,bufferPtr/bytes_per_element+szLength);break;case 17:res=Module.HEAPF32.slice(bufferPtr/bytes_per_element,bufferPtr/bytes_per_element+szLength);break;case 18:res=Module.HEAPF64.slice(bufferPtr/bytes_per_element,bufferPtr/bytes_per_element+szLength);break}Module._free(bufferPtr);return res}),js_to_mono_obj:(function(js_obj){this.bindings_lazy_init();if(js_obj==null||js_obj==undefined)return 0;if(typeof js_obj==="number"){if(parseInt(js_obj)==js_obj)return this.call_method(this.box_js_int,null,"im",[js_obj]);return this.call_method(this.box_js_double,null,"dm",[js_obj])}if(typeof js_obj==="string")return this.js_string_to_mono_string(js_obj);if(typeof js_obj==="boolean")return this.call_method(this.box_js_bool,null,"im",[js_obj]);if(Promise.resolve(js_obj)===js_obj){var the_task=this.try_extract_mono_obj(js_obj);if(the_task)return the_task;var tcs=this.create_task_completion_source();js_obj.then((function(result){BINDING.set_task_result(tcs,result)}),(function(reason){BINDING.set_task_failure(tcs,reason)}));return this.get_task_and_bind(tcs,js_obj)}if(!!(js_obj.buffer instanceof ArrayBuffer&&js_obj.BYTES_PER_ELEMENT)){var arrayType=0;if(js_obj instanceof Int8Array)arrayType=11;if(js_obj instanceof Uint8Array)arrayType=12;if(js_obj instanceof Uint8ClampedArray)arrayType=12;if(js_obj instanceof Int16Array)arrayType=13;if(js_obj instanceof Uint16Array)arrayType=14;if(js_obj instanceof Int32Array)arrayType=15;if(js_obj instanceof Uint32Array)arrayType=16;if(js_obj instanceof Float32Array)arrayType=17;if(js_obj instanceof Float64Array)arrayType=18;var heapBytes=this.js_typedarray_to_heap(js_obj);var bufferArray=this.mono_typed_array_new(heapBytes.byteOffset,js_obj.length,js_obj.BYTES_PER_ELEMENT,arrayType);Module._free(heapBytes.byteOffset);return bufferArray}if(ArrayBuffer.isView(js_obj)||js_obj instanceof ArrayBuffer){var byteView=new Uint8Array(js_obj);var heapBytes=this.js_typedarray_to_heap(byteView);byteView=null;var bufferArray=this.mono_typed_array_new(heapBytes.byteOffset,heapBytes.length,heapBytes.BYTES_PER_ELEMENT,2);Module._free(heapBytes.byteOffset);return bufferArray}return this.extract_mono_obj(js_obj)}),js_to_mono_enum:(function(method,parmIdx,js_obj){this.bindings_lazy_init();if(js_obj===null||typeof js_obj==="undefined")return 0;var monoObj=this.js_to_mono_obj(js_obj);var monoEnum=this.call_method(this.object_to_enum,null,"iimm",[method,parmIdx,monoObj]);return this.mono_unbox_enum(monoEnum)}),wasm_binding_obj_new:(function(js_obj_id){return this.call_method(this.bind_js_obj,null,"i",[js_obj_id])}),wasm_bind_existing:(function(mono_obj,js_id){return this.call_method(this.bind_existing_obj,null,"mi",[mono_obj,js_id])}),wasm_unbind_js_obj:(function(js_obj_id){this.call_method(this.unbind_js_obj,null,"i",[js_obj_id])}),wasm_unbind_js_obj_and_free:(function(js_obj_id){this.call_method(this.unbind_js_obj_and_free,null,"i",[js_obj_id])}),wasm_get_js_id:(function(mono_obj){return this.call_method(this.get_js_id,null,"m",[mono_obj])}),wasm_get_raw_obj:(function(gchandle){return this.call_method(this.get_raw_mono_obj,null,"im",[gchandle])}),try_extract_mono_obj:(function(js_obj){if(js_obj===null||typeof js_obj==="undefined"||typeof js_obj.__mono_gchandle__==="undefined")return 0;return this.wasm_get_raw_obj(js_obj.__mono_gchandle__)}),mono_method_get_call_signature:(function(method){this.bindings_lazy_init();return this.call_method(this.get_call_sig,null,"i",[method])}),get_task_and_bind:(function(tcs,js_obj){var gc_handle=this.mono_wasm_free_list.length?this.mono_wasm_free_list.pop():this.mono_wasm_ref_counter++;var task_gchandle=this.call_method(this.tcs_get_task_and_bind,null,"oi",[tcs,gc_handle+1]);js_obj.__mono_gchandle__=task_gchandle;this.mono_wasm_object_registry[gc_handle]=js_obj;this.free_task_completion_source(tcs);tcs.is_mono_tcs_task_bound=true;js_obj.__mono_bound_tcs__=tcs.__mono_gchandle__;tcs.__mono_bound_task__=js_obj.__mono_gchandle__;return this.wasm_get_raw_obj(js_obj.__mono_gchandle__)}),free_task_completion_source:(function(tcs){if(tcs.is_mono_tcs_result_set){this.call_method(this.unbind_raw_obj_and_free,null,"ii",[tcs.__mono_gchandle__])}if(tcs.__mono_bound_task__){this.call_method(this.unbind_raw_obj_and_free,null,"ii",[tcs.__mono_bound_task__])}}),extract_mono_obj:(function(js_obj){if(js_obj===null||typeof js_obj==="undefined")return 0;if(!js_obj.is_mono_bridged_obj){var gc_handle=this.mono_wasm_register_obj(js_obj);return this.wasm_get_raw_obj(gc_handle)}return this.wasm_get_raw_obj(js_obj.__mono_gchandle__)}),extract_js_obj:(function(mono_obj){if(mono_obj==0)return null;var js_id=this.wasm_get_js_id(mono_obj);if(js_id>0)return this.mono_wasm_require_handle(js_id);var gcHandle=this.mono_wasm_free_list.length?this.mono_wasm_free_list.pop():this.mono_wasm_ref_counter++;var js_obj={__mono_gchandle__:this.wasm_bind_existing(mono_obj,gcHandle+1),is_mono_bridged_obj:true};this.mono_wasm_object_registry[gcHandle]=js_obj;return js_obj}),call_method:(function(method,this_arg,args_marshal,args){this.bindings_lazy_init();var extra_args_mem=0;for(var i=0;i<args.length;++i){if(args_marshal[i]=="i"||args_marshal[i]=="f"||args_marshal[i]=="l"||args_marshal[i]=="d"||args_marshal[i]=="j"||args_marshal[i]=="k")extra_args_mem+=8}var extra_args_mem=extra_args_mem?Module._malloc(extra_args_mem):0;var extra_arg_idx=0;var args_mem=Module._malloc(args.length*4);var eh_throw=Module._malloc(4);for(var i=0;i<args.length;++i){if(args_marshal[i]=="s"){Module.setValue(args_mem+i*4,this.js_string_to_mono_string(args[i]),"i32")}else if(args_marshal[i]=="m"){Module.setValue(args_mem+i*4,args[i],"i32")}else if(args_marshal[i]=="o"){Module.setValue(args_mem+i*4,this.js_to_mono_obj(args[i]),"i32")}else if(args_marshal[i]=="j"||args_marshal[i]=="k"){var enumVal=this.js_to_mono_enum(method,i,args[i]);var extra_cell=extra_args_mem+extra_arg_idx;extra_arg_idx+=8;if(args_marshal[i]=="j")Module.setValue(extra_cell,enumVal,"i32");else if(args_marshal[i]=="k")Module.setValue(extra_cell,enumVal,"i64");Module.setValue(args_mem+i*4,extra_cell,"i32")}else if(args_marshal[i]=="i"||args_marshal[i]=="f"||args_marshal[i]=="l"||args_marshal[i]=="d"){var extra_cell=extra_args_mem+extra_arg_idx;extra_arg_idx+=8;if(args_marshal[i]=="i")Module.setValue(extra_cell,args[i],"i32");else if(args_marshal[i]=="l")Module.setValue(extra_cell,args[i],"i64");else if(args_marshal[i]=="f")Module.setValue(extra_cell,args[i],"float");else Module.setValue(extra_cell,args[i],"double");Module.setValue(args_mem+i*4,extra_cell,"i32")}}Module.setValue(eh_throw,0,"i32");var res=this.invoke_method(method,this_arg,args_mem,eh_throw);var eh_res=Module.getValue(eh_throw,"i32");if(extra_args_mem)Module._free(extra_args_mem);Module._free(args_mem);Module._free(eh_throw);if(eh_res!=0){var msg=this.conv_string(res);throw new Error(msg)}if(args_marshal!==null&&typeof args_marshal!=="undefined"){if(args_marshal.length>=args.length&&args_marshal[args.length]=="m")return res}return this.unbox_mono_obj(res)}),invoke_delegate:(function(delegate_obj,js_args){this.bindings_lazy_init();if(!this.delegate_dynamic_invoke){if(!this.corlib)this.corlib=this.assembly_load("mscorlib");if(!this.delegate_class)this.delegate_class=this.find_class(this.corlib,"System","Delegate");if(!this.delegate_class){throw new Error("System.Delegate class can not be resolved.")}this.delegate_dynamic_invoke=this.find_method(this.delegate_class,"DynamicInvoke",-1)}var mono_args=this.js_array_to_mono_array(js_args);if(!this.delegate_dynamic_invoke)throw new Error("System.Delegate.DynamicInvoke method can not be resolved.");return this.call_method(this.delegate_dynamic_invoke,this.extract_mono_obj(delegate_obj),"mm",[mono_args])}),resolve_method_fqn:(function(fqn){var assembly=fqn.substring(fqn.indexOf("[")+1,fqn.indexOf("]")).trim();fqn=fqn.substring(fqn.indexOf("]")+1).trim();var methodname=fqn.substring(fqn.indexOf(":")+1);fqn=fqn.substring(0,fqn.indexOf(":")).trim();var namespace="";var classname=fqn;if(fqn.indexOf(".")!=-1){var idx=fqn.lastIndexOf(".");namespace=fqn.substring(0,idx);classname=fqn.substring(idx+1)}var asm=this.assembly_load(assembly);if(!asm)throw new Error("Could not find assembly: "+assembly);var klass=this.find_class(asm,namespace,classname);if(!klass)throw new Error("Could not find class: "+namespace+":"+classname);var method=this.find_method(klass,methodname,-1);if(!method)throw new Error("Could not find method: "+methodname);return method}),call_static_method:(function(fqn,args,signature){this.bindings_lazy_init();var method=this.resolve_method_fqn(fqn);if(typeof signature==="undefined")signature=Module.mono_method_get_call_signature(method);return this.call_method(method,null,signature,args)}),bind_static_method:(function(fqn,signature){this.bindings_lazy_init();var method=this.resolve_method_fqn(fqn);if(typeof signature==="undefined")signature=Module.mono_method_get_call_signature(method);return(function(){return BINDING.call_method(method,null,signature,arguments)})}),mono_wasm_register_obj:(function(obj){var gc_handle=undefined;if(obj!==null&&typeof obj!=="undefined"){gc_handle=obj.__mono_gchandle__;if(typeof gc_handle==="undefined"){var handle=this.mono_wasm_free_list.length?this.mono_wasm_free_list.pop():this.mono_wasm_ref_counter++;obj.__mono_jshandle__=handle;gc_handle=obj.__mono_gchandle__=this.wasm_binding_obj_new(handle+1);this.mono_wasm_object_registry[handle]=obj}}return gc_handle}),mono_wasm_require_handle:(function(handle){if(handle>0)return this.mono_wasm_object_registry[handle-1];return null}),mono_wasm_unregister_obj:(function(js_id){var obj=this.mono_wasm_object_registry[js_id-1];if(typeof obj!=="undefined"&&obj!==null){if(typeof ___mono_wasm_global___!=="undefined"&&___mono_wasm_global___===obj)return obj;var gc_handle=obj.__mono_gchandle__;if(typeof gc_handle!=="undefined"){this.wasm_unbind_js_obj_and_free(js_id);obj.__mono_gchandle__=undefined;obj.__mono_jshandle__=undefined;this.mono_wasm_object_registry[js_id-1]=undefined;this.mono_wasm_free_list.push(js_id-1)}}return obj}),mono_wasm_free_handle:(function(handle){this.mono_wasm_unregister_obj(handle)}),mono_wasm_free_raw_object:(function(js_id){var obj=this.mono_wasm_object_registry[js_id-1];if(typeof obj!=="undefined"&&obj!==null){if(typeof ___mono_wasm_global___!=="undefined"&&___mono_wasm_global___===obj)return obj;var gc_handle=obj.__mono_gchandle__;if(typeof gc_handle!=="undefined"){obj.__mono_gchandle__=undefined;obj.__mono_jshandle__=undefined;this.mono_wasm_object_registry[js_id-1]=undefined;this.mono_wasm_free_list.push(js_id-1)}}return obj}),mono_wasm_get_global:(function(){function testGlobal(obj){obj["___mono_wasm_global___"]=obj;var success=typeof ___mono_wasm_global___==="object"&&obj["___mono_wasm_global___"]===obj;if(!success){delete obj["___mono_wasm_global___"]}return success}if(typeof ___mono_wasm_global___==="object"){return ___mono_wasm_global___}if(typeof global==="object"&&testGlobal(global)){___mono_wasm_global___=global}else if(typeof window==="object"&&testGlobal(window)){___mono_wasm_global___=window}if(typeof ___mono_wasm_global___==="object"){return ___mono_wasm_global___}throw Error("unable to get mono wasm global object.")})};function _mono_wasm_get_global_object(global_name,is_exception){BINDING.bindings_lazy_init();var js_name=BINDING.conv_string(global_name);var globalObj=undefined;if(!js_name){globalObj=BINDING.mono_wasm_get_global()}else{globalObj=BINDING.mono_wasm_get_global()[js_name]}if(globalObj===null||typeof globalObj===undefined){setValue(is_exception,1,"i32");return BINDING.js_string_to_mono_string("Global object '"+js_name+"' not found.")}return BINDING.js_to_mono_obj(globalObj)}function _mono_wasm_get_object_property(js_handle,property_name,is_exception){BINDING.bindings_lazy_init();var obj=BINDING.mono_wasm_require_handle(js_handle);if(!obj){setValue(is_exception,1,"i32");return BINDING.js_string_to_mono_string("Invalid JS object handle '"+js_handle+"'")}var js_name=BINDING.conv_string(property_name);if(!js_name){setValue(is_exception,1,"i32");return BINDING.js_string_to_mono_string("Invalid property name object '"+js_name+"'")}var res;try{var m=obj[js_name];if(m===Object(m)&&obj.__is_mono_proxied__)m.__is_mono_proxied__=true;return BINDING.js_to_mono_obj(m)}catch(e){var res=e.toString();setValue(is_exception,1,"i32");if(res===null||typeof res==="undefined")res="unknown exception";return BINDING.js_string_to_mono_string(res)}}var DOTNET={_dotnet_get_global:(function(){function testGlobal(obj){obj["___dotnet_global___"]=obj;var success=typeof ___dotnet_global___==="object"&&obj["___dotnet_global___"]===obj;if(!success){delete obj["___dotnet_global___"]}return success}if(typeof ___dotnet_global___==="object"){return ___dotnet_global___}if(typeof global==="object"&&testGlobal(global)){___dotnet_global___=global}else if(typeof window==="object"&&testGlobal(window)){___dotnet_global___=window}if(typeof ___dotnet_global___==="object"){return ___dotnet_global___}throw Error("unable to get DotNet global object.")}),conv_string:(function(mono_obj){if(mono_obj==0)return null;if(!this.mono_string_get_utf8)this.mono_string_get_utf8=Module.cwrap("mono_wasm_string_get_utf8","number",["number"]);var raw=this.mono_string_get_utf8(mono_obj);var res=Module.UTF8ToString(raw);Module._free(raw);return res})};function _mono_wasm_invoke_js_marshalled(exceptionMessage,asyncHandleLongPtr,functionName,argsJson){var mono_string=DOTNET._dotnet_get_global()._mono_string_cached||(DOTNET._dotnet_get_global()._mono_string_cached=Module.cwrap("mono_wasm_string_from_js","number",["string"]));try{var u32Index=asyncHandleLongPtr>>2;var asyncHandleJsNumber=Module.HEAPU32[u32Index+1]*4294967296+Module.HEAPU32[u32Index];var funcNameJsString=DOTNET.conv_string(functionName);var argsJsonJsString=argsJson&&DOTNET.conv_string(argsJson);var dotNetExports=DOTNET._dotnet_get_global().DotNet;if(!dotNetExports){throw new Error("The Microsoft.JSInterop.js library is not loaded.")}if(asyncHandleJsNumber){dotNetExports.jsCallDispatcher.beginInvokeJSFromDotNet(asyncHandleJsNumber,funcNameJsString,argsJsonJsString);return 0}else{var resultJson=dotNetExports.jsCallDispatcher.invokeJSFromDotNet(funcNameJsString,argsJsonJsString);return resultJson===null?0:mono_string(resultJson)}}catch(ex){var exceptionJsString=ex.message+"\n"+ex.stack;var exceptionSystemString=mono_string(exceptionJsString);setValue(exceptionMessage,exceptionSystemString,"i32");return 0}}function _mono_wasm_invoke_js_unmarshalled(exceptionMessage,funcName,arg0,arg1,arg2){try{var funcNameJsString=DOTNET.conv_string(funcName);var dotNetExports=DOTNET._dotnet_get_global().DotNet;if(!dotNetExports){throw new Error("The Microsoft.JSInterop.js library is not loaded.")}var funcInstance=dotNetExports.jsCallDispatcher.findJSFunction(funcNameJsString);return funcInstance.call(null,arg0,arg1,arg2)}catch(ex){var exceptionJsString=ex.message+"\n"+ex.stack;var mono_string=Module.cwrap("mono_wasm_string_from_js","number",["string"]);var exceptionSystemString=mono_string(exceptionJsString);setValue(exceptionMessage,exceptionSystemString,"i32");return 0}}function _mono_wasm_invoke_js_with_args(js_handle,method_name,args,is_exception){BINDING.bindings_lazy_init();var obj=BINDING.get_js_obj(js_handle);if(!obj){setValue(is_exception,1,"i32");return BINDING.js_string_to_mono_string("Invalid JS object handle '"+js_handle+"'")}var js_name=BINDING.conv_string(method_name);if(!js_name){setValue(is_exception,1,"i32");return BINDING.js_string_to_mono_string("Invalid method name object '"+method_name+"'")}var js_args=BINDING.mono_array_to_js_array(args);var res;try{var m=obj[js_name];if(typeof m==="undefined")throw new Error("Method: '"+js_name+"' not found for: '"+Object.prototype.toString.call(obj)+"'");var res=m.apply(obj,js_args);return BINDING.js_to_mono_obj(res)}catch(e){var res=e.toString();setValue(is_exception,1,"i32");if(res===null||res===undefined)res="unknown exception";return BINDING.js_string_to_mono_string(res)}}function _mono_wasm_new_array(is_exception){BINDING.bindings_lazy_init();return BINDING.js_to_mono_obj([])}function _mono_wasm_new_object(object_handle,args,is_exception){BINDING.bindings_lazy_init();if(!object_handle){return BINDING.js_to_mono_obj({})}else{var requireObject=BINDING.mono_wasm_require_handle(object_handle);if(!requireObject){setValue(is_exception,1,"i32");return BINDING.js_string_to_mono_string("Invalid JS object handle '"+js_handle+"'")}var js_args=BINDING.mono_array_to_js_array(args);try{var allocator=(function(constructor,js_args){var argsList=new Array;argsList[0]=constructor;if(js_args)argsList=argsList.concat(js_args);var obj=new(constructor.bind.apply(constructor,argsList));return obj});var res=allocator(requireObject,js_args);return BINDING.extract_mono_obj(res)}catch(e){var res=e.toString();setValue(is_exception,1,"i32");if(res===null||res===undefined)res="Error allocating object.";return BINDING.js_string_to_mono_string(res)}}}function _mono_wasm_release_handle(js_handle,is_exception){BINDING.bindings_lazy_init();BINDING.mono_wasm_free_handle(js_handle)}function _mono_wasm_release_object(js_handle,is_exception){BINDING.bindings_lazy_init();BINDING.mono_wasm_free_raw_object(js_handle)}function _mono_wasm_set_object_property(js_handle,property_name,value,createIfNotExist,hasOwnProperty,is_exception){BINDING.bindings_lazy_init();var requireObject=BINDING.mono_wasm_require_handle(js_handle);if(!requireObject){setValue(is_exception,1,"i32");return BINDING.js_string_to_mono_string("Invalid JS object handle '"+js_handle+"'")}var property=BINDING.conv_string(property_name);if(!property){setValue(is_exception,1,"i32");return BINDING.js_string_to_mono_string("Invalid property name object '"+property_name+"'")}var result=false;var js_value=BINDING.unbox_mono_obj(value);if(createIfNotExist){requireObject[property]=js_value;result=true}else{result=false;if(!createIfNotExist){if(!requireObject.hasOwnProperty(property))return false}if(hasOwnProperty===true){if(requireObject.hasOwnProperty(property)){requireObject[property]=js_value;result=true}}else{requireObject[property]=js_value;result=true}}return BINDING.call_method(BINDING.box_js_bool,null,"im",[result])}function _usleep(useconds){var msec=useconds/1e3;if((ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&self["performance"]&&self["performance"]["now"]){var start=self["performance"]["now"]();while(self["performance"]["now"]()-start<msec){}}else{var start=Date.now();while(Date.now()-start<msec){}}return 0}Module["_usleep"]=_usleep;function _nanosleep(rqtp,rmtp){var seconds=HEAP32[rqtp>>2];var nanoseconds=HEAP32[rqtp+4>>2];if(rmtp!==0){HEAP32[rmtp>>2]=0;HEAP32[rmtp+4>>2]=0}return _usleep(seconds*1e6+nanoseconds/1e3)}function _pthread_cleanup_pop(){assert(_pthread_cleanup_push.level==__ATEXIT__.length,"cannot pop if something else added meanwhile!");__ATEXIT__.pop();_pthread_cleanup_push.level=__ATEXIT__.length}function _pthread_cleanup_push(routine,arg){__ATEXIT__.push((function(){Module["dynCall_vi"](routine,arg)}));_pthread_cleanup_push.level=__ATEXIT__.length}function _pthread_cond_destroy(){return 0}function _pthread_cond_init(){return 0}function _pthread_cond_signal(){return 0}function _pthread_cond_timedwait(){return 0}function _pthread_cond_wait(){return 0}var PTHREAD_SPECIFIC={};function _pthread_getspecific(key){return PTHREAD_SPECIFIC[key]||0}var PTHREAD_SPECIFIC_NEXT_KEY=1;function _pthread_key_create(key,destructor){if(key==0){return ERRNO_CODES.EINVAL}HEAP32[key>>2]=PTHREAD_SPECIFIC_NEXT_KEY;PTHREAD_SPECIFIC[PTHREAD_SPECIFIC_NEXT_KEY]=0;PTHREAD_SPECIFIC_NEXT_KEY++;return 0}function _pthread_mutex_destroy(){}function _pthread_mutex_init(){}function _pthread_mutexattr_destroy(){}function _pthread_mutexattr_init(){}function _pthread_mutexattr_settype(){}function _pthread_setcancelstate(){return 0}function _pthread_setspecific(key,value){if(!(key in PTHREAD_SPECIFIC)){return ERRNO_CODES.EINVAL}PTHREAD_SPECIFIC[key]=value;return 0}function _schedule_background_exec(){++MONO.pump_count;if(ENVIRONMENT_IS_WEB){window.setTimeout(MONO.pump_message,0)}}function _sem_destroy(){}function _sem_init(){}function _sem_post(){}function _sem_trywait(){}function _sem_wait(){}function _setenv(envname,envval,overwrite){if(envname===0){___setErrNo(ERRNO_CODES.EINVAL);return-1}var name=Pointer_stringify(envname);var val=Pointer_stringify(envval);if(name===""||name.indexOf("=")!==-1){___setErrNo(ERRNO_CODES.EINVAL);return-1}if(ENV.hasOwnProperty(name)&&!overwrite)return 0;ENV[name]=val;___buildEnvironment(__get_environ());return 0}function _sigaction(signum,act,oldact){return 0}function _sigemptyset(set){HEAP32[set>>2]=0;return 0}function __isLeapYear(year){return year%4===0&&(year%100!==0||year%400===0)}function __arraySum(array,index){var sum=0;for(var i=0;i<=index;sum+=array[i++]);return sum}var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];var __MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function __addDays(date,days){var newDate=new Date(date.getTime());while(days>0){var leap=__isLeapYear(newDate.getFullYear());var currentMonth=newDate.getMonth();var daysInCurrentMonth=(leap?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR)[currentMonth];if(days>daysInCurrentMonth-newDate.getDate()){days-=daysInCurrentMonth-newDate.getDate()+1;newDate.setDate(1);if(currentMonth<11){newDate.setMonth(currentMonth+1)}else{newDate.setMonth(0);newDate.setFullYear(newDate.getFullYear()+1)}}else{newDate.setDate(newDate.getDate()+days);return newDate}}return newDate}function _strftime(s,maxsize,format,tm){var tm_zone=HEAP32[tm+40>>2];var date={tm_sec:HEAP32[tm>>2],tm_min:HEAP32[tm+4>>2],tm_hour:HEAP32[tm+8>>2],tm_mday:HEAP32[tm+12>>2],tm_mon:HEAP32[tm+16>>2],tm_year:HEAP32[tm+20>>2],tm_wday:HEAP32[tm+24>>2],tm_yday:HEAP32[tm+28>>2],tm_isdst:HEAP32[tm+32>>2],tm_gmtoff:HEAP32[tm+36>>2],tm_zone:tm_zone?Pointer_stringify(tm_zone):""};var pattern=Pointer_stringify(format);var EXPANSION_RULES_1={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S"};for(var rule in EXPANSION_RULES_1){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_1[rule])}var WEEKDAYS=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var MONTHS=["January","February","March","April","May","June","July","August","September","October","November","December"];function leadingSomething(value,digits,character){var str=typeof value==="number"?value.toString():value||"";while(str.length<digits){str=character[0]+str}return str}function leadingNulls(value,digits){return leadingSomething(value,digits,"0")}function compareByDay(date1,date2){function sgn(value){return value<0?-1:value>0?1:0}var compare;if((compare=sgn(date1.getFullYear()-date2.getFullYear()))===0){if((compare=sgn(date1.getMonth()-date2.getMonth()))===0){compare=sgn(date1.getDate()-date2.getDate())}}return compare}function getFirstWeekStartDate(janFourth){switch(janFourth.getDay()){case 0:return new Date(janFourth.getFullYear()-1,11,29);case 1:return janFourth;case 2:return new Date(janFourth.getFullYear(),0,3);case 3:return new Date(janFourth.getFullYear(),0,2);case 4:return new Date(janFourth.getFullYear(),0,1);case 5:return new Date(janFourth.getFullYear()-1,11,31);case 6:return new Date(janFourth.getFullYear()-1,11,30)}}function getWeekBasedYear(date){var thisDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);var janFourthThisYear=new Date(thisDate.getFullYear(),0,4);var janFourthNextYear=new Date(thisDate.getFullYear()+1,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);if(compareByDay(firstWeekStartThisYear,thisDate)<=0){if(compareByDay(firstWeekStartNextYear,thisDate)<=0){return thisDate.getFullYear()+1}else{return thisDate.getFullYear()}}else{return thisDate.getFullYear()-1}}var EXPANSION_RULES_2={"%a":(function(date){return WEEKDAYS[date.tm_wday].substring(0,3)}),"%A":(function(date){return WEEKDAYS[date.tm_wday]}),"%b":(function(date){return MONTHS[date.tm_mon].substring(0,3)}),"%B":(function(date){return MONTHS[date.tm_mon]}),"%C":(function(date){var year=date.tm_year+1900;return leadingNulls(year/100|0,2)}),"%d":(function(date){return leadingNulls(date.tm_mday,2)}),"%e":(function(date){return leadingSomething(date.tm_mday,2," ")}),"%g":(function(date){return getWeekBasedYear(date).toString().substring(2)}),"%G":(function(date){return getWeekBasedYear(date)}),"%H":(function(date){return leadingNulls(date.tm_hour,2)}),"%I":(function(date){var twelveHour=date.tm_hour;if(twelveHour==0)twelveHour=12;else if(twelveHour>12)twelveHour-=12;return leadingNulls(twelveHour,2)}),"%j":(function(date){return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900)?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,date.tm_mon-1),3)}),"%m":(function(date){return leadingNulls(date.tm_mon+1,2)}),"%M":(function(date){return leadingNulls(date.tm_min,2)}),"%n":(function(){return"\n"}),"%p":(function(date){if(date.tm_hour>=0&&date.tm_hour<12){return"AM"}else{return"PM"}}),"%S":(function(date){return leadingNulls(date.tm_sec,2)}),"%t":(function(){return"\t"}),"%u":(function(date){var day=new Date(date.tm_year+1900,date.tm_mon+1,date.tm_mday,0,0,0,0);return day.getDay()||7}),"%U":(function(date){var janFirst=new Date(date.tm_year+1900,0,1);var firstSunday=janFirst.getDay()===0?janFirst:__addDays(janFirst,7-janFirst.getDay());var endDate=new Date(date.tm_year+1900,date.tm_mon,date.tm_mday);if(compareByDay(firstSunday,endDate)<0){var februaryFirstUntilEndMonth=__arraySum(__isLeapYear(endDate.getFullYear())?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,endDate.getMonth()-1)-31;var firstSundayUntilEndJanuary=31-firstSunday.getDate();var days=firstSundayUntilEndJanuary+februaryFirstUntilEndMonth+endDate.getDate();return leadingNulls(Math.ceil(days/7),2)}return compareByDay(firstSunday,janFirst)===0?"01":"00"}),"%V":(function(date){var janFourthThisYear=new Date(date.tm_year+1900,0,4);var janFourthNextYear=new Date(date.tm_year+1901,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);var endDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);if(compareByDay(endDate,firstWeekStartThisYear)<0){return"53"}if(compareByDay(firstWeekStartNextYear,endDate)<=0){return"01"}var daysDifference;if(firstWeekStartThisYear.getFullYear()<date.tm_year+1900){daysDifference=date.tm_yday+32-firstWeekStartThisYear.getDate()}else{daysDifference=date.tm_yday+1-firstWeekStartThisYear.getDate()}return leadingNulls(Math.ceil(daysDifference/7),2)}),"%w":(function(date){var day=new Date(date.tm_year+1900,date.tm_mon+1,date.tm_mday,0,0,0,0);return day.getDay()}),"%W":(function(date){var janFirst=new Date(date.tm_year,0,1);var firstMonday=janFirst.getDay()===1?janFirst:__addDays(janFirst,janFirst.getDay()===0?1:7-janFirst.getDay()+1);var endDate=new Date(date.tm_year+1900,date.tm_mon,date.tm_mday);if(compareByDay(firstMonday,endDate)<0){var februaryFirstUntilEndMonth=__arraySum(__isLeapYear(endDate.getFullYear())?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,endDate.getMonth()-1)-31;var firstMondayUntilEndJanuary=31-firstMonday.getDate();var days=firstMondayUntilEndJanuary+februaryFirstUntilEndMonth+endDate.getDate();return leadingNulls(Math.ceil(days/7),2)}return compareByDay(firstMonday,janFirst)===0?"01":"00"}),"%y":(function(date){return(date.tm_year+1900).toString().substring(2)}),"%Y":(function(date){return date.tm_year+1900}),"%z":(function(date){var off=date.tm_gmtoff;var ahead=off>=0;off=Math.abs(off)/60;off=off/60*100+off%60;return(ahead?"+":"-")+String("0000"+off).slice(-4)}),"%Z":(function(date){return date.tm_zone}),"%%":(function(){return"%"})};for(var rule in EXPANSION_RULES_2){if(pattern.indexOf(rule)>=0){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_2[rule](date))}}var bytes=intArrayFromString(pattern,false);if(bytes.length>maxsize){return 0}writeArrayToMemory(bytes,s);return bytes.length-1}function _sysconf(name){switch(name){case 30:return PAGE_SIZE;case 85:var maxHeapSize=2*1024*1024*1024-65536;return maxHeapSize/PAGE_SIZE;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 80:case 81:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 79:return 0;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:return-1;case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 75:return 16384;case 39:return 1e3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:{if(typeof navigator==="object")return navigator["hardwareConcurrency"]||1;return 1}}___setErrNo(ERRNO_CODES.EINVAL);return-1}function _time(ptr){var ret=Date.now()/1e3|0;if(ptr){HEAP32[ptr>>2]=ret}return ret}function _unsetenv(name){if(name===0){___setErrNo(ERRNO_CODES.EINVAL);return-1}name=Pointer_stringify(name);if(name===""||name.indexOf("=")!==-1){___setErrNo(ERRNO_CODES.EINVAL);return-1}if(ENV.hasOwnProperty(name)){delete ENV[name];___buildEnvironment(__get_environ())}return 0}function _utime(path,times){var time;if(times){var offset=4;time=HEAP32[times+offset>>2];time*=1e3}else{time=Date.now()}path=Pointer_stringify(path);try{FS.utime(path,time,time);return 0}catch(e){FS.handleFSError(e);return-1}}function _utimes(path,times){var time;if(times){var offset=8+0;time=HEAP32[times+offset>>2]*1e3;offset=8+4;time+=HEAP32[times+offset>>2]/1e3}else{time=Date.now()}path=Pointer_stringify(path);try{FS.utime(path,time,time);return 0}catch(e){FS.handleFSError(e);return-1}}function _wait(stat_loc){___setErrNo(ERRNO_CODES.ECHILD);return-1}function _waitpid(){return _wait.apply(null,arguments)}if(ENVIRONMENT_IS_NODE){_emscripten_get_now=function _emscripten_get_now_actual(){var t=process["hrtime"]();return t[0]*1e3+t[1]/1e6}}else if(typeof dateNow!=="undefined"){_emscripten_get_now=dateNow}else if(typeof self==="object"&&self["performance"]&&typeof self["performance"]["now"]==="function"){_emscripten_get_now=(function(){return self["performance"]["now"]()})}else if(typeof performance==="object"&&typeof performance["now"]==="function"){_emscripten_get_now=(function(){return performance["now"]()})}else{_emscripten_get_now=Date.now}FS.staticInit();__ATINIT__.unshift((function(){if(!Module["noFSInit"]&&!FS.init.initialized)FS.init()}));__ATMAIN__.push((function(){FS.ignorePermissions=false}));__ATEXIT__.push((function(){FS.quit()}));Module["FS_createPath"]=FS.createPath;Module["FS_createDataFile"]=FS.createDataFile;__ATINIT__.unshift((function(){TTY.init()}));__ATEXIT__.push((function(){TTY.shutdown()}));if(ENVIRONMENT_IS_NODE){var fs=require("fs");var NODEJS_PATH=require("path");NODEFS.staticInit()}__ATINIT__.push((function(){SOCKFS.root=FS.mount(SOCKFS,{},null)}));__ATINIT__.push((function(){PIPEFS.root=FS.mount(PIPEFS,{},null)}));Module["pump_message"]=MONO.pump_message;BINDING.export_functions(Module);DYNAMICTOP_PTR=staticAlloc(4);STACK_BASE=STACKTOP=alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}Module["wasmTableSize"]=2048;Module.asmGlobalArg={};Module.asmLibraryArg={"abort":abort,"enlargeMemory":enlargeMemory,"getTotalMemory":getTotalMemory,"abortOnCannotGrowMemory":abortOnCannotGrowMemory,"___assert_fail":___assert_fail,"___buildEnvironment":___buildEnvironment,"___clock_gettime":___clock_gettime,"___cxa_allocate_exception":___cxa_allocate_exception,"___cxa_throw":___cxa_throw,"___lock":___lock,"___setErrNo":___setErrNo,"___syscall10":___syscall10,"___syscall102":___syscall102,"___syscall118":___syscall118,"___syscall12":___syscall12,"___syscall122":___syscall122,"___syscall125":___syscall125,"___syscall140":___syscall140,"___syscall142":___syscall142,"___syscall144":___syscall144,"___syscall145":___syscall145,"___syscall146":___syscall146,"___syscall15":___syscall15,"___syscall150":___syscall150,"___syscall151":___syscall151,"___syscall168":___syscall168,"___syscall183":___syscall183,"___syscall191":___syscall191,"___syscall192":___syscall192,"___syscall194":___syscall194,"___syscall195":___syscall195,"___syscall196":___syscall196,"___syscall197":___syscall197,"___syscall199":___syscall199,"___syscall20":___syscall20,"___syscall201":___syscall201,"___syscall202":___syscall202,"___syscall209":___syscall209,"___syscall219":___syscall219,"___syscall220":___syscall220,"___syscall221":___syscall221,"___syscall268":___syscall268,"___syscall272":___syscall272,"___syscall3":___syscall3,"___syscall320":___syscall320,"___syscall33":___syscall33,"___syscall331":___syscall331,"___syscall340":___syscall340,"___syscall36":___syscall36,"___syscall38":___syscall38,"___syscall39":___syscall39,"___syscall4":___syscall4,"___syscall40":___syscall40,"___syscall41":___syscall41,"___syscall42":___syscall42,"___syscall5":___syscall5,"___syscall54":___syscall54,"___syscall6":___syscall6,"___syscall63":___syscall63,"___syscall77":___syscall77,"___syscall85":___syscall85,"___syscall9":___syscall9,"___syscall91":___syscall91,"___syscall94":___syscall94,"___syscall96":___syscall96,"___syscall97":___syscall97,"___unlock":___unlock,"__exit":__exit,"_abort":_abort,"_atexit":_atexit,"_clock_getres":_clock_getres,"_clock_gettime":_clock_gettime,"_emscripten_asm_const_i":_emscripten_asm_const_i,"_emscripten_asm_const_iii":_emscripten_asm_const_iii,"_emscripten_memcpy_big":_emscripten_memcpy_big,"_execve":_execve,"_exit":_exit,"_flock":_flock,"_fork":_fork,"_getaddrinfo":_getaddrinfo,"_getenv":_getenv,"_getnameinfo":_getnameinfo,"_getprotobyname":_getprotobyname,"_getpwuid":_getpwuid,"_gettimeofday":_gettimeofday,"_gmtime_r":_gmtime_r,"_kill":_kill,"_llvm_log10_f32":_llvm_log10_f32,"_llvm_log10_f64":_llvm_log10_f64,"_llvm_trap":_llvm_trap,"_llvm_trunc_f32":_llvm_trunc_f32,"_llvm_trunc_f64":_llvm_trunc_f64,"_localtime_r":_localtime_r,"_mono_set_timeout":_mono_set_timeout,"_mono_wasm_add_bool_var":_mono_wasm_add_bool_var,"_mono_wasm_add_float_var":_mono_wasm_add_float_var,"_mono_wasm_add_frame":_mono_wasm_add_frame,"_mono_wasm_add_int_var":_mono_wasm_add_int_var,"_mono_wasm_add_long_var":_mono_wasm_add_long_var,"_mono_wasm_add_string_var":_mono_wasm_add_string_var,"_mono_wasm_fire_bp":_mono_wasm_fire_bp,"_mono_wasm_get_global_object":_mono_wasm_get_global_object,"_mono_wasm_get_object_property":_mono_wasm_get_object_property,"_mono_wasm_invoke_js_marshalled":_mono_wasm_invoke_js_marshalled,"_mono_wasm_invoke_js_unmarshalled":_mono_wasm_invoke_js_unmarshalled,"_mono_wasm_invoke_js_with_args":_mono_wasm_invoke_js_with_args,"_mono_wasm_new_array":_mono_wasm_new_array,"_mono_wasm_new_object":_mono_wasm_new_object,"_mono_wasm_release_handle":_mono_wasm_release_handle,"_mono_wasm_release_object":_mono_wasm_release_object,"_mono_wasm_set_object_property":_mono_wasm_set_object_property,"_nanosleep":_nanosleep,"_pthread_cleanup_pop":_pthread_cleanup_pop,"_pthread_cleanup_push":_pthread_cleanup_push,"_pthread_cond_destroy":_pthread_cond_destroy,"_pthread_cond_init":_pthread_cond_init,"_pthread_cond_signal":_pthread_cond_signal,"_pthread_cond_timedwait":_pthread_cond_timedwait,"_pthread_cond_wait":_pthread_cond_wait,"_pthread_getspecific":_pthread_getspecific,"_pthread_key_create":_pthread_key_create,"_pthread_mutex_destroy":_pthread_mutex_destroy,"_pthread_mutex_init":_pthread_mutex_init,"_pthread_mutexattr_destroy":_pthread_mutexattr_destroy,"_pthread_mutexattr_init":_pthread_mutexattr_init,"_pthread_mutexattr_settype":_pthread_mutexattr_settype,"_pthread_setcancelstate":_pthread_setcancelstate,"_pthread_setspecific":_pthread_setspecific,"_schedule_background_exec":_schedule_background_exec,"_sem_destroy":_sem_destroy,"_sem_init":_sem_init,"_sem_post":_sem_post,"_sem_trywait":_sem_trywait,"_sem_wait":_sem_wait,"_setenv":_setenv,"_sigaction":_sigaction,"_sigemptyset":_sigemptyset,"_strftime":_strftime,"_sysconf":_sysconf,"_time":_time,"_unsetenv":_unsetenv,"_utime":_utime,"_utimes":_utimes,"_waitpid":_waitpid,"DYNAMICTOP_PTR":DYNAMICTOP_PTR,"STACKTOP":STACKTOP};var asm=Module["asm"](Module.asmGlobalArg,Module.asmLibraryArg,buffer);Module["asm"]=asm;var ___emscripten_environ_constructor=Module["___emscripten_environ_constructor"]=(function(){return Module["asm"]["___emscripten_environ_constructor"].apply(null,arguments)});var ___errno_location=Module["___errno_location"]=(function(){return Module["asm"]["___errno_location"].apply(null,arguments)});var __get_daylight=Module["__get_daylight"]=(function(){return Module["asm"]["__get_daylight"].apply(null,arguments)});var __get_environ=Module["__get_environ"]=(function(){return Module["asm"]["__get_environ"].apply(null,arguments)});var __get_timezone=Module["__get_timezone"]=(function(){return Module["asm"]["__get_timezone"].apply(null,arguments)});var __get_tzname=Module["__get_tzname"]=(function(){return Module["asm"]["__get_tzname"].apply(null,arguments)});var _emscripten_replace_memory=Module["_emscripten_replace_memory"]=(function(){return Module["asm"]["_emscripten_replace_memory"].apply(null,arguments)});var _free=Module["_free"]=(function(){return Module["asm"]["_free"].apply(null,arguments)});var _htonl=Module["_htonl"]=(function(){return Module["asm"]["_htonl"].apply(null,arguments)});var _htons=Module["_htons"]=(function(){return Module["asm"]["_htons"].apply(null,arguments)});var _malloc=Module["_malloc"]=(function(){return Module["asm"]["_malloc"].apply(null,arguments)});var _memalign=Module["_memalign"]=(function(){return Module["asm"]["_memalign"].apply(null,arguments)});var _memset=Module["_memset"]=(function(){return Module["asm"]["_memset"].apply(null,arguments)});var _mono_background_exec=Module["_mono_background_exec"]=(function(){return Module["asm"]["_mono_background_exec"].apply(null,arguments)});var _mono_print_method_from_ip=Module["_mono_print_method_from_ip"]=(function(){return Module["asm"]["_mono_print_method_from_ip"].apply(null,arguments)});var _mono_set_timeout_exec=Module["_mono_set_timeout_exec"]=(function(){return Module["asm"]["_mono_set_timeout_exec"].apply(null,arguments)});var _mono_unbox_int=Module["_mono_unbox_int"]=(function(){return Module["asm"]["_mono_unbox_int"].apply(null,arguments)});var _mono_wasm_add_assembly=Module["_mono_wasm_add_assembly"]=(function(){return Module["asm"]["_mono_wasm_add_assembly"].apply(null,arguments)});var _mono_wasm_array_get=Module["_mono_wasm_array_get"]=(function(){return Module["asm"]["_mono_wasm_array_get"].apply(null,arguments)});var _mono_wasm_array_length=Module["_mono_wasm_array_length"]=(function(){return Module["asm"]["_mono_wasm_array_length"].apply(null,arguments)});var _mono_wasm_array_to_heap=Module["_mono_wasm_array_to_heap"]=(function(){return Module["asm"]["_mono_wasm_array_to_heap"].apply(null,arguments)});var _mono_wasm_assembly_find_class=Module["_mono_wasm_assembly_find_class"]=(function(){return Module["asm"]["_mono_wasm_assembly_find_class"].apply(null,arguments)});var _mono_wasm_assembly_find_method=Module["_mono_wasm_assembly_find_method"]=(function(){return Module["asm"]["_mono_wasm_assembly_find_method"].apply(null,arguments)});var _mono_wasm_assembly_get_entry_point=Module["_mono_wasm_assembly_get_entry_point"]=(function(){return Module["asm"]["_mono_wasm_assembly_get_entry_point"].apply(null,arguments)});var _mono_wasm_assembly_load=Module["_mono_wasm_assembly_load"]=(function(){return Module["asm"]["_mono_wasm_assembly_load"].apply(null,arguments)});var _mono_wasm_clear_all_breakpoints=Module["_mono_wasm_clear_all_breakpoints"]=(function(){return Module["asm"]["_mono_wasm_clear_all_breakpoints"].apply(null,arguments)});var _mono_wasm_current_bp_id=Module["_mono_wasm_current_bp_id"]=(function(){return Module["asm"]["_mono_wasm_current_bp_id"].apply(null,arguments)});var _mono_wasm_enum_frames=Module["_mono_wasm_enum_frames"]=(function(){return Module["asm"]["_mono_wasm_enum_frames"].apply(null,arguments)});var _mono_wasm_exec_regression=Module["_mono_wasm_exec_regression"]=(function(){return Module["asm"]["_mono_wasm_exec_regression"].apply(null,arguments)});var _mono_wasm_exit=Module["_mono_wasm_exit"]=(function(){return Module["asm"]["_mono_wasm_exit"].apply(null,arguments)});var _mono_wasm_get_obj_type=Module["_mono_wasm_get_obj_type"]=(function(){return Module["asm"]["_mono_wasm_get_obj_type"].apply(null,arguments)});var _mono_wasm_get_var_info=Module["_mono_wasm_get_var_info"]=(function(){return Module["asm"]["_mono_wasm_get_var_info"].apply(null,arguments)});var _mono_wasm_invoke_method=Module["_mono_wasm_invoke_method"]=(function(){return Module["asm"]["_mono_wasm_invoke_method"].apply(null,arguments)});var _mono_wasm_load_runtime=Module["_mono_wasm_load_runtime"]=(function(){return Module["asm"]["_mono_wasm_load_runtime"].apply(null,arguments)});var _mono_wasm_obj_array_new=Module["_mono_wasm_obj_array_new"]=(function(){return Module["asm"]["_mono_wasm_obj_array_new"].apply(null,arguments)});var _mono_wasm_obj_array_set=Module["_mono_wasm_obj_array_set"]=(function(){return Module["asm"]["_mono_wasm_obj_array_set"].apply(null,arguments)});var _mono_wasm_remove_breakpoint=Module["_mono_wasm_remove_breakpoint"]=(function(){return Module["asm"]["_mono_wasm_remove_breakpoint"].apply(null,arguments)});var _mono_wasm_set_breakpoint=Module["_mono_wasm_set_breakpoint"]=(function(){return Module["asm"]["_mono_wasm_set_breakpoint"].apply(null,arguments)});var _mono_wasm_set_main_args=Module["_mono_wasm_set_main_args"]=(function(){return Module["asm"]["_mono_wasm_set_main_args"].apply(null,arguments)});var _mono_wasm_setenv=Module["_mono_wasm_setenv"]=(function(){return Module["asm"]["_mono_wasm_setenv"].apply(null,arguments)});var _mono_wasm_setup_single_step=Module["_mono_wasm_setup_single_step"]=(function(){return Module["asm"]["_mono_wasm_setup_single_step"].apply(null,arguments)});var _mono_wasm_strdup=Module["_mono_wasm_strdup"]=(function(){return Module["asm"]["_mono_wasm_strdup"].apply(null,arguments)});var _mono_wasm_string_array_new=Module["_mono_wasm_string_array_new"]=(function(){return Module["asm"]["_mono_wasm_string_array_new"].apply(null,arguments)});var _mono_wasm_string_from_js=Module["_mono_wasm_string_from_js"]=(function(){return Module["asm"]["_mono_wasm_string_from_js"].apply(null,arguments)});var _mono_wasm_string_get_utf8=Module["_mono_wasm_string_get_utf8"]=(function(){return Module["asm"]["_mono_wasm_string_get_utf8"].apply(null,arguments)});var _mono_wasm_typed_array_new=Module["_mono_wasm_typed_array_new"]=(function(){return Module["asm"]["_mono_wasm_typed_array_new"].apply(null,arguments)});var _mono_wasm_unbox_enum=Module["_mono_wasm_unbox_enum"]=(function(){return Module["asm"]["_mono_wasm_unbox_enum"].apply(null,arguments)});var _mono_wasm_unbox_float=Module["_mono_wasm_unbox_float"]=(function(){return Module["asm"]["_mono_wasm_unbox_float"].apply(null,arguments)});var _ntohs=Module["_ntohs"]=(function(){return Module["asm"]["_ntohs"].apply(null,arguments)});var _putchar=Module["_putchar"]=(function(){return Module["asm"]["_putchar"].apply(null,arguments)});var _wasm_get_stack_base=Module["_wasm_get_stack_base"]=(function(){return Module["asm"]["_wasm_get_stack_base"].apply(null,arguments)});var _wasm_get_stack_size=Module["_wasm_get_stack_size"]=(function(){return Module["asm"]["_wasm_get_stack_size"].apply(null,arguments)});var stackAlloc=Module["stackAlloc"]=(function(){return Module["asm"]["stackAlloc"].apply(null,arguments)});var stackRestore=Module["stackRestore"]=(function(){return Module["asm"]["stackRestore"].apply(null,arguments)});var stackSave=Module["stackSave"]=(function(){return Module["asm"]["stackSave"].apply(null,arguments)});var dynCall_X=Module["dynCall_X"]=(function(){return Module["asm"]["dynCall_X"].apply(null,arguments)});var dynCall_d=Module["dynCall_d"]=(function(){return Module["asm"]["dynCall_d"].apply(null,arguments)});var dynCall_dd=Module["dynCall_dd"]=(function(){return Module["asm"]["dynCall_dd"].apply(null,arguments)});var dynCall_ddd=Module["dynCall_ddd"]=(function(){return Module["asm"]["dynCall_ddd"].apply(null,arguments)});var dynCall_ddi=Module["dynCall_ddi"]=(function(){return Module["asm"]["dynCall_ddi"].apply(null,arguments)});var dynCall_di=Module["dynCall_di"]=(function(){return Module["asm"]["dynCall_di"].apply(null,arguments)});var dynCall_did=Module["dynCall_did"]=(function(){return Module["asm"]["dynCall_did"].apply(null,arguments)});var dynCall_didd=Module["dynCall_didd"]=(function(){return Module["asm"]["dynCall_didd"].apply(null,arguments)});var dynCall_ff=Module["dynCall_ff"]=(function(){return Module["asm"]["dynCall_ff"].apply(null,arguments)});var dynCall_fff=Module["dynCall_fff"]=(function(){return Module["asm"]["dynCall_fff"].apply(null,arguments)});var dynCall_ffi=Module["dynCall_ffi"]=(function(){return Module["asm"]["dynCall_ffi"].apply(null,arguments)});var dynCall_fi=Module["dynCall_fi"]=(function(){return Module["asm"]["dynCall_fi"].apply(null,arguments)});var dynCall_fif=Module["dynCall_fif"]=(function(){return Module["asm"]["dynCall_fif"].apply(null,arguments)});var dynCall_fiff=Module["dynCall_fiff"]=(function(){return Module["asm"]["dynCall_fiff"].apply(null,arguments)});var dynCall_i=Module["dynCall_i"]=(function(){return Module["asm"]["dynCall_i"].apply(null,arguments)});var dynCall_id=Module["dynCall_id"]=(function(){return Module["asm"]["dynCall_id"].apply(null,arguments)});var dynCall_idiii=Module["dynCall_idiii"]=(function(){return Module["asm"]["dynCall_idiii"].apply(null,arguments)});var dynCall_iffffffi=Module["dynCall_iffffffi"]=(function(){return Module["asm"]["dynCall_iffffffi"].apply(null,arguments)});var dynCall_iffii=Module["dynCall_iffii"]=(function(){return Module["asm"]["dynCall_iffii"].apply(null,arguments)});var dynCall_ii=Module["dynCall_ii"]=(function(){return Module["asm"]["dynCall_ii"].apply(null,arguments)});var dynCall_iif=Module["dynCall_iif"]=(function(){return Module["asm"]["dynCall_iif"].apply(null,arguments)});var dynCall_iiff=Module["dynCall_iiff"]=(function(){return Module["asm"]["dynCall_iiff"].apply(null,arguments)});var dynCall_iifff=Module["dynCall_iifff"]=(function(){return Module["asm"]["dynCall_iifff"].apply(null,arguments)});var dynCall_iiffffff=Module["dynCall_iiffffff"]=(function(){return Module["asm"]["dynCall_iiffffff"].apply(null,arguments)});var dynCall_iiffffffff=Module["dynCall_iiffffffff"]=(function(){return Module["asm"]["dynCall_iiffffffff"].apply(null,arguments)});var dynCall_iiffffi=Module["dynCall_iiffffi"]=(function(){return Module["asm"]["dynCall_iiffffi"].apply(null,arguments)});var dynCall_iiffffii=Module["dynCall_iiffffii"]=(function(){return Module["asm"]["dynCall_iiffffii"].apply(null,arguments)});var dynCall_iifffi=Module["dynCall_iifffi"]=(function(){return Module["asm"]["dynCall_iifffi"].apply(null,arguments)});var dynCall_iiffi=Module["dynCall_iiffi"]=(function(){return Module["asm"]["dynCall_iiffi"].apply(null,arguments)});var dynCall_iiffii=Module["dynCall_iiffii"]=(function(){return Module["asm"]["dynCall_iiffii"].apply(null,arguments)});var dynCall_iiffiii=Module["dynCall_iiffiii"]=(function(){return Module["asm"]["dynCall_iiffiii"].apply(null,arguments)});var dynCall_iifi=Module["dynCall_iifi"]=(function(){return Module["asm"]["dynCall_iifi"].apply(null,arguments)});var dynCall_iifii=Module["dynCall_iifii"]=(function(){return Module["asm"]["dynCall_iifii"].apply(null,arguments)});var dynCall_iifiii=Module["dynCall_iifiii"]=(function(){return Module["asm"]["dynCall_iifiii"].apply(null,arguments)});var dynCall_iii=Module["dynCall_iii"]=(function(){return Module["asm"]["dynCall_iii"].apply(null,arguments)});var dynCall_iiif=Module["dynCall_iiif"]=(function(){return Module["asm"]["dynCall_iiif"].apply(null,arguments)});var dynCall_iiiffff=Module["dynCall_iiiffff"]=(function(){return Module["asm"]["dynCall_iiiffff"].apply(null,arguments)});var dynCall_iiifffff=Module["dynCall_iiifffff"]=(function(){return Module["asm"]["dynCall_iiifffff"].apply(null,arguments)});var dynCall_iiiffffff=Module["dynCall_iiiffffff"]=(function(){return Module["asm"]["dynCall_iiiffffff"].apply(null,arguments)});var dynCall_iiiffffffff=Module["dynCall_iiiffffffff"]=(function(){return Module["asm"]["dynCall_iiiffffffff"].apply(null,arguments)});var dynCall_iiiffffffffiii=Module["dynCall_iiiffffffffiii"]=(function(){return Module["asm"]["dynCall_iiiffffffffiii"].apply(null,arguments)});var dynCall_iiifi=Module["dynCall_iiifi"]=(function(){return Module["asm"]["dynCall_iiifi"].apply(null,arguments)});var dynCall_iiifii=Module["dynCall_iiifii"]=(function(){return Module["asm"]["dynCall_iiifii"].apply(null,arguments)});var dynCall_iiifiii=Module["dynCall_iiifiii"]=(function(){return Module["asm"]["dynCall_iiifiii"].apply(null,arguments)});var dynCall_iiii=Module["dynCall_iiii"]=(function(){return Module["asm"]["dynCall_iiii"].apply(null,arguments)});var dynCall_iiiif=Module["dynCall_iiiif"]=(function(){return Module["asm"]["dynCall_iiiif"].apply(null,arguments)});var dynCall_iiiifi=Module["dynCall_iiiifi"]=(function(){return Module["asm"]["dynCall_iiiifi"].apply(null,arguments)});var dynCall_iiiifii=Module["dynCall_iiiifii"]=(function(){return Module["asm"]["dynCall_iiiifii"].apply(null,arguments)});var dynCall_iiiifiii=Module["dynCall_iiiifiii"]=(function(){return Module["asm"]["dynCall_iiiifiii"].apply(null,arguments)});var dynCall_iiiii=Module["dynCall_iiiii"]=(function(){return Module["asm"]["dynCall_iiiii"].apply(null,arguments)});var dynCall_iiiiiffffiiii=Module["dynCall_iiiiiffffiiii"]=(function(){return Module["asm"]["dynCall_iiiiiffffiiii"].apply(null,arguments)});var dynCall_iiiiii=Module["dynCall_iiiiii"]=(function(){return Module["asm"]["dynCall_iiiiii"].apply(null,arguments)});var dynCall_iiiiiifii=Module["dynCall_iiiiiifii"]=(function(){return Module["asm"]["dynCall_iiiiiifii"].apply(null,arguments)});var dynCall_iiiiiii=Module["dynCall_iiiiiii"]=(function(){return Module["asm"]["dynCall_iiiiiii"].apply(null,arguments)});var dynCall_iiiiiiif=Module["dynCall_iiiiiiif"]=(function(){return Module["asm"]["dynCall_iiiiiiif"].apply(null,arguments)});var dynCall_iiiiiiiff=Module["dynCall_iiiiiiiff"]=(function(){return Module["asm"]["dynCall_iiiiiiiff"].apply(null,arguments)});var dynCall_iiiiiiii=Module["dynCall_iiiiiiii"]=(function(){return Module["asm"]["dynCall_iiiiiiii"].apply(null,arguments)});var dynCall_iiiiiiiii=Module["dynCall_iiiiiiiii"]=(function(){return Module["asm"]["dynCall_iiiiiiiii"].apply(null,arguments)});var dynCall_iiiiiiiiii=Module["dynCall_iiiiiiiiii"]=(function(){return Module["asm"]["dynCall_iiiiiiiiii"].apply(null,arguments)});var dynCall_iiiiiiiiiii=Module["dynCall_iiiiiiiiiii"]=(function(){return Module["asm"]["dynCall_iiiiiiiiiii"].apply(null,arguments)});var dynCall_iiiiiiiiiiii=Module["dynCall_iiiiiiiiiiii"]=(function(){return Module["asm"]["dynCall_iiiiiiiiiiii"].apply(null,arguments)});var dynCall_iiiiiiiiiiiii=Module["dynCall_iiiiiiiiiiiii"]=(function(){return Module["asm"]["dynCall_iiiiiiiiiiiii"].apply(null,arguments)});var dynCall_iiiiiiiiiiiiii=Module["dynCall_iiiiiiiiiiiiii"]=(function(){return Module["asm"]["dynCall_iiiiiiiiiiiiii"].apply(null,arguments)});var dynCall_iiijji=Module["dynCall_iiijji"]=(function(){return Module["asm"]["dynCall_iiijji"].apply(null,arguments)});var dynCall_iij=Module["dynCall_iij"]=(function(){return Module["asm"]["dynCall_iij"].apply(null,arguments)});var dynCall_iiji=Module["dynCall_iiji"]=(function(){return Module["asm"]["dynCall_iiji"].apply(null,arguments)});var dynCall_iijiiii=Module["dynCall_iijiiii"]=(function(){return Module["asm"]["dynCall_iijiiii"].apply(null,arguments)});var dynCall_iijiiiii=Module["dynCall_iijiiiii"]=(function(){return Module["asm"]["dynCall_iijiiiii"].apply(null,arguments)});var dynCall_iijiiij=Module["dynCall_iijiiij"]=(function(){return Module["asm"]["dynCall_iijiiij"].apply(null,arguments)});var dynCall_iijji=Module["dynCall_iijji"]=(function(){return Module["asm"]["dynCall_iijji"].apply(null,arguments)});var dynCall_iijjji=Module["dynCall_iijjji"]=(function(){return Module["asm"]["dynCall_iijjji"].apply(null,arguments)});var dynCall_iji=Module["dynCall_iji"]=(function(){return Module["asm"]["dynCall_iji"].apply(null,arguments)});var dynCall_j=Module["dynCall_j"]=(function(){return Module["asm"]["dynCall_j"].apply(null,arguments)});var dynCall_jd=Module["dynCall_jd"]=(function(){return Module["asm"]["dynCall_jd"].apply(null,arguments)});var dynCall_jf=Module["dynCall_jf"]=(function(){return Module["asm"]["dynCall_jf"].apply(null,arguments)});var dynCall_ji=Module["dynCall_ji"]=(function(){return Module["asm"]["dynCall_ji"].apply(null,arguments)});var dynCall_jii=Module["dynCall_jii"]=(function(){return Module["asm"]["dynCall_jii"].apply(null,arguments)});var dynCall_jiii=Module["dynCall_jiii"]=(function(){return Module["asm"]["dynCall_jiii"].apply(null,arguments)});var dynCall_jiij=Module["dynCall_jiij"]=(function(){return Module["asm"]["dynCall_jiij"].apply(null,arguments)});var dynCall_jij=Module["dynCall_jij"]=(function(){return Module["asm"]["dynCall_jij"].apply(null,arguments)});var dynCall_jiji=Module["dynCall_jiji"]=(function(){return Module["asm"]["dynCall_jiji"].apply(null,arguments)});var dynCall_jijii=Module["dynCall_jijii"]=(function(){return Module["asm"]["dynCall_jijii"].apply(null,arguments)});var dynCall_jijj=Module["dynCall_jijj"]=(function(){return Module["asm"]["dynCall_jijj"].apply(null,arguments)});var dynCall_jj=Module["dynCall_jj"]=(function(){return Module["asm"]["dynCall_jj"].apply(null,arguments)});var dynCall_v=Module["dynCall_v"]=(function(){return Module["asm"]["dynCall_v"].apply(null,arguments)});var dynCall_vi=Module["dynCall_vi"]=(function(){return Module["asm"]["dynCall_vi"].apply(null,arguments)});var dynCall_vid=Module["dynCall_vid"]=(function(){return Module["asm"]["dynCall_vid"].apply(null,arguments)});var dynCall_vif=Module["dynCall_vif"]=(function(){return Module["asm"]["dynCall_vif"].apply(null,arguments)});var dynCall_viff=Module["dynCall_viff"]=(function(){return Module["asm"]["dynCall_viff"].apply(null,arguments)});var dynCall_viffff=Module["dynCall_viffff"]=(function(){return Module["asm"]["dynCall_viffff"].apply(null,arguments)});var dynCall_vifffffi=Module["dynCall_vifffffi"]=(function(){return Module["asm"]["dynCall_vifffffi"].apply(null,arguments)});var dynCall_vii=Module["dynCall_vii"]=(function(){return Module["asm"]["dynCall_vii"].apply(null,arguments)});var dynCall_viidiii=Module["dynCall_viidiii"]=(function(){return Module["asm"]["dynCall_viidiii"].apply(null,arguments)});var dynCall_viiffi=Module["dynCall_viiffi"]=(function(){return Module["asm"]["dynCall_viiffi"].apply(null,arguments)});var dynCall_viii=Module["dynCall_viii"]=(function(){return Module["asm"]["dynCall_viii"].apply(null,arguments)});var dynCall_viiii=Module["dynCall_viiii"]=(function(){return Module["asm"]["dynCall_viiii"].apply(null,arguments)});var dynCall_viiiii=Module["dynCall_viiiii"]=(function(){return Module["asm"]["dynCall_viiiii"].apply(null,arguments)});var dynCall_viiiiii=Module["dynCall_viiiiii"]=(function(){return Module["asm"]["dynCall_viiiiii"].apply(null,arguments)});var dynCall_viiiiiii=Module["dynCall_viiiiiii"]=(function(){return Module["asm"]["dynCall_viiiiiii"].apply(null,arguments)});var dynCall_viiiiiiii=Module["dynCall_viiiiiiii"]=(function(){return Module["asm"]["dynCall_viiiiiiii"].apply(null,arguments)});var dynCall_viiiiiiiii=Module["dynCall_viiiiiiiii"]=(function(){return Module["asm"]["dynCall_viiiiiiiii"].apply(null,arguments)});var dynCall_viiiiiiiiii=Module["dynCall_viiiiiiiiii"]=(function(){return Module["asm"]["dynCall_viiiiiiiiii"].apply(null,arguments)});var dynCall_viiiiiiiiiii=Module["dynCall_viiiiiiiiiii"]=(function(){return Module["asm"]["dynCall_viiiiiiiiiii"].apply(null,arguments)});var dynCall_viij=Module["dynCall_viij"]=(function(){return Module["asm"]["dynCall_viij"].apply(null,arguments)});var dynCall_vij=Module["dynCall_vij"]=(function(){return Module["asm"]["dynCall_vij"].apply(null,arguments)});var dynCall_vijii=Module["dynCall_vijii"]=(function(){return Module["asm"]["dynCall_vijii"].apply(null,arguments)});var dynCall_vijji=Module["dynCall_vijji"]=(function(){return Module["asm"]["dynCall_vijji"].apply(null,arguments)});var dynCall_vj=Module["dynCall_vj"]=(function(){return Module["asm"]["dynCall_vj"].apply(null,arguments)});Module["dynCall_X"]=dynCall_X;Module["dynCall_d"]=dynCall_d;Module["dynCall_dd"]=dynCall_dd;Module["dynCall_ddd"]=dynCall_ddd;Module["dynCall_ddi"]=dynCall_ddi;Module["dynCall_di"]=dynCall_di;Module["dynCall_did"]=dynCall_did;Module["dynCall_didd"]=dynCall_didd;Module["dynCall_ff"]=dynCall_ff;Module["dynCall_fff"]=dynCall_fff;Module["dynCall_ffi"]=dynCall_ffi;Module["dynCall_fi"]=dynCall_fi;Module["dynCall_fif"]=dynCall_fif;Module["dynCall_fiff"]=dynCall_fiff;Module["dynCall_i"]=dynCall_i;Module["dynCall_id"]=dynCall_id;Module["dynCall_idiii"]=dynCall_idiii;Module["dynCall_iffffffi"]=dynCall_iffffffi;Module["dynCall_iffii"]=dynCall_iffii;Module["dynCall_ii"]=dynCall_ii;Module["dynCall_iif"]=dynCall_iif;Module["dynCall_iiff"]=dynCall_iiff;Module["dynCall_iifff"]=dynCall_iifff;Module["dynCall_iiffffff"]=dynCall_iiffffff;Module["dynCall_iiffffffff"]=dynCall_iiffffffff;Module["dynCall_iiffffi"]=dynCall_iiffffi;Module["dynCall_iiffffii"]=dynCall_iiffffii;Module["dynCall_iifffi"]=dynCall_iifffi;Module["dynCall_iiffi"]=dynCall_iiffi;Module["dynCall_iiffii"]=dynCall_iiffii;Module["dynCall_iiffiii"]=dynCall_iiffiii;Module["dynCall_iifi"]=dynCall_iifi;Module["dynCall_iifii"]=dynCall_iifii;Module["dynCall_iifiii"]=dynCall_iifiii;Module["dynCall_iii"]=dynCall_iii;Module["dynCall_iiif"]=dynCall_iiif;Module["dynCall_iiiffff"]=dynCall_iiiffff;Module["dynCall_iiifffff"]=dynCall_iiifffff;Module["dynCall_iiiffffff"]=dynCall_iiiffffff;Module["dynCall_iiiffffffff"]=dynCall_iiiffffffff;Module["dynCall_iiiffffffffiii"]=dynCall_iiiffffffffiii;Module["dynCall_iiifi"]=dynCall_iiifi;Module["dynCall_iiifii"]=dynCall_iiifii;Module["dynCall_iiifiii"]=dynCall_iiifiii;Module["dynCall_iiii"]=dynCall_iiii;Module["dynCall_iiiif"]=dynCall_iiiif;Module["dynCall_iiiifi"]=dynCall_iiiifi;Module["dynCall_iiiifii"]=dynCall_iiiifii;Module["dynCall_iiiifiii"]=dynCall_iiiifiii;Module["dynCall_iiiii"]=dynCall_iiiii;Module["dynCall_iiiiiffffiiii"]=dynCall_iiiiiffffiiii;Module["dynCall_iiiiii"]=dynCall_iiiiii;Module["dynCall_iiiiiifii"]=dynCall_iiiiiifii;Module["dynCall_iiiiiii"]=dynCall_iiiiiii;Module["dynCall_iiiiiiif"]=dynCall_iiiiiiif;Module["dynCall_iiiiiiiff"]=dynCall_iiiiiiiff;Module["dynCall_iiiiiiii"]=dynCall_iiiiiiii;Module["dynCall_iiiiiiiii"]=dynCall_iiiiiiiii;Module["dynCall_iiiiiiiiii"]=dynCall_iiiiiiiiii;Module["dynCall_iiiiiiiiiii"]=dynCall_iiiiiiiiiii;Module["dynCall_iiiiiiiiiiii"]=dynCall_iiiiiiiiiiii;Module["dynCall_iiiiiiiiiiiii"]=dynCall_iiiiiiiiiiiii;Module["dynCall_iiiiiiiiiiiiii"]=dynCall_iiiiiiiiiiiiii;Module["dynCall_iiijji"]=dynCall_iiijji;Module["dynCall_iij"]=dynCall_iij;Module["dynCall_iiji"]=dynCall_iiji;Module["dynCall_iijiiii"]=dynCall_iijiiii;Module["dynCall_iijiiiii"]=dynCall_iijiiiii;Module["dynCall_iijiiij"]=dynCall_iijiiij;Module["dynCall_iijji"]=dynCall_iijji;Module["dynCall_iijjji"]=dynCall_iijjji;Module["dynCall_iji"]=dynCall_iji;Module["dynCall_j"]=dynCall_j;Module["dynCall_jd"]=dynCall_jd;Module["dynCall_jf"]=dynCall_jf;Module["dynCall_ji"]=dynCall_ji;Module["dynCall_jii"]=dynCall_jii;Module["dynCall_jiii"]=dynCall_jiii;Module["dynCall_jiij"]=dynCall_jiij;Module["dynCall_jij"]=dynCall_jij;Module["dynCall_jiji"]=dynCall_jiji;Module["dynCall_jijii"]=dynCall_jijii;Module["dynCall_jijj"]=dynCall_jijj;Module["dynCall_jj"]=dynCall_jj;Module["dynCall_v"]=dynCall_v;Module["dynCall_vi"]=dynCall_vi;Module["dynCall_vid"]=dynCall_vid;Module["dynCall_vif"]=dynCall_vif;Module["dynCall_viff"]=dynCall_viff;Module["dynCall_viffff"]=dynCall_viffff;Module["dynCall_vifffffi"]=dynCall_vifffffi;Module["dynCall_vii"]=dynCall_vii;Module["dynCall_viidiii"]=dynCall_viidiii;Module["dynCall_viiffi"]=dynCall_viiffi;Module["dynCall_viii"]=dynCall_viii;Module["dynCall_viiii"]=dynCall_viiii;Module["dynCall_viiiii"]=dynCall_viiiii;Module["dynCall_viiiiii"]=dynCall_viiiiii;Module["dynCall_viiiiiii"]=dynCall_viiiiiii;Module["dynCall_viiiiiiii"]=dynCall_viiiiiiii;Module["dynCall_viiiiiiiii"]=dynCall_viiiiiiiii;Module["dynCall_viiiiiiiiii"]=dynCall_viiiiiiiiii;Module["dynCall_viiiiiiiiiii"]=dynCall_viiiiiiiiiii;Module["dynCall_viij"]=dynCall_viij;Module["dynCall_vij"]=dynCall_vij;Module["dynCall_vijii"]=dynCall_vijii;Module["dynCall_vijji"]=dynCall_vijji;Module["dynCall_vj"]=dynCall_vj;Module["asm"]=asm;Module["ccall"]=ccall;Module["cwrap"]=cwrap;Module["setValue"]=setValue;Module["getValue"]=getValue;Module["UTF8ToString"]=UTF8ToString;Module["FS_createPath"]=FS.createPath;Module["FS_createDataFile"]=FS.createDataFile;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};function run(args){args=args||Module["arguments"];if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]&&status===0){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status)}Module["quit"](status,new ExitStatus(status))}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}if(what!==undefined){out(what);err(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;throw"abort("+what+"). Build with -s ASSERTIONS=1 for more info."}Module["abort"]=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}Module["noExitRuntime"]=true;run()
+
+
+
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/wasm/mono.wasm b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/wasm/mono.wasm
new file mode 100755
index 0000000..a11aabf
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/wasm/mono.wasm
Binary files differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/appStartup.js b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/appStartup.js
new file mode 100644
index 0000000..4f11b64
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/appStartup.js
@@ -0,0 +1,15 @@
+import { group, benchmark } from './lib/minibench/minibench.js';
+import { BlazorApp } from './util/BlazorApp.js';
+
+group('App Startup', () => {
+
+ benchmark('Time to first UI', async () => {
+ const app = new BlazorApp();
+ try {
+ await app.start();
+ } finally {
+ app.dispose();
+ }
+ });
+
+});
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/index.js b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/index.js
new file mode 100644
index 0000000..4600066
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/index.js
@@ -0,0 +1,6 @@
+import { HtmlUI } from './lib/minibench/minibench.js';
+import './appStartup.js';
+import './renderList.js';
+import './jsonHandling.js';
+
+new HtmlUI('E2E Performance', '#display');
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/jsonHandling.js b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/jsonHandling.js
new file mode 100644
index 0000000..4f6a311
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/jsonHandling.js
@@ -0,0 +1,57 @@
+import { group, benchmark, setup, teardown } from './lib/minibench/minibench.js';
+import { BlazorApp } from './util/BlazorApp.js';
+import { receiveEvent } from './util/BenchmarkEvents.js';
+import { setInputValue } from './util/DOM.js';
+import { largeJsonToDeserialize, largeObjectToSerialize } from './jsonHandlingData.js';
+
+group('JSON handling', () => {
+ let app;
+
+ setup(async () => {
+ app = new BlazorApp();
+ await app.start();
+ app.navigateTo('json');
+ });
+
+ teardown(() => app.dispose());
+
+ benchmark('Serialize 1kb', () =>
+ benchmarkJson(app, '#serialize-small', '#serialized-length', 935));
+
+ benchmark('Serialize 340kb', () =>
+ benchmarkJson(app, '#serialize-large', '#serialized-length', 339803));
+
+ benchmark('Deserialize 1kb', () =>
+ benchmarkJson(app, '#deserialize-small', '#deserialized-count', 5));
+
+ benchmark('Deserialize 340kb', () =>
+ benchmarkJson(app, '#deserialize-large', '#deserialized-count', 1365));
+
+ benchmark('Serialize 340kb (JavaScript)', () => {
+ const json = JSON.stringify(largeObjectToSerialize);
+ if (json.length !== 339803) {
+ throw new Error(`Incorrect length: ${json.length}`);
+ }
+ });
+
+ benchmark('Deserialize 340kb (JavaScript)', () => {
+ const parsed = JSON.parse(largeJsonToDeserialize);
+ if (parsed.name !== 'CEO - Subordinate 0') {
+ throw new Error('Incorrect result');
+ }
+ });
+});
+
+async function benchmarkJson(app, buttonSelector, resultSelector, expectedResult) {
+ const appDocument = app.window.document;
+ appDocument.querySelector('#reset-all').click();
+
+ let nextRenderCompletion = receiveEvent('Finished JSON processing');
+ appDocument.querySelector(buttonSelector).click();
+ await nextRenderCompletion;
+
+ const resultElem = appDocument.querySelector(resultSelector);
+ if (resultElem.textContent != expectedResult.toString()) {
+ throw new Error(`Incorrect result: ${resultElem.textContent}`);
+ }
+}
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/jsonHandlingData.js b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/jsonHandlingData.js
new file mode 100644
index 0000000..f3274a0
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/jsonHandlingData.js
@@ -0,0 +1,2 @@
+export const largeObjectToSerialize = { "name": "CEO - Subordinate 0", "salary": 10000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0", "salary": 5000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 3333333, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 3333333, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 3333333, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 3333333, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1", "salary": 5000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 3333333, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 3333333, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 3333333, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 3333333, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2", "salary": 5000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 3333333, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 3333333, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 3333333, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 3333333, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3", "salary": 5000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 3333333, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 3333333, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 3333333, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 3333333, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } };
+export const largeJsonToDeserialize = '{ "name": "CEO - Subordinate 0", "salary": 10000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0", "salary": 5000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 3333333, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 3333333, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 3333333, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 3333333, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1", "salary": 5000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 3333333, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 3333333, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 3333333, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 3333333, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2", "salary": 5000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 3333333, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 3333333, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 3333333, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 3333333, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3", "salary": 5000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 3333333, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 3333333, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 3333333, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 3333333, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2", "salary": 2500000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3", "salary": 2500000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 0", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 0 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 1", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 1 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 2", "salary": 2000000, "isAdmin": true, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 2 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 3", "salary": 2000000, "isAdmin": false, "subordinates": [{ "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 0", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 1", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 2", "salary": 1666666, "isAdmin": true, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }, { "name": "CEO - Subordinate 0 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 3 - Subordinate 3", "salary": 1666666, "isAdmin": false, "subordinates": [], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }], "securityClearances": { "Alpha": false, "Beta": false, "Gamma": false, "Delta": false, "Epsilon": true } }';
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/lib/bootstrap.min.css b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/lib/bootstrap.min.css
new file mode 100644
index 0000000..92e3fe8
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/lib/bootstrap.min.css
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap v4.3.1 (https://getbootstrap.com/)
+ * Copyright 2011-2019 The Bootstrap Authors
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:center right calc(.375em + .1875rem);background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc((1em + .75rem) * 3 / 4 + 1.75rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip{display:block}.form-control-file.is-valid~.valid-feedback,.form-control-file.is-valid~.valid-tooltip,.was-validated .form-control-file:valid~.valid-feedback,.was-validated .form-control-file:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{border-color:#28a745}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E");background-repeat:no-repeat;background-position:center right calc(.375em + .1875rem);background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc((1em + .75rem) * 3 / 4 + 1.75rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip{display:block}.form-control-file.is-invalid~.invalid-feedback,.form-control-file.is-invalid~.invalid-tooltip,.was-validated .form-control-file:invalid~.invalid-feedback,.was-validated .form-control-file:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#dc3545}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#adb5bd solid 1px}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:no-repeat 50%/50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + .75rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:calc(1rem + .4rem);padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-ms-flexbox;display:flex;-ms-flex:1 0 0%;flex:1 0 0%;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion>.card{overflow:hidden}.accordion>.card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion>.card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion>.card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.accordion>.card .card-header{margin-bottom:-1px}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-horizontal{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}@media (min-width:576px){.list-group-horizontal-sm{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-sm .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-sm .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:768px){.list-group-horizontal-md{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-md .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-md .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:992px){.list-group-horizontal-lg{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-lg .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-lg .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:1200px){.list-group-horizontal-xl{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xl .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-xl .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush .list-group-item:last-child{margin-bottom:-1px}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{margin-bottom:0;border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}a.close.disabled{pointer-events:none}.toast{max-width:350px;overflow:hidden;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-50px);transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal-dialog-scrollable{display:-ms-flexbox;display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);content:""}.modal-dialog-centered.modal-dialog-scrollable{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #dee2e6;border-bottom-right-radius:.3rem;border-bottom-left-radius:.3rem}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top]>.arrow::before,.bs-popover-top>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow::after,.bs-popover-top>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow::before,.bs-popover-right>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow::after,.bs-popover-right>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom]>.arrow::before,.bs-popover-bottom>.arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow::after,.bs-popover-bottom>.arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow::before,.bs-popover-left>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow::after,.bs-popover-left>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:0s .6s opacity}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:no-repeat 50%/100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;overflow-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}}
+/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/lib/minibench/README.md b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/lib/minibench/README.md
new file mode 100644
index 0000000..4eae50b
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/lib/minibench/README.md
@@ -0,0 +1,17 @@
+# Minibench
+
+A simple harness for benchmarking JavaScript code.
+
+Supports both synchronous and asynchronous code being benchmarked, plus both sync/async setup and teardown logic.
+
+## Sample
+
+See `sample-benchmarks.js`. To run it, serve `sample.html` from a local webserver.
+
+## Caveats
+
+Absolutely no support provided.
+
+## License
+
+MIT
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/lib/minibench/minibench.js b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/lib/minibench/minibench.js
new file mode 100644
index 0000000..8214419
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/lib/minibench/minibench.js
@@ -0,0 +1,486 @@
+/** minibench - https://github.com/SteveSanderson/minibench */
+class EventEmitter {
+ constructor() {
+ this.eventListeners = {};
+ }
+
+ on(eventName, callback, options) {
+ const listeners = this.eventListeners[eventName] = this.eventListeners[eventName] || [];
+ const handler = argsArray => {
+ if (options && options.once) {
+ const thisIndex = listeners.indexOf(handler);
+ listeners.splice(thisIndex, 1);
+ }
+
+ callback.apply(null, argsArray);
+ };
+
+ listeners.push(handler);
+ }
+
+ once(eventName, callback) {
+ this.on(eventName, callback, { once: true });
+ }
+
+ _emit(eventName, ...args) {
+ const listeners = this.eventListeners[eventName];
+ listeners && listeners.forEach(l => l.call(null, args));
+ }
+}
+
+let currentPromise = new Promise(resolve => resolve());
+
+function addToWorkQueue(fn) {
+ const cancelHandle = new CancelHandle();
+ currentPromise = currentPromise.then(() => cancelHandle.isCancelled || fn());
+ return cancelHandle;
+}
+
+class CancelHandle {
+ cancel() {
+ this.isCancelled = true;
+ }
+}
+
+const queue = [];
+const messageIdentifier = 'nextTick-' + Math.random();
+
+function nextTick(callback) {
+ queue.push(callback);
+ window.postMessage(messageIdentifier, '*');
+}
+
+function nextTickPromise() {
+ return new Promise(resolve => nextTick(resolve));
+}
+
+window.addEventListener('message', evt => {
+ if (evt.data === messageIdentifier) {
+ evt.stopPropagation();
+ const callback = queue.shift();
+ callback && callback();
+ }
+});
+
+/*
+ To work around browsers' current nonsupport for high-resolution timers
+ (since Spectre etc.), the approach used here is to group executions into
+ blocks of roughly fixed duration.
+
+ - In each block, we execute the test code as many times as we can until
+ the end of the block duration, without even yielding the thread if
+ it's a synchronous call. We count how many executions completed. It
+ will always be at least 1, even if the single call duration is longer
+ than the intended block duration.
+ - Since each block is of a significant duration (e.g., 0.5 sec), the low
+ resolution of the timer doesn't matter. We can divide the measured block
+ duration by the measured number of executions to estimate the per-call
+ duration.
+ - Each block will give us a different estimate. We want to return the *best*
+ timing, not the mean or median. That's the most accurate predictor of the
+ true execution cost, as hopefully there will have been at least one block
+ during which there was no unrelated GC cycle or other background contention.
+ - We keep running blocks until some larger timeout occurs *and* we've done
+ at least some minimum number of executions.
+
+ Note that this approach does *not* allow for per-execution setup/teardown
+ logic whose timing is separated from the code under test. Because of the
+ low timer precision, there would be no way to separate the setup duration
+ from the test code duration if they were interleaved too quickly (e.g.,
+ if the test code was < 1ms). We do support per-benchmark setup/teardown,
+ but not per-execution.
+*/
+
+const totalDurationMs = 6000;
+const blockDurationMs = 400;
+const minExecutions = 10;
+
+class ExecutionTimer {
+ constructor(fn) {
+ this._fn = fn;
+ }
+
+ async run(progressCallback, runOptions) {
+ this._isAborted = false;
+ this.numExecutions = 0;
+ this.bestExecutionsPerMs = null;
+
+ // 'verify only' means just do a single execution to check it doesn't error
+ const targetBlockDuration = runOptions.verifyOnly ? 1 : blockDurationMs;
+ const targetMinExecutions = runOptions.verifyOnly ? 1 : minExecutions;
+ const targetTotalDuration = runOptions.verifyOnly ? 0 : totalDurationMs;
+
+ const endTime = performance.now() + targetTotalDuration;
+ while (performance.now() < endTime || this.numExecutions < targetMinExecutions) {
+ if (this._isAborted) {
+ this.numExecutions = 0;
+ this.bestExecutionsPerMs = null;
+ break;
+ }
+
+ const { blockDuration, blockExecutions } = await this._runBlock(targetBlockDuration);
+ this.numExecutions += blockExecutions;
+
+ const blockExecutionsPerMs = blockExecutions / blockDuration;
+ if (blockExecutionsPerMs > this.bestExecutionsPerMs) {
+ this.bestExecutionsPerMs = blockExecutionsPerMs;
+ }
+
+ progressCallback && progressCallback();
+ }
+ }
+
+ abort() {
+ this._isAborted = true;
+ }
+
+ async _runBlock(targetBlockDuration) {
+ await nextTickPromise();
+
+ const blockStartTime = performance.now();
+ const blockEndTime = blockStartTime + targetBlockDuration;
+ let executions = 0;
+
+ while ((performance.now() < blockEndTime) && !this._isAborted) {
+ const syncResult = this._fn();
+
+ // Only yield the thread if we really have to
+ if (syncResult instanceof Promise) {
+ await syncResult;
+ }
+
+ executions++;
+ }
+
+ return {
+ blockDuration: performance.now() - blockStartTime,
+ blockExecutions: executions
+ };
+ }
+}
+
+class Benchmark extends EventEmitter {
+ constructor(group, name, fn, options) {
+ super();
+ this._group = group;
+ this.name = name;
+ this._fn = fn;
+ this._options = options;
+ this._state = { status: BenchmarkStatus.idle };
+ }
+
+ get state() {
+ return this._state;
+ }
+
+ run(runOptions) {
+ this._currentRunWasAborted = false;
+ if (this._state.status === BenchmarkStatus.idle) {
+ this._updateState({ status: BenchmarkStatus.queued });
+ this.workQueueCancelHandle = addToWorkQueue(async () => {
+ try {
+ if (!(runOptions && runOptions.skipGroupSetup)) {
+ await this._group.runSetup();
+ }
+
+ this._updateState({ status: BenchmarkStatus.running });
+ this._options && this._options.setup && await this._options.setup();
+ await this._measureTimings(runOptions);
+
+ this._options && this._options.teardown && await this._options.teardown();
+ if (this._currentRunWasAborted || !(runOptions && runOptions.skipGroupTeardown)) {
+ await this._group.runTeardown();
+ }
+
+ this._updateState({ status: BenchmarkStatus.idle });
+ } catch (ex) {
+ this._updateState({ status: BenchmarkStatus.error });
+ console.error(ex);
+ }
+ });
+ }
+ }
+
+ stop() {
+ this._currentRunWasAborted = true;
+ this.timer && this.timer.abort();
+ this.workQueueCancelHandle && this.workQueueCancelHandle.cancel();
+ this._updateState({ status: BenchmarkStatus.idle });
+ }
+
+ async _measureTimings(runOptions) {
+ this._updateState({ numExecutions: 0, estimatedExecutionDurationMs: null });
+
+ this.timer = new ExecutionTimer(this._fn);
+ const updateTimingsDisplay = () => {
+ this._updateState({
+ numExecutions: this.timer.numExecutions,
+ estimatedExecutionDurationMs: this.timer.bestExecutionsPerMs ? 1 / this.timer.bestExecutionsPerMs : null
+ });
+ };
+
+ await this.timer.run(updateTimingsDisplay, { verifyOnly: runOptions.verifyOnly });
+ updateTimingsDisplay();
+ this.timer = null;
+ }
+
+ _updateState(newState) {
+ Object.assign(this._state, newState);
+ this._emit('changed', this._state);
+ }
+}
+
+const BenchmarkStatus = {
+ idle: 0,
+ queued: 1,
+ running: 2,
+ error: 3,
+};
+
+class Group extends EventEmitter {
+ constructor(name) {
+ super();
+ this.name = name;
+ this.benchmarks = [];
+ }
+
+ add(benchmark) {
+ this.benchmarks.push(benchmark);
+ benchmark.on('changed', () => this._emit('changed'));
+ }
+
+ runAll(runOptions) {
+ this.benchmarks.forEach((benchmark, index) => {
+ benchmark.run(Object.assign({
+ skipGroupSetup: index > 0,
+ skipGroupTeardown: index < this.benchmarks.length - 1,
+ }, runOptions));
+ });
+ }
+
+ stopAll() {
+ this.benchmarks.forEach(b => b.stop());
+ }
+
+ async runSetup() {
+ this.setup && await this.setup();
+ }
+
+ async runTeardown() {
+ this.teardown && await this.teardown();
+ }
+
+ get status() {
+ return this.benchmarks.reduce(
+ (prev, next) => Math.max(prev, next.state.status),
+ BenchmarkStatus.idle
+ );
+ }
+}
+
+const groups = [];
+
+function group(name, configure) {
+ groups.push(new Group(name));
+ configure && configure();
+}
+
+function benchmark(name, fn, options) {
+ const group = groups[groups.length - 1];
+ group.add(new Benchmark(group, name, fn, options));
+}
+
+function setup(fn) {
+ groups[groups.length - 1].setup = fn;
+}
+
+function teardown(fn) {
+ groups[groups.length - 1].teardown = fn;
+}
+
+class BenchmarkDisplay {
+ constructor(htmlUi, benchmark) {
+ this.benchmark = benchmark;
+ this.elem = document.createElement('tr');
+
+ const headerCol = this.elem.appendChild(document.createElement('th'));
+ headerCol.className = 'pl-4';
+ headerCol.textContent = benchmark.name;
+ headerCol.setAttribute('scope', 'row');
+
+ const progressCol = this.elem.appendChild(document.createElement('td'));
+ this.numExecutionsText = progressCol.appendChild(document.createTextNode(''));
+
+ const timingCol = this.elem.appendChild(document.createElement('td'));
+ this.executionDurationText = timingCol.appendChild(document.createElement('span'));
+
+ const runCol = this.elem.appendChild(document.createElement('td'));
+ runCol.className = 'pr-4';
+ runCol.setAttribute('align', 'right');
+ this.runButton = document.createElement('a');
+ this.runButton.className = 'run-button';
+ runCol.appendChild(this.runButton);
+ this.runButton.textContent = 'Run';
+ this.runButton.onclick = evt => {
+ evt.preventDefault();
+ this.benchmark.run(htmlUi.globalRunOptions);
+ };
+
+ benchmark.on('changed', state => this.updateDisplay(state));
+ this.updateDisplay(this.benchmark.state);
+ }
+
+ updateDisplay(state) {
+ const benchmark = this.benchmark;
+ this.elem.className = rowClass(state.status);
+ this.runButton.textContent = runButtonText(state.status);
+ this.numExecutionsText.textContent = state.numExecutions
+ ? `Executions: ${state.numExecutions}` : '';
+ this.executionDurationText.innerHTML = state.estimatedExecutionDurationMs
+ ? `Duration: <b>${parseFloat(state.estimatedExecutionDurationMs.toPrecision(3))}ms</b>` : '';
+ if (state.status === BenchmarkStatus.idle) {
+ this.runButton.setAttribute('href', '');
+ } else {
+ this.runButton.removeAttribute('href');
+ if (state.status === BenchmarkStatus.error) {
+ this.numExecutionsText.textContent = 'Error - see console';
+ }
+ }
+ }
+}
+
+function runButtonText(status) {
+ switch (status) {
+ case BenchmarkStatus.idle:
+ case BenchmarkStatus.error:
+ return 'Run';
+ case BenchmarkStatus.queued:
+ return 'Waiting...';
+ case BenchmarkStatus.running:
+ return 'Running...';
+ default:
+ throw new Error(`Unknown status: ${status}`);
+ }
+}
+
+function rowClass(status) {
+ switch (status) {
+ case BenchmarkStatus.idle:
+ return 'benchmark-idle';
+ case BenchmarkStatus.queued:
+ return 'benchmark-waiting';
+ case BenchmarkStatus.running:
+ return 'benchmark-running';
+ case BenchmarkStatus.error:
+ return 'benchmark-error';
+ default:
+ throw new Error(`Unknown status: ${status}`);
+ }
+}
+
+class GroupDisplay {
+ constructor(htmlUi, group) {
+ this.group = group;
+
+ this.elem = document.createElement('div');
+ this.elem.className = 'my-3 py-2 bg-white rounded shadow-sm';
+
+ const headerContainer = this.elem.appendChild(document.createElement('div'));
+ headerContainer.className = 'd-flex align-items-baseline px-4';
+ const header = headerContainer.appendChild(document.createElement('h5'));
+ header.className = 'py-2';
+ header.textContent = group.name;
+
+ this.runButton = document.createElement('a');
+ this.runButton.className = 'ml-auto run-button';
+ this.runButton.setAttribute('href', '');
+ headerContainer.appendChild(this.runButton);
+ this.runButton.textContent = 'Run all';
+ this.runButton.onclick = evt => {
+ evt.preventDefault();
+ group.runAll(htmlUi.globalRunOptions);
+ };
+
+ const table = this.elem.appendChild(document.createElement('table'));
+ table.className = 'table mb-0 benchmarks';
+ const tbody = table.appendChild(document.createElement('tbody'));
+
+ group.benchmarks.forEach(benchmark => {
+ const benchmarkDisplay = new BenchmarkDisplay(htmlUi, benchmark);
+ tbody.appendChild(benchmarkDisplay.elem);
+ });
+
+ group.on('changed', () => this.updateDisplay());
+ this.updateDisplay();
+ }
+
+ updateDisplay() {
+ const canRun = this.group.status === BenchmarkStatus.idle;
+ this.runButton.style.display = canRun ? 'block' : 'none';
+ }
+}
+
+class HtmlUI {
+ constructor(title, selector) {
+ this.containerElement = document.querySelector(selector);
+
+ const headerDiv = this.containerElement.appendChild(document.createElement('div'));
+ headerDiv.className = 'd-flex align-items-center';
+
+ const header = headerDiv.appendChild(document.createElement('h2'));
+ header.className = 'mx-3 flex-grow-1';
+ header.textContent = title;
+
+ const verifyCheckboxLabel = document.createElement('label');
+ verifyCheckboxLabel.className = 'ml-auto mr-5';
+ headerDiv.appendChild(verifyCheckboxLabel);
+ this.verifyCheckbox = verifyCheckboxLabel.appendChild(document.createElement('input'));
+ this.verifyCheckbox.type = 'checkbox';
+ this.verifyCheckbox.className = 'mr-2';
+ verifyCheckboxLabel.appendChild(document.createTextNode('Verify only'));
+
+ this.runButton = document.createElement('button');
+ this.runButton.className = 'btn btn-success ml-auto px-4 run-button';
+ headerDiv.appendChild(this.runButton);
+ this.runButton.textContent = 'Run all';
+ this.runButton.onclick = () => {
+ groups.forEach(g => g.runAll(this.globalRunOptions));
+ };
+
+ this.stopButton = document.createElement('button');
+ this.stopButton.className = 'btn btn-danger ml-auto px-4 stop-button';
+ headerDiv.appendChild(this.stopButton);
+ this.stopButton.textContent = 'Stop';
+ this.stopButton.onclick = () => {
+ groups.forEach(g => g.stopAll());
+ };
+
+ groups.forEach(group$$1 => {
+ const groupDisplay = new GroupDisplay(this, group$$1);
+ this.containerElement.appendChild(groupDisplay.elem);
+ group$$1.on('changed', () => this.updateDisplay());
+ });
+
+ this.updateDisplay();
+ }
+
+ updateDisplay() {
+ const areAllIdle = groups.reduce(
+ (prev, next) => prev && next.status === BenchmarkStatus.idle,
+ true
+ );
+ this.runButton.style.display = areAllIdle ? 'block' : 'none';
+ this.stopButton.style.display = areAllIdle ? 'none' : 'block';
+ }
+
+ get globalRunOptions() {
+ return { verifyOnly: this.verifyCheckbox.checked };
+ }
+}
+
+/**
+ * minibench
+ * https://github.com/SteveSanderson/minibench
+ */
+
+export { group, benchmark, setup, teardown, HtmlUI };
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/lib/minibench/style.css b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/lib/minibench/style.css
new file mode 100644
index 0000000..788330d
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/lib/minibench/style.css
@@ -0,0 +1,19 @@
+body { padding: 2rem 0; background: #e8e8e8; }
+.run-button::before {
+ content: '▶';
+ font-family: 'Segoe UI Symbol', sans-serif;
+ font-size: 90%;
+ margin-right: 8px;
+}
+.run-button:hover { text-decoration: none; }
+.benchmarks th { width: 40%; }
+.benchmarks td:nth-child(1) { width: 20%; color: #888; }
+.benchmarks td:nth-child(2) { width: 20%; color: #888; }
+.benchmarks td:nth-child(3) { width: 20%; color: #888; }
+.benchmarks b { color: black; font-weight: normal; }
+.benchmark-running { background-color: #fff7a1; }
+.benchmark-waiting { background-color: #f1f1f1; color: #bebebe; }
+.benchmark-error { background-color: #ffa1a1; }
+.benchmark-running .run-button::before, .benchmark-waiting .run-button::before {
+ display: none;
+}
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/renderList.js b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/renderList.js
new file mode 100644
index 0000000..68bf32d
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/renderList.js
@@ -0,0 +1,45 @@
+import { group, benchmark, setup, teardown } from './lib/minibench/minibench.js';
+import { BlazorApp } from './util/BlazorApp.js';
+import { receiveEvent } from './util/BenchmarkEvents.js';
+import { setInputValue } from './util/DOM.js';
+
+group('Rendering list', () => {
+ let app;
+
+ setup(async () => {
+ app = new BlazorApp();
+ await app.start();
+ app.navigateTo('renderList');
+ });
+
+ teardown(() => {
+ app.dispose();
+ });
+
+ benchmark('Render 10 items', () => measureRenderList(app, 10));
+ benchmark('Render 100 items', () => measureRenderList(app, 100));
+ benchmark('Render 1000 items', () => measureRenderList(app, 1000));
+
+});
+
+async function measureRenderList(app, numItems) {
+ const appDocument = app.window.document;
+ const numItemsTextbox = appDocument.querySelector('#num-items');
+ setInputValue(numItemsTextbox, numItems.toString());
+
+ let nextRenderCompletion = receiveEvent('Finished rendering list');
+ appDocument.querySelector('#hide-list').click();
+ await nextRenderCompletion;
+
+ if (appDocument.querySelectorAll('tbody tr').length !== 0) {
+ throw new Error('Wrong number of items rendered');
+ }
+
+ nextRenderCompletion = receiveEvent('Finished rendering list');
+ appDocument.querySelector('#show-list').click();
+ await nextRenderCompletion;
+
+ if (appDocument.querySelectorAll('tbody tr').length !== numItems) {
+ throw new Error('Wrong number of items rendered');
+ }
+}
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/util/BenchmarkEvents.js b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/util/BenchmarkEvents.js
new file mode 100644
index 0000000..ebfa7bd
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/util/BenchmarkEvents.js
@@ -0,0 +1,21 @@
+const pendingCallbacksByEventName = {};
+
+// Returns a promise that resolves the next time we receive the specified event
+export function receiveEvent(name) {
+ let capturedResolver;
+ const resultPromise = new Promise(resolve => {
+ capturedResolver = resolve;
+ });
+
+ pendingCallbacksByEventName[name] = pendingCallbacksByEventName[name] || [];
+ pendingCallbacksByEventName[name].push(capturedResolver);
+
+ return resultPromise;
+}
+
+// Listen for messages forwarded from the child frame
+window.receiveBenchmarkEvent = function (name) {
+ const callbacks = pendingCallbacksByEventName[name];
+ delete pendingCallbacksByEventName[name];
+ callbacks && callbacks.forEach(callback => callback());
+}
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/util/BlazorApp.js b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/util/BlazorApp.js
new file mode 100644
index 0000000..d3211c5
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/util/BlazorApp.js
@@ -0,0 +1,25 @@
+import { receiveEvent } from './BenchmarkEvents.js';
+
+export class BlazorApp {
+ constructor() {
+ this._frame = document.createElement('iframe');
+ document.body.appendChild(this._frame);
+ }
+
+ get window() {
+ return this._frame.contentWindow;
+ }
+
+ async start() {
+ this._frame.src = 'blazor-frame.html';
+ await receiveEvent('Rendered index.cshtml');
+ }
+
+ navigateTo(url) {
+ this.window.Blazor.navigateTo(url);
+ }
+
+ dispose() {
+ document.body.removeChild(this._frame);
+ }
+}
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/util/DOM.js b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/util/DOM.js
new file mode 100644
index 0000000..2a4f68c
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/benchmarks/util/DOM.js
@@ -0,0 +1,7 @@
+export function setInputValue(inputElement, value) {
+ inputElement.value = value;
+
+ const event = document.createEvent('HTMLEvents');
+ event.initEvent('change', false, true);
+ inputElement.dispatchEvent(event);
+}
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/blazor-frame.html b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/blazor-frame.html
new file mode 100644
index 0000000..e93b5f8
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/blazor-frame.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8" />
+ <title>E2EPerformance</title>
+ <base href="/" />
+</head>
+<body>
+ <script>
+ // Pass through benchmark events to the iframe parent
+ window.receiveBenchmarkEvent = function () {
+ if (window !== window.parent) { // Only if we're running in a frame
+ window.parent.receiveBenchmarkEvent.apply(window.parent, arguments);
+ }
+ };
+
+ // Behave as if we were loaded from / instead of /blazor-frame.html
+ history.pushState('', null, '/');
+ </script>
+
+ <app>Loading...</app>
+ <script src="_framework/components.webassembly.js"></script>
+</body>
+</html>
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/index.html b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/index.html
new file mode 100644
index 0000000..13bbb31
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/wwwroot/index.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8" />
+ <title>E2EPerformance</title>
+ <link href="benchmarks/lib/bootstrap.min.css" rel="stylesheet" />
+ <link href="benchmarks/lib/minibench/style.css" rel="stylesheet" />
+</head>
+<body style="overflow: scroll;">
+ <div class="container" id="display"></div>
+ <p class="container px-3">
+ <a href="blazor-frame.html">View benchmark app ⮕</a>
+ </p>
+
+ <script type="module" src="benchmarks/index.js"></script>
+</body>
+</html>
diff --git a/wasm/wasm.sln b/wasm/wasm.sln
index 8165987..b80eb23 100644
--- a/wasm/wasm.sln
+++ b/wasm/wasm.sln
@@ -7,6 +7,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HelloWorld", "HelloWorld\He
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Newtonsoft", "Newtonsoft\Newtonsoft.csproj", "{968694DD-3195-4AEF-9EFC-C6E5921207B6}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNetCore.Blazor.E2EPerformance", "Microsoft.AspNetCore.Blazor.E2EPerformance\Microsoft.AspNetCore.Blazor.E2EPerformance.csproj", "{85FDC54F-74CA-4625-B02F-73ACBEC89230}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -44,5 +46,17 @@ Global
{968694DD-3195-4AEF-9EFC-C6E5921207B6}.Release|x64.Build.0 = Release|Any CPU
{968694DD-3195-4AEF-9EFC-C6E5921207B6}.Release|x86.ActiveCfg = Release|Any CPU
{968694DD-3195-4AEF-9EFC-C6E5921207B6}.Release|x86.Build.0 = Release|Any CPU
+ {85FDC54F-74CA-4625-B02F-73ACBEC89230}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {85FDC54F-74CA-4625-B02F-73ACBEC89230}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {85FDC54F-74CA-4625-B02F-73ACBEC89230}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {85FDC54F-74CA-4625-B02F-73ACBEC89230}.Debug|x64.Build.0 = Debug|Any CPU
+ {85FDC54F-74CA-4625-B02F-73ACBEC89230}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {85FDC54F-74CA-4625-B02F-73ACBEC89230}.Debug|x86.Build.0 = Debug|Any CPU
+ {85FDC54F-74CA-4625-B02F-73ACBEC89230}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {85FDC54F-74CA-4625-B02F-73ACBEC89230}.Release|Any CPU.Build.0 = Release|Any CPU
+ {85FDC54F-74CA-4625-B02F-73ACBEC89230}.Release|x64.ActiveCfg = Release|Any CPU
+ {85FDC54F-74CA-4625-B02F-73ACBEC89230}.Release|x64.Build.0 = Release|Any CPU
+ {85FDC54F-74CA-4625-B02F-73ACBEC89230}.Release|x86.ActiveCfg = Release|Any CPU
+ {85FDC54F-74CA-4625-B02F-73ACBEC89230}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal