@myop/sdk 0.4.0-beta.4 → 0.4.0-beta.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -0
- package/dist/bundled-declarations.d.ts +87 -4
- package/dist/cjs/{_IframeSDK.3a412cd4.js → _IframeSDK.49662e01.js} +97 -18
- package/dist/cjs/_IframeSDK.49662e01.js.map +7 -0
- package/dist/cjs/_IframeSDK.d4a97876.min.js +1 -0
- package/dist/cjs/_MyopHelpers.12acc780.min.js +1 -0
- package/dist/cjs/{_MyopHelpers.efed13e4.js → _MyopHelpers.2c449e7a.js} +78 -15
- package/dist/cjs/_MyopHelpers.2c449e7a.js.map +7 -0
- package/dist/cjs/_WebComponentSDK.1addf28b.min.js +1 -0
- package/dist/cjs/{_WebComponentSDK.4b6ac803.js → _WebComponentSDK.d5f9105b.js} +97 -18
- package/dist/cjs/_WebComponentSDK.d5f9105b.js.map +7 -0
- package/dist/cjs/_hostSDK.6dab59cb.min.js +1 -0
- package/dist/cjs/{_hostSDK.e9b70e44.js → _hostSDK.8cf37510.js} +97 -18
- package/dist/cjs/_hostSDK.8cf37510.js.map +7 -0
- package/dist/cjs/myop_sdk.js +14 -14
- package/dist/cjs/myop_sdk.js.map +1 -1
- package/dist/cjs/myop_sdk.min.js +1 -1
- package/dist/cjs-bundled/myop_sdk.bundled.js +107 -21
- package/dist/cjs-bundled/myop_sdk.bundled.js.map +3 -3
- package/dist/cjs-bundled/myop_sdk.bundled.min.js +1 -1
- package/dist/module/Iframe/index.js +98 -19
- package/dist/module/Iframe/index.js.map +2 -2
- package/dist/module/SDK.js +107 -21
- package/dist/module/SDK.js.map +3 -3
- package/dist/module/common/index.d.ts +5 -0
- package/dist/module/common/index.js +1 -1
- package/dist/module/common/index.js.map +2 -2
- package/dist/module/embeddedSDK.js +1 -1
- package/dist/module/helpers/CloudRepository.d.ts +36 -1
- package/dist/module/helpers/cloudRepositoryHelpers.d.ts +42 -2
- package/dist/module/helpers/index.js +77 -16
- package/dist/module/helpers/index.js.map +2 -2
- package/dist/module/host/components/IMyopComponent.d.ts +3 -0
- package/dist/module/host/embeddedSDK.js +1 -1
- package/dist/module/host/hostSDK.d.ts +1 -1
- package/dist/module/host/index.js +98 -19
- package/dist/module/host/index.js.map +2 -2
- package/dist/module/webcomponent/index.js +98 -19
- package/dist/module/webcomponent/index.js.map +2 -2
- package/package.json +1 -1
- package/dist/cjs/_IframeSDK.3a412cd4.js.map +0 -7
- package/dist/cjs/_IframeSDK.9338575d.min.js +0 -1
- package/dist/cjs/_MyopHelpers.91004b19.min.js +0 -1
- package/dist/cjs/_MyopHelpers.efed13e4.js.map +0 -7
- package/dist/cjs/_WebComponentSDK.4b6ac803.js.map +0 -7
- package/dist/cjs/_WebComponentSDK.4e78d94a.min.js +0 -1
- package/dist/cjs/_hostSDK.34f770f6.min.js +0 -1
- package/dist/cjs/_hostSDK.e9b70e44.js.map +0 -7
package/dist/module/SDK.js
CHANGED
|
@@ -68,7 +68,7 @@ var init_defineDynamicImport = __esm({
|
|
|
68
68
|
var myop_sdk_version_default;
|
|
69
69
|
var init_myop_sdk_version = __esm({
|
|
70
70
|
"version:myop-sdk-version"() {
|
|
71
|
-
myop_sdk_version_default = "0.4.0-beta.
|
|
71
|
+
myop_sdk_version_default = "0.4.0-beta.6";
|
|
72
72
|
}
|
|
73
73
|
});
|
|
74
74
|
|
|
@@ -839,6 +839,10 @@ var init_IMyopComponent = __esm({
|
|
|
839
839
|
}
|
|
840
840
|
});
|
|
841
841
|
}
|
|
842
|
+
get uiTags() {
|
|
843
|
+
var _a2;
|
|
844
|
+
return ((_a2 = this.componentDefinition) == null ? void 0 : _a2.uiTags) || [];
|
|
845
|
+
}
|
|
842
846
|
get markedForDisposed() {
|
|
843
847
|
return this._markedForDisposed;
|
|
844
848
|
}
|
|
@@ -2326,7 +2330,7 @@ var init_IMyopLoader = __esm({
|
|
|
2326
2330
|
});
|
|
2327
2331
|
|
|
2328
2332
|
// src/host/loaders/iframeLoader.ts
|
|
2329
|
-
var addQueryParam, MyopIframeLoader;
|
|
2333
|
+
var addQueryParam, showsSamePage, MyopIframeLoader;
|
|
2330
2334
|
var init_iframeLoader = __esm({
|
|
2331
2335
|
"src/host/loaders/iframeLoader.ts"() {
|
|
2332
2336
|
"use strict";
|
|
@@ -2339,6 +2343,21 @@ var init_iframeLoader = __esm({
|
|
|
2339
2343
|
urlObj.searchParams.append(param, value);
|
|
2340
2344
|
return urlObj.toString();
|
|
2341
2345
|
};
|
|
2346
|
+
showsSamePage = (frame, url) => {
|
|
2347
|
+
const current = frame.getAttribute("src");
|
|
2348
|
+
if (!current || !url) return false;
|
|
2349
|
+
const norm = (u) => {
|
|
2350
|
+
const x = new URL(u, document.baseURI);
|
|
2351
|
+
x.hash = "";
|
|
2352
|
+
if (x.pathname.length > 1) x.pathname = x.pathname.replace(/\/$/, "");
|
|
2353
|
+
return x.href;
|
|
2354
|
+
};
|
|
2355
|
+
try {
|
|
2356
|
+
return norm(current) === norm(url);
|
|
2357
|
+
} catch (e) {
|
|
2358
|
+
return false;
|
|
2359
|
+
}
|
|
2360
|
+
};
|
|
2342
2361
|
MyopIframeLoader = class extends BaseMyopLoader {
|
|
2343
2362
|
constructor() {
|
|
2344
2363
|
super(...arguments);
|
|
@@ -2348,9 +2367,10 @@ var init_iframeLoader = __esm({
|
|
|
2348
2367
|
let IframeElement;
|
|
2349
2368
|
const typedLoaderConfig = skin.loader;
|
|
2350
2369
|
if ((container == null ? void 0 : container.nodeName) === "IFRAME") {
|
|
2351
|
-
console.log("needs to load into an exsisting Iframe...", typedLoaderConfig.url, container);
|
|
2352
2370
|
IframeElement = container;
|
|
2353
|
-
IframeElement
|
|
2371
|
+
if (!showsSamePage(IframeElement, typedLoaderConfig.url)) {
|
|
2372
|
+
IframeElement.src = typedLoaderConfig.url;
|
|
2373
|
+
}
|
|
2354
2374
|
} else {
|
|
2355
2375
|
const uniqId = uuidv4();
|
|
2356
2376
|
const domId = `myop-comp-${uniqId}`;
|
|
@@ -2705,7 +2725,10 @@ var init_CloudRepository = __esm({
|
|
|
2705
2725
|
loader: config.consume_variant[0].loader
|
|
2706
2726
|
}
|
|
2707
2727
|
],
|
|
2708
|
-
defaultSkin: 0
|
|
2728
|
+
defaultSkin: 0,
|
|
2729
|
+
// Only `ui:` tags ever reach the client; the server filters, absent = none.
|
|
2730
|
+
// @ts-ignore
|
|
2731
|
+
uiTags: Array.isArray(config.uiTags) ? config.uiTags : []
|
|
2709
2732
|
},
|
|
2710
2733
|
name: config.name
|
|
2711
2734
|
};
|
|
@@ -2747,7 +2770,7 @@ var init_CloudRepository = __esm({
|
|
|
2747
2770
|
* Opt-in delivery settings, set by myop.delivery(). Off means: this file behaves
|
|
2748
2771
|
* EXACTLY as it did before — same host, same URL, same everything.
|
|
2749
2772
|
*/
|
|
2750
|
-
__publicField(this, "_delivery", { minify: false, host: null, cache: false });
|
|
2773
|
+
__publicField(this, "_delivery", { minify: false, host: null, cache: false, flow: false });
|
|
2751
2774
|
/**
|
|
2752
2775
|
* What actually happened, for myop.delivery.stats(). `fellBack` is the number that
|
|
2753
2776
|
* matters: it is how you find out the lane is unhealthy without waiting for a
|
|
@@ -2782,6 +2805,9 @@ var init_CloudRepository = __esm({
|
|
|
2782
2805
|
*/
|
|
2783
2806
|
__publicField(this, "_localServes", /* @__PURE__ */ new Map());
|
|
2784
2807
|
__publicField(this, "_flushBound", false);
|
|
2808
|
+
// ============ V1 Methods (Legacy) ============
|
|
2809
|
+
/** ids seeded by hydrateV1Component whose first use has not been counted yet */
|
|
2810
|
+
__publicField(this, "_hydratedV1", /* @__PURE__ */ new Set());
|
|
2785
2811
|
}
|
|
2786
2812
|
static get Main() {
|
|
2787
2813
|
const globalMain = getGlobalMain();
|
|
@@ -2817,34 +2843,48 @@ var init_CloudRepository = __esm({
|
|
|
2817
2843
|
* Deliberately mutates THIS instance rather than constructing a new repository:
|
|
2818
2844
|
* CloudRepository.Main is a global singleton shared across bundles (see getGlobalMain),
|
|
2819
2845
|
* so a second instance would be ignored by every component already using the first.
|
|
2846
|
+
*
|
|
2847
|
+
* @internal
|
|
2820
2848
|
*/
|
|
2821
2849
|
setDelivery(opts = {}) {
|
|
2822
2850
|
if (opts.minify !== void 0) this._delivery.minify = !!opts.minify;
|
|
2823
2851
|
if (opts.host !== void 0) this._delivery.host = opts.host;
|
|
2824
2852
|
if (opts.cache !== void 0) this._delivery.cache = !!opts.cache;
|
|
2853
|
+
if (opts.flow !== void 0) this._delivery.flow = !!opts.flow;
|
|
2825
2854
|
}
|
|
2855
|
+
/** @internal */
|
|
2826
2856
|
deliveryStats() {
|
|
2827
2857
|
var _a2;
|
|
2828
2858
|
return __spreadProps(__spreadValues({}, this._deliveryStats), {
|
|
2829
2859
|
host: (_a2 = this._delivery.host) != null ? _a2 : _CloudRepository.DEFAULT_HOST,
|
|
2830
2860
|
minify: this._delivery.minify,
|
|
2831
|
-
cache: this._delivery.cache
|
|
2861
|
+
cache: this._delivery.cache,
|
|
2862
|
+
flow: this._delivery.flow
|
|
2832
2863
|
});
|
|
2833
2864
|
}
|
|
2834
2865
|
/**
|
|
2835
2866
|
* Forget what this browser holds, so the next load asks the server.
|
|
2836
2867
|
* `refresh()` with no ids drops everything; the counterpart to the window for the case
|
|
2837
2868
|
* where a change has to be visible on THIS load — right after someone publishes.
|
|
2869
|
+
*
|
|
2870
|
+
* @internal
|
|
2838
2871
|
*/
|
|
2839
2872
|
refreshDelivery() {
|
|
2840
2873
|
return __async(this, null, function* () {
|
|
2841
2874
|
yield deliveryStore.clear();
|
|
2842
2875
|
});
|
|
2843
2876
|
}
|
|
2844
|
-
|
|
2845
|
-
|
|
2877
|
+
/**
|
|
2878
|
+
* `source: 'h'` = the view was served from a config the page's SERVER embedded
|
|
2879
|
+
* (hydrateV1Component), not from this browser's cache window. Reported as a 4th batch
|
|
2880
|
+
* field (`id:env:n:h`) so our usage data can tell server-rendered views apart; a server
|
|
2881
|
+
* that predates it reads the first three fields and counts the view all the same.
|
|
2882
|
+
*/
|
|
2883
|
+
noteLocalServe(componentId, env, source) {
|
|
2884
|
+
const key = source ? `${componentId}:${source}` : componentId;
|
|
2885
|
+
const cur = this._localServes.get(key);
|
|
2846
2886
|
if (cur) cur.count++;
|
|
2847
|
-
else this._localServes.set(
|
|
2887
|
+
else this._localServes.set(key, { id: componentId, env, count: 1, source });
|
|
2848
2888
|
this.bindFlush();
|
|
2849
2889
|
}
|
|
2850
2890
|
/** Report on page-hide, which is the only event that reliably fires on mobile. */
|
|
@@ -2864,7 +2904,7 @@ var init_CloudRepository = __esm({
|
|
|
2864
2904
|
*/
|
|
2865
2905
|
flushLocalServes() {
|
|
2866
2906
|
if (!this._localServes.size) return;
|
|
2867
|
-
const batch = [...this._localServes.entries()].map(([
|
|
2907
|
+
const batch = [...this._localServes.entries()].map(([, v]) => `${v.id}:${v.env}:${v.count}${v.source ? ":" + v.source : ""}`).join(",");
|
|
2868
2908
|
this._localServes.clear();
|
|
2869
2909
|
try {
|
|
2870
2910
|
const url = `${this.deliveryHost()}/clientUsage?b=${encodeURIComponent(batch)}`;
|
|
@@ -2915,7 +2955,7 @@ var init_CloudRepository = __esm({
|
|
|
2915
2955
|
/**
|
|
2916
2956
|
* Enable static mode for self-hosted component registries.
|
|
2917
2957
|
* In static mode, URLs are constructed as file paths instead of query params:
|
|
2918
|
-
*
|
|
2958
|
+
* `${baseUrl}/components/${componentId}/${env}.json`
|
|
2919
2959
|
*/
|
|
2920
2960
|
enableStaticMode() {
|
|
2921
2961
|
this._staticMode = true;
|
|
@@ -3128,6 +3168,14 @@ var init_CloudRepository = __esm({
|
|
|
3128
3168
|
const { cacheKey } = this.resolveParams(componentId, env, preview);
|
|
3129
3169
|
return ((_a2 = this.variants[cacheKey]) == null ? void 0 : _a2.resolved) || null;
|
|
3130
3170
|
}
|
|
3171
|
+
/**
|
|
3172
|
+
* The `ui:` tags of an already-resolved component (`[]` if it has none or is not
|
|
3173
|
+
* resolved yet). Synchronous, no request: tags arrive with the component itself.
|
|
3174
|
+
*/
|
|
3175
|
+
getComponentTags(componentId, env, preview) {
|
|
3176
|
+
var _a2, _b;
|
|
3177
|
+
return ((_b = (_a2 = this.getResolvedConfig(componentId, env, preview)) == null ? void 0 : _a2.type) == null ? void 0 : _b.uiTags) || [];
|
|
3178
|
+
}
|
|
3131
3179
|
/**
|
|
3132
3180
|
* Resolve which (env, preview) pair — and therefore which cache key — a call
|
|
3133
3181
|
* for `componentId` refers to.
|
|
@@ -3172,7 +3220,27 @@ var init_CloudRepository = __esm({
|
|
|
3172
3220
|
this.variants[cacheKey] = promise;
|
|
3173
3221
|
this.preloadedComponents[componentId] = { env: resolvedEnv, preview: usePreview };
|
|
3174
3222
|
}
|
|
3175
|
-
|
|
3223
|
+
/**
|
|
3224
|
+
* Seed a v1 component's config, so `fetchComponentV1(componentId)` answers from memory
|
|
3225
|
+
* with no request. The v1 counterpart of {@link hydrateComponent}.
|
|
3226
|
+
*
|
|
3227
|
+
* `flow` is what `GET /flow?id=<componentId>&auto=true` returns: either the whole body
|
|
3228
|
+
* (`{item: {...}}`) or its `item`. Typical use is a server that fetched it (with
|
|
3229
|
+
* `&prefetch=1`, so the fetch is not counted as a view) and embedded it in the page.
|
|
3230
|
+
*
|
|
3231
|
+
* The view IS counted: the first time the seeded config is used, it is reported through
|
|
3232
|
+
* /clientUsage (flagged `:h`, recorded as deliveryPath 'hydrated'), so hydrating never makes
|
|
3233
|
+
* usage disappear and server-rendered views stay distinguishable.
|
|
3234
|
+
*/
|
|
3235
|
+
hydrateV1Component(componentId, flow) {
|
|
3236
|
+
var _a2, _b;
|
|
3237
|
+
const item = (_a2 = flow == null ? void 0 : flow.item) != null ? _a2 : flow;
|
|
3238
|
+
if (!((_b = item == null ? void 0 : item.components) == null ? void 0 : _b.length)) {
|
|
3239
|
+
throw new Error(`hydrateV1Component(${componentId}): not a /flow?auto=true response`);
|
|
3240
|
+
}
|
|
3241
|
+
this.userFlows[componentId] = Promise.resolve(item);
|
|
3242
|
+
this._hydratedV1.add(componentId);
|
|
3243
|
+
}
|
|
3176
3244
|
/**
|
|
3177
3245
|
* Fetch a v1 component from a flow
|
|
3178
3246
|
*/
|
|
@@ -3189,13 +3257,15 @@ var init_CloudRepository = __esm({
|
|
|
3189
3257
|
}
|
|
3190
3258
|
fetchAutoFlow(componentId) {
|
|
3191
3259
|
return __async(this, null, function* () {
|
|
3260
|
+
if (this._hydratedV1.delete(componentId)) {
|
|
3261
|
+
this.noteLocalServe(componentId, "v1_auto_flow", "h");
|
|
3262
|
+
}
|
|
3192
3263
|
if (!this.userFlows[componentId]) {
|
|
3193
3264
|
this.userFlows[componentId] = new Promise(
|
|
3194
3265
|
(resolve, reject) => __async(this, null, function* () {
|
|
3195
3266
|
try {
|
|
3196
|
-
const
|
|
3197
|
-
|
|
3198
|
-
);
|
|
3267
|
+
const path = `/flow?id=${componentId}&auto=true`;
|
|
3268
|
+
const res = this._delivery.flow && this._delivery.host ? yield this.deliveryFetch(path) : yield fetch(`${this._baseUrl}${path}`);
|
|
3199
3269
|
const json = yield res.json();
|
|
3200
3270
|
resolve(json.item);
|
|
3201
3271
|
} catch (e) {
|
|
@@ -3249,7 +3319,7 @@ var init_CloudRepository = __esm({
|
|
|
3249
3319
|
});
|
|
3250
3320
|
|
|
3251
3321
|
// src/helpers/cloudRepositoryHelpers.ts
|
|
3252
|
-
var _cloudRepository, getCloudRepository, isPreloaded, getPreloadedParams, enableLocalDev, setCloudRepositoryUrl, enableSelfHosted, DELIVERY_HOST, delivery, deliveryRefresh, deliveryStats, deliveryOff, setCloudRepository, setEnvironment, getResolvedConfig, preloadComponents, hydrateComponents;
|
|
3322
|
+
var _cloudRepository, getCloudRepository, isPreloaded, getPreloadedParams, enableLocalDev, setCloudRepositoryUrl, enableSelfHosted, DELIVERY_HOST, delivery, deliveryRefresh, deliveryStats, deliveryOff, setCloudRepository, setEnvironment, getResolvedConfig, getComponentTags, preloadComponents, hydrateComponents, hydrateV1Components;
|
|
3253
3323
|
var init_cloudRepositoryHelpers = __esm({
|
|
3254
3324
|
"src/helpers/cloudRepositoryHelpers.ts"() {
|
|
3255
3325
|
"use strict";
|
|
@@ -3277,11 +3347,12 @@ var init_cloudRepositoryHelpers = __esm({
|
|
|
3277
3347
|
};
|
|
3278
3348
|
DELIVERY_HOST = "https://delivery.myop.dev";
|
|
3279
3349
|
delivery = (opts = {}) => {
|
|
3280
|
-
var _a2, _b;
|
|
3281
|
-
const wantsLane = opts.minify !== false || opts.cache === true;
|
|
3350
|
+
var _a2, _b, _c;
|
|
3351
|
+
const wantsLane = opts.minify !== false || opts.cache === true || opts.flow === true;
|
|
3282
3352
|
_cloudRepository.setDelivery({
|
|
3283
3353
|
minify: (_a2 = opts.minify) != null ? _a2 : false,
|
|
3284
3354
|
cache: (_b = opts.cache) != null ? _b : false,
|
|
3355
|
+
flow: (_c = opts.flow) != null ? _c : false,
|
|
3285
3356
|
host: opts.host !== void 0 ? opts.host : wantsLane ? DELIVERY_HOST : null
|
|
3286
3357
|
});
|
|
3287
3358
|
return deliveryStats();
|
|
@@ -3292,7 +3363,7 @@ var init_cloudRepositoryHelpers = __esm({
|
|
|
3292
3363
|
});
|
|
3293
3364
|
deliveryStats = () => _cloudRepository.deliveryStats();
|
|
3294
3365
|
deliveryOff = () => {
|
|
3295
|
-
_cloudRepository.setDelivery({ minify: false, cache: false, host: null });
|
|
3366
|
+
_cloudRepository.setDelivery({ minify: false, cache: false, flow: false, host: null });
|
|
3296
3367
|
return deliveryStats();
|
|
3297
3368
|
};
|
|
3298
3369
|
setCloudRepository = (repository) => {
|
|
@@ -3304,6 +3375,9 @@ var init_cloudRepositoryHelpers = __esm({
|
|
|
3304
3375
|
getResolvedConfig = (componentId, env, preview) => {
|
|
3305
3376
|
return _cloudRepository.getResolvedConfig(componentId, env, preview);
|
|
3306
3377
|
};
|
|
3378
|
+
getComponentTags = (componentId, env, preview) => {
|
|
3379
|
+
return _cloudRepository.getComponentTags(componentId, env, preview);
|
|
3380
|
+
};
|
|
3307
3381
|
preloadComponents = (ids, env, preview) => __async(void 0, null, function* () {
|
|
3308
3382
|
return Promise.allSettled(
|
|
3309
3383
|
ids.map((id) => _cloudRepository.fetchComponentV2(id, env, preview))
|
|
@@ -3314,6 +3388,11 @@ var init_cloudRepositoryHelpers = __esm({
|
|
|
3314
3388
|
_cloudRepository.hydrateComponent(id, config, env, preview);
|
|
3315
3389
|
}
|
|
3316
3390
|
};
|
|
3391
|
+
hydrateV1Components = (flows) => {
|
|
3392
|
+
for (const [id, flow] of Object.entries(flows)) {
|
|
3393
|
+
_cloudRepository.hydrateV1Component(id, flow);
|
|
3394
|
+
}
|
|
3395
|
+
};
|
|
3317
3396
|
}
|
|
3318
3397
|
});
|
|
3319
3398
|
|
|
@@ -4587,9 +4666,11 @@ __export(helpers_exports, {
|
|
|
4587
4666
|
enableSelfHosted: () => enableSelfHosted,
|
|
4588
4667
|
exec: () => exec,
|
|
4589
4668
|
getCloudRepository: () => getCloudRepository,
|
|
4669
|
+
getComponentTags: () => getComponentTags,
|
|
4590
4670
|
getPreloadedParams: () => getPreloadedParams,
|
|
4591
4671
|
getResolvedConfig: () => getResolvedConfig,
|
|
4592
4672
|
hydrateComponents: () => hydrateComponents,
|
|
4673
|
+
hydrateV1Components: () => hydrateV1Components,
|
|
4593
4674
|
isPreloaded: () => isPreloaded,
|
|
4594
4675
|
preloadComponents: () => preloadComponents,
|
|
4595
4676
|
removeClass: () => removeClass,
|
|
@@ -5053,6 +5134,9 @@ var init_hostSDK = __esm({
|
|
|
5053
5134
|
api.refresh = deliveryRefresh;
|
|
5054
5135
|
window.myop.delivery = api;
|
|
5055
5136
|
}
|
|
5137
|
+
if (window.myop && !window.myop.hydrateV1) {
|
|
5138
|
+
window.myop.hydrateV1 = hydrateV1Components;
|
|
5139
|
+
}
|
|
5056
5140
|
hostSDK = window.myop.hostSDK;
|
|
5057
5141
|
defineDynamicImport("hostSDK", hostSDK);
|
|
5058
5142
|
}
|
|
@@ -5639,9 +5723,11 @@ __export(MyopHelpers_exports, {
|
|
|
5639
5723
|
enableSelfHosted: () => enableSelfHosted,
|
|
5640
5724
|
exec: () => exec,
|
|
5641
5725
|
getCloudRepository: () => getCloudRepository,
|
|
5726
|
+
getComponentTags: () => getComponentTags,
|
|
5642
5727
|
getPreloadedParams: () => getPreloadedParams,
|
|
5643
5728
|
getResolvedConfig: () => getResolvedConfig,
|
|
5644
5729
|
hydrateComponents: () => hydrateComponents,
|
|
5730
|
+
hydrateV1Components: () => hydrateV1Components,
|
|
5645
5731
|
isPreloaded: () => isPreloaded,
|
|
5646
5732
|
preloadComponents: () => preloadComponents,
|
|
5647
5733
|
removeClass: () => removeClass,
|
|
@@ -5762,4 +5848,4 @@ export {
|
|
|
5762
5848
|
getMyopMessages,
|
|
5763
5849
|
getWebcomponentModule
|
|
5764
5850
|
};
|
|
5765
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydC50cyIsICJ2ZXJzaW9uOm15b3Atc2RrLXZlcnNpb24iLCAiLi4vLi4vc3JjL2NvbW1vbi9NeW9wTWVzc2FnZXMudHMiLCAiLi4vLi4vc3JjL3V0aWxzL3V1aWQudHMiLCAiLi4vLi4vc3JjL3V0aWxzL3V0aWxzLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9CYXNlTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQmluZENsaWNrTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQ2hhbmdlVGV4dE1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL21lc3NhZ2VzL0V4ZWN1dGVTY3JpcHRNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9DdXN0b21SZWZNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9BZGRFdmVudExpc3RlbmVyTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvU2V0QXR0cmlidXRlTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvR2V0RWxlbWVudFZhbHVlTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvU2V0SW5uZXJIdG1sLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9Jbml0TWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvRW52ZWxvcGVkTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9HZXRBdHRyaWJ1dGVNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9FeGVjdXRlQ29tcG9uZW50TWV0aG9kLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQ2xlYW51cE1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL21lc3NhZ2VzL0Rpc3Bvc2VNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL21lc3NhZ2VzL2luZGV4LnRzIiwgIi4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvSU15b3BDb21wb25lbnQudHMiLCAiLi4vLi4vc3JjL2NvbW1vbi9NeW9wRWxlbWVudFJlZi50cyIsICIuLi8uLi9zcmMvY29tbW9uL2Jhc2VNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi9zcmMvY29tbW9uL0Jhc2VNeW9wU0RLLnRzIiwgIi4uLy4uL3NyYy9jb21tb24vaW5kZXgudHMiLCAiLi4vLi4vc3JjL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzIiwgIi4uLy4uL3NyYy9ob3N0L2xvZ01lc3NhZ2VzLnRzIiwgIi4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcFJlZkNvbXBvbmVudC50cyIsICIuLi8uLi9zcmMvaG9zdC9jb21wb25lbnRzL215b3BFeHRyYWN0ZWRXZWJDb21wb25lbnQudHMiLCAiLi4vLi4vc3JjL2hvc3QvY29tcG9uZW50Q29yZS50cyIsICIuLi8uLi9zcmMvaG9zdC9jb21wb25lbnRzL215b3BJZnJhbWVDb21wb25lbnQudHMiLCAiLi4vLi4vc3JjL2hvc3QvbG9hZGVycy9JTXlvcExvYWRlci50cyIsICIuLi8uLi9zcmMvaG9zdC9sb2FkZXJzL2lmcmFtZUxvYWRlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L2NvbnN0cy50cyIsICIuLi8uLi9zcmMvaG9zdC9jb21wb25lbnRzL215b3BXZWJjb21wb25lbnQudHMiLCAiLi4vLi4vc3JjL2hvc3QvbG9hZGVycy93ZWJjb21wb25lbnRMb2FkZXIudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvZGVsaXZlcnlTdG9yZS50cyIsICIuLi8uLi9zcmMvaGVscGVycy9DbG91ZFJlcG9zaXRvcnkudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvY2xvdWRSZXBvc2l0b3J5SGVscGVycy50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL2NvbnN0cy50cyIsICIuLi8uLi9zcmMvY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L3NoYWRvd1Jvb3RSZWYudHMiLCAiLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL0dldEVsZW1lbnRWYWx1ZUhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvc2V0SW5uZXJIdG1sSGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L1dlYkNvbXBvbmVudFNESy50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L2luZGV4LnRzIiwgIi4uLy4uL3NyYy9ob3N0L2xvYWRlcnMvSFRNTENvbXBvbmVudExvYWRlci50cyIsICIuLi8uLi9zcmMvaGVscGVycy9hcHBseVN0eWxlc2hlZXQudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvaWZyYW1lU2tpblVybFRva2VuaXplci50cyIsICIuLi8uLi9zcmMvaGVscGVycy9jbGFzc0xpc3QudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvY29uZmlnQnVpbGRlci50cyIsICIuLi8uLi9zcmMvaGVscGVycy9leGVjLnRzIiwgIi4uLy4uL3NyYy9oZWxwZXJzL2luZGV4LnRzIiwgIi4uLy4uL3NyYy9ob3N0L215b3BPdmVycmlkZS50cyIsICIuLi8uLi9zcmMvaG9zdC9ob3N0U0RLLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvYmluZE9uQ2xpY2tIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL2NoYW5nZVRleHRIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL2FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL3NldEF0dHJpYnV0ZUhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL2NvbW1vbi91dGlscy9kb21PYnNlcnZlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9TZXRNdXRhdGlvbk9ic2VydmVySGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9HZXRFbGVtZW50VmFsdWVIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL2dldEF0dHJpYnV0ZUhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvU2V0UmVzaXplT2JzZXJ2ZXJIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL3NldElubmVySHRtbEhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL0lmcmFtZS9JZnJhbWVTREsudHMiLCAiLi4vLi4vc3JjL21lc3NhZ2VzL015b3BNZXNzYWdlcy50cyIsICIuLi8uLi9zcmMvaGVscGVycy9NeW9wSGVscGVycy50cyIsICIuLi8uLi9zcmMvZHluYW1pY0ltcG9ydC9sb2FkX19mZWRlcmF0aW9uX18udHMiLCAiLi4vLi4vc3JjL1NESy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IGNvbnN0IF9fZmVkZXJhdGlvbl9fID0gXCJfX2ZlZGVyYXRpb25fX1wiXG5leHBvcnQgY29uc3Qgb25Mb2FkS2V5ID0gXCJvbkxvYWRcIlxuZXhwb3J0IGNvbnN0IG1vZHVsZUluc3RhbmNlS2V5ID0gXCJtb2R1bGVJbnN0YW5jZVwiXG5cbmV4cG9ydCBjb25zdCBkZWZpbmVEeW5hbWljSW1wb3J0ID0gKGdsb2JhbE5hbWU6IHN0cmluZywgbW9kdWxlOiBhbnkpID0+IHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKHdpbmRvd1tfX2ZlZGVyYXRpb25fX10gJiYgd2luZG93W19fZmVkZXJhdGlvbl9fXVtnbG9iYWxOYW1lXSAmJiB3aW5kb3dbX19mZWRlcmF0aW9uX19dW2dsb2JhbE5hbWVdW29uTG9hZEtleV0pIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB3aW5kb3dbX19mZWRlcmF0aW9uX19dW2dsb2JhbE5hbWVdW29uTG9hZEtleV0oe1tnbG9iYWxOYW1lXTogbW9kdWxlfSlcbiAgICB9IGVsc2Uge1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdfX2ZlZGVyYXRpb25fXyBsb2FkZXIgbm90IGRlZmluZWQgZm9yIG1vZHVsZScsIG1vZHVsZSk7XG4gICAgfVxufSIsICJleHBvcnQgZGVmYXVsdCAnMC40LjAtYmV0YS40JzsiLCAidHlwZSBTdHJpbmdXaXRoQXV0b2NvbXBsZXRlPFQ+ID0gVCB8IChzdHJpbmcgJiBSZWNvcmQ8bmV2ZXIsIG5ldmVyPik7XG5cbmV4cG9ydCB0eXBlIE15b3BNZXNzYWdlS2V5ID0gU3RyaW5nV2l0aEF1dG9jb21wbGV0ZTxrZXlvZiB0eXBlb2YgTXlvcE1lc3NhZ2VzIHwga2V5b2YgdHlwZW9mIE15b3BNZXNzYWdlcy5Jbj47XG5cbmV4cG9ydCBjb25zdCBNeW9wTWVzc2FnZXMgPSB7XG4gICAgLy9ob3N0IHRvIGNvbXBvbmVudFxuICAgICdJbml0UmVxdWVzdCc6ICdJbml0UmVxdWVzdCcsXG4gICAgJ0luaXRSZXNwb25zZSc6ICdJbml0UmVzcG9uc2UnLFxuICAgICdJbml0TWVzc2FnZSc6ICdJbml0TWVzc2FnZScsXG4gICAgJ0Rpc3Bvc2VNZXNzYWdlJzogJ0Rpc3Bvc2VNZXNzYWdlJyxcblxuICAgICdDaGFuZ2VUZXh0TWVzc2FnZSc6ICdDaGFuZ2VUZXh0TWVzc2FnZScsXG4gICAgJ0JpbmRDbGlja01lc3NhZ2UnOiAnQmluZENsaWNrTWVzc2FnZScsXG4gICAgJ0RldGVjdE15b3BSZWZzTWVzc2FnZSc6ICdEZXRlY3RNeW9wUmVmc01lc3NhZ2UnLFxuXG4gICAgJ0V4ZWN1dGVTY3JpcHRNZXNzYWdlJzogJ0V4ZWN1dGVTY3JpcHRNZXNzYWdlJyxcblxuICAgICdBZGRFdmVudExpc3RlbmVyTWVzc2FnZSc6ICdBZGRFdmVudExpc3RlbmVyTWVzc2FnZScsXG4gICAgJ1NldEF0dHJpYnV0ZU1lc3NhZ2UnOiAnU2V0QXR0cmlidXRlTWVzc2FnZScsXG5cbiAgICAnQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSc6ICdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlJyxcbiAgICAnRW52ZWxvcGVkTWVzc2FnZSc6ICdFbnZlbG9wZWRNZXNzYWdlJyxcblxuICAgICdHZXRFbGVtZW50VmFsdWVNZXNzYWdlJzogJ0dldEVsZW1lbnRWYWx1ZU1lc3NhZ2UnLFxuICAgICdHZXRBdHRyaWJ1dGVNZXNzYWdlJzogJ0dldEF0dHJpYnV0ZU1lc3NhZ2UnLFxuXG4gICAgJ1NldElubmVySHRtbCc6ICdTZXRJbm5lckh0bWwnLFxuXG4gICAgLy9jb21wb25lbnQgbWVzc2FnZXNcbiAgICAnRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCc6ICdFeGVjdXRlQ29tcG9uZW50TWV0aG9kJyxcbiAgICAnU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnOiAnU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnLFxuICAgICdTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UnOiAnU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlJyxcblxuICAgICdDbGVhbnVwTWVzc2FnZSc6ICdDbGVhbnVwTWVzc2FnZScsXG5cbiAgICAvLyBleHRlcm5hbCB0byBob3N0IDpcbiAgICBJbjoge1xuICAgICAgICAnRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UnOiAnRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UnLFxuICAgICAgICAnQ2xpY2tSZXBsYXlNZXNzYWdlJzogJ0NsaWNrUmVwbGF5TWVzc2FnZScsXG4gICAgICAgICdFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlJzogJ0V4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2UnLFxuXG4gICAgICAgICdFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlJzogJ0V2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UnLFxuICAgICAgICAnRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSc6ICdFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlJyxcblxuICAgICAgICBcIkdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2VcIjogXCJHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlXCIsXG4gICAgICAgICdSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZSc6ICdSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZScsXG4gICAgICAgICdFbnZlbG9wZWRNZXNzYWdlJzogJ0VudmVsb3BlZE1lc3NhZ2UnLFxuXG4gICAgICAgICdNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc6ICdNdXRhdGlvbk9ic2VydmVyTWVzc2FnZScsXG4gICAgICAgICdDbGVhbnVwUmVwbGF5TWVzc2FnZSc6ICdDbGVhbnVwUmVwbGF5TWVzc2FnZScsXG4gICAgICAgICdSZXNpemVPYnNlcnZlck1lc3NhZ2UnOiAnUmVzaXplT2JzZXJ2ZXJNZXNzYWdlJ1xuICAgIH1cbn1cbiIsICIvL1RPRE8gOiByZXVzZSBmcm9tIG9uZSBwbGFjZS5cbi8vIG5lZWRzIHRvIGJlIHVzZWQgaW4gbXlvcC1zZGssIG15b3AtZGFzaGJhb3JkLCBteW9wLXNlcnZlciwgbXlvcC1jbGkgLi5cblxuZXhwb3J0IGNvbnN0IHV1aWR2NCA9ICgpID0+IHtcbiAgICByZXR1cm4gXCIxMDAwMDAwMC0xMDAwLTQwMDAtODAwMC0xMDAwMDAwMDAwMDBcIi5yZXBsYWNlKC9bMDE4XS9nLCBjID0+XG4gICAgICAgICgrYyBeIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoMSkpWzBdICYgMTUgPj4gK2MgLyA0KS50b1N0cmluZygxNilcbiAgICApO1xufVxuXG4vLyBDb252ZXJ0IFVVSUQgc3RyaW5nIHRvIGJ5dGVzXG5leHBvcnQgY29uc3QgdXVpZFRvQnl0ZXMgPSAodXVpZDogc3RyaW5nKTogVWludDhBcnJheSA9PiB7XG4gICAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShcbiAgICAgICAgdXVpZC5yZXBsYWNlKC8tL2csICcnKS5tYXRjaCgvLnsxLDJ9L2cpIS5tYXAoYnl0ZSA9PiBwYXJzZUludChieXRlLCAxNikpXG4gICAgKTtcbn07XG5cbi8vIENvbnZlcnQgYnl0ZXMgdG8gVVVJRCBzdHJpbmdcbmV4cG9ydCBjb25zdCBieXRlc1RvVXVpZCA9IChieXRlczogVWludDhBcnJheSk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgaGV4ID0gWy4uLmJ5dGVzXS5tYXAoYiA9PiBiLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpKS5qb2luKCcnKTtcbiAgICByZXR1cm4gW1xuICAgICAgICBoZXguc2xpY2UoMCwgOCksXG4gICAgICAgIGhleC5zbGljZSg4LCAxMiksXG4gICAgICAgIGhleC5zbGljZSgxMiwgMTYpLFxuICAgICAgICBoZXguc2xpY2UoMTYsIDIwKSxcbiAgICAgICAgaGV4LnNsaWNlKDIwKVxuICAgIF0uam9pbignLScpO1xufTtcblxuLy8gQmFzZTY0IFVSTC1zYWZlIGVuY29kZVxuZXhwb3J0IGNvbnN0IGJhc2U2NFVybEVuY29kZSA9IChieXRlczogVWludDhBcnJheSk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgYmFzZTY0ID0gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLmJ5dGVzKSk7XG4gICAgcmV0dXJuIGJhc2U2NC5yZXBsYWNlKC9cXCsvZywgJy0nKS5yZXBsYWNlKC9cXC8vZywgJ18nKS5yZXBsYWNlKC89KyQvLCAnJyk7XG59O1xuXG4vLyBCYXNlNjQgVVJMLXNhZmUgZGVjb2RlXG5leHBvcnQgY29uc3QgYmFzZTY0VXJsRGVjb2RlID0gKHN0cjogc3RyaW5nKTogVWludDhBcnJheSA9PiB7XG4gICAgbGV0IGJhc2U2NCA9IHN0ci5yZXBsYWNlKC8tL2csICcrJykucmVwbGFjZSgvXy9nLCAnLycpO1xuICAgIHdoaWxlIChiYXNlNjQubGVuZ3RoICUgNCkgYmFzZTY0ICs9ICc9JztcbiAgICBjb25zdCBiaW5hcnkgPSBhdG9iKGJhc2U2NCk7XG4gICAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShiaW5hcnksIGNoYXIgPT4gY2hhci5jaGFyQ29kZUF0KDApKTtcbn07XG5cbi8vIENvbXByZXNzIGFuIGFycmF5IG9mIFVVSURzIGludG8gYSBzaG9ydCBVUkwtc2FmZSBzdHJpbmdcbmV4cG9ydCBjb25zdCBjb21wcmVzc1VVSURzID0gKHV1aWRzOiBzdHJpbmdbXSk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgYWxsQnl0ZXMgPSB1dWlkcy5mbGF0TWFwKHV1aWQgPT4gQXJyYXkuZnJvbSh1dWlkVG9CeXRlcyh1dWlkKSkpO1xuICAgIHJldHVybiBiYXNlNjRVcmxFbmNvZGUobmV3IFVpbnQ4QXJyYXkoYWxsQnl0ZXMpKTtcbn07XG5cbi8vIERlY29tcHJlc3MgZnJvbSBVUkwtc2FmZSBzdHJpbmcgYmFjayB0byBhbiBhcnJheSBvZiBVVUlEc1xuZXhwb3J0IGNvbnN0IGRlY29tcHJlc3NVVUlEcyA9IChlbmNvZGVkOiBzdHJpbmcpOiBzdHJpbmdbXSA9PiB7XG4gICAgY29uc3QgYnl0ZXMgPSBiYXNlNjRVcmxEZWNvZGUoZW5jb2RlZCk7XG4gICAgaWYgKGJ5dGVzLmxlbmd0aCAlIDE2ICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaW5wdXQgbGVuZ3RoJyk7XG5cbiAgICBjb25zdCB1dWlkczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAxNikge1xuICAgICAgICB1dWlkcy5wdXNoKGJ5dGVzVG9VdWlkKGJ5dGVzLnNsaWNlKGksIGkgKyAxNikpKTtcbiAgICB9XG4gICAgcmV0dXJuIHV1aWRzO1xufTtcbiIsICJleHBvcnQgKiBmcm9tICcuL3V1aWQudHMnXG5cbmV4cG9ydCBjb25zdCB3YWl0ID0gKG1zOiBudW1iZXIpID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59IiwgImltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge3V1aWR2NH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vaG9zdFwiO1xuaW1wb3J0IHtJUmVmQ29uZmlnfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBNZXNzYWdlRGlyZWN0aW9uIHtcbiAgICBzdGF0aWMgZG93biA9ICdkb3duJyBhcyBjb25zdFxuICAgIHN0YXRpYyB1cCA9ICd1cCcgYXMgY29uc3Rcbn1cblxuZXhwb3J0IHR5cGUgTWVzc2FnZURpcmVjdGlvbk9wdGlvbiA9ICd1cCcgfCAnZG93bic7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTXlvcE1lc3NhZ2U8VCA9IGFueT4ge1xuICAgIGlkID0gdXVpZHY0KClcblxuICAgIHN0YXRpYyBjcmVhdGU8VCwgVSBleHRlbmRzIG5ldyAoLi4uYXJnczogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFU+KSA9PiBUID0gdHlwZW9mIHRoaXM+KFxuICAgICAgICB0aGlzOiBVLFxuICAgICAgICAuLi5hcmdzOiBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8VT5cbiAgICApOiBJbnN0YW5jZVR5cGU8dHlwZW9mIHRoaXM+IHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gbmV3IHRoaXMoLi4uYXJncyk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vY29uc29sZS5sb2coJ21lZXNhZ2UgaWQgY3JlYXRlZCcsIHRoaXMuaWQsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO1xuICAgIH1cblxuICAgIG15b3AgPSB0cnVlXG5cbiAgICBhYnN0cmFjdCBtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXkgfCBzdHJpbmc7XG5cbiAgICBjb250ZW50PzogVFxuXG4gICAgLy8gVE9ETyA6IGNhbnQgYmUgb3B0aW9uYWwgXG4gICAgc291cmNlPzogc3RyaW5nXG4gICAgZGVzdGluYXRpb24/OiBzdHJpbmdcblxuICAgIHJvdXRlPzogc3RyaW5nW11cblxuICAgIHJlZj86IFJlZlxuXG4gICAgZGlyZWN0aW9uPzogTWVzc2FnZURpcmVjdGlvbk9wdGlvblxuXG4gICAgY2xlYW5hYmxlOiBib29sZWFuID0gZmFsc2VcblxuICAgIGlzVHlwZW9mKG1zZzogQmFzZU15b3BNZXNzYWdlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBtc2cubWVzc2FnZVR5cGUgPT09IHRoaXMubWVzc2FnZVR5cGVcbiAgICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNeW9wRWxlbWVudE1lc3NhZ2U8VCA9IGFueT4gZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8VD4ge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZikge1xuICAgICAgICBzdXBlcigpXG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTXlvcEJpbmRSZXBsYXlNZXNzYWdlPFQgPSBhbnk+IGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyPzogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTXlvcEJpbmRNZXNzYWdlPFQgPSBhbnksIFIgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2UgPSBhbnk+IGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPFQ+IHtcblxuICAgIHB1YmxpYyBhYnN0cmFjdCByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5O1xuXG4gICAgcHVibGljIGhhbmRsZXJVbmlxdWVJZCA9IHV1aWR2NCgpXG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgaGFuZGxlcjogKG1lc3NhZ2U6IFIpID0+IHZvaWQpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlZiB7XG4gICAgcHVibGljIG15b3AgPSB0cnVlO1xuXG4gICAgcHVibGljIF9fbm9uUHJveGllZD86IFJlZjtcblxuICAgIHN0YXRpYyBjcmVhdGUoc2VsZWN0b3I6IHN0cmluZywgcmVmQ29uZmlnPzogSVJlZkNvbmZpZywgY29tcG9uZW50PzogSU15b3BDb21wb25lbnQpIHtcbiAgICAgICAgbGV0IF9yZWZDb25maWcgPSByZWZDb25maWc7XG4gICAgICAgIGlmICghX3JlZkNvbmZpZykge1xuICAgICAgICAgICAgX3JlZkNvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICBpZDogJycsXG4gICAgICAgICAgICAgICAgbmFtZTogJycsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yVHlwZTogJ2lkLWF0dHJpYnV0ZScsXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6IHNlbGVjdG9yLFxuICAgICAgICAgICAgICAgIGJlaGF2aW9yOiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjb2RlJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gYXMgSVJlZkNvbmZpZ1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUmVmKF9yZWZDb25maWcsIGNvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZkNvbmZpZzogSVJlZkNvbmZpZywgcHVibGljIGNvbXBvbmVudD86IElNeW9wQ29tcG9uZW50KSB7XG4gICAgICAgIHRoaXMuX19ub25Qcm94aWVkID0ge1xuICAgICAgICAgICAgLi4udGhpcyxcbiAgICAgICAgICAgIGNvbXBvbmVudDogbnVsbCAvLyBpbiBvcmRlciB0byBiZSBzZXJpYWxpemFibGVcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0NsaWNrUmVwbGF5TWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIEJpbmRDbGlja01lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgQ2xpY2tSZXBsYXlNZXNzYWdlPiB7XG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXlcbiAgICBtZXNzYWdlVHlwZSA9ICdCaW5kQ2xpY2tNZXNzYWdlJztcbiAgICBjbGVhbmFibGUgPSB0cnVlO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBoYW5kbGVyOiAobWVzc2FnZTogQ2xpY2tSZXBsYXlNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENsaWNrUmVwbGF5TWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG59XG5cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlVGV4dE1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8c3RyaW5nPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9ICdDaGFuZ2VUZXh0TWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIHRleHQ6IHN0cmluZykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSB0ZXh0XG4gICAgfVxufSIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7Um9vdFJlZn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlJ1xuXG5jb25zdCBmdW5jdGlvbkJvZHlSZWdleCA9IC8oPzpmdW5jdGlvblxccypcXHcqXFxzKlxcKFteKV0qXFwpXFxzKlxceyhbXFxzXFxTXSo/KVxcfXwoXFwoW14pXSpcXClcXHMqPT5cXHMqXFx7KFtcXHNcXFNdKj8pXFx9KSlcXHMqJC87XG5jb25zdCBleHByZXNzaW9uQm9keVJlZ2V4ID0gL1xcKFxccypbXildK1xccypcXClcXHMqPT5cXHMqKC4rKS87XG5cbmV4cG9ydCBjb25zdCBzdHJpcEZ1bmN0aW9uID0gKGNvbnRlbnQ6IHN0cmluZykgPT4ge1xuICAgIGxldCBtYXRjaCA9IGNvbnRlbnQubWF0Y2goZnVuY3Rpb25Cb2R5UmVnZXgpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgICByZXR1cm4gbWF0Y2hbMV0gfHwgbWF0Y2hbM107XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IG1hdGNoID0gY29udGVudC5tYXRjaChleHByZXNzaW9uQm9keVJlZ2V4KTtcbiAgICAgICAgaWYgKG1hdGNoKVxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdLnRyaW0oKTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIHNjcmlwdElucHV0cyA9IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuXG59IHwge307XG5cbmV4cG9ydCB0eXBlIHNjcmlwdFZhcnM8VD4gPSB7XG4gICAgc2VuZDogKGRhdGE6IFQpID0+IHZvaWQ7XG4gICAgLy8gY29tcGxldGVTdHJlYW06ICgpID0+IHZvaWQ7XG4gICAgcm9vdFJlZjogUm9vdFJlZjtcbiAgICBtYWtlU2VyaWFsaXphYmxlOiB0eXBlb2YgbWFrZVNlcmlhbGl6YWJsZVxufVxuXG5leHBvcnQgdHlwZSBleHRlbmRlZFNjcmlwdFZhcnM8VCwgST4gPSB7XG4gICAgW0sgaW4ga2V5b2YgSV06IElbS107XG59ICYgc2NyaXB0VmFyczxUPlxuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZVNjcmlwdE1lc3NhZ2U8VCA9IGFueSwgSSBleHRlbmRzIHNjcmlwdElucHV0cyA9IGFueT4gZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8c3RyaW5nLCBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQ+PiB7XG5cbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleTtcbiAgICBtZXNzYWdlVHlwZSA9ICdFeGVjdXRlU2NyaXB0TWVzc2FnZSc7XG4gICAgc2NyaXB0OiBzdHJpbmcgPSAnJ1xuXG4gICAgc3RhdGljIHJlcGxpZXJLZXkgPSAnc2VuZCc7XG4gICAgc3RhdGljIGNvbXBsZXRlU3RyZWFtS2V5ID0gJ2NvbXBsZXRlU3RyZWFtJztcblxuICAgIGNvbnN0cnVjdG9yKHNjcmlwdDogKHZhcnM6IGV4dGVuZGVkU2NyaXB0VmFyczxULCBJPikgPT4gVCwgaGFuZGxlcjogKG1lc3NhZ2U6IEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2U8VD4pID0+IHZvaWQgPSAoKSA9PiB7XG4gICAgfSwgcHVibGljIHNjcmlwdElucHV0cz86IEkpIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG4gICAgICAgIHRoaXMuc2NyaXB0ID0gc2NyaXB0LnRvU3RyaW5nKCk7XG5cbiAgICAgICAgLy9UT0RPOiBjYW4gYmUgcmVtb3ZlXG4gICAgICAgIHRoaXMuY29udGVudCA9IHNjcmlwdC50b1N0cmluZygpXG4gICAgICAgIHRoaXMuY29udGVudCA9IHN0cmlwRnVuY3Rpb24odGhpcy5jb250ZW50KTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQgPSBhbnk+IGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlPFQ+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI6IHN0cmluZywgcHVibGljIGNvbnRlbnQ6IFQpIHtcbiAgICAgICAgc3VwZXIocmVwbGF5VG9IYW5kbGVyKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgICBFeGVjdXRlU2NyaXB0TWVzc2FnZSxcbiAgICBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlLFxuICAgIGV4dGVuZGVkU2NyaXB0VmFycyxcbiAgICBzY3JpcHRJbnB1dHMsIHN0cmlwRnVuY3Rpb25cbn0gZnJvbSBcIi4vRXhlY3V0ZVNjcmlwdE1lc3NhZ2UudHNcIjtcblxuZXhwb3J0IHR5cGUgY3VzdG9tUmVmU2NyaXB0SW5wdXRzID0ge1xuICAgIGVsZW1lbnRJZDogc3RyaW5nLFxuICAgIHJlZj86IEhUTUxFbGVtZW50LFxuICAgIF9zY3JpcHQ/OiBzdHJpbmcsXG4gICAgX19zY3JpcHRJbnB1dHM/OiBPYmplY3Rcbn07XG5cbmV4cG9ydCBjbGFzcyBDdXN0b21SZWZNZXNzYWdlPFQgPSBhbnksIEkgZXh0ZW5kcyBzY3JpcHRJbnB1dHMgPSBjdXN0b21SZWZTY3JpcHRJbnB1dHM+IGV4dGVuZHMgRXhlY3V0ZVNjcmlwdE1lc3NhZ2U8VCwgSSAmIGN1c3RvbVJlZlNjcmlwdElucHV0cz4ge1xuXG4gICAgY29uc3RydWN0b3Ioc2NyaXB0OiAodmFyczogZXh0ZW5kZWRTY3JpcHRWYXJzPFQsIEkgJiBjdXN0b21SZWZTY3JpcHRJbnB1dHM+KSA9PiBULFxuICAgICAgICAgICAgICAgIHB1YmxpYyBzY3JpcHRJbnB1dHM6IEkgJiBjdXN0b21SZWZTY3JpcHRJbnB1dHMsXG4gICAgICAgICAgICAgICAgaGFuZGxlcjogKG1lc3NhZ2U6IEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2U8VD4pID0+IHZvaWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgfSkge1xuXG4gICAgICAgIC8vbW9jayB2YXJzXG4gICAgICAgIC8vIGxldCByb290UmVmLCBlbGVtZW50SWQsIF9zY3JpcHQsIF9fc2NyaXB0SW5wdXRzO1xuICAgICAgICBzdXBlcigoe3Jvb3RSZWYsIGVsZW1lbnRJZCwgX3NjcmlwdCwgX19zY3JpcHRJbnB1dHN9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWZzID0gKHJvb3RSZWYuc2hhZG93Um9vdCB8fCByb290UmVmLmNvbnRhaW5lcikucXVlcnlTZWxlY3RvckFsbChgWyR7J215b3AtaWQnfT0nJHtlbGVtZW50SWR9J11gKTtcbiAgICAgICAgICAgIGlmIChyZWZzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIC8vICBjb25zdCByZWYgPSByZWZzWzBdO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogdGhpbmsgYWJvdXQgZXhwb3NpbmcgXCJyZWZzXCIgYW5kIG5vdCBvbmx5IFwicmVmXCJcbiAgICAgICAgICAgICAgICAvL2ZvciBjYXNlcyB3aGVyZSB0aGUgUmVmIGhhcyBtdWx0aXBsYXRlIGltcGxlbWVudGF0aW9uc1xuXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIF9fc2NyaXB0SW5wdXRzLnJlZiA9IHJlZnNbMF07XG5cbiAgICAgICAgICAgICAgICBjb25zdCBkeW5hbWljRnVuY3Rpb24gPSBuZXcgRnVuY3Rpb24oYHJldHVybiAoJHtfc2NyaXB0fSkoLi4uYXJndW1lbnRzKWApO1xuICAgICAgICAgICAgICAgIHJldHVybiBkeW5hbWljRnVuY3Rpb24oX19zY3JpcHRJbnB1dHMpO1xuXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIC8vcmV0dXJuIEZ1bmN0aW9uKCdyZWYnLCAncm9vdFJlZicsIC4uLk9iamVjdC5rZXlzKF9fc2NyaXB0SW5wdXRzKSwgX3NjcmlwdCEpKHJlZiwgcm9vdFJlZiwgLi4uT2JqZWN0LnZhbHVlcyhfX3NjcmlwdElucHV0cykpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbCBhcyBUO1xuICAgICAgICB9LCBoYW5kbGVyKTtcblxuICAgICAgICB0aGlzLnNjcmlwdElucHV0cyA9IHtcbiAgICAgICAgICAgIC4uLnNjcmlwdElucHV0cyxcbiAgICAgICAgICAgIC8vX3NjcmlwdDogc3RyaXBGdW5jdGlvbihzY3JpcHQudG9TdHJpbmcoKSksXG4gICAgICAgICAgICBfc2NyaXB0OiBzY3JpcHQudG9TdHJpbmcoKVxuICAgICAgICB9O1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXJpYWxpemFibGUsIFNlcmlhbGl6YWJsZVNrZWxldG9ufSBmcm9tIFwiLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2U8VCBleHRlbmRzIGtleW9mIEhUTUxFbGVtZW50RXZlbnRNYXAgPSBrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwPiBleHRlbmRzIE15b3BCaW5kTWVzc2FnZSB7XG5cbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleTtcbiAgICBtZXNzYWdlVHlwZSA9ICdBZGRFdmVudExpc3RlbmVyTWVzc2FnZSc7XG4gICAgY2xlYW5hYmxlID0gdHJ1ZTtcbiAgICBzZXJpYWxpemFibGVTa2VsZXRvbjogU2VyaWFsaXphYmxlU2tlbGV0b248SFRNTEVsZW1lbnRFdmVudE1hcFtUXT4gPSBmYWxzZSAvLyB7fSAvLyBlbXB0eVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBwdWJsaWMgdHlwZTogVCwgcHVibGljIGhhbmRsZXI6IChtZXNzYWdlOiBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpXG4gICAgfVxuXG4gICAgd2l0aFNlcmlhbGl6YWJsZVNrZWxldG9uKHNlcmlhbGl6YWJsZVNrZWxldG9uOiBTZXJpYWxpemFibGVTa2VsZXRvbjxIVE1MRWxlbWVudEV2ZW50TWFwW1RdPikge1xuICAgICAgICB0aGlzLnNlcmlhbGl6YWJsZVNrZWxldG9uID0gc2VyaWFsaXphYmxlU2tlbGV0b247XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI6IHN0cmluZywgcHVibGljIGU6IFNlcmlhbGl6YWJsZTxFdmVudD4pIHtcbiAgICAgICAgc3VwZXIocmVwbGF5VG9IYW5kbGVyKTtcbiAgICAgICAgdGhpcy5jb250ZW50ID0ge1xuICAgICAgICAgICAgZVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBSZWYsfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuXG5cbmV4cG9ydCBjbGFzcyBTZXRBdHRyaWJ1dGVNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcblxuICAgIG1lc3NhZ2VUeXBlID0gJ1NldEF0dHJpYnV0ZU1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBwdWJsaWMgbmFtZTogc3RyaW5nLCBwdWJsaWMgdmFsdWU6IHN0cmluZykge1xuICAgICAgICBzdXBlcigpXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NlcmlhbGl6YWJsZX0gZnJvbSBcIi4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZT4ge1xuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5XG4gICAgbWVzc2FnZVR5cGUgPSAnR2V0RWxlbWVudFZhbHVlTWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIGhhbmRsZXI6IChtZXNzYWdlOiBFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgRm9ybURhdGFFbnRyeSA9IHtcbiAgICBpZD86IHN0cmluZyxcbiAgICBuYW1lPzogc3RyaW5nLFxuICAgIHZhbHVlPzogSW5wdXRFbGVtZW50VmFsdWUsXG4gICAgcmVxdWlyZWQ/OiBib29sZWFuLFxuICAgIHZhbGlkaXR5PzogU2VyaWFsaXphYmxlPFZhbGlkaXR5U3RhdGU+LFxuICAgIG15b3BJZD86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBJbnB1dEVsZW1lbnRGb3JtVmFsdWUgPSB7XG4gICAgZm9ybURhdGE/OiB7IFtrZXk6IHN0cmluZ106IEZvcm1EYXRhRW50cnkgfVxuICAgIHVubWFwcGVkRGF0YT86IEZvcm1EYXRhRW50cnlbXVxufTtcblxuZXhwb3J0IHR5cGUgSW5wdXRFbGVtZW50VmFsdWUgPSBzdHJpbmcgfCBJbnB1dEVsZW1lbnRGb3JtVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkXG5cbmV4cG9ydCBjbGFzcyBFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250ZW50OiBJbnB1dEVsZW1lbnRWYWx1ZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn1cblxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRJbm5lckh0bWwgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8c3RyaW5nPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9ICdTZXRJbm5lckh0bWwnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBpbm5lckh0bWw6IHN0cmluZykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSBpbm5lckh0bWxcbiAgICB9XG59IiwgImltcG9ydCB7IEJhc2VNeW9wTWVzc2FnZSB9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5cbi8vIHNlbnQgYnkgaG9zdCB0byBjb21wb25lbnRzLCBjb250YWlucyB0aGllciBpZCBcbmV4cG9ydCBjbGFzcyBJbml0TWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTx7IGlkOiBzdHJpbmcgfT4ge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0luaXRNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSB7IGlkIH1cbiAgICB9XG5cbiAgICBpc1R5cGVvZihtc2c6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gbXNnLm1lc3NhZ2VUeXBlID09PSB0aGlzLm1lc3NhZ2VUeXBlXG4gICAgfVxufVxuXG4vLyBjb21wb25lbnQgbm90aWZ5IGhvc3QgdGhlIGl0IHdhcyBpbml0YXRlZCBcbmV4cG9ydCBjbGFzcyBJbml0UmVzcG9uc2UgZXh0ZW5kcyBJbml0TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnSW5pdFJlc3BvbnNlJztcbn1cblxuLy8gY29tcG9uZW50IGFzayB0byBob3N0IHRvIGdldCBpbml0YXRlZCBcbmV4cG9ydCBjbGFzcyBJbml0UmVxdWVzdCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnSW5pdFJlcXVlc3QnO1xufVxuIiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50Q29uZmlnLCBJUmVmQ29uZmlnfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0L2hvc3RTREsudHNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZkNvbmZpZzogSVJlZkNvbmZpZyxcbiAgICAgICAgICAgICAgICBwdWJsaWMgbmVzdGVkQ29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBvcHRpb25zOiBsb2FkZXJPcHRpb25zLFxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IChtZXNzYWdlOiBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZSkgPT4gdm9pZCxcbiAgICApIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG5cbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIE5lc3RlZFJlZiA9IHtcbiAgICByZWZOYW1lOiBzdHJpbmcsXG4gICAgY29tcG9uZW50RGVmaW5pdGlvbklkOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI6IHN0cmluZywgcHVibGljIG5lc3RlZFJlZnM6IE5lc3RlZFJlZltdLCBwdWJsaWMgZmFpbGVkPzogYm9vbGVhbikge1xuICAgICAgICBzdXBlcihyZXBsYXlUb0hhbmRsZXIpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIEVudmVsb3BlZE1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0VudmVsb3BlZE1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGRlc3RpbmF0aW9uOiBzdHJpbmcsIHB1YmxpYyBtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICBjb25zdCBpbm5lckVudmVsb3BlZE1lc3NhZ2UgPSAobWVzc2FnZSBhcyBFbnZlbG9wZWRNZXNzYWdlKTtcbiAgICAgICAgdGhpcy5yb3V0ZSA9IFtkZXN0aW5hdGlvbiwgLi4uaW5uZXJFbnZlbG9wZWRNZXNzYWdlLnJvdXRlID8gaW5uZXJFbnZlbG9wZWRNZXNzYWdlLnJvdXRlIDogW11dO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge0lFbGVtZW50UmVmfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBEZXRlY3RNeW9wUmVmc01lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8YW55LCBEZXRlY3RlZE15b3BSZWZzTWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0RldGVjdE15b3BSZWZzTWVzc2FnZSdcbiAgICByZXBseU1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5O1xufVxuXG5leHBvcnQgY2xhc3MgRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2U8SUVsZW1lbnRSZWZbXT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5O1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlcGxheVRvSGFuZGxlcjogc3RyaW5nLCBteW9wRWxlbWVudFJlZnM6IElFbGVtZW50UmVmW10pIHtcbiAgICAgICAgc3VwZXIocmVwbGF5VG9IYW5kbGVyKVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSBteW9wRWxlbWVudFJlZnM7XG4gICAgfVxuXG4gICAgaXNUeXBlb2YobXNnOiBCYXNlTXlvcE1lc3NhZ2U8YW55Pik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gbXNnLm1lc3NhZ2VUeXBlID09PSB0aGlzLm1lc3NhZ2VUeXBlXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIEdldEF0dHJpYnV0ZU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZT4ge1xuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5XG4gICAgbWVzc2FnZVR5cGUgPSAnR2V0QXR0cmlidXRlTWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIHB1YmxpYyBuYW1lOiBzdHJpbmcsIGhhbmRsZXI6IChtZXNzYWdlOiBHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbnRlbnQ6IHN0cmluZyB8IG51bGwpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG5cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4uL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vaG9zdFwiO1xuXG50eXBlIE1ldGhvZE5hbWVzPFQ+ID0ge1xuICAgIC8vIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgPyBLIDogbmV2ZXI7XG4gICAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyAoKSA9PiB2b2lkID8gSyA6IG5ldmVyO1xufVtrZXlvZiBUXTtcblxuLy8gRGVmaW5lIGEgdHlwZSB0aGF0IGFsbG93cyBvbmx5IHN0cmluZ3MgY29ycmVzcG9uZGluZyB0byB0aGUgbWV0aG9kIG5hbWVzIG9mIFRcbnR5cGUgTWV0aG9kU3RyaW5nPFQ+ID0gTWV0aG9kTmFtZXM8VD4gZXh0ZW5kcyBpbmZlciBNID8gTSBleHRlbmRzIHN0cmluZyA/IE0gOiBuZXZlciA6IG5ldmVyO1xuXG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdFeGVjdXRlQ29tcG9uZW50TWV0aG9kJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBtZXRob2Q6IE1ldGhvZFN0cmluZzxJTXlvcENvbXBvbmVudD4pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi9CYXNlTWVzc2FnZVwiO1xuXG5leHBvcnQgY2xhc3MgU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ1NldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJztcbn1cblxuZXhwb3J0IGNsYXNzIE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc7XG59IiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0NsZWFudXBSZXBsYXlNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgQ2xlYW51cE1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgQ2xlYW51cFJlcGxheU1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0NsZWFudXBNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjbGVhbnVwRm9yTWVzc2FnZUlkOiBzdHJpbmcsIGhhbmRsZXI6IChtZXNzYWdlOiBDbGVhbnVwUmVwbGF5TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDbGVhbnVwUmVwbGF5TWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY3VzdG9tQ2xlYW51cDogYm9vbGVhbikge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIERpc3Bvc2VNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdEaXNwb3NlTWVzc2FnZSc7XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi9CYXNlTWVzc2FnZVwiO1xuXG5leHBvcnQgY2xhc3MgU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBjbGVhbmFibGUgPSB0cnVlO1xuICAgIG1lc3NhZ2VUeXBlID0gJ1NldFJlc2l6ZU9ic2VydmVyTWVzc2FnZSc7XG59XG5cbmV4cG9ydCBjbGFzcyBSZXNpemVPYnNlcnZlck1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ1Jlc2l6ZU9ic2VydmVyTWVzc2FnZSc7XG59IiwgImV4cG9ydCAqIGZyb20gJy4vQmFzZU1lc3NhZ2UnO1xuXG4vL3VzZXIncyBtZXNzYWdlc1xuZXhwb3J0ICogZnJvbSAnLi9CaW5kQ2xpY2tNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQ2hhbmdlVGV4dE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9FeGVjdXRlU2NyaXB0TWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0N1c3RvbVJlZk1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9BZGRFdmVudExpc3RlbmVyTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL1NldEF0dHJpYnV0ZU1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9HZXRFbGVtZW50VmFsdWVNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vU2V0SW5uZXJIdG1sJztcblxuLy9zeXN0ZW0gbWVzc2FnZXNcbmV4cG9ydCAqIGZyb20gJy4vSW5pdE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vRW52ZWxvcGVkTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0RldGVjdE15b3BSZWZzTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0dldEVsZW1lbnRWYWx1ZU1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAgJy4vR2V0QXR0cmlidXRlTWVzc2FnZSc7XG5cbmV4cG9ydCAqIGZyb20gJy4vY29tcG9uZW50TWVzc2FnZXMvRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCc7XG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudE1lc3NhZ2VzL1NldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQ2xlYW51cE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9EaXNwb3NlTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudE1lc3NhZ2VzL1NldFJlc2l6ZU9ic2VydmVyTWVzc2FnZSc7IiwgImltcG9ydCB7TXlvcE1lc3NhZ2VLZXksIE15b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7XG4gICAgQmFzZU15b3BNZXNzYWdlLFxuICAgIERpc3Bvc2VNZXNzYWdlLCBFeGVjdXRlQ29tcG9uZW50TWV0aG9kLCBNZXNzYWdlRGlyZWN0aW9uLFxuICAgIENsZWFudXBNZXNzYWdlLCBDbGVhbnVwUmVwbGF5TWVzc2FnZSxcbiAgICBNeW9wQmluZE1lc3NhZ2UsXG4gICAgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZcbn0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyLCBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtIb3N0U0RLLCBsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuXG4vKipcbiAqIFJlc3VsdCByZXR1cm5lZCBieSBvYnNlcnZlQXV0b1NpemUgY2FsbGJhY2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRvU2l6ZVJlc3VsdCB7XG4gICAgLyoqIEN1cnJlbnQgd2lkdGggKGZyb20gY29udGVudCkgKi9cbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIC8qKiBDdXJyZW50IGhlaWdodCAoZnJvbSBjb250ZW50KSAqL1xuICAgIGhlaWdodDogbnVtYmVyO1xuICAgIC8qKiBXaGV0aGVyIHdpZHRoIGlzIGJlaW5nIGF1dG8tc2l6ZWQgKi9cbiAgICBhdXRvU2l6aW5nV2lkdGg6IGJvb2xlYW47XG4gICAgLyoqIFdoZXRoZXIgaGVpZ2h0IGlzIGJlaW5nIGF1dG8tc2l6ZWQgKi9cbiAgICBhdXRvU2l6aW5nSGVpZ2h0OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIG9ic2VydmVBdXRvU2l6ZSBtZXRob2RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRvU2l6ZU9wdGlvbnMge1xuICAgIC8qKiBDYWxsYmFjayBjYWxsZWQgd2l0aCBzaXplIGluZm8gd2hlbmV2ZXIgc2l6ZSBjaGFuZ2VzICovXG4gICAgb25TaXplQ2hhbmdlPzogKHJlc3VsdDogQXV0b1NpemVSZXN1bHQpID0+IHZvaWQ7XG4gICAgLyoqIE1pbmltdW0gd2lkdGggY29uc3RyYWludCAqL1xuICAgIG1pbldpZHRoPzogbnVtYmVyIHwgc3RyaW5nO1xuICAgIC8qKiBNYXhpbXVtIHdpZHRoIGNvbnN0cmFpbnQgKi9cbiAgICBtYXhXaWR0aD86IG51bWJlciB8IHN0cmluZztcbiAgICAvKiogTWluaW11bSBoZWlnaHQgY29uc3RyYWludCAqL1xuICAgIG1pbkhlaWdodD86IG51bWJlciB8IHN0cmluZztcbiAgICAvKiogTWF4aW11bSBoZWlnaHQgY29uc3RyYWludCAqL1xuICAgIG1heEhlaWdodD86IG51bWJlciB8IHN0cmluZztcbiAgICAvKiogRXhwbGljaXQgd2lkdGggc2V0IGJ5IGhvc3QgLSBpZiBkZWZpbmVkLCBkb24ndCBhdXRvLXNpemUgd2lkdGggKi9cbiAgICBleHBsaWNpdFdpZHRoPzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIC8qKiBFeHBsaWNpdCBoZWlnaHQgc2V0IGJ5IGhvc3QgLSBpZiBkZWZpbmVkLCBkb24ndCBhdXRvLXNpemUgaGVpZ2h0ICovXG4gICAgZXhwbGljaXRIZWlnaHQ/OiBzdHJpbmcgfCBudW1iZXI7XG4gICAgLyoqIEZvcmNlIGF1dG8tc2l6ZSBldmVuIGlmIGNvbnRhaW5lciBoYXMgZGltZW5zaW9ucyAqL1xuICAgIGZvcmNlQXV0b1NpemU/OiBib29sZWFuO1xuICAgIC8qKiBNaW4gaGVpZ2h0IHVzZWQgYnkgbG9hZGVyIHRvIGRldGVjdCBjb2xsYXBzZSAoZGVmYXVsdDogNTApICovXG4gICAgbG9hZGVyTWluSGVpZ2h0PzogbnVtYmVyO1xufVxuXG4vL1RPRE8gOiBjaGFuZ2UgSU15b3BDb21wb25lbnQgdG8gcmVmIHNwZWNpZmljIGltcGxcbnR5cGUgUmVmVHlwZXMgPSB7XG4gICAgW2tleTogc3RyaW5nXTogSU15b3BDb21wb25lbnQgfCBSZWZcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU15b3BDb21wb25lbnQ8UCA9IGFueSwgUiA9IGFueT4ge1xuXG4gICAgaWQ6IHN0cmluZztcblxuICAgIGlzSW5pdGlhdGVkOiBib29sZWFuO1xuXG4gICAgbWFya2VkRm9yRGlzcG9zZWQ6IGJvb2xlYW47XG5cbiAgICBzZXRJbml0aWF0ZWQ6ICgpID0+IHZvaWRcblxuICAgIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnXG5cbiAgICBjb250YWluZXI6IEhUTUxFbGVtZW50XG5cbiAgICAvL3JlZiBjb21wb25lbnRzIGNhbiBiZSBlbGVtZW50LWxlc3NcbiAgICBlbGVtZW50PzogSFRNTEVsZW1lbnRcblxuICAgIHNlbmQ6IChtc2c6IEJhc2VNeW9wTWVzc2FnZSkgPT4gQ2xlYW51cEhhbmRsZXJcblxuICAgIGJpbmQobWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5LCBoYW5kbGVyOiAoKSA9PiBib29sZWFuKTogdm9pZDtcblxuICAgIGJpbmQ8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4obWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5LCBoYW5kbGVyOiAobWVzc2FnZTogVCkgPT4gYm9vbGVhbik6IHZvaWQ7XG5cbiAgICAvLyBib29sZWFuIHJldHVybmVkIHZhbHVlID0gaGFuZGxlZCBvciBub3RcbiAgICBvbk1lc3NhZ2VSZWNlaXZlZDogKG1zZzogQmFzZU15b3BNZXNzYWdlKSA9PiBib29sZWFuXG5cbiAgICBpbml0aWF0ZWQ6ICgpID0+IFByb21pc2U8YW55PjtcblxuICAgIGRpc3Bvc2U6ICgpID0+IHZvaWRcblxuICAgIGhpZGUoKTogdm9pZDtcblxuICAgIHNob3coKTogdm9pZDtcblxuICAgIGluc3BlY3QoKTogdm9pZDtcblxuICAgIC8qKlxuICAgICAqIE9ic2VydmVzIHRoZSBpZnJhbWUgY29udGVudCBzaXplIGFuZCBhdXRvbWF0aWNhbGx5IHN5bmNzIGl0IHRvIHRoZSBpZnJhbWUgZWxlbWVudC5cbiAgICAgKiBPbmx5IGF2YWlsYWJsZSBmb3IgaWZyYW1lLWJhc2VkIGNvbXBvbmVudHMuIFVzZXMgZGlyZWN0IGNvbnRlbnREb2N1bWVudCBhY2Nlc3MuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgaW5jbHVkaW5nIHNpemUgY2hhbmdlIGNhbGxiYWNrIGFuZCBtaW4vbWF4IGNvbnN0cmFpbnRzXG4gICAgICogQHJldHVybnMgQ2xlYW51cCBmdW5jdGlvbiB0byBzdG9wIG9ic2VydmluZ1xuICAgICAqL1xuICAgIG9ic2VydmVBdXRvU2l6ZT86IChvcHRpb25zPzogQXV0b1NpemVPcHRpb25zKSA9PiBDbGVhbnVwSGFuZGxlcjtcblxuICAgIC8qKlxuICAgICAqIFBhcnNlZCBteW9wOnNpemUgbWV0YSB0YWcgZnJvbSB0aGUgY29tcG9uZW50IEhUTUwuXG4gICAgICogU2V0IGJ5IEhUTUxDb21wb25lbnRMb2FkZXIgYmVmb3JlIGlmcmFtZSBjcmVhdGlvbi5cbiAgICAgKiBVc2VkIGJ5IHRoZSBSZWFjdCBob3N0IHRvIGRldGVybWluZSBzaXppbmcgbW9kZSAoZmlsbCB2cyBjb250ZW50KS5cbiAgICAgKi9cbiAgICBzaXplTWV0YT86IHsgd2lkdGg/OiBzdHJpbmcgfCBudW1iZXI7IGhlaWdodD86IHN0cmluZyB8IG51bWJlcjsgbWluV2lkdGg/OiBudW1iZXI7IG1heFdpZHRoPzogbnVtYmVyOyBtaW5IZWlnaHQ/OiBudW1iZXI7IG1heEhlaWdodD86IG51bWJlciB9IHwgbnVsbDtcblxuICAgIHBhcmVudD86IElNeW9wQ29tcG9uZW50O1xuXG4gICAgcHJvcHM6IFBcblxuICAgIHJlZnM6IFJcbn1cblxuZnVuY3Rpb24gaXNJbmhlcml0RnJvbShvYmo6IGFueSwgYmFzZUNsYXNzOiBhbnkpIHtcbiAgICBpZiAoIW9iaikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKTtcblxuICAgIGlmICghcHJvdG8pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChwcm90by5jb25zdHJ1Y3Rvci5uYW1lID09PSBiYXNlQ2xhc3MubmFtZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGlzSW5oZXJpdEZyb20ocHJvdG8sIGJhc2VDbGFzcyk7XG59XG5cbi8vIFRPRE8gOiBtb3ZlIDogXG50eXBlIG1lc3NhZ2VIYW5kbGVyPFQ+ID0gKG1lc3NhZ2U6IFQpID0+IGJvb2xlYW47XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTXlvcENvbXBvbmVudDxQID0gYW55LCBSIGV4dGVuZHMgUmVmVHlwZXMgPSBSZWZUeXBlcz4gaW1wbGVtZW50cyBJTXlvcENvbXBvbmVudDxQPiB7XG4gICAgaWQ6IHN0cmluZyA9ICcnXG5cbiAgICBtZXNzYWdlSGFuZGxlcnM6IFJlY29yZDxzdHJpbmcsIG1lc3NhZ2VIYW5kbGVyPGFueT5bXT4gPSB7fTtcblxuICAgIGVsZW1lbnQ/OiBIVE1MRWxlbWVudFxuXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHB1YmxpYyBjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgcHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuaWQgPSBvcHRpb25zPy5pZCB8fCBIb3N0U0RLLkluc3RhbmNlKCkuYXNzaWduSWQoY29tcG9uZW50RGVmaW5pdGlvbik7XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSBvcHRpb25zPy50aW1lb3V0ID8gb3B0aW9ucz8udGltZW91dCA6IDUgKiAxMDAwO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0luaXRpYXRlZCAmJiB0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0ICYmICF0aGlzLl9tYXJrZWRGb3JEaXNwb3NlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3doZW5Jbml0aWF0ZWRSZWplY3QoYHRpbWVvdXRfJHt0aW1lb3V0fSAke3RoaXMuaWR9YCk7XG5cbiAgICAgICAgICAgICAgICAvLyBBIFRJTUVELU9VVCBDT01QT05FTlQgTVVTVCBVTlJFR0lTVEVSIElUU0VMRiAtLSBOT0JPRFkgRUxTRSBDQU4uXG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvLyBob3N0U0RLLmxvYWRDb21wb25lbnQgcmVqZWN0cyB3aXRoIHRoaXMgc2FtZSBlcnJvciwgc28gdGhlIGNhbGxlciBuZXZlclxuICAgICAgICAgICAgICAgIC8vIHJlY2VpdmVzIHRoZSBjb21wb25lbnQgYW5kIGhhcyBubyBoYW5kbGUgdG8gZGlzcG9zZS4gV2l0aG91dCB0aGlzIHRoZVxuICAgICAgICAgICAgICAgIC8vIGhvc3Qga2VlcHMgaXQgaW4gYGNvbXBvbmVudHNgIEFORCBgY29tcG9uZW50czJpbml0YCBmb3IgdGhlIGxpZmUgb2YgdGhlXG4gICAgICAgICAgICAgICAgLy8gcGFnZSwgYW5kIHRoYXQgY29zdCBjb21wb3VuZHM6IGBjb21wb25lbnRzMmluaXRgIGlzIHdhbGtlZCBvbiBldmVyeVxuICAgICAgICAgICAgICAgIC8vIEluaXRSZXF1ZXN0LCBgaXNUcnVzdGVkU291cmNlYCB3YWxrcyBib3RoIGFycmF5cyBvbiBldmVyeSBtZXNzYWdlLCBhbmQgYVxuICAgICAgICAgICAgICAgIC8vIFVJIHRoYXQgcmV0cmllcyAtLSBhIHJlZWwgcGlja2VyLCBhIGRpYWxvZyByZW9wZW5lZCBwZXIgdGVtcGxhdGUgLS0gYWRkc1xuICAgICAgICAgICAgICAgIC8vIGEgZGVhZCBlbnRyeSBlYWNoIGF0dGVtcHQuXG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvLyBkaXNwb3NlKCkgaXMgdGhlIGNvaGVyZW50IGVuZCBzdGF0ZTogaXQgdW5yZWdpc3RlcnMgdGhyb3VnaCB0aGUgaG9zdCdzXG4gICAgICAgICAgICAgICAgLy8gJ29uRGlzcG9zZScgaGFuZGxlciBhbmQgZHJvcHMgdGhlIGZyYW1lIHRoYXQgbmV2ZXIgYW5zd2VyZWQuXG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwb3NlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRpbWVvdXQpO1xuXG4gICAgICAgIC8vIFRPRE8gOiBhdXRvIGluc3BlY3QsIGNvbnRyb2wgZnJvbSBjb25maWdcbiAgICAgICAgdGhpcy5pbml0aWF0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGlmICh3aW5kb3cubXlvcC5ob3N0U0RLLmluc3BlY3RlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5zcGVjdCgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9tYXJrZWRGb3JEaXNwb3NlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgZ2V0IG1hcmtlZEZvckRpc3Bvc2VkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFya2VkRm9yRGlzcG9zZWQ7XG4gICAgfVxuXG4gICAgc2V0IG1hcmtlZEZvckRpc3Bvc2VkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLl9tYXJrZWRGb3JEaXNwb3NlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uOiBUaGUgY29tcG9uZW50IGlzIGFscmVhZHkgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgZGlzcG9zZWQuIERpc3Bvc2Ugb3BlcmF0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWQgYWdhaW4gdW50aWwgdGhlIGN1cnJlbnQgZGlzcG9zYWwgcHJvY2VzcyBpcyBjb21wbGV0ZS4nKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX21hcmtlZEZvckRpc3Bvc2VkID0gdmFsdWU7XG4gICAgfVxuXG4gICAgYWJzdHJhY3QgaGlkZSgpOiB2b2lkO1xuXG4gICAgYWJzdHJhY3Qgc2hvdygpOiB2b2lkO1xuXG4gICAgYWJzdHJhY3QgaW5zcGVjdCgpOiBDbGVhbnVwSGFuZGxlcjtcblxuICAgIC8vVE9ETzogdXNlIGJpbmRXaGVuIHdpdGggcmV0dXJuIHRydWUgcHJlZGljYXRlIC4uLlxuICAgIGJpbmQgPSA8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4obWVzc2FnZVR5cGU6IHN0cmluZywgaGFuZGxlcjogKG1lc3NhZ2U6IFQpID0+IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0pIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXSA9IFtdXG4gICAgICAgIH1cblxuICAgICAgICAvLyBoYW5kbGUgZHVwbGljYXRlIHJlZ2lzdHJhdGlvblxuICAgICAgICBpZiAoIXRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXS5pbmNsdWRlcyhoYW5kbGVyKSkge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdLnB1c2goaGFuZGxlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBiaW5kV2hlbiA9IDxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPihtZXNzYWdlVHlwZTogc3RyaW5nLCBwcmVkaWNhdGU6IChtZXNzYWdlOiBUKSA9PiBib29sZWFuLCBoYW5kbGVyOiAobWVzc2FnZTogVCkgPT4gdm9pZCk6IENsZWFudXBIYW5kbGVyID0+IHtcbiAgICAgICAgaWYgKCFoYW5kbGVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhblxcJ3QgdXNlIGNvbXBvbmVudC5iaW5kV2hlbiB3aXRob3V0IGFuIGhhbmRsZXInKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0gPSBbXVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV07XG5cbiAgICAgICAgY29uc3QgcHJlZGljYXRlV3JhcHBlZEhhbmRsZXIgPSAoZTogVCkgPT4ge1xuICAgICAgICAgICAgaWYgKHByZWRpY2F0ZShlKSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXIoZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy9UT0RPIDogaGFuZGxlIGR1cGxpY2F0ZSByZWdpc3RyYXRpb24gP1xuICAgICAgICBoYW5kbGVycy5wdXNoKHByZWRpY2F0ZVdyYXBwZWRIYW5kbGVyKTtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBoYW5kbGVycy5pbmRleE9mKHByZWRpY2F0ZVdyYXBwZWRIYW5kbGVyKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uTWVzc2FnZVJlY2VpdmVkKGluY29tZU1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdvbk1lc3NhZ2VSZWNlaXZlZCcsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYsIGluY29tZU1lc3NhZ2UsIHRoaXMpO1xuICAgICAgICAvL1RPRE8gOiBoYW5kZWwgc3BlY2lhbCBldmV0cyA/IGxpa2UgaW5pdFJlcyA/XG4gICAgICAgIGlmIChpbmNvbWVNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCkge1xuICAgICAgICAgICAgY29uc3QgdHlwZWRNZXNzYWdlID0gKGluY29tZU1lc3NhZ2UgYXMgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCk7XG5cbiAgICAgICAgICAgIC8va2VlcGluZyB0aGlzLm1ldGhvZCgpIHNvIHRoYXQgY29udGV4dCB3aWxsIHNhdmVkXG4gICAgICAgICAgICBpZiAoKHRoaXMgYXMgYW55KVt0eXBlZE1lc3NhZ2UubWV0aG9kXSkge1xuICAgICAgICAgICAgICAgICh0aGlzIGFzIGFueSlbdHlwZWRNZXNzYWdlLm1ldGhvZF0odHlwZWRNZXNzYWdlLmNvbnRlbnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgbWV0aG9kIG5vdCBmb3VuZCAke3R5cGVkTWVzc2FnZS5tZXRob2R9IG9uIGNvbXBvbmVudGAsIHRoaXMpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyc1tpbmNvbWVNZXNzYWdlLm1lc3NhZ2VUeXBlXTtcbiAgICAgICAgaWYgKGhhbmRsZXJzICYmIGhhbmRsZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IGhhbmRsZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgaGFuZGxlcnMuZm9yRWFjaChoYW5kbGVyID0+IHtcbiAgICAgICAgICAgICAgICBoYW5kbGVkID0gaGFuZGxlZCB8fCBoYW5kbGVyKGluY29tZU1lc3NhZ2UpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL1RPRE8gOiBjb25zb2xlIG9ubHkgd2hlbiBkZWJ1ZyBjb25maWdcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ25vIGhhbmRsZXJzIGZvdW5kIGZvciAnLCBpbmNvbWVNZXNzYWdlKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzZXRJbml0aWF0ZWQgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuaXNJbml0aWF0ZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmICh0aGlzLl93aGVuSW5pdGlhdGVkUmVzb2x2ZSlcbiAgICAgICAgICAgIHRoaXMuX3doZW5Jbml0aWF0ZWRSZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgaXNJbml0aWF0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIF93aGVuSW5pdGlhdGVkUmVzb2x2ZT86ICh2YWx1ZT86IGFueSkgPT4gYW55O1xuICAgIF93aGVuSW5pdGlhdGVkUmVqZWN0PzogKHZhbHVlPzogYW55KSA9PiBhbnk7XG5cbiAgICBfd2hlbkluaXRpYXRlZDogUHJvbWlzZTxhbnk+ID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgIHRoaXMuX3doZW5Jbml0aWF0ZWRSZWplY3QgPSByZWplY3Q7XG4gICAgfSk7XG5cbiAgICBpbml0aWF0ZWQgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl93aGVuSW5pdGlhdGVkO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2VuZENsZWFudXBNZXNzYWdlKG1lc3NhZ2U6IENsZWFudXBNZXNzYWdlKTogdm9pZCB7XG4gICAgICAgIG1lc3NhZ2Uuc291cmNlID0gdGhpcy5pZDtcbiAgICAgICAgbWVzc2FnZS5kZXN0aW5hdGlvbiA9IHRoaXMuaWQ7XG4gICAgICAgIG1lc3NhZ2UuZGlyZWN0aW9uID0gTWVzc2FnZURpcmVjdGlvbi5kb3duO1xuXG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gdGhpcy5iaW5kV2hlbihtZXNzYWdlLnJlcGx5TWVzc2FnZUtleSwgKG1zZzogTXlvcEJpbmRSZXBsYXlNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbXNnLnJlcGxheVRvSGFuZGxlciA9PT0gbWVzc2FnZS5oYW5kbGVyVW5pcXVlSWRcbiAgICAgICAgfSwgKG06IENsZWFudXBSZXBsYXlNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICBtZXNzYWdlLmhhbmRsZXIobSk7XG4gICAgICAgICAgICBjbGVhbnVwSGFuZGxlcigpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBoYW5kbGVyID0gbWVzc2FnZS5oYW5kbGVyO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGRlbGV0ZSBtZXNzYWdlLmhhbmRsZXJcblxuICAgICAgICB0aGlzLnNlbmQobWVzc2FnZSk7XG5cbiAgICAgICAgbWVzc2FnZS5oYW5kbGVyID0gaGFuZGxlcjtcbiAgICB9XG5cbiAgICBzZW5kKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSk6IENsZWFudXBIYW5kbGVyIHtcbiAgICAgICAgLy9tZXNzYWdlcyB0aGF0IGV4ZXRyYWN0ZWQgZnJvbSBlbnZlbG9wZSBhbHJlYWR5IGhhdmUgc291cmNlIGluIHRoZW1cbiAgICAgICAgaWYgKCFtZXNzYWdlLnNvdXJjZSlcbiAgICAgICAgICAgIG1lc3NhZ2Uuc291cmNlID0gdGhpcy5pZDtcblxuICAgICAgICBpZiAoIW1lc3NhZ2UuZGVzdGluYXRpb24pXG4gICAgICAgICAgICBtZXNzYWdlLmRlc3RpbmF0aW9uID0gdGhpcy5pZDtcblxuICAgICAgICBtZXNzYWdlLmRpcmVjdGlvbiA9IE1lc3NhZ2VEaXJlY3Rpb24uZG93bjtcblxuICAgICAgICBsZXQgY2xlYW51cEhhbmRsZXI7XG4gICAgICAgIC8vIFRPRE8gOiBmaXggaGVhdnkgb3AuLlxuICAgICAgICAvLyAgaWYgKGlzSW5oZXJpdEZyb20obWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlKSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmIChtZXNzYWdlLmhhbmRsZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IChtZXNzYWdlIGFzIE15b3BCaW5kTWVzc2FnZSk7XG4gICAgICAgICAgICBjbGVhbnVwSGFuZGxlciA9IHRoaXMuYmluZFdoZW4odHlwZWRNZXNzYWdlLnJlcGx5TWVzc2FnZUtleSwgKG1zZzogTXlvcEJpbmRSZXBsYXlNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1zZy5yZXBsYXlUb0hhbmRsZXIgPT09IHR5cGVkTWVzc2FnZS5oYW5kbGVyVW5pcXVlSWRcbiAgICAgICAgICAgIH0sIHR5cGVkTWVzc2FnZS5oYW5kbGVyKTtcblxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZGVsZXRlIG1lc3NhZ2UuaGFuZGxlclxuICAgICAgICB9XG5cbiAgICAgICAgLy9UT0RPOiB0aGluayBhYm91dCB0aGF0XG4gICAgICAgIGlmIChtZXNzYWdlLnJlZikge1xuICAgICAgICAgICAgLy8gc2VyaWFsaXphYmxlXG4gICAgICAgICAgICBtZXNzYWdlLnJlZiA9IG1lc3NhZ2UucmVmLl9fbm9uUHJveGllZCB8fCBtZXNzYWdlLnJlZjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXNzYWdlLmNsZWFuYWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbmRDbGVhbnVwTWVzc2FnZShuZXcgQ2xlYW51cE1lc3NhZ2UobWVzc2FnZS5pZCwgKHJlcGxheSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBsb2cgcmVwbGF5P1xuICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICAgIGlmIChjbGVhbnVwSGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBjbGVhbnVwSGFuZGxlcigpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogUnVucyB0aGUgJ29uRGlzcG9zZScgaGFuZGxlcnMgb25jZS4gaG9zdFNESyByZWdpc3RlcnMgdGhlIG9uZSB0aGF0IHVucmVnaXN0ZXJzXG4gICAgICogIHRoaXMgY29tcG9uZW50LCBzbyBpdCBoYXMgdG8gcnVuIG9uIEVWRVJZIGRpc3Bvc2UgcGF0aCwgaW5pdGlhdGVkIG9yIG5vdC4gKi9cbiAgICBwcml2YXRlIHJ1bkRpc3Bvc2VIYW5kbGVycygpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgb25EaXNwb3NlSGFuZGxlcnMgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyc1snb25EaXNwb3NlJ107XG4gICAgICAgIGlmIChvbkRpc3Bvc2VIYW5kbGVycykge1xuICAgICAgICAgICAgb25EaXNwb3NlSGFuZGxlcnMuZm9yRWFjaChkaXNwb3NlSGFuZGxlciA9PiB7XG4gICAgICAgICAgICAgICAgLy9UT0RPIDogc2VuZCBudWxsIG9yIGZpeCB0aGUgdHlwZSA/XG4gICAgICAgICAgICAgICAgZGlzcG9zZUhhbmRsZXIobnVsbCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYXJrZWRGb3JEaXNwb3NlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzSW5pdGlhdGVkKSB7XG4gICAgICAgICAgICAvLyBBIENPTVBPTkVOVCBUSEFUIE5FVkVSIElOSVRJQVRFRCBTVElMTCBIQVMgVE8gQkUgVU5SRUdJU1RFUkVELlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIFRoaXMgdXNlZCB0byBgcmV0dXJuYCBoZXJlLCB3aGljaCBsZWFrZWQ6IGhvc3RTREsgdHJhY2tzIGV2ZXJ5IGNvbXBvbmVudCBieVxuICAgICAgICAgICAgLy8gYmluZGluZyBhbiAnb25EaXNwb3NlJyBoYW5kbGVyIHRoYXQgcmVtb3ZlcyBpdCBmcm9tIGBjb21wb25lbnRzYCBhbmRcbiAgICAgICAgICAgIC8vIGBjb21wb25lbnRzMmluaXRgLCBhbmQgdGhvc2UgaGFuZGxlcnMgbGl2ZSBiZWxvdyB0aGlzIGxpbmUuIFNvIGEgY29tcG9uZW50XG4gICAgICAgICAgICAvLyB0aGF0IHRpbWVkIG91dCBhbmQgd2FzIHRoZW4gZGlzcG9zZWQgaGFkIGl0cyBpZnJhbWUgcHVsbGVkIGZyb20gdGhlIERPTVxuICAgICAgICAgICAgLy8gKG15b3BJZnJhbWVDb21wb25lbnQuZGlzcG9zZSBkb2VzIHRoYXQgYWZ0ZXIgc3VwZXIuZGlzcG9zZSkgd2hpbGUgc3RheWluZyBpblxuICAgICAgICAgICAgLy8gYm90aCBob3N0IGFycmF5cyBmb3JldmVyLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIFRoYXQgaXMgbm90IGEgc2xvdyBsZWFrLCBpdCBjb21wb3VuZHM6IGBjb21wb25lbnRzMmluaXRgIGlzIHdhbGtlZCBvbiBldmVyeVxuICAgICAgICAgICAgLy8gSW5pdFJlcXVlc3QgYW5kIGBpc1RydXN0ZWRTb3VyY2VgIHdhbGtzIGJvdGggYXJyYXlzIG9uIGV2ZXJ5IG1lc3NhZ2UsIHNvIGVhY2hcbiAgICAgICAgICAgIC8vIGRlYWQgZW50cnkgY29zdHMgYSBgc2VuZCgpYCBpbnRvIGEgcmVtb3ZlZCBmcmFtZSBvbiBldmVyeSBmdXR1cmUgaGFuZHNoYWtlLlxuICAgICAgICAgICAgLy8gUmUtb3BlbmluZyBhIGRpYWxvZyB0aGF0IG1vdW50cyBjb21wb25lbnRzIC0tIFBpYy1UaW1lJ3MgcmVlbCBwaWNrZXIgLS0gYWRkc1xuICAgICAgICAgICAgLy8gb25lIGRlYWQgZW50cnkgcGVyIGF0dGVtcHQuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gT25seSB0aGUgRGlzcG9zZU1lc3NhZ2UgaXMgZ2VudWluZWx5IGNvbmRpdGlvbmFsOiB0aGVyZSBpcyBubyBsaXZlIGZyYW1lIHRvXG4gICAgICAgICAgICAvLyB0ZWxsLiBFdmVyeXRoaW5nIGVsc2UgbXVzdCBydW4uXG4gICAgICAgICAgICB0aGlzLnJ1bkRpc3Bvc2VIYW5kbGVycygpO1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlcnMgPSB7fTtcbiAgICAgICAgICAgIHRoaXMuaWQgKz0gJ19kaXNwb3NlZCc7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coJ2Rpc3Bvc2luZyBjb21wb25lbnQnLCB0aGlzLmlkKTtcblxuICAgICAgICAvLyAvL1RPRE8gOiBpbXBsZW1lbnQgZGlzcG9zZSBmbG93XG4gICAgICAgIC8vIE9iamVjdC5rZXlzKHRoaXMucmVmcykuZm9yRWFjaChyZWZLZXk9PntcbiAgICAgICAgLy8gICAgIHRoaXMucmVmc1tyZWZLZXldLmRpc3Bvc2UoKTtcbiAgICAgICAgLy8gfSk7XG5cbiAgICAgICAgLy9UT0RPIDogY2hlY2sgaWYgdGhlcmUgaXMgYW55IHRpbWUgZm9yIHRoZSBvXG4gICAgICAgIC8vIHRoZXIgc2lkZSB0byBwcm9jY2VzcyB0byBtZXNzYWdlIGJlZm9yZSBkaWUgP1xuICAgICAgICAvL25vdGlmeSB0aGUgb3RoZXIgc2lkZSBTREtcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBEaXNwb3NlTWVzc2FnZSgpKVxuXG4gICAgICAgIHRoaXMucnVuRGlzcG9zZUhhbmRsZXJzKCk7XG5cbiAgICAgICAgLy9jb25zb2xlLmxvZyh0aGlzLmNvbnRhaW5lcik7XG4gICAgICAgIC8vdGhpcy5jb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXJzID0ge31cbiAgICAgICAgdGhpcy5pZCArPSAnX2Rpc3Bvc2VkJztcbiAgICAgICAgdGhpcy5pc0luaXRpYXRlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHByb3BzOiBQID0ge30gYXMgdW5rbm93biBhcyBQO1xuICAgIHJlZnM6IFIgPSB7fSBhcyB1bmtub3duIGFzIFI7XG59XG4iLCAiZXhwb3J0IGludGVyZmFjZSBJRWxlbWVudFJlZiB7XG4gICAgbXlvcElkPzogc3RyaW5nXG4gICAgaHRtbFRhZ05hbWU6IHN0cmluZ1xuICAgIEJvdW5kaW5nUmVjdD86IERPTVJlY3RcbiAgICBvZmZzZXRUb3A/OiBudW1iZXJcbiAgICBvZmZzZXRMZWZ0PzogbnVtYmVyXG5cbiAgICB0eXBlOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIFhQYXRoRWxlbWVudFJlZiBpbXBsZW1lbnRzIElFbGVtZW50UmVmIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgeFBhdGg6IHN0cmluZyxcbiAgICAgICAgICAgICAgICBwdWJsaWMgaHRtbFRhZ05hbWU6IHN0cmluZyxcbiAgICAgICAgICAgICAgICBwdWJsaWMgQm91bmRpbmdSZWN0PzogRE9NUmVjdCxcbiAgICAgICAgICAgICAgICBwdWJsaWMgb2Zmc2V0VG9wPzogbnVtYmVyLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBvZmZzZXRMZWZ0PzogbnVtYmVyKSB7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IHN0cmluZyA9ICdYUGF0aEVsZW1lbnRSZWYnXG59XG5cbmV4cG9ydCBjbGFzcyBNeW9wRWxlbWVudFJlZiBpbXBsZW1lbnRzIElFbGVtZW50UmVmIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbXlvcElkOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcHVibGljIGh0bWxUYWdOYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcHVibGljIEJvdW5kaW5nUmVjdD86IERPTVJlY3QsXG4gICAgICAgICAgICAgICAgcHVibGljIG9mZnNldFRvcD86IG51bWJlcixcbiAgICAgICAgICAgICAgICBwdWJsaWMgb2Zmc2V0TGVmdD86IG51bWJlcikge1xuXG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IHN0cmluZyA9ICdNeW9wRWxlbWVudFJlZidcbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZX0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyfSBmcm9tIFwiLi9pbmRleC50c1wiO1xuXG5leHBvcnQgdHlwZSBJTWVzc2FnZUV4ZWN1dG9yQ2xlYW51cCA9IENsZWFudXBIYW5kbGVyIHwgUHJvbWlzZTxDbGVhbnVwSGFuZGxlcj4gfCBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcblxuZXhwb3J0IGNvbnN0IHJ1bkV4ZWN1dG9yQ2xlYW51cCA9IGFzeW5jICh0YXNrOiBJTWVzc2FnZUV4ZWN1dG9yQ2xlYW51cCkgPT4ge1xuICAgIGlmICh0eXBlb2YgdGFzayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBJdCdzIGEgZnVuY3Rpb24sIGNhbGwgaXRcbiAgICAgICAgdGFzaygpO1xuICAgIH0gZWxzZSBpZiAodGFzayBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgLy8gSXQncyBhIFByb21pc2UsIGF3YWl0IGl0XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRhc2s7XG5cbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSByZXN1bHQgaXMgYSBmdW5jdGlvbiwgY2FsbCBpdFxuICAgICAgICAgICAgcmVzdWx0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gSWYgdGFzayBpcyB2b2lkLCBkbyBub3RoaW5nXG59XG5cbnR5cGUgSU1lc3NhZ2VFeGVjdXRvcjxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPiA9IChtZXNzYWdlOiBUKSA9PiBJTWVzc2FnZUV4ZWN1dG9yQ2xlYW51cDtcblxuaW50ZXJmYWNlIElNZXNzYWdlSGFuZGxlcjxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5XG5cbiAgICBleGVjdXRvcjogSU1lc3NhZ2VFeGVjdXRvcjxUPjtcblxuICAgIG1lc3NhZ2VUb0hvc3Q6IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU1lc3NhZ2VIYW5kbGVyPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2UgPSBhbnk+IGltcGxlbWVudHMgSU1lc3NhZ2VIYW5kbGVyPFQ+IHtcblxuICAgIC8vVE9ETyA6IGFkZCBkaXNwb3NlIG1ldGhvZFxuXG4gICAgY29uc3RydWN0b3IocHVibGljIG1lc3NhZ2VUb0hvc3Q6IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB2b2lkKSB7XG5cbiAgICB9XG5cbiAgICBhYnN0cmFjdCBtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXlcbiAgICBhYnN0cmFjdCBleGVjdXRvcjogSU1lc3NhZ2VFeGVjdXRvcjxUPjtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VDb250ZXh0TWVzc2FnZUhhbmRsZXI8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSA9IGFueSwgRSA9IGFueT4gZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8VD4ge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZCwgcHVibGljIGNvbnRleHQ/OiBFKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2VUb0hvc3QpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyLCBydW5FeGVjdXRvckNsZWFudXB9IGZyb20gXCIuL2luZGV4LnRzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vYmFzZU1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge1xuICAgIEJhc2VNeW9wTWVzc2FnZSwgQ2xlYW51cE1lc3NhZ2UsIENsZWFudXBSZXBsYXlNZXNzYWdlLCBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLCBFbnZlbG9wZWRNZXNzYWdlLFxuICAgIEluaXRNZXNzYWdlLFxuICAgIEluaXRSZXNwb25zZSxcbiAgICBNZXNzYWdlRGlyZWN0aW9uLFxuICAgIE15b3BCaW5kTWVzc2FnZSxcbiAgICBNeW9wQmluZFJlcGxheU1lc3NhZ2Vcbn0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5cbmV4cG9ydCBjbGFzcyBIb3N0ZWRDb21wb25lbnQ8VCA9IGFueT4ge1xuICAgIHNlbmQgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSA9PiB7XG4gICAgICAgIC8vZGVidWdnZXI7XG4gICAgfVxuXG4gICAgLy9vbk1lc3NhZ2VSZWNlaXZlZDogKG1zZzogSU15b3BNZXNzYWdlKSA9PiB2b2lkO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGlkOiBzdHJpbmcsIHB1YmxpYyBjb250ZXh0PzogVCkge1xuXG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNeW9wU0RLIHtcbiAgICBpbml0OiAoKSA9PiB2b2lkO1xuXG4gICAgbWVzc2FnZVRvSG9zdDogKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHZvaWRcblxuICAgIHN1cHBvcnRlZEhhbmRsZXJzOiBCYXNlTWVzc2FnZUhhbmRsZXJbXTtcblxuICAgIGhhbmRsZUluY29tZU1lc3NhZ2VzOiAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSA9PiB2b2lkXG5cbiAgICBjb21wb25lbnRzOiBSZWNvcmQ8c3RyaW5nLCBIb3N0ZWRDb21wb25lbnQ+O1xufVxuXG4vLyBjb25zdCBsb2NhbEhvc3RIYW5kbGVkTWVzc2FnZXMgPSBbXG4vLyAgICAgTXlvcE1lc3NhZ2VzLkluaXRSZXF1ZXN0LFxuLy8gICAgIE15b3BNZXNzYWdlcy5Jbml0UmVzcG9uc2UsXG4vLyAgICAgLy9NeW9wTWVzc2FnZXMuRW52ZWxvcGVkTWVzc2FnZSxcbi8vIF1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNeW9wU0RLIGltcGxlbWVudHMgSU15b3BTREsge1xuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVRvSG9zdDogKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHZvaWQ7XG5cbiAgICBhYnN0cmFjdCBzdXBwb3J0ZWRIYW5kbGVyczogQmFzZU1lc3NhZ2VIYW5kbGVyW107XG5cbiAgICBtZXNzYWdlVG9IYW5kbGVBZnRlckluaXQ6IEJhc2VNeW9wTWVzc2FnZVtdID0gW107XG5cbiAgICBjb21wb25lbnRzOiBSZWNvcmQ8c3RyaW5nLCBIb3N0ZWRDb21wb25lbnQ+ID0ge307XG5cbiAgICBhbHdheXNQYXNzRW52ZWxvcGVzVG9Ib3N0OiBib29sZWFuID0gZmFsc2VcblxuICAgIG1lc3NhZ2VDbGVhbnVwQ2FjaGU6IFJlY29yZDxzdHJpbmcsIENsZWFudXBIYW5kbGVyIHwgUHJvbWlzZTxDbGVhbnVwSGFuZGxlcj4+IHwgUHJvbWlzZTx2b2lkPiA9IHt9O1xuXG4gICAgaGFuZGxlSW5jb21lTWVzc2FnZXMoZXZlbnQ6IGFueSkge1xuICAgICAgICBjb25zdCBldmVudENvbnRlbnQgPSBldmVudC5kYXRhID8gZXZlbnQuZGF0YSA6IGV2ZW50LmRldGFpbDtcblxuICAgICAgICBpZiAoIWV2ZW50Q29udGVudCB8fCAhZXZlbnRDb250ZW50Lm15b3ApIHtcbiAgICAgICAgICAgIC8vIG5vdCBteW9wIG1hcmtlZCBldmVudCBcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlID0gZXZlbnRDb250ZW50IGFzIEJhc2VNeW9wTWVzc2FnZTtcblxuICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZGlyZWN0aW9uICE9PSBNZXNzYWdlRGlyZWN0aW9uLmRvd24pIHtcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdtZXNzYWdlIGRyb3BwZWQgaW4gYmFzZVNESywgZGlyZWN0aW9uIHdhcyAnLCBldmVudC5kYXRhLmRpcmVjdGlvbilcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGlmIChsb2NhbEhvc3RIYW5kbGVkTWVzc2FnZXMuaW5jbHVkZXMobWVzc2FnZS5tZXNzYWdlVHlwZSkpIHtcbiAgICAgICAgICAgIC8vICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vICAgICAvL1RPRE8gOiBmaXggZGlyZWN0aW9uID8gbWVzc2FnZSB3aWxsIG5vdCBwcm9jY2VzcyBvdGhlcndpc2VcbiAgICAgICAgICAgIC8vICAgICB3aW5kb3cubXlvcC5ob3N0U0RLLnNlbmQobWVzc2FnZSlcbiAgICAgICAgICAgIC8vICAgICByZXR1cm47XG4gICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuRGlzcG9zZU1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogc2hvdWxkIG5vdCBiZSBvcHRpb25hbCwgZml4IGFuZCByZW1vdmUgJ2lmJ1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmRlc3RpbmF0aW9uKVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5jb21wb25lbnRzW21lc3NhZ2UuZGVzdGluYXRpb25dXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBXZSBnb3Qgb3VyIGlkIGZyb20gb3VyIGhvc3RTREtcbiAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW5pdE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBTREsgbWF5IHNlcnZlIG1vcmUgdGhhbiAxIGNvbXBvbmVudCAuLiB0aGluayBhYm91dCB0aGF0XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NvbXBvbmVudElkID0gKG1lc3NhZ2UgYXMgSW5pdE1lc3NhZ2UpLmNvbnRlbnQuaWQ7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb21wb25lbnRzW25ld0NvbXBvbmVudElkXSkge1xuICAgICAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgICAgICAgICAvL3Rocm93IG5ldyBFcnJvcihcInJlY2hpdmVkIGluaXQgbWVzc2FnZSBmb3IgYW4gZXhzaXNpbmcgY29tcG9uZW50LlwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzW25ld0NvbXBvbmVudElkXSA9IG5ldyBIb3N0ZWRDb21wb25lbnQobmV3Q29tcG9uZW50SWQpXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBJbml0UmVzcG9uc2UobmV3Q29tcG9uZW50SWQpKTtcblxuICAgICAgICAgICAgICAgIC8vIFRPRE8gOiBpcyBpdCB0cnVlIHRvIG5vdCBwYXNzIGZ1cnRoZXIgKCB0byB0aGUgY29tcG9uZW50IClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGZvciBzYW1lIEhvc3RTREsgY2FzZXNcbiAgICAgICAgICAgIC8vIHdoZW4gYm90aCBSZWZDb21wb25lbnQgYW5kIHJlYWxDb21wb25lbnQgaG9zdGVkIGluIHRoZSBzYW1lIEhvc3RTREtcbiAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuRW52ZWxvcGVkTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudmVsb3BlZE1lc3NhZ2UgPSAobWVzc2FnZSBhcyBFbnZlbG9wZWRNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbm5lck1lc3NhZ2UgPSBlbnZlbG9wZWRNZXNzYWdlLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGlubmVyTWVzc2FnZTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFsd2F5c1Bhc3NFbnZlbG9wZXNUb0hvc3QgfHwgdGhpcy5jb21wb25lbnRzW21lc3NhZ2UuZGVzdGluYXRpb24hXSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uQ29tcG9uZW50ID0gbXlvcC5ob3N0U0RLLmNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT09IGlubmVyTWVzc2FnZS5kZXN0aW5hdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXN0aW5hdGlvbkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25Db21wb25lbnQuc2VuZChpbm5lck1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnZlbG9wZWREZXN0aW5hdGlvbkNvbXBvbmVudCA9IG15b3AuaG9zdFNESy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09PSBlbnZlbG9wZWRNZXNzYWdlLmRlc3RpbmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVudmVsb3BlZERlc3RpbmF0aW9uQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnZlbG9wZWREZXN0aW5hdGlvbkNvbXBvbmVudC5zZW5kKGlubmVyTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZihtZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSl7XG4gICAgICAgICAgICAvLyAgICAgY29uc3QgdHlwZWRNZXNzYWdlIDogQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSA9IG1lc3NhZ2UgYXMgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZTtcbiAgICAgICAgICAgIC8vIC8vICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUpIHtcblxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuQ2xlYW51cE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRNZXNzYWdlID0gbWVzc2FnZSBhcyBDbGVhbnVwTWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xlYW51cCA9IHRoaXMubWVzc2FnZUNsZWFudXBDYWNoZVt0eXBlZE1lc3NhZ2UuY2xlYW51cEZvck1lc3NhZ2VJZF07XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xlYW51cE1lc3NhZ2UgPSBuZXcgQ2xlYW51cFJlcGxheU1lc3NhZ2UoISFjbGVhbnVwKTtcbiAgICAgICAgICAgICAgICAgICAgY2xlYW51cE1lc3NhZ2UuZGVzdGluYXRpb24gPSBtZXNzYWdlLmRlc3RpbmF0aW9uO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghIWNsZWFudXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm1lc3NhZ2VDbGVhbnVwQ2FjaGVbdHlwZWRNZXNzYWdlLmNsZWFudXBGb3JNZXNzYWdlSWRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVuRXhlY3V0b3JDbGVhbnVwKGNsZWFudXApLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChjbGVhbnVwTWVzc2FnZSwgdHlwZWRNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBoYW5kZWwgZXJyb3I/XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KGNsZWFudXBNZXNzYWdlLCB0eXBlZE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgYWN0aW9uSGFuZGxlckZvdW5kID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnN1cHBvcnRlZEhhbmRsZXJzLmZvckVhY2goaGFuZGxlciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyLm1lc3NhZ2VUeXBlID09PSBtZXNzYWdlLm1lc3NhZ2VUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25IYW5kbGVyRm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xlYW51cCA9IGhhbmRsZXIuZXhlY3V0b3IobWVzc2FnZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmNsZWFuYWJsZSAmJiBjbGVhbnVwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlQ2xlYW51cENhY2hlW21lc3NhZ2UuaWRdID0gY2xlYW51cDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsZWFudXAgJiYgIW1lc3NhZ2UuY2xlYW5hYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDbGVhbnVwIGhhbmRsZXIgZ2VuZXJhdGVkIGZvciBub24tY2xlYW5hYmxlIG1lc3NhZ2UuIFxubWVzc2FnZVR5cGUgLSAke21lc3NhZ2UubWVzc2FnZVR5cGV9LCBoYW5kbGVyIGV4ZWN1dG9yIHdhcyAtICR7aGFuZGxlci5leGVjdXRvcn1cblxuUGxlYXNlIHJldmlldyB0aGUgbWVzc2FnZSBkZWZpbml0aW9uIG9iamVjdCAmIG1lc3NhZ2UgaGFuZGxlci5cblRvIGVuc3VyZSBjbGVhbnVwIHByb3Blcmx5IHNldCAnY2xlYW5hYmxlJyB0cnVlIGF0IG1lc3NhZ2UgZGVmaW5pdGlvbiBhbmQgcmV0dXJuIElNZXNzYWdlRXhlY3V0b3JDbGVhbnVwIGZyb20geW91ciBoYW5kbGVycy5gKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNsZWFudXAgJiYgbWVzc2FnZS5jbGVhbmFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGNsZWFudXAgaGFuZGxlciBnZW5lcmF0ZWQgZm9yIGEgY2xlYW5hYmxlIG1lc3NhZ2UuIFxubWVzc2FnZVR5cGUgLSAke21lc3NhZ2UubWVzc2FnZVR5cGV9LCBoYW5kbGVyIGV4ZWN1dG9yIHdhcyAtICR7aGFuZGxlci5leGVjdXRvcn1cblxuUGxlYXNlIHJldmlldyB0aGUgbWVzc2FnZSBkZWZpbml0aW9uIG9iamVjdCAmIG1lc3NhZ2UgaGFuZGxlci5cblRvIGVuc3VyZSBjbGVhbnVwIHByb3Blcmx5IHNldCAnY2xlYW5hYmxlJyB0cnVlIGF0IG1lc3NhZ2UgZGVmaW5pdGlvbiBhbmQgcmV0dXJuIElNZXNzYWdlRXhlY3V0b3JDbGVhbnVwIGZyb20geW91ciBoYW5kbGVycy5gKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIGlmICghYWN0aW9uSGFuZGxlckZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IHByaW50IHdpdGggZGVidWcgY29uZmlnIG9ubHlcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnbm8gbWVzc2FnZSBoYW5kbGVyIHdhcyBmb3VuZCBmb3IgJywgbWVzc2FnZSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd1bnN1cHBvcnRlZCBtZXNzYWdlIHR5cGUnKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWJzdHJhY3QgaW5pdDogKCkgPT4gdm9pZDtcbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi9NeW9wTWVzc2FnZXNcIjtcblxuZXhwb3J0ICogZnJvbSAnLi9NeW9wRWxlbWVudFJlZic7XG5leHBvcnQgKiBmcm9tICcuL2Jhc2VNZXNzYWdlSGFuZGxlcic7XG5leHBvcnQgKiBmcm9tICcuL0Jhc2VNeW9wU0RLJztcblxuZXhwb3J0IHR5cGUgQ2xlYW51cEhhbmRsZXIgPSAoKSA9PiB2b2lkXG5cbmV4cG9ydCB0eXBlIERpY3Rpb25hcnk8VD4gPSB7IFtrZXk6IHN0cmluZ106IFQ7IH07XG5cbi8vZXhwb3J0IHR5cGUgU2tpbkxvYWRlclR5cGUgPSAnSWZyYW1lTG9hZGVyJyB8ICdXZWJDb21wb25lbnRMb2FkZXInIHwgJ0hUTUxMb2FkZXInIHwgc3RyaW5nO1xuXG5leHBvcnQgY29uc3QgU2tpbkxvYWRlcnMgPSB7XG4gICAgXCJJZnJhbWVMb2FkZXJcIjogXCJJZnJhbWVMb2FkZXJcIixcbiAgICBcIldlYkNvbXBvbmVudExvYWRlclwiOiBcIldlYkNvbXBvbmVudExvYWRlclwiLFxuICAgIFwiSFRNTExvYWRlclwiOiBcIkhUTUxMb2FkZXJcIixcbiAgICBcIk1pbmltaXplZExvYWRlclwiOiBcIk1pbmltaXplZExvYWRlclwiXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgU2tpbkxvYWRlclR5cGUgPSBrZXlvZiB0eXBlb2YgU2tpbkxvYWRlcnM7XG5cbmV4cG9ydCB0eXBlIFByb3BUeXBlID0gJ2FueScgfCAnc3RyaW5nJyB8ICdudW1iZXInIHwgc3RyaW5nOyAvLyBUT0RPIDogPFxuZXhwb3J0IHR5cGUgUmVmU2VsZWN0b3JUeXBlID0gJ2lkLWF0dHJpYnV0ZScgfCAnY3NzLXNlbGVjdG9yJyB8ICd4cGF0aCcgfCBzdHJpbmc7XG5cbmV4cG9ydCBjb25zdCBMb2FkZXJGcmFtZXdvcmtzID0ge1xuICAgIFwicmVhY3RcIjogXCJyZWFjdFwiLFxuICAgIFwidnVlXCI6IFwidnVlXCIsXG4gICAgXCJhbmd1bGFyXCI6IFwiYW5ndWxhclwiLFxufSBhcyBjb25zdFxuZXhwb3J0IHR5cGUgTG9hZGVyRnJhbWV3b3JrVHlwZSA9IGtleW9mIHR5cGVvZiBMb2FkZXJGcmFtZXdvcmtzO1xuXG5leHBvcnQgaW50ZXJmYWNlIElXZWJDb21wb25lbnRMb2FkZXJDb25maWcgZXh0ZW5kcyBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogXCJXZWJDb21wb25lbnRMb2FkZXJcIjtcbiAgICB1cmw6IHN0cmluZyxcbiAgICB0YWc6IHN0cmluZyxcbiAgICBmcmFtZXdvcms/OiBMb2FkZXJGcmFtZXdvcmtUeXBlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUlmcmFtZUxvYWRlckNvbmZpZyBleHRlbmRzIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBcIklmcmFtZUxvYWRlclwiO1xuICAgIHVybDogc3RyaW5nXG4gICAgYXV0b0hlaWdodDogYm9vbGVhblxuICAgIGhlaWdodD86IHN0cmluZ1xuICAgIHdpZHRoPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBTaGFkb3dSb290TW9kZVR5cGUgPSB7XG4gICAgXCJvcGVuXCI6IFwib3BlblwiLFxuICAgIFwiY2xvc2VkXCI6IFwiY2xvc2VkXCIsXG4gICAgXCJub25lXCI6IFwibm9uZVwiLFxuICAgIFwibG9jYWxGcmFtZVwiOiBcImxvY2FsRnJhbWVcIlxufSBhcyBjb25zdDtcblxuXG5leHBvcnQgaW50ZXJmYWNlIElIVE1MTG9hZGVyQ29uZmlnIGV4dGVuZHMgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFwiSFRNTExvYWRlclwiO1xuICAgIEhUTUw6IHN0cmluZztcbiAgICAvL1RPRE86IHJlbmFtZShyb290TW9kZS9jdXN0b21FbGVtZW50TW9kZSkgKyBkYiBtaWdyYXRpb25cbiAgICBzaGFkb3dSb290TW9kZT86IGtleW9mIHR5cGVvZiBTaGFkb3dSb290TW9kZVR5cGU7XG4gICAgYXV0b0hlaWdodD86IGJvb2xlYW47XG4gICAgaGVpZ2h0Pzogc3RyaW5nO1xuICAgIHdpZHRoPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZW4gdHJ1ZSwgYW4gaW5saW5lLUhUTUwgKGxvY2FsRnJhbWUpIGNvbXBvbmVudCBpcyByZW5kZXJlZCBpbiBhIHNhbmRib3hlZCxcbiAgICAgKiBjcm9zcy1vcmlnaW4gaWZyYW1lIHdpdGggTk8gYWNjZXNzIHRvIHRoZSBob3N0IGRvY3VtZW50ICh1bnRydXN0ZWQgY29kZSkuXG4gICAgICogVGhlIGhvc3QgcmVuZGVyIHBvbGljeSBjYW4gYWxzbyBmb3JjZSB0aGlzIHJlZ2FyZGxlc3Mgb2YgdGhlIGNvbmZpZyB2YWx1ZS5cbiAgICAgKi9cbiAgICBpc29sYXRpb24/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEhvdyBhIGNvbXBvbmVudCBpcyByZW5kZXJlZCBvbiB0aGUgaG9zdCBwYWdlLCBpbiBhc2NlbmRpbmcgaXNvbGF0aW9uOlxuICogIC0gJ3dlYkNvbXBvbmVudCcgICBcdTIwMTQgY3VzdG9tIGVsZW1lbnQgb24gdGhlIGhvc3QgZG9jdW1lbnQgKG1vc3QgcHJpdmlsZWdlZClcbiAqICAtICdpZnJhbWUnICAgICAgICAgXHUyMDE0IHNhbWUtb3JpZ2luIGlubGluZS1IVE1MIGlmcmFtZSAodG9kYXkncyBkZWZhdWx0KVxuICogIC0gJ2lzb2xhdGVkSWZyYW1lJyBcdTIwMTQgc2FuZGJveGVkLCBjcm9zcy1vcmlnaW4gaWZyYW1lICh1bnRydXN0ZWQgY29kZSlcbiAqL1xuZXhwb3J0IHR5cGUgUmVuZGVyTW9kZSA9ICd3ZWJDb21wb25lbnQnIHwgJ2lmcmFtZScgfCAnaXNvbGF0ZWRJZnJhbWUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlclBvbGljeUNvbnRleHQge1xuICAgIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnO1xuICAgIHNraW46IElTa2luQ29uZmlnO1xuICAgIC8qKiBXaGF0IHRoZSBjb21wb25lbnQgYXNrZWQgZm9yIChtYXJrZXIgXHUyMUQyICd3ZWJDb21wb25lbnQnLCBjb25maWcuaXNvbGF0aW9uIFx1MjFEMiAnaXNvbGF0ZWRJZnJhbWUnKS4gKi9cbiAgICByZXF1ZXN0ZWRNb2RlOiBSZW5kZXJNb2RlO1xuICAgIC8qKiBXaGV0aGVyIHRoZSBIVE1MIGNhcnJpZXMgdGhlIGA8IS0tIG15b3Atd2ViLWNvbXBvbmVudCAtLT5gIG1hcmtlci4gKi9cbiAgICBpc1dlYkNvbXBvbmVudDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBIb3N0LXN1cHBsaWVkIGdhdGUgZGVjaWRpbmcgaG93IChvciB3aGV0aGVyKSBhIGNvbXBvbmVudCByZW5kZXJzLiBSZXR1cm4gYVxuICogUmVuZGVyTW9kZSB0byB1c2UsIG9yIGBmYWxzZWAgdG8gYmxvY2sgcmVuZGVyaW5nIGVudGlyZWx5LlxuICovXG5leHBvcnQgdHlwZSBSZW5kZXJQb2xpY3kgPVxuICAgIChjdHg6IFJlbmRlclBvbGljeUNvbnRleHQpID0+IFJlbmRlck1vZGUgfCBmYWxzZSB8IFByb21pc2U8UmVuZGVyTW9kZSB8IGZhbHNlPjtcblxuLy9mb3IgaW50ZXJuYWwgZGFzaGJvYXJkIHVzYWdlXG5leHBvcnQgaW50ZXJmYWNlIElNaW5pbWl6ZWRMb2FkZXJDb25maWcgZXh0ZW5kcyBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogXCJNaW5pbWl6ZWRMb2FkZXJcIjtcbn1cblxuaW50ZXJmYWNlIERhc2hib2FyZE9iamVjdCB7XG4gICAgX3RlbXBfY2xpZW50X2lkPzogc3RyaW5nLFxufVxuXG50eXBlIEV4dGVuZDxULCBVPiA9IFQgJiBVO1xuXG50eXBlIEV4dGVuZFJlY3Vyc2l2ZWx5PFQsIEU+ID0ge1xuICAgIFtLIGluIGtleW9mIEVdOiBFW0tdO1xufSAmIHtcbiAgICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIG9iamVjdFxuICAgICAgICA/IEV4dGVuZFJlY3Vyc2l2ZWx5PFRbS10sIEU+XG4gICAgICAgIDogVFtLXTtcbn07XG5cbmV4cG9ydCB0eXBlIElEYXNoYm9hcmQ8VD4gPSBFeHRlbmRSZWN1cnNpdmVseTxULCBEYXNoYm9hcmRPYmplY3Q+O1xuXG5leHBvcnQgaW50ZXJmYWNlIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBTa2luTG9hZGVyVHlwZVxuXG4gICAgW2tleTogc3RyaW5nXTogYW55OyAvLyBBbGxvd3MgYW55IGFkZGl0aW9uYWwgcHJvcGVydGllc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lSZWxlYXNlTWV0YWRhdGEge1xuICAgIGVudmlyb25tZW50SWQ6IHN0cmluZztcbiAgICBlbnZpcm9ubWVudElkZW50aWZpZXI6IHN0cmluZztcbiAgICByZWxlYXNlZE9uPzogc3RyaW5nO1xuICAgIHJlbGVhc2VkQnk/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSVZhcmlhbnRDb25maWcgZXh0ZW5kcyB2Ml9JTXlvcFN0b3JlZE9iamVjdCB7XG4gICAgbG9hZGVyOiBJU2tpbkxvYWRlckNvbmZpZ1xuICAgIGNvbXBvbmVudElkOiBzdHJpbmc7XG5cbiAgICByZWxlYXNlcz86IHYyX0lSZWxlYXNlTWV0YWRhdGFbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTa2luQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nXG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIGxvYWRlcjogSVNraW5Mb2FkZXJDb25maWdcbiAgICBjcmVhdGVkQnk/OiBzdHJpbmdcbiAgICBjcmVhdGVkT24/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JU2tpbkNvbmZpZyBleHRlbmRzIElTa2luQ29uZmlnIHtcbiAgICBjb21wb25lbnRJZDogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU1lc3NhZ2VQcm9wQ29uZmlnIGV4dGVuZHMgSVByb3BDb25maWcge1xuICAgIHR5cGU6IFByb3BUeXBlXG4gICAgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUJpbmRNZXNzYWdlUHJvcENvbmZpZyBleHRlbmRzIElQcm9wQ29uZmlnIHtcbiAgICB0eXBlOiBQcm9wVHlwZVxuICAgIG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxufVxuXG5leHBvcnQgY29uc3QgUHJvcE1lc3NhZ2VNb2RlcyA9IHtcbiAgICBcImlucHV0XCI6IFwiaW5wdXRcIixcbiAgICBcIm91dHB1dFwiOiBcIm91dHB1dFwiXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMgPSB7XG4gICAgXCJtZXNzYWdlXCI6IFwibWVzc2FnZVwiLFxuICAgIFwiY29kZVwiOiBcImNvZGVcIlxufSBhcyBjb25zdDtcblxuZXhwb3J0IGludGVyZmFjZSBJUHJvcE1lc3NhZ2VCZWhhdmlvclBhcmFtIHtcbiAgICB2YWx1ZTogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BCZWhhdmlvciB7XG4gICAgdHlwZToga2V5b2YgdHlwZW9mIFByb3BDb25maWdCZWhhdmlvclR5cGVzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BDb2RlQmVoYXZpb3IgZXh0ZW5kcyBJUHJvcEJlaGF2aW9yIHtcbiAgICB0eXBlOiBcImNvZGVcIlxuICAgIHJlbWFwPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BNZXNzYWdlQmVoYXZpb3IgZXh0ZW5kcyBJUHJvcEJlaGF2aW9yIHtcbiAgICB0eXBlOiBcIm1lc3NhZ2VcIlxuICAgIG1lc3NhZ2U6IE15b3BNZXNzYWdlS2V5XG4gICAgcmVmOiBzdHJpbmcsIC8vVE9ETyBtYWtlIGl0IGlkXG4gICAgcGFyYW1zOiBJUHJvcE1lc3NhZ2VCZWhhdmlvclBhcmFtW11cbiAgICBtb2RlOiBrZXlvZiB0eXBlb2YgUHJvcE1lc3NhZ2VNb2Rlc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nXG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIHR5cGU6IFByb3BUeXBlXG4gICAgYmVoYXZpb3I6IElQcm9wQmVoYXZpb3Jcbn1cblxuXG5leHBvcnQgY2xhc3MgUmVmQmVoYXZpb3JUeXBlIHtcbiAgICBzdGF0aWMgY29kZSA9ICdjb2RlJyBhcyBjb25zdFxuICAgIHN0YXRpYyBjb21wb25lbnQgPSAnY29tcG9uZW50JyBhcyBjb25zdFxufVxuXG5leHBvcnQgdHlwZSBJUmVmQmVoYXZpb3JUeXBlID0gJ2NvZGUnIHwgJ2NvbXBvbmVudCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJlZkJlaGF2aW9yIHtcbiAgICB0eXBlOiBJUmVmQmVoYXZpb3JUeXBlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudFJlZkJlaGF2aW9yIGV4dGVuZHMgSVJlZkJlaGF2aW9yIHtcbiAgICB0eXBlOiAnY29tcG9uZW50J1xuICAgIGNvbXBvbmVudElkOiBzdHJpbmdcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICogUHJvcGVydHkgaW5zdGFuY2UgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucy5cbiAgICAgKi9cbiAgICBpbnN0YW5jZTogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvZGVSZWZCZWhhdmlvciBleHRlbmRzIElSZWZCZWhhdmlvciB7XG4gICAgdHlwZTogJ2NvZGUnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJlZkNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICBzZWxlY3RvclR5cGU6IFJlZlNlbGVjdG9yVHlwZVxuICAgIHNlbGVjdG9yOiBzdHJpbmdcbiAgICBiZWhhdmlvcjogSVJlZkJlaGF2aW9yXG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBzZWdtZW50IHJ1bGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZVNlZ21lbnRSdWxlIHtcbiAgICBwcm9wZXJ0eTogc3RyaW5nO1xuICAgIG9wZXJhdG9yOiBzdHJpbmc7XG4gICAgdmFsdWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBFeHBlcmllbmNlIEEvQiBzcGxpdCB2ZXJzaW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2VBQlNwbGl0VmVyc2lvbiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBwZXJjZW50YWdlOiBudW1iZXI7XG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBBL0Igc3BsaXQgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlQUJTcGxpdCB7XG4gICAgdmVyc2lvbnM6IElFeHBlcmllbmNlQUJTcGxpdFZlcnNpb25bXTtcbn1cblxuLyoqXG4gKiBFeHBlcmllbmNlIHNlZ21lbnQgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlU2VnbWVudCB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBydWxlczogSUV4cGVyaWVuY2VTZWdtZW50UnVsZVtdO1xuICAgIHVzZUFiOiBib29sZWFuO1xuICAgIGNvbXBvbmVudFZhcmlhbnRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcbiAgICBhYlNwbGl0PzogSUV4cGVyaWVuY2VBQlNwbGl0O1xuICAgIHN0aWNreVByb3BlcnRpZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBFeHBlcmllbmNlIGRlZmluaXRpb24gY29uZmlnICh2MilcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZURlZmluaXRpb25Db25maWcgZXh0ZW5kcyB2Ml9JTXlvcFN0b3JlZE9iamVjdCB7XG4gICAgLyoqIFNlbGVjdGVkIGNvbXBvbmVudCBJRHMgKi9cbiAgICBjb21wb25lbnRzOiBzdHJpbmdbXTtcbiAgICAvKiogU2VnbWVudCBjb25maWd1cmF0aW9ucyAqL1xuICAgIHNlZ21lbnRzOiBJRXhwZXJpZW5jZVNlZ21lbnRbXTtcbiAgICAvKiogRmFsbGJhY2sgdmFyaWFudCBwZXIgY29tcG9uZW50ICovXG4gICAgZmFsbGJhY2s6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgLyoqIFRhZ3MgKi9cbiAgICB0YWdzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICAvLyBwcm9wczogUmVjb3JkPHN0cmluZywgSVByb3BDb25maWc+IC8vaWQgLSB0eXBlXG4gICAgLy8gcmVmczogUmVjb3JkPHN0cmluZywgSVJlZkNvbmZpZz4sXG4gICAgLy8gc2tpbnM6IFJlY29yZDxzdHJpbmcsIElTa2luQ29uZmlnPlxuICAgIHByb3BzOiBJUHJvcENvbmZpZ1tdLFxuICAgIHJlZnM6IElSZWZDb25maWdbXSxcbiAgICBza2luczogSVNraW5Db25maWdbXSxcbiAgICBkZWZhdWx0U2tpbjogbnVtYmVyO1xuXG4gICAgLy9UT0RPIDogdGhpbmsgYWJvdXQgdGhhdFxuICAgIC8vcmVzb2x2ZWREZWZpbml0aW9ucz86IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnW11cbiAgICAvL1RPRE8gOiBtb3ZlIHRvIGJhc2UgY2xhc3MgKCBJU3RvcmFibGVJdGVtIG9yIHNvLi4uKVxuXG4gICAgY3JlYXRlZE9uPzogc3RyaW5nXG4gICAgY3JlYXRlZEJ5Pzogc3RyaW5nXG4gICAgdXBkYXRlZEJ5Pzogc3RyaW5nXG59XG5cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JQmFzZU15b3BPYmplY3Qge1xuICAgIGlkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSU15b3BTdG9yZWRPYmplY3QgZXh0ZW5kcyB2Ml9JQmFzZU15b3BPYmplY3Qge1xuICAgIHVwZGF0ZWRPbj86IHN0cmluZ1xuICAgIHVwZGF0ZWRCeT86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudEFjY2VzcyB7XG4gICAgdmlzaWJpbGl0eTogJ3ByaXZhdGUnIHwgJ3VubGlzdGVkJyB8ICdwdWJsaWMnO1xuICAgIHVubGlzdGVkPzoge1xuICAgICAgICBzbHVnOiBzdHJpbmc7XG4gICAgfTtcbiAgICBtYXJrZXRwbGFjZT86IHtcbiAgICAgICAgc3RhdHVzOiAnZHJhZnQnIHwgJ3N1Ym1pdHRlZCcgfCAnY2xhaW1lZCcgfCAnY2xvc2VkJztcbiAgICAgICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAgICAgY29udGFjdEVtYWlsOiBzdHJpbmc7XG4gICAgICAgIGRlYWRsaW5lOiBzdHJpbmc7XG4gICAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyBleHRlbmRzIHYyX0lNeW9wU3RvcmVkT2JqZWN0IHtcbiAgICB2YXJpYW50c19pZHM6IHN0cmluZ1tdLFxuICAgIERUT3M6IHYyX0lEVE9bXSxcbiAgICB0YWdzOiBzdHJpbmdbXSxcbiAgICBhY2Nlc3M/OiBDb21wb25lbnRBY2Nlc3MsXG5cbiAgICAvL1xuICAgIHZhcmlhbnRzX25hbWVzOiBzdHJpbmdbXSxcbiAgICB2YXJpYW50c19kYXRhOiB7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgaWQ6IHN0cmluZ1xuICAgICAgICBkZXNjcmlwdGlvbj86IHN0cmluZ1xuICAgICAgICB1cGRhdGVkT24/OiBzdHJpbmdcbiAgICAgICAgdXBkYXRlZEJ5Pzogc3RyaW5nXG4gICAgICAgIGhhc19yZWxlYXNlcz86IGJvb2xlYW5cbiAgICB9W10sXG5cbiAgICBwcmV2aWV3X3ZhcmlhbnQ6IHYyX0lWYXJpYW50Q29uZmlnO1xuICAgIGV4dHJhPzoge1xuICAgICAgICBmaXJzdFZhcmlhbnQ6IHYyX0lWYXJpYW50Q29uZmlnOyAvL3doZW4gbmV3IGNvbXBvbmVudCBjcmVhdGVzIGF0IHRoZSBjbGllbnRcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSURUTyBleHRlbmRzIHYyX0lNeW9wU3RvcmVkT2JqZWN0IHtcbiAgICBkYXRhOiBvYmplY3RcbiAgICBtZXRob2ROYW1lOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2tpbkluc3RhbmNlQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNraW5TZWxlY3RvckNvbmZpZyB7XG4gICAgdHlwZToga2V5b2YgdHlwZW9mIFNraW5TZWxlY3RvclR5cGVzLFxuICAgIC8vc2tpbnM6IElTa2luSW5zdGFuY2VDb25maWdbXVxufVxuXG5leHBvcnQgY29uc3QgU2VnbWVudFR5cGUgPSB7XG4gICAgXCJGdW5jdGlvblJlc3VsdFwiOiBcIkZ1bmN0aW9uUmVzdWx0XCIsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIElTZWdtZW50SW5zdGFuY2Uge1xuICAgIHNlZ21lbnRJZDogc3RyaW5nO1xuICAgIHNraW5TZWxlY3RvcjogSVNraW5TZWxlY3RvckNvbmZpZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTZWdtZW50RGVmaW5pdGlvbiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB0eXBlOiBrZXlvZiB0eXBlb2YgU2VnbWVudFR5cGVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRnVuY3Rpb25SZXN1bHRzU2VnbWVudCBleHRlbmRzIElTZWdtZW50RGVmaW5pdGlvbiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB0eXBlOiB0eXBlb2YgU2VnbWVudFR5cGUuRnVuY3Rpb25SZXN1bHRcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgZnVuY3Rpb246IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgU2tpblNlbGVjdG9yVHlwZXMgPSB7XG4gICAgXCJTZWdtZW50ZWRcIjogXCJTZWdtZW50ZWRcIixcbiAgICBcIkRlZGljYXRlZFwiOiBcIkRlZGljYXRlZFwiLFxuXG4gICAgLyoqXG4gICAgICogVGhpcyBTZWxlY3RvciBUeXBlIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGJ1dCB3aWxsIGJlIGFkZGVkIGluIGEgZnV0dXJlIHJlbGVhc2UuXG4gICAgICogUGxlYXNlIGNoZWNrIHRoZSBkb2N1bWVudGF0aW9uIGZvciB1cGRhdGVzLlxuICAgICAqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBcIkRlZmF1bHRcIjogXCJEZWZhdWx0XCJcbn0gYXMgY29uc3Q7XG5cblxuLyoqXG4gKiBUaGlzIFNraW4gQ29uZmlnIFR5cGUgaXMgbm90IHlldCBzdXBwb3J0ZWQgYnV0IHdpbGwgYmUgYWRkZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS5cbiAqIFBsZWFzZSBjaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdXBkYXRlcy5cbiAqXG4gKiBAdHlwZSB7SURlZmF1bHRTa2luQ29uZmlnfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElEZWZhdWx0U2tpbkNvbmZpZyBleHRlbmRzIElTa2luU2VsZWN0b3JDb25maWcge1xuICAgIHR5cGU6IHR5cGVvZiBTa2luU2VsZWN0b3JUeXBlcy5EZWZhdWx0LFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTZWdtZW50ZWRTa2luQ29uZmlnIGV4dGVuZHMgSVNraW5TZWxlY3RvckNvbmZpZyB7XG4gICAgdHlwZTogdHlwZW9mIFNraW5TZWxlY3RvclR5cGVzLlNlZ21lbnRlZCxcbiAgICBzZWdtZW50czogSVNlZ21lbnRJbnN0YW5jZVtdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURlZGljYXRlZFNraW5Db25maWcgZXh0ZW5kcyBJU2tpblNlbGVjdG9yQ29uZmlnIHtcbiAgICB0eXBlOiB0eXBlb2YgU2tpblNlbGVjdG9yVHlwZXMuRGVkaWNhdGVkLFxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBza2lufSBpbnN0ZWFkLlxuICAgICAqIFByb3BlcnR5IHNraW5zIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuXG4gICAgICogUGxlYXNlIHVwZGF0ZSB5b3VyIGNvZGUgdG8gdXNlIHtAbGluayBza2lufSBmb3IgYmV0dGVyIGNvbXBhdGliaWxpdHkuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHNraW5zPzogSVNraW5JbnN0YW5jZUNvbmZpZ1tdIC8vIGRlcHJlY2F0ZWRcbiAgICBza2luOiBJU2tpbkluc3RhbmNlQ29uZmlnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGNvbXBvbmVudElkOiBzdHJpbmc7XG5cbiAgICAvL1RPRE8gOlxuICAgIC8vIFJlZklEID8gdG8gc3VwcG9ydCBtb3JlIHRoYW4gMSBjb21wb25lbnQgZnJvbSB0aGUgc2FtZSB0eXBlIGluIGNvbXBvc2l0ZXMgP1xuXG4gICAgLy9UT0RPIDogcmVtb3ZlXG4gICAgY29tcG9uZW50TmFtZTogc3RyaW5nOyAvLyA8PCBjaGVja1xuXG4gICAgc2tpblNlbGVjdG9yOiBJU2tpblNlbGVjdG9yQ29uZmlnXG5cbiAgICAvLyBzdG9yaW5nIHRoZSBuZXN0ZWQgY29uZmlnIGZvciByZWYgY29tcG9uZW50c1xuICAgIG5lc3RlZENvbXBvbmVudHM/OiBJQ29tcG9uZW50SW5zdGFuY2VDb25maWdbXVxuXG4gICAgLy9vbmx5IG9uIEdFVD9cbiAgICAvL1RPRE8gOiB0aGluayBhYm91dCB0aGF0XG4gICAgcmVzb2x2ZWRFeHBlcmllbmNlcz86IElFeHBlcmllbmNlW11cbiAgICAvLyB3aWxsIGluY2x1ZGUgaW5zdGFuY2UgYW5kIGRlZiBjb25maWcgaW4gb3JkZXIgdG8gcmVuZGVyIGluIHByb2R1Y3Rpb25cbiAgICByZXNvbHZlZE5lc3RlZENvbXBvbmVudHM/OiBJQ29tcG9uZW50Q29uZmlnW11cbn1cblxuZXhwb3J0IGNvbnN0IEV4cGVyaWVuY2VUeXBlcyA9IHtcbiAgICBcIlNlZ21lbnRcIjogXCJTZWdtZW50XCIsXG4gICAgXCJQcm9tb1wiOiBcIlByb21vXCIsXG4gICAgXCJBQlwiOiBcIkFCXCJcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2Uge1xuICAgIGlkOiBzdHJpbmdcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgdHlwZToga2V5b2YgdHlwZW9mIEV4cGVyaWVuY2VUeXBlc1xuICAgIGV4cGVyaWVuY2VzOiBJRXhwZXJpZW5jZVtdXG4gICAgLy9zdGlja2luZXNzRmFjdG9yXG4gICAgLy9FbmREYXRlXG59XG5cbi8vIGV4cG9ydCBpbnRlcmZhY2UgSUFCRXhwZXJpZW5jZUdyb3VwIHtcbi8vICAgICBpZDogc3RyaW5nXG4vLyAgICAgbmFtZTogc3RyaW5nXG4vLyAgICAgcGVyY2VudGFnZTogbnVtYmVyXG4vLyB9XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUFCRXhwZXJpZW5jZSBleHRlbmRzIElFeHBlcmllbmNlIHtcbiAgICB0eXBlOiB0eXBlb2YgRXhwZXJpZW5jZVR5cGVzLkFCXG4gICAgLy8gZ3JvdXBzOiBJQUJFeHBlcmllbmNlR3JvdXBbXVxuICAgIGV4cGVyaWVuY2VzOiBJRXhwZXJpZW5jZVtdXG4gICAgcGVyY2VudGFnZTogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURhdGVSYW5nZSB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIHN0YXJ0OiBEYXRlXG4gICAgZW5kOiBEYXRlXG4gICAgdGltZXpvbmU6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTZWdtZW50RXhwZXJpZW5jZSBleHRlbmRzIElFeHBlcmllbmNlIHtcbiAgICB0eXBlOiBrZXlvZiB0eXBlb2YgRXhwZXJpZW5jZVR5cGVzXG4gICAgc2VnbWVudDogSVNlZ21lbnREZWZpbml0aW9uXG4gICAgZGF0ZVJhbmdlPzogSURhdGVSYW5nZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElVc2VyRmxvd0RlZmluaXRpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgY29tcG9uZW50czogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnW107XG4gICAgb3JpZ2luczogc3RyaW5nW10sXG4gICAgZXhwZXJpZW5jZXM6IElFeHBlcmllbmNlW11cbiAgICBicmFuY2g/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29tcG9uZW50Q29uZmlnIHtcbiAgICBpbnN0YW5jZTogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnXG4gICAgdHlwZTogSUNvbXBvbmVudERlZmluaXRpb25Db25maWdcblxuICAgIC8vIFRPRE8gOiB2ZXJpZnkgdW5pcXVlbmVzcyAoZGFzaGJvYXJkICYgc2VydmVyKVxuICAgIG5hbWU6IHN0cmluZ1xufVxuXG5pbnRlcmZhY2UgSUJyYW5jaGFibGUge1xuICAgIGJyYW5jaD86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElVc2VyRmxvdyBleHRlbmRzIE9taXQ8SVVzZXJGbG93RGVmaW5pdGlvbiwgJ2NvbXBvbmVudHMnPiwgSUJyYW5jaGFibGUge1xuICAgIGNvbXBvbmVudHM6IElDb21wb25lbnRDb25maWdbXVxufVxuXG5leHBvcnQgY2xhc3MgUm9vdFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHB1YmxpYyBzaGFkb3dSb290PzogU2hhZG93Um9vdCkge1xuXG4gICAgfVxuXG4gICAgZ2V0Um9vdERpdiA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnNoYWRvd1Jvb3QgfHwgdGhpcy5jb250YWluZXIpLnF1ZXJ5U2VsZWN0b3IoJ2RpdicpXG4gICAgfVxuXG4gICAgZ2V0Um9vdCA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnNoYWRvd1Jvb3QgfHwgdGhpcy5jb250YWluZXIpO1xuICAgIH1cbn1cbiIsICJleHBvcnQgdHlwZSBTZXJpYWxpemFibGU8VD4gPVxuICAgIFQgZXh0ZW5kcyBGdW5jdGlvbiA/IG5ldmVyIDogLy8gRXhjbHVkZSBmdW5jdGlvbnNcbiAgICAgICAgVCBleHRlbmRzIEFycmF5PGluZmVyIFU+ID8gU2VyaWFsaXphYmxlPFU+W10gOiAvLyBIYW5kbGUgYXJyYXlzXG4gICAgICAgICAgICBUIGV4dGVuZHMgb2JqZWN0ID8ge1xuICAgICAgICAgICAgICAgIFtLIGluIGtleW9mIFQgYXMgVFtLXSBleHRlbmRzIEZ1bmN0aW9uID8gbmV2ZXIgOiBLXTogU2VyaWFsaXphYmxlPFRbS10+XG4gICAgICAgICAgICB9IDogVDsgLy8gSGFuZGxlIG9iamVjdHNcblxuY29uc3QgaXNQcmltaXRpdmUgPSAodmFsdWUpID0+IHtcbiAgICByZXR1cm4gdmFsdWUgIT09IE9iamVjdCh2YWx1ZSk7XG59XG5cbmNvbnN0IGlzRnVuY3Rpb24gPSAodmFsdWUpID0+IHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xufVxuXG5leHBvcnQgY29uc3QgY29udGFpbnNQcmltaXRpdmVzT25seSA9IChvYmopID0+IHtcbiAgICBpZiAoaXNQcmltaXRpdmUob2JqKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoaXNGdW5jdGlvbihvYmopKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNoZWNrIGlmIGl0J3MgYSBuZXN0ZWQgb2JqZWN0XG4gICAgICAgICAgICBpZiAoIWNvbnRhaW5zUHJpbWl0aXZlc09ubHkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlzUHJpbWl0aXZlKHZhbHVlKSkge1xuICAgICAgICAgICAgY29udGludWU7IC8vIEl0J3MgYSBwcmltaXRpdmUsIHNvIHdlIGNhbiBza2lwIGl0XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIEZvdW5kIGEgbm9uLXByaW1pdGl2ZSB2YWx1ZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7IC8vIEFsbCB2YWx1ZXMgYXJlIHByaW1pdGl2ZXMgb3IgbmVzdGVkIG9iamVjdHMgd2l0aCBwcmltaXRpdmVzXG59XG5cbi8vIGN1cnJlbnRseSBzdXBwb3J0IHJvb3QgbGV2ZWwgb25seVxuLy8ge3g6IDEsIHkgOiAnYScsIHogOiAoKT0+ey4uLn0sIGlubmVyIDogeyB4OiAxICwgeSA6ICdhJ30gfVxuLy8ge3g6IDEsIHkgOiAnYSd9XG4vL2h0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvR2xvc3NhcnkvRmFsc3lcbmV4cG9ydCB0eXBlIFNlcmlhbGl6YWJsZVNrZWxldG9uPFQ+ID0gUGFydGlhbDxSZWNvcmQ8a2V5b2YgVCwgYm9vbGVhbiB8IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgYm9vbGVhbj4+Pj4gfCBib29sZWFuO1xuXG5leHBvcnQgY29uc3QgbWFrZVNlcmlhbGl6YWJsZSA9IDxUPihcbiAgICBvYmo6IFQsXG4gICAgc2tlbGV0b246IFNlcmlhbGl6YWJsZVNrZWxldG9uPFQ+ID0ge30sXG4gICAgaW5jbHVkZUZhbHN5S2V5czogYm9vbGVhbiA9IHRydWUsIC8vIFRPRE8gOiB1c2UgdGhhdCBhcmdcbiAgICBzZWVuOiBXZWFrTWFwPG9iamVjdCwgU2VyaWFsaXphYmxlPGFueT4+ID0gbmV3IFdlYWtNYXAoKVxuKTogU2VyaWFsaXphYmxlPFQ+ID0+IHtcblxuICAgIGlmIChpc1ByaW1pdGl2ZShvYmopKSB7XG4gICAgICAgIHJldHVybiBvYmogYXMgU2VyaWFsaXphYmxlPFQ+OyAvLyBEaXJlY3RseSByZXR1cm4gcHJpbWl0aXZlIHZhbHVlc1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgaWYgKHNlZW4uaGFzKG9iaikpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWVuLmdldChvYmopITsgLy8gUmV0dXJuIHRoZSBhbHJlYWR5IHByb2Nlc3NlZCBvYmplY3RcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhhbmRsZSBhcnJheSBzZXJpYWxpemF0aW9uXG4gICAgICAgIGNvbnN0IHNlcmlhbGl6YWJsZUFycmF5OiBTZXJpYWxpemFibGU8YW55PltdID0gW107XG4gICAgICAgIHNlZW4uc2V0KG9iaiwgc2VyaWFsaXphYmxlQXJyYXkpOyAvLyBTdG9yZSB0aGUgYXJyYXkgaW4gc2VlblxuXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBvYmoubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gb2JqW2luZGV4XTtcbiAgICAgICAgICAgIHNlcmlhbGl6YWJsZUFycmF5W2luZGV4XSA9IG1ha2VTZXJpYWxpemFibGUoZWxlbWVudCwgc2tlbGV0b24sIGluY2x1ZGVGYWxzeUtleXMsIHNlZW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXJpYWxpemFibGVBcnJheSBhcyBTZXJpYWxpemFibGU8VD47XG4gICAgfVxuXG4gICAgaWYgKG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICAvLyBDaGVjayBmb3IgY3ljbGljIHJlZmVyZW5jZXNcbiAgICAgICAgaWYgKHNlZW4uaGFzKG9iaikpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWVuLmdldChvYmopITsgLy8gUmV0dXJuIHRoZSBhbHJlYWR5IHByb2Nlc3NlZCBvYmplY3RcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZXJpYWxpemFibGVPYmplY3Q6IFBhcnRpYWw8U2VyaWFsaXphYmxlPFQ+PiA9IHt9O1xuICAgICAgICBzZWVuLnNldChvYmosIHNlcmlhbGl6YWJsZU9iamVjdCk7IC8vIFN0b3JlIHRoZSBvYmplY3QgaW4gc2VlblxuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGtleSBpcyBpbiB0aGUgc2tlbGV0b24gYW5kIGlmIGl0J3MgYSB2YWxpZCBrZXkgdG8gc2VyaWFsaXplXG5cbiAgICAgICAgICAgIGNvbnN0IGtleUluU2tlbGV0b24gPSB0eXBlb2Ygc2tlbGV0b24gPT0gXCJib29sZWFuXCIgPyBza2VsZXRvbiA6IHNrZWxldG9uW2tleV07XG5cbiAgICAgICAgICAgIGlmIChrZXlJblNrZWxldG9uKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleUluU2tlbGV0b24gPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNrZWxldG9uIGluZGljYXRlcyB0byBzZXJpYWxpemUgdGhpcyBrZXlcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluY2x1ZGVGYWxzeUtleXMgPyBvYmpba2V5XSAhPT0gdW5kZWZpbmVkIDogb2JqW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6YWJsZU9iamVjdFtrZXldID0gbWFrZVNlcmlhbGl6YWJsZShvYmpba2V5XSwgdHJ1ZSwgaW5jbHVkZUZhbHN5S2V5cywgc2Vlbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBrZXlJblNrZWxldG9uID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2tlbGV0b24gaW5kaWNhdGVzIG5lc3RlZCBrZXlzIHRvIHNlcmlhbGl6ZVxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6YWJsZU9iamVjdFtrZXldID0gbWFrZVNlcmlhbGl6YWJsZShvYmpba2V5XSwga2V5SW5Ta2VsZXRvbiwgaW5jbHVkZUZhbHN5S2V5cywgc2Vlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXJpYWxpemFibGVPYmplY3QgYXMgU2VyaWFsaXphYmxlPFQ+O1xuICAgIH1cblxuICAgIHJldHVybiB7fSBhcyBhbnk7IC8vIFJldHVybiBhbiBlbXB0eSBvYmplY3QgZm9yIG90aGVyIGNhc2VzXG59XG4iLCAiZXhwb3J0IGNvbnN0IEVycm9ycyA9IHtcbiAgICBub3RTZXJpYWxpemFibGVSZWZDYWxsOiAocHJvcCwgYXJnKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgXG5UaGUgaW5wdXQgcHJvdmlkZWQgdG8gJyR7cHJvcC50b1N0cmluZygpfScgaXMgbm90IHNlcmlhbGl6YWJsZS4gU2VyaWFsaXphdGlvbiBpcyByZXF1aXJlZCB0byBlbnN1cmUgdGhhdCB0aGUgZGF0YSBjYW4gYmUgc2FmZWx5IHRyYW5zZmVycmVkIHRvIHRoZSBza2luIGltcGxlbWVudGF0aW9uLiBcblRoZSBmb2xsb3dpbmcgdHlwZXMgb2YgZGF0YSBhcmUgY29uc2lkZXJlZCBub24tc2VyaWFsaXphYmxlIGFuZCBjYW5ub3QgYmUgcHJvY2Vzc2VkOlxuXG4tIEZ1bmN0aW9uc1xuLSBET00gZWxlbWVudHNcbi0gQ2xhc3MgaW5zdGFuY2VzXG4tIENpcmN1bGFyIHJlZmVyZW5jZXNcbi0gU3ltYm9sc1xuLSBCaWdJbnQgdmFsdWVzXG5cbkluIHRoZSBmb2xsb3dpbmcgZXhlY3V0aW9uIHdlIGRldGVjdGVkIDpcbn5+fn5+fn5+XG4ke2FyZ30gXG5+fn5+fn5+flxuYXMgbm90IHNlcmlhbGl6YWJsZS5cblxuVG8gcmVzb2x2ZSB0aGlzIGlzc3VlLCBwbGVhc2UgZW5zdXJlIHRoYXQgYWxsIGlucHV0cyBwYXNzZWQgdG8gJyR7cHJvcC50b1N0cmluZygpfScgYXJlIGluIGEgc2VyaWFsaXphYmxlIGZvcm1hdC5cblRoaXMgdHlwaWNhbGx5IGluY2x1ZGVzIHByaW1pdGl2ZSB0eXBlcyAoc3RyaW5ncywgbnVtYmVycywgYm9vbGVhbnMpLCBhcnJheXMsIGFuZCBwbGFpbiBvYmplY3RzLiBcbklmIHlvdSBuZWVkIHRvIGluY2x1ZGUgY29tcGxleCBkYXRhIHR5cGVzLCBjb25zaWRlciBjb252ZXJ0aW5nIHRoZW0gdG8gYSBzZXJpYWxpemFibGUgc3RydWN0dXJlIGJlZm9yZSBwYXNzaW5nIHRoZW0gdG8gdGhlIGZ1bmN0aW9uLlxuT3IgdXNlIE15b3AgbWVzc2FnZSB0aGF0IHN1cHBvcnQgaXQ6IEN1c3RvbVJlZk1lc3NhZ2UsIEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlIG9yIEV4ZWN1dGVTY3JpcHRNZXNzYWdlLlxuXG5TdWdnZXN0ZWQgRml4OlxuMS4gUmVtb3ZlIG9yIHJlcGxhY2Ugbm9uLXNlcmlhbGl6YWJsZSB2YWx1ZXMgZnJvbSB5b3VyIGlucHV0LlxuMi4gSWYgdXNpbmcgb2JqZWN0cywgZW5zdXJlIHRoZXkgZG8gbm90IGNvbnRhaW4gYW55IGZ1bmN0aW9ucyBvciBjaXJjdWxhciByZWZlcmVuY2VzLlxuMy4gQ29udmVydCBhbnkgY2xhc3MgaW5zdGFuY2VzIHRvIHBsYWluIG9iamVjdHMgb3IgSlNPTi1jb21wYXRpYmxlIGZvcm1hdHMuXG40LiBVc2UgZGVkaWNhdGVkIE15b3AgbWVzc2FnZS5cblxuRm9yIG1vcmUgZGV0YWlscyBvbiBzZXJpYWxpemF0aW9uIGFuZCBNeW9wIG1lc3NhZ2UgZXhhbXBsZXMsIHJlZmVyIHRvIGh0dHBzOi8vZG9jcy5teW9wLmRldlxcLlxuXG5gKTtcbiAgICB9XG59XG5cbiIsICJpbXBvcnQge0Jhc2VNeW9wQ29tcG9uZW50LCBJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4vSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBFeGVjdXRlQ29tcG9uZW50TWV0aG9kfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7SUNvbXBvbmVudERlZmluaXRpb25Db25maWd9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7RW52ZWxvcGVkTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzL0VudmVsb3BlZE1lc3NhZ2VcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREsudHNcIjtcblxuZXhwb3J0IGNsYXNzIE15b3BSZWZDb21wb25lbnQgZXh0ZW5kcyBCYXNlTXlvcENvbXBvbmVudCB7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHB1YmxpYyBwYXJlbnQ6IElNeW9wQ29tcG9uZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykge1xuICAgICAgICAvL1RPRE8gOiBjaGVjayBwYXJlbnRDb21wb25lbnQuY29udGFpbmVyLi4uXG4gICAgICAgIHN1cGVyKGNvbXBvbmVudERlZmluaXRpb24sIHBhcmVudC5jb250YWluZXIsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGhpZGUoKSB7XG4gICAgICAgIC8vdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKGFyZ3VtZW50cy5jYWxsZWUubmFtZSkpO1xuICAgICAgICB0aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoJ2hpZGUnKSk7XG4gICAgfVxuXG4gICAgc2hvdygpIHtcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdzaG93JykpO1xuICAgIH1cblxuICAgIGluc3BlY3QoKSB7XG4gICAgICAgIC8vVE9ETyA6IHN1cHBvcnQgcmVhbCBjbGVhbnVwXG4gICAgICAgIC8vY29uc29sZS5sb2coJ3JlZiBpbnNwZWN0IGNhbGxlZCwgY3JlYXRpbmcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCBpbnNwZWN0JywgZG9jdW1lbnQubG9jYXRpb24uaHJlZiwgdGhpcy5pZCk7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoJ2luc3BlY3QnKSk7XG4gICAgfVxuXG4gICAgc2V0SGVpZ2h0QmFzZWRPbkRvY3VtZW50RWxlbWVudCgpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoJ3NldEhlaWdodEJhc2VkT25Eb2N1bWVudEVsZW1lbnQnKSk7XG4gICAgfVxuXG4gICAgc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCgpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoJ3NldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQnKSk7XG4gICAgfVxuXG4gICAgb25NZXNzYWdlUmVjZWl2ZWQoaW5jb21lTWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKTogYm9vbGVhbiB7XG4gICAgICAgIC8vIGlmIChpbmNvbWVNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSAnTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnKSB7XG4gICAgICAgIC8vICBkZWJ1Z2dlcjtcbiAgICAgICAgLy8gICAgIHRoaXMuc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCgpO1xuICAgICAgICAvLyAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIC8vIH1cbiAgICAgICAgcmV0dXJuIHN1cGVyLm9uTWVzc2FnZVJlY2VpdmVkKGluY29tZU1lc3NhZ2UpO1xuICAgIH1cblxuXG4gICAgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpID0+IHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygncmVmIG1lc3NhZ2Ugc2VuZGluZyAnLCBtZXNzYWdlKTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBjb25zdCBoYW5kbGVyID0gbWVzc2FnZS5oYW5kbGVyXG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gc3VwZXIuc2VuZChtZXNzYWdlKTtcblxuICAgICAgICAvLyB0aGlzLmlkIHdpbGwgYmUgYXZhaWxhYmxlIG9uIHRoZSBuZXN0ZWQgY29tcG9uZW50XG4gICAgICAgIHRoaXMucGFyZW50LnNlbmQobmV3IEVudmVsb3BlZE1lc3NhZ2UodGhpcy5pZCwgbWVzc2FnZSkpO1xuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgbWVzc2FnZS5oYW5kbGVyID0gaGFuZGxlclxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfTtcblxuICAgIGRpc3Bvc2UgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzSW5pdGlhdGVkKVxuICAgICAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdkaXNwb3NlJykpO1xuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7QXV0b1NpemVPcHRpb25zLCBCYXNlTXlvcENvbXBvbmVudH0gZnJvbSBcIi4vSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Q2xlYW51cEhhbmRsZXIsIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJU2tpbkNvbmZpZ30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtzZXREZWJ1Z1N0eWxlfSBmcm9tIFwiLi4vY29tcG9uZW50Q29yZVwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNES1wiO1xuXG4vKipcbiAqIENvbXBvbmVudCB3cmFwcGVyIGZvciBNeW9wIFdlYiBDb21wb25lbnRzIHRoYXQgYXJlIGV4dHJhY3RlZCBmcm9tIEhUTUxcbiAqIGFuZCBydW4gZGlyZWN0bHkgb24gdGhlIGhvc3QgZG9jdW1lbnQgKG5vdCBpbiBhbiBpZnJhbWUpLlxuICpcbiAqIFRoZXNlIGNvbXBvbmVudHMgdXNlIHRoZSBuYXRpdmUgV2ViIENvbXBvbmVudHMgQVBJIChDdXN0b20gRWxlbWVudHMgKyBTaGFkb3cgRE9NKVxuICogYW5kIGNvbW11bmljYXRlIHZpYSBkaXJlY3QgbWV0aG9kIGNhbGxzIGFuZCBDdXN0b21FdmVudHMgaW5zdGVhZCBvZiBwb3N0TWVzc2FnZS5cbiAqL1xuZXhwb3J0IGNsYXNzIE15b3BFeHRyYWN0ZWRXZWJDb21wb25lbnQgZXh0ZW5kcyBCYXNlTXlvcENvbXBvbmVudCB7XG4gICAgcHJpdmF0ZSBjdGFDbGVhbnVwPzogKCkgPT4gdm9pZDtcbiAgICBwcml2YXRlIF9jdGFIYW5kbGVyPzogKGFjdGlvbjogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duKSA9PiB2b2lkO1xuICAgIHByaXZhdGUgX2N0YVF1ZXVlOiBBcnJheTx7YWN0aW9uOiBzdHJpbmcsIHBheWxvYWQ6IHVua25vd259PiA9IFtdO1xuXG4gICAgLy8gQSBzaW5nbGUgJ215b3AtY3RhJyBsaXN0ZW5lciwgYXR0YWNoZWQgYXQgY29uc3RydWN0aW9uIHNvIENUQXMgYSBjb21wb25lbnRcbiAgICAvLyBkaXNwYXRjaGVzIGR1cmluZyBpdHMgZmlyc3QgaW5pdFdpdGhEYXRhKCkgcmVuZGVyIFx1MjAxNCBiZWZvcmUgdGhlIGhvc3QgYXR0YWNoZXNcbiAgICAvLyBhIGhhbmRsZXIgXHUyMDE0IGFyZSBidWZmZXJlZCAoYW5kIGZsdXNoZWQgb24gc2V0Q3RhSGFuZGxlciksIG1hdGNoaW5nIHRoZSBpZnJhbWVcbiAgICAvLyBwYXRoJ3MgcHJlLWhhbmRsZXIgQ1RBIHF1ZXVlLlxuICAgIHByaXZhdGUgX2N0YUxpc3RlbmVyID0gKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGRldGFpbCA9IChlIGFzIEN1c3RvbUV2ZW50KS5kZXRhaWw7XG4gICAgICAgIGlmICghZGV0YWlsPy5hY3Rpb24pIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuX2N0YUhhbmRsZXIgJiYgIXRoaXMubWFya2VkRm9yRGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2N0YUhhbmRsZXIoZGV0YWlsLmFjdGlvbiwgZGV0YWlsLnBheWxvYWQpO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLl9jdGFIYW5kbGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9jdGFRdWV1ZS5wdXNoKHsgYWN0aW9uOiBkZXRhaWwuYWN0aW9uLCBwYXlsb2FkOiBkZXRhaWwucGF5bG9hZCB9KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgICAgIHNraW46IElTa2luQ29uZmlnLFxuICAgICAgICBwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCxcbiAgICAgICAgcHJpdmF0ZSBjdXN0b21FbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICAgICAgcHJpdmF0ZSB0YWdOYW1lOiBzdHJpbmcsXG4gICAgICAgIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGNvbXBvbmVudERlZmluaXRpb24sIGNvbnRhaW5lciwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGN1c3RvbUVsZW1lbnQ7XG5cbiAgICAgICAgLy8gTGlzdGVuIEJFRk9SRSBhbnkgaW5pdFdpdGhEYXRhIHJlbmRlciBzbyBpbml0LXRpbWUgQ1RBcyBhcmVuJ3QgbG9zdC5cbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ215b3AtY3RhJywgdGhpcy5fY3RhTGlzdGVuZXIpO1xuICAgICAgICB0aGlzLmN0YUNsZWFudXAgPSAoKSA9PiB0aGlzLmN1c3RvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbXlvcC1jdGEnLCB0aGlzLl9jdGFMaXN0ZW5lcik7XG5cbiAgICAgICAgLy8gV2ViIGNvbXBvbmVudHMgYXJlIGluaXRpYXRlZCBpbW1lZGlhdGVseSAobm8gcG9zdE1lc3NhZ2UgaGFuZHNoYWtlIG5lZWRlZClcbiAgICAgICAgdGhpcy5zZXRJbml0aWF0ZWQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9hdXRvU2l6ZU9wdGlvbnM/OiBBdXRvU2l6ZU9wdGlvbnM7XG5cbiAgICAvKipcbiAgICAgKiBEYXRhLW91dCBmb3Igc2l6ZSBcdTIwMTQgdGhlIGV4dHJhY3RlZCBjb3VudGVycGFydCBvZiB0aGUgaWZyYW1lIGltcGxlbWVudGF0aW9uLlxuICAgICAqXG4gICAgICogVEhJUyBFWElTVEVEIE9OTFkgT04gTXlvcElmcmFtZUNvbXBvbmVudCwgYW5kIHRoYXQgd2FzIGludmlzaWJsZSBmb3IgYXMgbG9uZyBhc1xuICAgICAqIG1pbmlmaWNhdGlvbiB3YXMgc2VuZGluZyBldmVyeSB2MiBjb21wb25lbnQgZG93biB0aGUgaWZyYW1lIHBhdGguIFJlc3RvcmluZyB2MlxuICAgICAqIGRldGVjdGlvbiBtb3ZlcyB0aGVtIHRvIHRoaXMgY2xhc3MsIGFuZCBgQG15b3AvcmVhY3RgIGRyaXZlcyBib3RoIHRocm91Z2ggb25lXG4gICAgICogd3JhcHBlcjogaW4gY29udGVudCBtb2RlIGl0IGhpZGVzIGl0cyBsb2FkZXIgZnJvbSB0aGUgRklSU1Qgb25TaXplQ2hhbmdlLCBzbyBhXG4gICAgICogY29tcG9uZW50IHdob3NlIGNsYXNzIGhhcyBubyBvYnNlcnZlQXV0b1NpemUgbGVhdmVzIGEgUmVhY3QgaG9zdCBvbiBhIGxvYWRlclxuICAgICAqIGZvcmV2ZXIuIFBpYy1UaW1lJ3Mgc2l6ZU1ldGEgaXMgd2lkdGg6MTAwJSB3aXRoIG5vIGhlaWdodCwgd2hpY2ggaXMgZXhhY3RseSBjb250ZW50XG4gICAgICogbW9kZS4gQ2F1Z2h0IGJ5IHYyLWRhdGEtY29udHJhY3QgRDggKEFQSSBwYXJpdHkpLlxuICAgICAqXG4gICAgICogSXQgUkVQT1JUUyByYXRoZXIgdGhhbiBpbXBvc2VzLiBBbiBpZnJhbWUgaGFzIG5vIGludHJpbnNpYyBzaXplIGFuZCBtdXN0IGJlXG4gICAgICogbWVhc3VyZWQgaW5zaWRlIGFuZCB0aGVuIHNldCBmcm9tIG91dHNpZGU7IGEgY3VzdG9tIGVsZW1lbnQgc2l6ZXMgaXRzZWxmIGZyb20gaXRzXG4gICAgICogb3duIGNvbnRlbnQsIHNvIHRoZSBob25lc3QgdGhpbmcgaXMgdG8gbWVhc3VyZSBpdCBhbmQgdGVsbCB0aGUgaG9zdCwgYW5kIGxldCB0aGVcbiAgICAgKiBob3N0IGRlY2lkZS4gUmVhY3QgdGhlbiB1c2VzIHdpZHRoOjEwMCUgYW5kIHRoZSBtZWFzdXJlZCBoZWlnaHQuXG4gICAgICpcbiAgICAgKiBUaGUgb25lIHRoaW5nIGl0IGRvZXMgaW1wb3NlIGlzIGBkaXNwbGF5OiBibG9ja2Agd2hlbiB0aGUgZWxlbWVudCBjb21wdXRlcyB0b1xuICAgICAqIGBpbmxpbmVgLCB3aGljaCBpcyB0aGUgZGVmYXVsdCBmb3IgYSBjdXN0b20gZWxlbWVudCBhbmQgbWVhc3VyZXMgYXMgemVybyBoZWlnaHQgbm9cbiAgICAgKiBtYXR0ZXIgd2hhdCBpdCBjb250YWlucy4gVGhlIGlmcmFtZSBwYXRoIGZvcmNlcyB3aWR0aDoxMDAlIGZvciB0aGUgc2FtZSByZWFzb24gXHUyMDE0XG4gICAgICogd2l0aG91dCBpdCB0aGUgZmlyc3QgbWVhc3VyZW1lbnQgaXMgMCBhbmQgdGhlIGhvc3Qgc2l6ZXMgdGhlIGNvbXBvbmVudCB0byBub3RoaW5nLlxuICAgICAqL1xuICAgIG9ic2VydmVBdXRvU2l6ZSA9IChvcHRpb25zPzogQXV0b1NpemVPcHRpb25zKTogQ2xlYW51cEhhbmRsZXIgPT4ge1xuICAgICAgICB0aGlzLl9hdXRvU2l6ZU9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICBjb25zdCBlbCA9IHRoaXMuY3VzdG9tRWxlbWVudDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKGdldENvbXB1dGVkU3R5bGUoZWwpLmRpc3BsYXkgPT09ICdpbmxpbmUnKSBlbC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgfSBjYXRjaCB7IC8qIGRldGFjaGVkIG9yIG5vIGxheW91dCB5ZXQ7IHRoZSBvYnNlcnZlciB3aWxsIHJlcG9ydCBvbmNlIGl0IGhhcyBvbmUgKi8gfVxuXG4gICAgICAgIGNvbnN0IHBhcnNlID0gKHY6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCk6IG51bWJlciB8IHVuZGVmaW5lZCA9PiB7XG4gICAgICAgICAgICBpZiAodiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2ID09PSAnbnVtYmVyJykgcmV0dXJuIHY7XG4gICAgICAgICAgICBjb25zdCBuID0gcGFyc2VGbG9hdCh2KTtcbiAgICAgICAgICAgIHJldHVybiBpc05hTihuKSA/IHVuZGVmaW5lZCA6IG47XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGNsYW1wID0gKHY6IG51bWJlciwgbWluPzogbnVtYmVyLCBtYXg/OiBudW1iZXIpID0+XG4gICAgICAgICAgICBtaW4gIT09IHVuZGVmaW5lZCAmJiB2IDwgbWluID8gbWluIDogKG1heCAhPT0gdW5kZWZpbmVkICYmIHYgPiBtYXggPyBtYXggOiB2KTtcblxuICAgICAgICBjb25zdCByZXBvcnQgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvcHRzID0gdGhpcy5fYXV0b1NpemVPcHRpb25zO1xuICAgICAgICAgICAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgY29uc3QgYXV0b0hlaWdodCA9IG9wdHM/LmV4cGxpY2l0SGVpZ2h0ID09PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBvcHRzPy5vblNpemVDaGFuZ2U/Lih7XG4gICAgICAgICAgICAgICAgd2lkdGg6IHJlY3Qud2lkdGgsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBhdXRvSGVpZ2h0XG4gICAgICAgICAgICAgICAgICAgID8gY2xhbXAocmVjdC5oZWlnaHQsIHBhcnNlKG9wdHM/Lm1pbkhlaWdodCksIHBhcnNlKG9wdHM/Lm1heEhlaWdodCkpXG4gICAgICAgICAgICAgICAgICAgIDogcmVjdC5oZWlnaHQsXG4gICAgICAgICAgICAgICAgYXV0b1NpemluZ1dpZHRoOiBmYWxzZSwgICAvLyBhIHdlYiBjb21wb25lbnQgZmlsbHMgaXRzIGNvbnRhaW5lcidzIHdpZHRoXG4gICAgICAgICAgICAgICAgYXV0b1NpemluZ0hlaWdodDogYXV0b0hlaWdodCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGxldCBybzogUmVzaXplT2JzZXJ2ZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBybyA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiByZXBvcnQoKSk7XG4gICAgICAgICAgICByby5vYnNlcnZlKGVsKTtcbiAgICAgICAgfSBjYXRjaCB7IC8qIG5vIFJlc2l6ZU9ic2VydmVyOiB0aGUgb25lLXNob3QgcmVwb3J0IGJlbG93IHN0aWxsIHVuYmxvY2tzIHRoZSBob3N0ICovIH1cblxuICAgICAgICAvLyBGaXJlIG9uY2UgaW1tZWRpYXRlbHkuIEhvc3RzIGdhdGUgdGhlaXIgbG9hZGVyIG9uIHRoZSBGSVJTVCBtZWFzdXJlbWVudCwgc28gYVxuICAgICAgICAvLyBjb21wb25lbnQgdGhhdCBuZXZlciByZXNpemVzIG11c3Qgc3RpbGwgcHJvZHVjZSBvbmUuXG4gICAgICAgIHJlcG9ydCgpO1xuXG4gICAgICAgIHJldHVybiAoKSA9PiB7IHJvPy5kaXNjb25uZWN0KCk7IHRoaXMuX2F1dG9TaXplT3B0aW9ucyA9IHVuZGVmaW5lZDsgfTtcbiAgICB9XG5cbiAgICBjbGVhbnVwSW5zcGVjdDogQ2xlYW51cEhhbmRsZXIgPSAoKSA9PiB7fTtcblxuICAgIGluc3BlY3QoKSB7XG4gICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QgPSBzZXREZWJ1Z1N0eWxlKHRoaXMuaWQsICdNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50JywgMCwgdGhpcy5jb250YWluZXIsIHRoaXMuY3VzdG9tRWxlbWVudCwgdGhpcy5jb21wb25lbnREZWZpbml0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xlYW51cEluc3BlY3Q7XG4gICAgfVxuXG4gICAgaGlkZSgpIHtcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUud2lkdGggPSAnMCc7XG4gICAgfVxuXG4gICAgc2hvdygpIHtcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMSc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICd1bnNldCc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2FsbCc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJyc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS53aWR0aCA9ICcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgdGhlIGNvbXBvbmVudCB3aXRoIGRhdGEgYnkgY2FsbGluZyBteW9wX2luaXRfaW50ZXJmYWNlIGRpcmVjdGx5XG4gICAgICovXG4gICAgaW5pdFdpdGhEYXRhKGRhdGE6IHVua25vd24pOiB2b2lkIHtcbiAgICAgICAgaWYgKHR5cGVvZiAodGhpcy5jdXN0b21FbGVtZW50IGFzIGFueSkubXlvcF9pbml0X2ludGVyZmFjZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgKHRoaXMuY3VzdG9tRWxlbWVudCBhcyBhbnkpLm15b3BfaW5pdF9pbnRlcmZhY2UoZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgY3VycmVudCBkYXRhIGZyb20gdGhlIGNvbXBvbmVudFxuICAgICAqL1xuICAgIGdldERhdGEoKTogdW5rbm93biB7XG4gICAgICAgIGlmICh0eXBlb2YgKHRoaXMuY3VzdG9tRWxlbWVudCBhcyBhbnkpLm15b3BfaW5pdF9pbnRlcmZhY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiAodGhpcy5jdXN0b21FbGVtZW50IGFzIGFueSkubXlvcF9pbml0X2ludGVyZmFjZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IENUQSBoYW5kbGVyIC0gdW5pZmllZCBBUEkgd2l0aCBpZnJhbWUgY29tcG9uZW50cy5cbiAgICAgKiBDYWxsZWQgdmlhIHByb3BzLm15b3BfY3RhX2hhbmRsZXIgPSBoYW5kbGVyXG4gICAgICovXG4gICAgc2V0Q3RhSGFuZGxlcihoYW5kbGVyOiAoYWN0aW9uOiBzdHJpbmcsIHBheWxvYWQ6IHVua25vd24pID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgLy8gVGhlICdteW9wLWN0YScgbGlzdGVuZXIgaXMgYXR0YWNoZWQgaW4gdGhlIGNvbnN0cnVjdG9yLCBzbyB3ZSBvbmx5IHNldCB0aGVcbiAgICAgICAgLy8gaGFuZGxlciBhbmQgZmx1c2ggYW55dGhpbmcgdGhlIGNvbXBvbmVudCBlbWl0dGVkIGJlZm9yZSBub3cgKGUuZy4gZHVyaW5nIHRoZVxuICAgICAgICAvLyBmaXJzdCBpbml0V2l0aERhdGEgcmVuZGVyKS5cbiAgICAgICAgdGhpcy5fY3RhSGFuZGxlciA9IGhhbmRsZXI7XG5cbiAgICAgICAgaWYgKHRoaXMuX2N0YVF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHF1ZXVlID0gWy4uLnRoaXMuX2N0YVF1ZXVlXTtcbiAgICAgICAgICAgIHRoaXMuX2N0YVF1ZXVlID0gW107XG4gICAgICAgICAgICBxdWV1ZS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5tYXJrZWRGb3JEaXNwb3NlZCkge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVyKGl0ZW0uYWN0aW9uLCBpdGVtLnBheWxvYWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBtZXNzYWdlLWJhc2VkIGNvbXBvbmVudHMuXG4gICAgICogV2ViIGNvbXBvbmVudHMgZG9uJ3QgdXNlIHBvc3RNZXNzYWdlLCBzbyB0aGlzIGlzIGEgbm8tb3AgZm9yIG1vc3QgbWVzc2FnZXMuXG4gICAgICovXG4gICAgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2U8YW55PikgPT4ge1xuICAgICAgICAvLyBXZWIgY29tcG9uZW50cyBkb24ndCB1c2UgdGhlIHBvc3RNZXNzYWdlIHN5c3RlbVxuICAgICAgICAvLyBJbnN0ZWFkLCBpbnRlcmFjdCBkaXJlY3RseSB2aWEgcHJvcHMubXlvcF9pbml0X2ludGVyZmFjZSBhbmQgcHJvcHMubXlvcF9jdGFfaGFuZGxlclxuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHN1cGVyLnNlbmQobWVzc2FnZSk7XG5cbiAgICAgICAgLy8gTG9nIGZvciBkZWJ1Z2dpbmdcbiAgICAgICAgY29uc29sZS5kZWJ1ZygnW015b3BFeHRyYWN0ZWRXZWJDb21wb25lbnRdIHNlbmQoKSBjYWxsZWQgLSB3ZWIgY29tcG9uZW50cyB1c2UgZGlyZWN0IEFQSSBpbnN0ZWFkJywgbWVzc2FnZSk7XG5cbiAgICAgICAgcmV0dXJuIGNsZWFudXBIYW5kbGVyO1xuICAgIH1cblxuICAgIGRpc3Bvc2UgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmN0YUNsZWFudXApIHtcbiAgICAgICAgICAgIHRoaXMuY3RhQ2xlYW51cCgpO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnBhcmVudE5vZGU/LnJlbW92ZUNoaWxkKHRoaXMuY3VzdG9tRWxlbWVudCk7XG4gICAgfVxufVxuIiwgIi8vdHlwZSBBQ29uc3RydWN0b3JUeXBlT2Y8VD4gPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50cy9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLCBDdXN0b21SZWZNZXNzYWdlLCBSZWZ9IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0ICogYXMgbWVzc2FnZXMgZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge1xuICAgIENsZWFudXBIYW5kbGVyLCBJQ29tcG9uZW50Q29uZmlnLFxuICAgIHR5cGUgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgSUNvbXBvbmVudFJlZkJlaGF2aW9yLCBJSFRNTExvYWRlckNvbmZpZywgSVByb3BDb2RlQmVoYXZpb3IsXG4gICAgSVByb3BDb25maWcsIElTa2luQ29uZmlnLCBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcyxcbiAgICBSZWZCZWhhdmlvclR5cGUsIFNoYWRvd1Jvb3RNb2RlVHlwZSwgU2tpbkxvYWRlcnMsIFNraW5Mb2FkZXJUeXBlXG59IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7Y29udGFpbnNQcmltaXRpdmVzT25seX0gZnJvbSBcIi4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uXCI7XG5pbXBvcnQge0Vycm9yc30gZnJvbSBcIi4vbG9nTWVzc2FnZXNcIjtcbmltcG9ydCB7TXlvcFJlZkNvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50cy9teW9wUmVmQ29tcG9uZW50XCI7XG5pbXBvcnQge015b3BFeHRyYWN0ZWRXZWJDb21wb25lbnR9IGZyb20gXCIuL2NvbXBvbmVudHMvbXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudFwiO1xuaW1wb3J0IHtNeW9wSWZyYW1lQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRzL215b3BJZnJhbWVDb21wb25lbnRcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4vaG9zdFNES1wiO1xuXG50eXBlIGNvbXBvbmVudERlZmluaXRpb25Qcm9wcyA9IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnWydwcm9wcyddXG5cbmNvbnN0IGNyZWF0ZURlYnVnVGl0bGUgPSAodGV4dDogc3RyaW5nLCB0b3A6IG51bWJlciwgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZzogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcpID0+IHtcbiAgICBjb25zdCB0aXRsZUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIHRpdGxlRWwudGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgIHRpdGxlRWwuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICAgIHRpdGxlRWwuc3R5bGUucGFkZGluZyA9ICcwIDVweCc7XG4gICAgdGl0bGVFbC5zdHlsZS5mb250U2l6ZSA9ICcxNHB4JztcbiAgICB0aXRsZUVsLnN0eWxlWyd0b3AnXSA9ICcwJztcbiAgICB0aXRsZUVsLnN0eWxlLnRvcCA9IGAke3RvcH1weGA7XG4gICAgLy90aXRsZUVsLnN0eWxlLmxlZnQgPSAnNTAlJztcbiAgICB0aXRsZUVsLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGVYKC01MCUpJztcbiAgICB0aXRsZUVsLnRhcmdldCA9ICdfYmxhbmsnO1xuICAgIHRpdGxlRWwuaHJlZiA9IGBodHRwczovL2Rhc2hib2FyZC5teW9wLmRldi9kYXNoYm9hcmQvY29tcG9uZW50LyR7Y29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZy5pZH1gXG5cbiAgICByZXR1cm4gdGl0bGVFbDtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXREZWJ1Z1N0eWxlID0gKGlkOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRFbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudERlZmluaXRpb25Db25maWc6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnXG4pOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgLy8jMDA3QkZGIChibHVlKSBvciAjRkY1NzIyIChvcmFuZ2UpXG4gICAgLy8jNENBRjUwIChncmVlbikgb3IgI0ZGQzEwNyAoYW1iZXIpXG4gICAgLy8gY29uc3QgdG9wVGV4dCA9IGNyZWF0ZURlYnVnVGl0bGUoYCR7aWR9IDogJHt0eXBlfWAsIHRvcCwgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyk7XG4gICAgY29uc3QgdG9wVGV4dCA9IGNyZWF0ZURlYnVnVGl0bGUoYCR7Y29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZy5uYW1lfSA6ICR7dHlwZX1gLCB0b3AsIGNvbXBvbmVudERlZmluaXRpb25Db25maWcpO1xuICAgIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUodG9wVGV4dCwgY29tcG9uZW50RWxlbWVudCk7XG4gICAgY29tcG9uZW50RWxlbWVudC5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkICMwMDdCRkYnO1xuICAgIGNvbXBvbmVudEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBjb21wb25lbnRFbGVtZW50LnN0eWxlLmJvcmRlciA9ICd1bnNldCc7XG4gICAgICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZCh0b3BUZXh0KTtcbiAgICB9XG59XG5cbmNvbnN0IHJlcG9ydEVycm9yID0gKHByb3BDb25maWc6IElQcm9wQ29uZmlnLCBwcm9wTmFtZTogc3RyaW5nLCBjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50PGFueSwgYW55PikgPT4ge1xuICAgIGlmICghcHJvcENvbmZpZykge1xuXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAvLyB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXJyb3I6IFVuZGVmaW5lZCBQcm9wXFxuXFxuYCArXG4gICAgICAgICAgICBgSXQgbG9va3MgbGlrZSB5b3UndmUgdHJpZWQgdG8gdXNlIGEgcHJvcCB0aGF0IGhhc24ndCBiZWVuIGRlZmluZWQuXFxuYCArXG4gICAgICAgICAgICBgUGxlYXNlIGNoZWNrIHRoZSBwcm9wIG5hbWUgZm9yIGFueSB0eXBvcyBvciBlbnN1cmUgdGhhdCBpdCBpcyBwcm9wZXJseSBkZWZpbmVkIGluIHRoZSBjb21wb25lbnQncyBwcm9wIGxpc3QuXFxuXFxuYCArXG4gICAgICAgICAgICBgUHJvcCBOYW1lOiAke3Byb3BOYW1lfVxcbmAgK1xuICAgICAgICAgICAgYENvbXBvbmVudDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5uYW1lfSwgSUQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9XFxuXFxuYCArXG4gICAgICAgICAgICBgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlZmVyIHRvIHRoZSBjb21wb25lbnQgcGFnZSBodHRwczovL2Rhc2hib2FyZC5teW9wLmRldi9kYXNoYm9hcmQvY29tcG9uZW50LyR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9IG9yIGNvbnN1bHQgdGhlIGRldmVsb3BlciBndWlkZS5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxufVxuXG5jb25zdCByZXBvcnRVbnN1cHBvcnRlZCA9IChwcm9wQ29uZmlnOiBJUHJvcENvbmZpZywgcHJvcE5hbWU6IHN0cmluZywgY29tcG9uZW50OiBJTXlvcENvbXBvbmVudDxhbnksIGFueT4pID0+IHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgRXJyb3I6IENvZGUgUHJvcCBOb3QgU3VwcG9ydGVkXFxuXFxuYCArXG4gICAgICAgIGBDdXJyZW50bHksIGNvZGUgcHJvcHMgYXJlIG9ubHkgc3VwcG9ydGVkIGluIGxvY2FsIGZyYW1lIGNvbXBvbmVudHMuXFxuYCArXG4gICAgICAgIGBcdTI2QTBcdUZFMEYgVGhpcyBpcyBhIHdvcmsgaW4gcHJvZ3Jlc3MgZmVhdHVyZSBcdTIwMTQgY29kZSBwcm9wcyB3aWxsIGJlIHN1cHBvcnRlZCBpbiB1cGNvbWluZyB2ZXJzaW9ucy5cXG5cXG5gICtcbiAgICAgICAgYEluIHRoZSBtZWFudGltZSwgeW91IGNhbiB1c2UgbWVzc2FnZSBwcm9wcy5cXG5cXG5gICtcbiAgICAgICAgYFByb3AgTmFtZTogJHtwcm9wTmFtZX1cXG5gICtcbiAgICAgICAgYENvbXBvbmVudDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5uYW1lfSwgSUQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9XFxuXFxuYCArXG4gICAgICAgIGBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmVmZXIgdG8gdGhlIGNvbXBvbmVudCBwYWdlIGh0dHBzOi8vZGFzaGJvYXJkLm15b3AuZGV2L2Rhc2hib2FyZC9jb21wb25lbnQvJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5pZH0gb3IgY29uc3VsdCB0aGUgZGV2ZWxvcGVyIGd1aWRlLmBcbiAgICApO1xufVxuXG5leHBvcnQgY29uc3QgY29ubmVjdFByb3BzID0gPFQgZXh0ZW5kcyBjb21wb25lbnREZWZpbml0aW9uUHJvcHM+KGNvbXBvbmVudDogSU15b3BDb21wb25lbnQsIHByb3BzQ29uZmlnOiBJUHJvcENvbmZpZ1tdLCBzZWxlY3RlZFNraW46IElTa2luQ29uZmlnKSA9PiB7XG5cbiAgICBjb25zdCBwcm9wc01hcCA9IHByb3BzQ29uZmlnLnJlZHVjZSgocHJldmlvdXNWYWx1ZSwgY3VycmVudFZhbHVlKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5wcmV2aW91c1ZhbHVlLFxuICAgICAgICAgICAgW2N1cnJlbnRWYWx1ZS5uYW1lXTogey4uLmN1cnJlbnRWYWx1ZX1cbiAgICAgICAgfVxuICAgIH0sIHt9KTtcblxuICAgIGNvbnN0IHByb3BzSGFuZGxlciA9IHtcbiAgICAgICAgZ2V0OiAoXzogSU15b3BDb21wb25lbnQsIHByb3A6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgcHJvcENvbmZpZyA9IHByb3BzTWFwW3Byb3BdO1xuXG4gICAgICAgICAgICBpZiAocmVwb3J0RXJyb3IocHJvcENvbmZpZywgcHJvcCwgY29tcG9uZW50KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IudHlwZSA9PT0gUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMuY29kZSkge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBleHRyYWN0ZWQgd2ViIGNvbXBvbmVudHMgRklSU1RcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgTXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFByb3BCZWhhdmlvciA9IHByb3BDb25maWcuYmVoYXZpb3IgYXMgSVByb3BDb2RlQmVoYXZpb3I7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BOYW1lID0gdHlwZWRQcm9wQmVoYXZpb3IucmVtYXAgfHwgcHJvcDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcE5hbWUgPT09ICdteW9wX2luaXRfaW50ZXJmYWNlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV0dXJuIGEgZnVuY3Rpb24gdGhhdCBnZXRzL3NldHMgZGF0YSAobWF0Y2hlcyBpZnJhbWUgYmVoYXZpb3IpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGRhdGE/OiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50LmdldERhdGEoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmluaXRXaXRoRGF0YShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBGb3IgbXlvcF9jdGFfaGFuZGxlciwgcmV0dXJuIHVuZGVmaW5lZCAoaXQncyB3cml0ZS1vbmx5KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIElzb2xhdGVkIGlmcmFtZTogbm8gc2FtZS1vcmlnaW4gYWNjZXNzIFx1MjAxNCB1c2UgdGhlIHBvc3RNZXNzYWdlIGJyaWRnZVxuICAgICAgICAgICAgICAgIC8vIChzYW1lIG1ldGhvZCBzdXJmYWNlIGFzIHRoZSBleHRyYWN0ZWQtV0MgYnJhbmNoIGFib3ZlKS5cbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgTXlvcElmcmFtZUNvbXBvbmVudCAmJiBjb21wb25lbnQuaXNvbGF0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRQcm9wQmVoYXZpb3IgPSBwcm9wQ29uZmlnLmJlaGF2aW9yIGFzIElQcm9wQ29kZUJlaGF2aW9yO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wTmFtZSA9IHR5cGVkUHJvcEJlaGF2aW9yLnJlbWFwIHx8IHByb3A7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ215b3BfaW5pdF9pbnRlcmZhY2UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGRhdGE/OiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGNvbXBvbmVudC5nZXREYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmluaXRXaXRoRGF0YShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gbXlvcF9jdGFfaGFuZGxlciBpcyB3cml0ZS1vbmx5XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gRm9yIGlmcmFtZSAobG9jYWxGcmFtZSkgY29tcG9uZW50c1xuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZFNraW4ubG9hZGVyLnR5cGUgPT09IFNraW5Mb2FkZXJzLkhUTUxMb2FkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRMb2FkZXIgPSBzZWxlY3RlZFNraW4ubG9hZGVyIGFzIElIVE1MTG9hZGVyQ29uZmlnO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZWRMb2FkZXIuc2hhZG93Um9vdE1vZGUgPT09IFNoYWRvd1Jvb3RNb2RlVHlwZS5sb2NhbEZyYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFByb3BCZWhhdmlvciA9IHByb3BDb25maWcuYmVoYXZpb3IgYXMgSVByb3BDb2RlQmVoYXZpb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50LmVsZW1lbnQuY29udGVudFdpbmRvd1t0eXBlZFByb3BCZWhhdmlvci5yZW1hcCB8fCBwcm9wXVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVwb3J0VW5zdXBwb3J0ZWQocHJvcENvbmZpZywgcHJvcCwgY29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLm1vZGUgPT09ICdvdXRwdXQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VQYXJhbXM6IGFueVtdID0gW107XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IHR1cm4gaXQgaW50byBjb25maWdcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IucmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2goUmVmLmNyZWF0ZShwcm9wQ29uZmlnLmJlaGF2aW9yLnJlZikpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKC4uLnByb3BDb25maWcuYmVoYXZpb3IucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZUN0b3IgPSBtZXNzYWdlc1twcm9wQ29uZmlnLmJlaGF2aW9yLm1lc3NhZ2VdO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBtZXNzYWdlQ3RvciguLi5tZXNzYWdlUGFyYW1zKSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH0sXG4gICAgICAgIHNldDogKF86IElNeW9wQ29tcG9uZW50LCBwcm9wOiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IHByb3BDb25maWcgPSBwcm9wc01hcFtwcm9wXTtcblxuICAgICAgICAgICAgaWYgKHJlcG9ydEVycm9yKHByb3BDb25maWcsIHByb3AsIGNvbXBvbmVudCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnR5cGUgPT09IFByb3BDb25maWdCZWhhdmlvclR5cGVzLmNvZGUpIHtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgZXh0cmFjdGVkIHdlYiBjb21wb25lbnRzIEZJUlNUIChiZWZvcmUgbG9jYWxGcmFtZSBjaGVjaylcbiAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIGV4dHJhY3RlZCB3ZWIgY29tcG9uZW50cyBtYXkgaGF2ZSBzaGFkb3dSb290TW9kZTogbG9jYWxGcmFtZSBpbiB0aGVpciBjb25maWdcbiAgICAgICAgICAgICAgICAvLyBidXQgdGhleSBydW4gZGlyZWN0bHkgb24gdGhlIGhvc3QgZG9jdW1lbnQsIG5vdCBpbiBhbiBpZnJhbWVcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgTXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFByb3BCZWhhdmlvciA9IHByb3BDb25maWcuYmVoYXZpb3IgYXMgSVByb3BDb2RlQmVoYXZpb3I7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BOYW1lID0gdHlwZWRQcm9wQmVoYXZpb3IucmVtYXAgfHwgcHJvcDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcE5hbWUgPT09ICdteW9wX2N0YV9oYW5kbGVyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNldEN0YUhhbmRsZXIodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcE5hbWUgPT09ICdteW9wX2luaXRfaW50ZXJmYWNlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmluaXRXaXRoRGF0YSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIElzb2xhdGVkIGlmcmFtZTogcm91dGUgdmlhIHRoZSBwb3N0TWVzc2FnZSBicmlkZ2UgKG5vIHNhbWUtb3JpZ2luIGFjY2VzcykuXG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIE15b3BJZnJhbWVDb21wb25lbnQgJiYgY29tcG9uZW50Lmlzb2xhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUHJvcEJlaGF2aW9yID0gcHJvcENvbmZpZy5iZWhhdmlvciBhcyBJUHJvcENvZGVCZWhhdmlvcjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcE5hbWUgPSB0eXBlZFByb3BCZWhhdmlvci5yZW1hcCB8fCBwcm9wO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcE5hbWUgPT09ICdteW9wX2N0YV9oYW5kbGVyJykgeyBjb21wb25lbnQuc2V0Q3RhSGFuZGxlcih2YWx1ZSk7IHJldHVybiB0cnVlOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ215b3BfaW5pdF9pbnRlcmZhY2UnKSB7IGNvbXBvbmVudC5pbml0V2l0aERhdGEodmFsdWUpOyByZXR1cm4gdHJ1ZTsgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEZvciBpZnJhbWUgKGxvY2FsRnJhbWUpIGNvbXBvbmVudHNcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRTa2luLmxvYWRlci50eXBlID09PSBTa2luTG9hZGVycy5IVE1MTG9hZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkTG9hZGVyID0gc2VsZWN0ZWRTa2luLmxvYWRlciBhcyBJSFRNTExvYWRlckNvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVkTG9hZGVyLnNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUubG9jYWxGcmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRQcm9wQmVoYXZpb3IgPSBwcm9wQ29uZmlnLmJlaGF2aW9yIGFzIElQcm9wQ29kZUJlaGF2aW9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudFdpbmRvdyA9IChjb21wb25lbnQuZWxlbWVudCBhcyBIVE1MSUZyYW1lRWxlbWVudCkuY29udGVudFdpbmRvdyBhcyBhbnk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wTmFtZSA9IHR5cGVkUHJvcEJlaGF2aW9yLnJlbWFwIHx8IHByb3A7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgcmVhbCBoYW5kbGVyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50V2luZG93W3Byb3BOYW1lXSA9IHZhbHVlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGbHVzaCBDVEEgcXVldWUgaWYgdGhpcyBpcyBteW9wX2N0YV9oYW5kbGVyIGFuZCBxdWV1ZSBleGlzdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ215b3BfY3RhX2hhbmRsZXInICYmIGNvbnRlbnRXaW5kb3cuX19teW9wX2N0YV9xdWV1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXVlID0gY29udGVudFdpbmRvdy5fX215b3BfY3RhX3F1ZXVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRXaW5kb3cuX19teW9wX2N0YV9xdWV1ZSA9IG51bGw7IC8vIENsZWFyIHRvIHByZXZlbnQgZG91YmxlLWZsdXNoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUuZm9yRWFjaCgoaXRlbToge2FjdGlvbjogc3RyaW5nLCBwYXlsb2FkOiBhbnl9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgaWYgY29tcG9uZW50IHdhcyBkaXNwb3NlZCBkdXJpbmcgZmx1c2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5tYXJrZWRGb3JEaXNwb3NlZCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZShpdGVtLmFjdGlvbiwgaXRlbS5wYXlsb2FkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlcG9ydFVuc3VwcG9ydGVkKHByb3BDb25maWcsIHByb3AsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvL2lmKHByb3BDb25maWcuYmVoYXZpb3IgPT09IFByb3BDb25maWdCZWhhdmlvclR5cGVzLm1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcubW9kZSA9PT0gJ2lucHV0Jykge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBzdXBwb3J0IG11bHRpIGJlaGF2aW9yc1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnR5cGUgPT09ICdtZXNzYWdlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZVBhcmFtczogYW55W10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IHR1cm4gaXQgaW50byBjb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnJlZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaChSZWYuY3JlYXRlKHByb3BDb25maWcuYmVoYXZpb3IucmVmKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IucGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKC4uLnByb3BDb25maWcuYmVoYXZpb3IucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZUN0b3IgPSBtZXNzYWdlc1twcm9wQ29uZmlnLmJlaGF2aW9yLm1lc3NhZ2VdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IG1lc3NhZ2VDdG9yKC4uLm1lc3NhZ2VQYXJhbXMpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yOiBVbnN1cHBvcnRlZCBCZWhhdmlvclxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBUaGUgJ2JlaGF2aW9yJyBmaWVsZCBwcm92aWRlZCBpcyBub3Qgc3VwcG9ydGVkLlxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBDb21wb25lbnQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ubmFtZX0sIElEOiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfVxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBQcm9wIE5hbWU6ICR7cHJvcH1cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgQmVoYXZpb3IgRmllbGQ6ICR7cHJvcENvbmZpZy5iZWhhdmlvci50eXBlfVxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBDaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdmFsaWQgYmVoYXZpb3Igb3B0aW9ucy5gXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29tcG9uZW50LnByb3BzID0ge307XG4gICAgY29tcG9uZW50LnByb3BzID0gbmV3IFByb3h5KGNvbXBvbmVudC5wcm9wcywgcHJvcHNIYW5kbGVyKTtcblxuICAgIHJldHVybiBjb21wb25lbnQgYXMgKE9taXQ8SU15b3BDb21wb25lbnQsICdwcm9wcyc+ICYge1xuICAgICAgICBwcm9wczogcHJvcFR5cGVzPFQ+XG4gICAgfSlcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVJlZlByb3h5ID0gKHRhcmdldDogUmVmLCBjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50KSA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm94eSh0YXJnZXQsIHtcbiAgICAgICAgZ2V0KHRhcmdldCwgcHJvcCkge1xuXG4gICAgICAgICAgICAvLyBpZiAocHJvcCA9PT0gJ19fbm9uUHJveGllZCcpIHtcbiAgICAgICAgICAgIC8vICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpZiAodGFyZ2V0W3Byb3BdKSB7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRbcHJvcF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IGdldHRlckZ1bmN0aW9uID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXJncy5mb3JFYWNoKGFyZyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRhaW5zUHJpbWl0aXZlc09ubHkoYXJnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9ycy5ub3RTZXJpYWxpemFibGVSZWZDYWxsKHByb3AsIGFyZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgQ3VzdG9tUmVmTWVzc2FnZSgoe3JlZiwgcHJvcE5hbWUsIGZ1bmN0aW9uQXJncywgbWFrZVNlcmlhbGl6YWJsZX0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByZWZbcHJvcE5hbWVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFrZVNlcmlhbGl6YWJsZShyZWZbcHJvcE5hbWVdKC4uLmZ1bmN0aW9uQXJncyksIHRydWUpIC8vIEludm9rZSB0aGUgZnVuY3Rpb24gYW5kIHJldHVybiBpdHMgcmVzdWx0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFrZVNlcmlhbGl6YWJsZSh2YWx1ZSwgdHJ1ZSk7IC8vIFJldHVybiB0aGUgcHJvcGVydHkgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogdHVybiBpdCB0byBjb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50SWQ6IHRhcmdldC5yZWZDb25maWcuc2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcE5hbWU6IHByb3AsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25BcmdzOiBhcmdzXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgKG1zZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobXNnLmNvbnRlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvL1RPRE86IHdlIGNhbiBpbXBsZW1lbnQgdGhpbmdzIGxpa2UgYXV0byBzZXJpYWxpemF0aW9uIGFuZCBiaW5kaW5nIGZ1bmN0aW9ucyBoZXJlXG4gICAgICAgICAgICAvL2dldHRlckZ1bmN0aW9uLnRlc3QgPSAnMTIzJztcblxuICAgICAgICAgICAgcmV0dXJuIGdldHRlckZ1bmN0aW9uO1xuXG4gICAgICAgICAgICAvL3JldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3ApO1xuICAgICAgICB9LFxuICAgICAgICBzZXQodGFyZ2V0LCBwcm9wOiBzdHJpbmcsIHZhbHVlKSB7XG4gICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgQ3VzdG9tUmVmTWVzc2FnZSgoe3JlZiwgcHJvcE5hbWUsIHByb3BWYWx1ZX0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlZilcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZltwcm9wTmFtZV0gPSBwcm9wVmFsdWU7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IGZpeCB0aGF0XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJZDogdGFyZ2V0LnJlZkNvbmZpZy5zZWxlY3RvcixcbiAgICAgICAgICAgICAgICAgICAgcHJvcFZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcE5hbWU6IHByb3BcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChtc2cpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogbG9nP1xuICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG4gICAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVSZWZDb21wb25lbnQgPSBhc3luYyA8VCBleHRlbmRzIElNeW9wQ29tcG9uZW50ID0gSU15b3BDb21wb25lbnQ+KHJlZjogUmVmLCBjb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsIGNvbXBvbmVudHM6IElNeW9wQ29tcG9uZW50W10sIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKTogUHJvbWlzZTxUPiA9PiB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gcmVmLmNvbXBvbmVudDtcbiAgICBpZiAoIWNvbXBvbmVudClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW50IGNyZWF0ZVJlZkNvbXBvbmVudCB3aXRoIGRldGFjaGVkIHJlZicpO1xuXG4gICAgLy9jb25zb2xlLmxvZygnY3JlYXRlUmVmQ29tcG9uZW50IGNhbGxlZCcsIHJlZiwgY29tcG9uZW50Q29uZmlnKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IG5ldyBNeW9wUmVmQ29tcG9uZW50KGNvbXBvbmVudENvbmZpZy50eXBlLCBjb21wb25lbnQsIG9wdGlvbnMpO1xuICAgICAgICBjb21wb25lbnRzLnB1c2gocmVmQ29tcG9uZW50KTtcblxuICAgICAgICAvLyBBIEZBSUxFRCBSRUYgTVVTVCBOT1QgS0VFUCBJVFMgUExBQ0VIT0xERVIuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFRoZSBwbGFjZWhvbGRlciBpcyByZWdpc3RlcmVkIGFib3ZlLCBiZWZvcmUgd2Uga25vdyB3aGV0aGVyIHRoZSBmcmFtZSBjYW5cbiAgICAgICAgLy8gYWN0dWFsbHkgY3JlYXRlIHRoZSBjb21wb25lbnQsIGFuZCBib3RoIGZhaWx1cmUgcGF0aHMgYmVsb3cgdXNlZCB0byByZWplY3RcbiAgICAgICAgLy8gd2l0aG91dCByZW1vdmluZyBpdC4gVGhlIGNhbGxlciBnZXRzIGEgcmVqZWN0aW9uIGFuZCBubyBoYW5kbGUsIHNvIG5vYm9keSBlbHNlXG4gICAgICAgIC8vIGNhbiBjbGVhbiBpdCB1cCBlaXRoZXIgLS0gZXhhY3RseSB0aGUgc2hhcGUgb2YgdGhlIHRpbWVvdXQgbGVhayBpblxuICAgICAgICAvLyBCYXNlTXlvcENvbXBvbmVudC4gSXQgaXMgcGVybWFuZW50IGFuZCBpdCBjb21wb3VuZHM6IGV2ZXJ5IHJldHJ5IG9mIGEgcmVmIHRoYXRcbiAgICAgICAgLy8gY2Fubm90IGJlIGNyZWF0ZWQgKGEgc2VsZWN0b3IgdGhhdCBtYXRjaGVzIG5vdGhpbmcsIGEgZnJhbWUgdGhhdCBuZXZlciBhbnN3ZXJzKVxuICAgICAgICAvLyBhZGRzIGFub3RoZXIgZGVhZCBlbnRyeSB0byB0aGUgYXJyYXkgdGhhdCBpc1RydXN0ZWRTb3VyY2Ugd2Fsa3Mgb24gZXZlcnlcbiAgICAgICAgLy8gbWVzc2FnZS4gQ2F1Z2h0IGJ5IHRlc3QvY29tcG9zaXRlLXJlZi5lMmUubWpzIGNhc2UgUjMuXG4gICAgICAgIGNvbnN0IHVucmVnaXN0ZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhdCA9IGNvbXBvbmVudHMuaW5kZXhPZihyZWZDb21wb25lbnQpO1xuICAgICAgICAgICAgaWYgKGF0ICE9PSAtMSkgY29tcG9uZW50cy5zcGxpY2UoYXQsIDEpO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vZm9yIGNhc2VzIHdoZXJlIHJlZiBjb21wb25lbnRzIGRlZmluZSBpbiB0aGUgY29tcG9uZW50IGNvbmZpZ1xuICAgICAgICAvLyB3ZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSByb290IGNvbXBvbmVudCB0aGUgYmUgaW5pdGlhdGVkIGJlZm9yZSBpbnRlcmFjdGluZyB3aXRoIGl0XG4gICAgICAgIGF3YWl0IGNvbXBvbmVudC5pbml0aWF0ZWQoKTtcblxuXG4gICAgICAgIC8vVE9ETyA6XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIC8vcmVqZWN0KCd0aW1lb3V0PycpO1xuICAgICAgICAgICAgdW5yZWdpc3RlcigpO1xuICAgICAgICAgICAgcmVqZWN0KCd0aW1lb3V0Jyk7XG4gICAgICAgIH0sIDUwMDApO1xuXG4gICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlKHJlZi5yZWZDb25maWcsXG4gICAgICAgICAgICBjb21wb25lbnRDb25maWcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLi4ub3B0aW9ucyA/IG9wdGlvbnMgOiB7fSxcbiAgICAgICAgICAgICAgICBpZDogcmVmQ29tcG9uZW50LmlkLFxuICAgICAgICAgICAgICAgIF9oYXNQYXJlbnQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhc3luYyAobWVzc2FnZSkgPT4ge1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogY2hlY2sgaWYgdGltZW91dCBhbHJlYWR5IHBhc3NlZFxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcblxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmZhaWxlZCkge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOlxuICAgICAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgnQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSBmYWlsZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGltcGxlbWVudGF0aW9uQ29tcG9uZW50ID0gY29tcG9uZW50cy5maW5kKGMgPT4gYy5pZCA9PSByZWZDb21wb25lbnQuaWQpO1xuXG4gICAgICAgICAgICAgICAgLy9zYW1lIG1lbW9yeSBlbnYsIHNhbWUgSG9zdFNES1xuICAgICAgICAgICAgICAgIGlmIChpbXBsZW1lbnRhdGlvbkNvbXBvbmVudCAmJiBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudCAhPT0gcmVmQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRIRSBQTEFDRUhPTERFUiBJUyBSRURVTkRBTlQgSEVSRSwgU08gRFJPUCBJVC5cbiAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBicmFuY2ggbWVhbnMgdGhlIGZyYW1lIG1vdW50ZWQgaW50byBPVVIgcmVnaXN0cnkgcmF0aGVyIHRoYW5cbiAgICAgICAgICAgICAgICAgICAgLy8gaXRzIG93biAtLSB0aGUgc2FtZS13aW5kb3cgY2FzZSB0aGUgd2ViY29tcG9uZW50IGhhbmRsZXIgY2FsbHNcbiAgICAgICAgICAgICAgICAgICAgLy8gXCJzYW1lIG1lbW9yeSB3aGVuIHVzaW5nIHdlYmNvbXBvbmVudFwiLiBCb3RoIHRoZSBwbGFjZWhvbGRlciBhbmQgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlYWwgY29tcG9uZW50IHdlcmUgdGhlbiByZWdpc3RlcmVkIHVuZGVyIHRoZSBTQU1FIGlkLCBhbmQgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIHBsYWNlaG9sZGVyIHdhcyBsZWZ0IGJlaGluZCAodGhlIGBUT0RPIDogY2xlYW4gcmVmQ29tcG9uZW50ID9gIHRoYXRcbiAgICAgICAgICAgICAgICAgICAgLy8gdXNlZCB0byBzaXQgaGVyZSkuIFR3byBlbnRyaWVzLCBvbmUgaWQsIG9uZSBvZiB0aGVtIGRlYWQuXG4gICAgICAgICAgICAgICAgICAgIHVucmVnaXN0ZXIoKTtcblxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdID0gaW1wbGVtZW50YXRpb25Db21wb25lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoaW1wbGVtZW50YXRpb25Db21wb25lbnQgYXMgdW5rbm93biBhcyBUKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGBmaW5kYCBDQU4gQ09NRSBCQUNLIEVNUFRZLCBBTkQgdW5kZWZpbmVkICE9PSByZWZDb21wb25lbnQgSVMgVFJVRS5cbiAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgLy8gV2l0aG91dCB0aGUgZ3VhcmQgYWJvdmUsIHRoYXQgcmVzb2x2ZWQgdGhlIGNhbGxlcidzIHByb21pc2Ugd2l0aFxuICAgICAgICAgICAgICAgICAgICAvLyBgdW5kZWZpbmVkYDogbm8gZXJyb3IsIG5vIGNvbXBvbmVudCwgYW5kIHRoZSBwbGFjZWhvbGRlciBsZWZ0IGluXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZWdpc3RyeS4gUmVwcm9kdWNlZCBieSBjcmVhdGluZyBhIHJlZiBmcm9tIGEgd2ViIGNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICAvLyBwYXJlbnQgKGNvbXBvc2l0ZS1yZWYgY2FzZSBSNSksIHdoZXJlIHRoZSByZWFsIGNvbXBvbmVudCBpcyBwdXNoZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gaW50byBhIHJlZ2lzdHJ5IHRoZSBjYXB0dXJlZCBhcnJheSBubyBsb25nZXIgcmVmbGVjdHMuIEZhbGxpbmdcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3VnaCB0byB0aGUgcGxhY2Vob2xkZXIgZ2l2ZXMgdGhlIGNhbGxlciBhIHVzYWJsZSBjb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiBzaWxlbmNlLlxuICAgICAgICAgICAgICAgICAgICByZWZDb21wb25lbnQuc2V0SW5pdGlhdGVkKClcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSA9IHJlZkNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBoZXJlID5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiB3aGF0IGFib3V0IHJlYXB0ZXJzID8hIGR5bmFtaWMgPyFcbiAgICAgICAgICAgICAgICAvLyBjb25zdCBleHNpc3RpbmdSZWZDb21wb25lbnQgPSBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdIGFzIE15b3BSZWZDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgLy8gaWYgKGV4c2lzdGluZ1JlZkNvbXBvbmVudC5pZCAmJiBleHNpc3RpbmdSZWZDb21wb25lbnQucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gPSBbY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSwgcmVmQ29tcG9uZW50XTtcbiAgICAgICAgICAgICAgICAvLyB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSkpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXS5wdXNoKHJlZkNvbXBvbmVudClcbiAgICAgICAgICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICAgY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSA9IHJlZkNvbXBvbmVudDsgLy9ob3N0U0RLLmNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT09IHJlZkNvbXBvbmVudC5pZCkhO1xuICAgICAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGluIHdlYmNvbXBvbmVudCBjYXNlIHRoZSBzYW1lIGlkIHdpbGwgYWxyZWRheSBiZSBoZXJlLCB3aGljaCBpcyBnb29kICFcbiAgICAgICAgICAgICAgICAvLyBuYW1lOlxuICAgICAgICAgICAgICAgIC8vICAgICBpZFxuICAgICAgICAgICAgICAgIC8vICAgICBjb21wb25lbnREZWZpbml0aW9uSWRcblxuICAgICAgICAgICAgICAgIC8vIGZvciBpbm5lciBjb21wb25lbnRzIGluc2lkZSByZWYgY29tcG9uZW50IDpcbiAgICAgICAgICAgICAgICBtZXNzYWdlLm5lc3RlZFJlZnMuZm9yRWFjaChuZXN0ZWRSZWZDb25maWcgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRDb21wb25lbnREZWZpbml0aW9uID0gY29tcG9uZW50Q29uZmlnLmluc3RhbmNlLnJlc29sdmVkTmVzdGVkQ29tcG9uZW50cyEuZmluZChjID0+IGMudHlwZS5pZCA9PT0gbmVzdGVkUmVmQ29uZmlnLmNvbXBvbmVudERlZmluaXRpb25JZCkhLnR5cGU7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc3QgbmVzdGVkQ29tcG9uZW50RGVmaW5pdGlvbiA9IGNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlc29sdmVkRGVmaW5pdGlvbnM/LmZpbmQoZGVmID0+IGRlZi5pZCA9PT0gbmVzdGVkUmVmQ29uZmlnLmNvbXBvbmVudERlZmluaXRpb25JZCkhO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zdCByZWZDb25maWcgPSBjb21wb25lbnRDb25maWcudHlwZS5yZWZzLmZpbmQociA9PiByLm5hbWUgPT09IG5lc3RlZFJlZkNvbmZpZy5yZWZOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKCFyZWZDb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHRocm93IG5ldyBFcnJvcignbm8gcmVmQ29uZmlnIGZvdW5kIGZvciBuZXN0ZWQgcmVmJyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZENvbXBvbmVudCA9IG5ldyBNeW9wUmVmQ29tcG9uZW50KG5lc3RlZENvbXBvbmVudERlZmluaXRpb24sIHJlZkNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgICAgIG5lc3RlZENvbXBvbmVudC5zZXRJbml0aWF0ZWQoKTtcbiAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50LnJlZnNbbmVzdGVkUmVmQ29uZmlnLnJlZk5hbWVdID0gbmVzdGVkQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLnB1c2gobmVzdGVkQ29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICB9KTtcblxuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29ubmVjdFJlZnMocmVmQ29tcG9uZW50LCBjb21wb25lbnRDb25maWcsIGNvbXBvbmVudHMsIHRydWUpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6dXNlIGNvbmZpZyBjaGVjayBmb3IgYXV0by1oaWdodCBhbmQgY29udmVydCB0eXBlIHByb3Blcmx5XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5zZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQoKTtcblxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlZkNvbXBvbmVudCBhcyB1bmtub3duIGFzIFQpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9kZWJ1Z2dlclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRocm93IGVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG4gICAgfSlcbn1cblxuZXhwb3J0IGNvbnN0IGNvbm5lY3RSZWZzID0gYXN5bmMgKGNvbXBvbmVudDogSU15b3BDb21wb25lbnQsIGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZywgY29tcG9uZW50czogSU15b3BDb21wb25lbnRbXSwgd2l0aG91dFJlZkNvbXBvbmVudHM6IGJvb2xlYW4gPSBmYWxzZSkgPT4ge1xuXG4gICAgaWYgKCFjb21wb25lbnQucmVmcylcbiAgICAgICAgY29tcG9uZW50LnJlZnMgPSB7fTtcblxuICAgIGNvbnN0IHdhaXRGb3IgPSBPYmplY3QudmFsdWVzKGNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlZnMpLm1hcChyZWYgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlZi5iZWhhdmlvci50eXBlID09IFJlZkJlaGF2aW9yVHlwZS5jb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBjb21wb25lbnQucmVmc1tyZWYubmFtZV0gPVxuXG4gICAgICAgICAgICAgICAgaWYgKHdpdGhvdXRSZWZDb21wb25lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudC5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBjaGFuZ2UgdG8gZ2V0IGl0IGZyb20gdGhlIGZsb3dcbiAgICAgICAgICAgICAgICBsZXQgcmVmQ29tcG9uZW50SWQgPSAocmVmLmJlaGF2aW9yIGFzIElDb21wb25lbnRSZWZCZWhhdmlvcikuY29tcG9uZW50SWQ7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWZDb21wb25lbnRJZClcbiAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50SWQgPSAocmVmLmJlaGF2aW9yIGFzIElDb21wb25lbnRSZWZCZWhhdmlvcikuaW5zdGFuY2UuY29tcG9uZW50SWRcblxuICAgICAgICAgICAgICAgIC8vIGlmICghY29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ucmVzb2x2ZWREZWZpbml0aW9ucykge1xuICAgICAgICAgICAgICAgIC8vICAgICByZWplY3QobmV3IEVycm9yKCdjb21wb25lbnRDb25maWcgcHJvdmlkZWQgd2l0aG91dCByZXNvbHZlZERlZmluaXRpb25zIGNoZWNrIHRoZSBjb25maWcgb2JqZWN0JykpO1xuICAgICAgICAgICAgICAgIC8vICAgICAvL3Rocm93IG5ldyBFcnJvcignY29tcG9uZW50Q29uZmlnIHByb3ZpZGVkIHdpdGhvdXQgcmVzb2x2ZWREZWZpbml0aW9ucyBjaGVjayB0aGUgY29uZmlnIG9iamVjdCcpO1xuICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAvLyBjb25zdCBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnID0gY29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ucmVzb2x2ZWREZWZpbml0aW9ucyEuZmluZChjb21wZGVmID0+IGNvbXBkZWYuaWQgPT09IHJlZkNvbXBvbmVudElkKSE7XG4gICAgICAgICAgICAgICAgLy8gLy9jb25zdCBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnID0gYXdhaXQgZ2V0Q29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyhjb21wb25lbnRJbnN0YW5jZUNvbmZpZy5jb21wb25lbnRJZCk7XG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvLyBpZiAoIWNvbXBvbmVudERlZmluaXRpb25Db25maWcpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgcmVqZWN0KG5ldyBFcnJvcignY29tcG9uZW50Q29uZmlnIHByb3ZpZGVkIHdpdGhvdXQgcmVzb2x2ZWREZWZpbml0aW9ucyBjaGVjayB0aGUgY29uZmlnIG9iamVjdCcpKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgICAgIC8vVE9ETzogaWYgd2UgaGF2ZSB0aGUgc2FtZSBjb21wb25lbnQgbW9yZSB0aGFuIG9uY2Ugd2Ugd2lsbCBuZWVkIGluc3RhbmNlIGlkIGhlcmUgLi4uXG4gICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkQ29tcG9uZW50Q29uZmlnID0gY29tcG9uZW50Q29uZmlnLmluc3RhbmNlLnJlc29sdmVkTmVzdGVkQ29tcG9uZW50cz8uZmluZChuZXN0ZWRDb21wb25lbnQgPT4gbmVzdGVkQ29tcG9uZW50LnR5cGUuaWQgPT09IHJlZkNvbXBvbmVudElkKTtcblxuICAgICAgICAgICAgICAgIGlmICghbmVzdGVkQ29tcG9uZW50Q29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY29tcG9uZW50Q29uZmlnIHByb3ZpZGVkIHdpdGhvdXQgbmVzdGVkQ29tcG9uZW50Q29uZmlnIGNoZWNrIHRoZSBjb25maWcgb2JqZWN0Jyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvL2NvbnN0IGNvbXBvbmVudEluc3RhbmNlQ29uZmlnID0gY29tcG9uZW50Q29uZmlnLmluc3RhbmNlLm5lc3RlZENvbXBvbmVudHM/LmZpbmQoY29tcG9uZW50SW5zdGFjZSA9PiBjb21wb25lbnRJbnN0YWNlLmNvbXBvbmVudElkID09PSBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnLmlkKTtcbiAgICAgICAgICAgICAgICAvLyBpZighY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyl7XG4gICAgICAgICAgICAgICAgLy8gICAgIHRocm93IG5ldyBFcnJvcignVE9ETyBUT0RPIFRPRE8gJyk7XG4gICAgICAgICAgICAgICAgLy8gICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOnRoaW5rIGFib3V0IHRoYXQgOlxuICAgICAgICAgICAgICAgIC8vICAgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZy5yZXNvbHZlZERlZmluaXRpb25zID0gY29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ucmVzb2x2ZWREZWZpbml0aW9ucztcbiAgICAgICAgICAgICAgICAvLyAgIGNvbnN0IG5lc3RlZENvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICBpbnN0YW5jZTogbmVzdGVkQ29tcG9uZW50Q29uZmlnLmluc3RhbmNlISxcbiAgICAgICAgICAgICAgICAvLyAgICAgICB0eXBlOiBuZXN0ZWRDb21wb25lbnRDb25maWcudHlwZSxcbiAgICAgICAgICAgICAgICAvLyAgICAgICBuYW1lOiBuZXN0ZWRDb21wb25lbnRDb25maWcubmFtZVxuICAgICAgICAgICAgICAgIC8vICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgX3JlZiA9IFJlZi5jcmVhdGUoJycsIHJlZiwgY29tcG9uZW50KTtcblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ25lc3RlZCAhISBjcmVhdGVSZWZDb21wb25lbnQgY2FsbGVkJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZENvbXBvbmVudCA9IGF3YWl0IGNyZWF0ZVJlZkNvbXBvbmVudChfcmVmLCBuZXN0ZWRDb21wb25lbnRDb25maWchLCBjb21wb25lbnRzKVxuICAgICAgICAgICAgICAgICAgICAvL1RET08gOiBwdXQgdGhhdCByZWYgY29tcG9uZW50IHNvbWV3aGVyZT9cblxuICAgICAgICAgICAgICAgICAgICAvLyBkZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnJlZnNbcmVmLm5hbWVdID0gbmVzdGVkQ29tcG9uZW50O1xuXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbm9uUHJveGllZCA9IFJlZi5jcmVhdGUoJycsIHJlZiwgY29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnJlZnNbcmVmLm5hbWVdID0gY3JlYXRlUmVmUHJveHkoX19ub25Qcm94aWVkLCBjb21wb25lbnQpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAvL2FsZXJ0KCc/JylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfSlcbiAgICB0cnkge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh3YWl0Rm9yKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vZGVidWdnZXJcbiAgICAgICAgdGhyb3cgZTtcbiAgICB9XG5cbn1cblxuZXhwb3J0IHR5cGUgcHJvcFR5cGVzPFQgZXh0ZW5kcyBjb21wb25lbnREZWZpbml0aW9uUHJvcHM+ID0ge1xuICAgIFtQcm9wZXJ0eSBpbiBrZXlvZiBUXTpcbiAgICBUW1Byb3BlcnR5XSBleHRlbmRzIHsgbW9kZTogJ2lucHV0JyB9ID9cbiAgICAgICAgVFtQcm9wZXJ0eV1bJ3R5cGUnXSA6XG4gICAgICAgIFByb21pc2U8VFtQcm9wZXJ0eV1bJ3R5cGUnXT5cbn1cblxuZXhwb3J0IGNvbnN0IGV4ZWMgPSBhc3luYyAoZ2V0dGVyOiBhbnkpID0+IHtcbiAgICByZXR1cm4gYXdhaXQgZ2V0dGVyKClcbn1cblxuZXhwb3J0IGNvbnN0IGFjdEFzID0gPFQ+KHJlZjogUmVmKSA9PiB7XG4gICAgcmV0dXJuIHJlZiBhcyB1bmtub3duIGFzIEZ1bmN0aW9uaWZ5UmVmPFQ+XG59XG5cbmV4cG9ydCB0eXBlIEZ1bmN0aW9uaWZ5UmVmPFQgPSBhbnk+ID0ge1xuICAgIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgKC4uLmFyZ3M6IGluZmVyIEEpID0+IGluZmVyIFIgLy8gSWYgaXQncyBhIGZ1bmN0aW9uXG4gICAgICAgID8gKC4uLmFyZ3M6IEEpID0+IFByb21pc2U8Uj4gLy8gQ29udmVydCBpdCB0byBhIHByb21pc2VkIGZ1bmN0aW9uXG4gICAgICAgIDogVFtLXVxufTtcbiIsICJpbXBvcnQge0F1dG9TaXplT3B0aW9ucywgQmFzZU15b3BDb21wb25lbnR9IGZyb20gXCIuL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge1xuICAgIEJhc2VNeW9wTWVzc2FnZSxcbiAgICBFeGVjdXRlQ29tcG9uZW50TWV0aG9kLFxuICAgIEV4ZWN1dGVTY3JpcHRNZXNzYWdlLCBNZXNzYWdlRGlyZWN0aW9uLCBTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2Vcbn0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyLCBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSVNraW5Db25maWd9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7c2V0RGVidWdTdHlsZX0gZnJvbSBcIi4uL2NvbXBvbmVudENvcmVcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlcy50c1wiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuXG5leHBvcnQgY2xhc3MgTXlvcElmcmFtZUNvbXBvbmVudCBleHRlbmRzIEJhc2VNeW9wQ29tcG9uZW50IHtcblxuICAgIHByaXZhdGUgX2F1dG9TaXplQ2xlYW51cD86IENsZWFudXBIYW5kbGVyO1xuICAgIHByaXZhdGUgX2F1dG9TaXplT3B0aW9ucz86IEF1dG9TaXplT3B0aW9ucztcbiAgICBwcml2YXRlIF9hdXRvU2l6ZVVwZGF0ZT86ICgpID0+IHZvaWQ7XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgSXNvbGF0aW9uIChzYW5kYm94ZWQgY3Jvc3Mtb3JpZ2luIGZyYW1lKSBcdTIwMTQgcG9zdE1lc3NhZ2UgYnJpZGdlLCBob3N0IHNpZGUgXHUyNTAwXHUyNTAwXG4gICAgcHVibGljIGlzb2xhdGVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfbGFzdERhdGE/OiB1bmtub3duOyAgICAgICAgICAgICAgIC8vIGNhY2hlZCBsYXN0LXNlbnQgZGF0YSAoc3luYyBnZXREYXRhKVxuICAgIHByaXZhdGUgX2N0YUhhbmRsZXI/OiAoYWN0aW9uOiBzdHJpbmcsIHBheWxvYWQ6IHVua25vd24pID0+IHZvaWQ7XG4gICAgcHJpdmF0ZSBfY3RhUXVldWU6IEFycmF5PHsgYWN0aW9uOiBzdHJpbmcsIHBheWxvYWQ6IHVua25vd24gfT4gPSBbXTtcbiAgICBwcml2YXRlIF9pc29Nc2dIYW5kbGVyPzogKGU6IE1lc3NhZ2VFdmVudCkgPT4gdm9pZDtcbiAgICBwcml2YXRlIF9pc29TaXplT3B0cz86IEF1dG9TaXplT3B0aW9ucztcbiAgICBwcml2YXRlIF9pc29BdXRvU2l6ZSA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBicmlkZ2Ugc2l6aW5nIG9ubHkgd2hlbiBhdXRvLXNpemUgaXMgb25cbiAgICBwcml2YXRlIF9pc29MYXN0U2l6ZT86IHsgaGVpZ2h0OiBudW1iZXIsIHdpZHRoPzogbnVtYmVyIH07ICAvLyBsYXN0IHJlcG9ydGVkIHNpemUgKGZvciB0aGUgZW5hYmxlIHJhY2UpXG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBwcml2YXRlIElmcmFtZUVsZW1lbnQ6IEhUTUxJRnJhbWVFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykge1xuICAgICAgICBzdXBlcihjb21wb25lbnRDb25maWcsIGNvbnRhaW5lciwgb3B0aW9ucylcblxuICAgICAgICB0aGlzLmVsZW1lbnQgPSB0aGlzLklmcmFtZUVsZW1lbnQ7XG4gICAgICAgIHRoaXMuX2xhc3REYXRhID0gb3B0aW9ucz8uZGF0YTtcbiAgICAgICAgLy8gdGhpcy5JZnJhbWVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKCkgPT4ge1xuICAgICAgICAvLyAgICAgaWYgKHRoaXMuX3doZW5Jbml0aWF0ZWRSZWplY3QpXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5fd2hlbkluaXRpYXRlZFJlamVjdChgSWZyYW1lRWxlbWVudCBlcnJvcmApO1xuICAgICAgICAvLyB9KTtcbiAgICB9XG5cbiAgICBzaXplTWV0YT86IHsgd2lkdGg/OiBzdHJpbmcgfCBudW1iZXI7IGhlaWdodD86IHN0cmluZyB8IG51bWJlcjsgbWluV2lkdGg/OiBudW1iZXI7IG1heFdpZHRoPzogbnVtYmVyOyBtaW5IZWlnaHQ/OiBudW1iZXI7IG1heEhlaWdodD86IG51bWJlciB9IHwgbnVsbDtcblxuICAgIC8vIFx1MjUwMFx1MjUwMCBJc29sYXRpb24gYnJpZGdlIChob3N0IHNpZGUpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIC8qKiBBdHRhY2ggdGhlIGhvc3Qtc2lkZSBwb3N0TWVzc2FnZSBsaXN0ZW5lciBmb3IgYSBzYW5kYm94ZWQgZnJhbWUuICovXG4gICAgZW5hYmxlSXNvbGF0aW9uKCkge1xuICAgICAgICB0aGlzLmlzb2xhdGVkID0gdHJ1ZTtcbiAgICAgICAgLy8gSXNvbGF0ZWQgZnJhbWVzIGRvbid0IHJ1biB0aGUgSWZyYW1lU0RLIGhhbmRzaGFrZSAobm8gc2FtZS1vcmlnaW4gaW5pdCksXG4gICAgICAgIC8vIHNvIG1hcmsgaW5pdGlhdGVkIGltbWVkaWF0ZWx5IFx1MjAxNCBsaWtlIHRoZSBleHRyYWN0ZWQgd2ViIGNvbXBvbmVudCBkb2VzLlxuICAgICAgICB0aGlzLnNldEluaXRpYXRlZCgpO1xuICAgICAgICB0aGlzLl9pc29Nc2dIYW5kbGVyID0gKGU6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGUuc291cmNlICE9PSB0aGlzLklmcmFtZUVsZW1lbnQuY29udGVudFdpbmRvdykgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgZDogYW55ID0gZS5kYXRhO1xuICAgICAgICAgICAgaWYgKCFkIHx8IGQuX19teW9wICE9PSB0cnVlKSByZXR1cm47XG4gICAgICAgICAgICBpZiAoZC50eXBlID09PSAnbXlvcDpjdGEnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2N0YUhhbmRsZXIgJiYgIXRoaXMubWFya2VkRm9yRGlzcG9zZWQpIHRoaXMuX2N0YUhhbmRsZXIoZC5hY3Rpb24sIGQucGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMuX2N0YUhhbmRsZXIpIHRoaXMuX2N0YVF1ZXVlLnB1c2goeyBhY3Rpb246IGQuYWN0aW9uLCBwYXlsb2FkOiBkLnBheWxvYWQgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGQudHlwZSA9PT0gJ215b3A6c2l6ZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hcHBseUlzb1NpemUoZC5oZWlnaHQsIGQud2lkdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMuX2lzb01zZ0hhbmRsZXIpO1xuICAgIH1cblxuICAgIC8qKiBEYXRhLWluIFx1MjAxNCB1bmlmaWVkIHdpdGggdGhlIGV4dHJhY3RlZC1XQyBBUEkuIFBvc3RzIGluaXQgb3ZlciB0aGUgYnJpZGdlLiAqL1xuICAgIGluaXRXaXRoRGF0YShkYXRhOiB1bmtub3duKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2xhc3REYXRhID0gZGF0YTtcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50Py5jb250ZW50V2luZG93Py5wb3N0TWVzc2FnZSh7IF9fbXlvcDogdHJ1ZSwgdHlwZTogJ215b3A6aW5pdCcsIGRhdGEgfSwgJyonKTtcbiAgICB9XG5cbiAgICAvKiogRGF0YS1pbiBnZXR0ZXIgXHUyMDE0IHJldHVybnMgdGhlIGxhc3QgZGF0YSB0aGUgaG9zdCBzZW50IChjYWNoZWQsIHN5bmNocm9ub3VzKS4gKi9cbiAgICBnZXREYXRhKCk6IHVua25vd24ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGFzdERhdGE7XG4gICAgfVxuXG4gICAgLyoqIERhdGEtb3V0IFx1MjAxNCB1bmlmaWVkIHdpdGggdGhlIGV4dHJhY3RlZC1XQyBBUEkuIEZsdXNoZXMgQ1RBcyBxdWV1ZWQgcHJlLWhhbmRsZXIuICovXG4gICAgc2V0Q3RhSGFuZGxlcihoYW5kbGVyOiAoYWN0aW9uOiBzdHJpbmcsIHBheWxvYWQ6IHVua25vd24pID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fY3RhSGFuZGxlciA9IGhhbmRsZXI7XG4gICAgICAgIGlmICh0aGlzLl9jdGFRdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBxdWV1ZSA9IFsuLi50aGlzLl9jdGFRdWV1ZV07XG4gICAgICAgICAgICB0aGlzLl9jdGFRdWV1ZSA9IFtdO1xuICAgICAgICAgICAgcXVldWUuZm9yRWFjaChpdGVtID0+IHsgaWYgKCF0aGlzLm1hcmtlZEZvckRpc3Bvc2VkKSBoYW5kbGVyKGl0ZW0uYWN0aW9uLCBpdGVtLnBheWxvYWQpOyB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2FwcGx5SXNvU2l6ZShoZWlnaHQ6IG51bWJlciwgd2lkdGg/OiBudW1iZXIpIHtcbiAgICAgICAgaWYgKCFoZWlnaHQgfHwgTnVtYmVyLmlzTmFOKGhlaWdodCkpIHJldHVybjtcbiAgICAgICAgLy8gQWx3YXlzIHJlbWVtYmVyIHRoZSBsYXRlc3QgcmVwb3J0ZWQgc2l6ZSBzbyBpdCBjYW4gYmUgYXBwbGllZCBpZi93aGVuXG4gICAgICAgIC8vIGF1dG8tc2l6aW5nIGlzIGVuYWJsZWQgYWZ0ZXIgdGhlIGZpcnN0IG1lc3NhZ2UgYXJyaXZlcy5cbiAgICAgICAgdGhpcy5faXNvTGFzdFNpemUgPSB7IGhlaWdodCwgd2lkdGggfTtcbiAgICAgICAgLy8gUmVzcGVjdCBhdXRvU2l6ZTpmYWxzZSBcdTIwMTQgdGhlIGhvc3Qgb3ducyBkaW1lbnNpb25zLCBzbyBkb24ndCB0b3VjaCB0aGVtLlxuICAgICAgICBpZiAoIXRoaXMuX2lzb0F1dG9TaXplKSByZXR1cm47XG4gICAgICAgIGNvbnN0IG9wdHMgPSB0aGlzLl9pc29TaXplT3B0cztcbiAgICAgICAgY29uc3QgdG9OdW0gPSAodjogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgdW5kZWZpbmVkID0+XG4gICAgICAgICAgICB2ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiAodHlwZW9mIHYgPT09ICdudW1iZXInID8gdiA6IChpc05hTihwYXJzZUZsb2F0KHYpKSA/IHVuZGVmaW5lZCA6IHBhcnNlRmxvYXQodikpKTtcbiAgICAgICAgY29uc3QgbWluID0gdG9OdW0ob3B0cz8ubWluSGVpZ2h0KSwgbWF4ID0gdG9OdW0ob3B0cz8ubWF4SGVpZ2h0KTtcbiAgICAgICAgbGV0IGggPSBoZWlnaHQ7XG4gICAgICAgIGlmIChtaW4gIT09IHVuZGVmaW5lZCAmJiBoIDwgbWluKSBoID0gbWluO1xuICAgICAgICBpZiAobWF4ICE9PSB1bmRlZmluZWQgJiYgaCA+IG1heCkgaCA9IG1heDtcbiAgICAgICAgLy8gVHJhbnNpdGlvbiBmcm9tIGFic29sdXRlIG92ZXJsYXkgdG8gZG9jdW1lbnQgZmxvdyBhdCB0aGUgbWVhc3VyZWQgaGVpZ2h0LlxuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaW5zZXQgPSAnYXV0byc7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBoICsgJ3B4JztcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgICAgICBvcHRzPy5vblNpemVDaGFuZ2U/Lih7IHdpZHRoOiB3aWR0aCA/PyB0aGlzLklmcmFtZUVsZW1lbnQuY2xpZW50V2lkdGgsIGhlaWdodDogaCwgYXV0b1NpemluZ1dpZHRoOiBmYWxzZSwgYXV0b1NpemluZ0hlaWdodDogdHJ1ZSB9IGFzIGFueSk7XG4gICAgfVxuXG4gICAgY2xlYW51cEluc3BlY3Q/OiBDbGVhbnVwSGFuZGxlcjtcblxuICAgIGluc3BlY3QoKSB7XG4gICAgICAgIC8vIFRPRE8gOiB1c2UgYmV0dGVyIGNoZWNrIGZvciBpbnNwZWN0IG1vZGVcbiAgICAgICAgaWYgKHRoaXMuY2xlYW51cEluc3BlY3QpIHtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2luc3BlY3QgY2FsbCBtb3JlIHRoYW4gb25jZScpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xlYW51cEluc3BlY3RcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0ID0gc2V0RGVidWdTdHlsZSh0aGlzLmlkLCAnTXlvcElmcmFtZUNvbXBvbmVudCcsIDEwLCB0aGlzLmNvbnRhaW5lciwgdGhpcy5JZnJhbWVFbGVtZW50LCB0aGlzLmNvbXBvbmVudERlZmluaXRpb24pO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCEoKTtcbiAgICAgICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgaGlkZSgpIHtcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSdcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSdcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICB9XG5cbiAgICBzaG93KCkge1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcxJztcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3Vuc2V0J1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhbGwnXG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuICAgIH1cblxuICAgIHNldEhlaWdodEJhc2VkT25Eb2N1bWVudEVsZW1lbnQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gdGhpcy5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICAgIH0sIChyZXQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtyZXQuY29udGVudH1weGA7XG4gICAgICAgICAgICBjbGVhbnVwSGFuZGxlcigpO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgb2JzZXJ2ZVNpemVCYXNlZE9uRG9jdW1lbnRFbGVtZW50ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKHtzZW5kfSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qge2hlaWdodCwgd2lkdGh9ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qge2hlaWdodCwgd2lkdGh9ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgIHNlbmQoe2hlaWdodCwgd2lkdGh9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpO1xuICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5KTtcblxuICAgICAgICAgICAgcmV0dXJuIHtoZWlnaHQsIHdpZHRofVxuICAgICAgICB9LCAocmV0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUud2lkdGggPSBgJHtyZXQuY29udGVudC53aWR0aH1weGA7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7cmV0LmNvbnRlbnQuaGVpZ2h0fXB4YDtcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIHJldHVybiBjbGVhbnVwSGFuZGxlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPYnNlcnZlcyB0aGUgaWZyYW1lIGNvbnRlbnQgc2l6ZSBhbmQgYXV0b21hdGljYWxseSBzeW5jcyBpdCB0byB0aGUgaWZyYW1lIGVsZW1lbnQuXG4gICAgICogVXNlcyBkaXJlY3QgY29udGVudERvY3VtZW50IGFjY2VzcyAoc2FtZS1vcmlnaW4gb25seSkgZm9yIGFjY3VyYXRlIG1lYXN1cmVtZW50cy5cbiAgICAgKlxuICAgICAqIFJlZW50cmFudDogd2hlbiBjYWxsZWQgYWdhaW4gd2hpbGUgb2JzZXJ2ZXJzIGFscmVhZHkgZXhpc3QsIHVwZGF0ZXMgb3B0aW9ucyBhbmRcbiAgICAgKiByZS1ldmFsdWF0ZXMgc2l6aW5nIHdpdGhvdXQgcmVjcmVhdGluZyBvYnNlcnZlcnMuIENsZWFudXAgKyByZS1jYWxsIChlLmcuIFJlYWN0XG4gICAgICogcmUtcmVuZGVyKSBjcmVhdGVzIGZyZXNoIG9ic2VydmVycyBzaW5jZSBjbGVhbnVwIGNsZWFycyB0aGUgZXhpc3Rpbmcgb25lcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGluY2x1ZGluZyBzaXplIGNoYW5nZSBjYWxsYmFjayBhbmQgbWluL21heCBjb25zdHJhaW50c1xuICAgICAqIEByZXR1cm5zIENsZWFudXAgZnVuY3Rpb24gdG8gc3RvcCBvYnNlcnZpbmdcbiAgICAgKi9cbiAgICBvYnNlcnZlQXV0b1NpemUgPSAob3B0aW9ucz86IEF1dG9TaXplT3B0aW9ucyk6IENsZWFudXBIYW5kbGVyID0+IHtcbiAgICAgICAgLy8gU3RvcmUgb3B0aW9ucyBzbyB1cGRhdGVTaXplIGFsd2F5cyByZWFkcyB0aGUgbGF0ZXN0XG4gICAgICAgIHRoaXMuX2F1dG9TaXplT3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICAgICAgLy8gSXNvbGF0ZWQgZnJhbWVzIGNhbid0IGJlIG1lYXN1cmVkIGNyb3NzLW9yaWdpbiBcdTIwMTQgc2l6aW5nIGlzIGRyaXZlbiBieVxuICAgICAgICAvLyAnbXlvcDpzaXplJyBwb3N0TWVzc2FnZXMgZnJvbSB0aGUgYnJpZGdlIChzZWUgX2FwcGx5SXNvU2l6ZSkuXG4gICAgICAgIGlmICh0aGlzLmlzb2xhdGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9pc29TaXplT3B0cyA9IG9wdGlvbnM7XG4gICAgICAgICAgICB0aGlzLl9pc29BdXRvU2l6ZSA9IHRydWU7XG4gICAgICAgICAgICAvLyBBcHBseSB0aGUgbW9zdCByZWNlbnQgYnJpZGdlLXJlcG9ydGVkIHNpemUgKGl0IG1heSBoYXZlIGFycml2ZWQgYmVmb3JlXG4gICAgICAgICAgICAvLyBhdXRvLXNpemluZyB3YXMgdHVybmVkIG9uKS5cbiAgICAgICAgICAgIGlmICh0aGlzLl9pc29MYXN0U2l6ZSkgdGhpcy5fYXBwbHlJc29TaXplKHRoaXMuX2lzb0xhc3RTaXplLmhlaWdodCwgdGhpcy5faXNvTGFzdFNpemUud2lkdGgpO1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHsgdGhpcy5faXNvQXV0b1NpemUgPSBmYWxzZTsgdGhpcy5faXNvU2l6ZU9wdHMgPSB1bmRlZmluZWQ7IH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBvYnNlcnZlcnMgYWxyZWFkeSBleGlzdCwgcmUtZXZhbHVhdGUgd2l0aCBuZXcgb3B0aW9ucyBhbmQgcmV1c2UgdGhlbVxuICAgICAgICBpZiAodGhpcy5fYXV0b1NpemVDbGVhbnVwICYmIHRoaXMuX2F1dG9TaXplVXBkYXRlKSB7XG4gICAgICAgICAgICB0aGlzLl9hdXRvU2l6ZVVwZGF0ZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2F1dG9TaXplQ2xlYW51cDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlmcmFtZSA9IHRoaXMuSWZyYW1lRWxlbWVudDtcbiAgICAgICAgY29uc3QgZG9jID0gaWZyYW1lLmNvbnRlbnREb2N1bWVudDtcblxuICAgICAgICBpZiAoIWRvYykge1xuICAgICAgICAgICAgLy8gQ3Jvc3Mtb3JpZ2luICh2MSBjb21wb25lbnRzIG9uIHRoZSBjdXN0b21lcidzIGRvbWFpbik6IG1lYXN1cmUgaW5zaWRlIHRoZSBmcmFtZS5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLm9ic2VydmVIZWlnaHRWaWFCcmlkZ2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNsYW1wID0gKHZhbHVlOiBudW1iZXIsIG1pbj86IG51bWJlciwgbWF4PzogbnVtYmVyKTogbnVtYmVyID0+IHtcbiAgICAgICAgICAgIGlmIChtaW4gIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA8IG1pbikgcmV0dXJuIG1pbjtcbiAgICAgICAgICAgIGlmIChtYXggIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA+IG1heCkgcmV0dXJuIG1heDtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBQYXJzZSBDU1Mgc2l6ZSB2YWx1ZXMgdG8gbnVtYmVyc1xuICAgICAgICBjb25zdCBwYXJzZVNpemUgPSAodmFsdWU6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCk6IG51bWJlciB8IHVuZGVmaW5lZCA9PiB7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlRmxvYXQodmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIGlzTmFOKHBhcnNlZCkgPyB1bmRlZmluZWQgOiBwYXJzZWQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgdXBkYXRlU2l6ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREb2MgPSBpZnJhbWUuY29udGVudERvY3VtZW50O1xuICAgICAgICAgICAgaWYgKCFjb250ZW50RG9jKSByZXR1cm47XG5cbiAgICAgICAgICAgIGNvbnN0IG9wdHMgPSB0aGlzLl9hdXRvU2l6ZU9wdGlvbnM7XG5cbiAgICAgICAgICAgIGNvbnN0IG1pbldpZHRoID0gcGFyc2VTaXplKG9wdHM/Lm1pbldpZHRoKTtcbiAgICAgICAgICAgIGNvbnN0IG1heFdpZHRoID0gcGFyc2VTaXplKG9wdHM/Lm1heFdpZHRoKTtcbiAgICAgICAgICAgIGNvbnN0IG1pbkhlaWdodCA9IHBhcnNlU2l6ZShvcHRzPy5taW5IZWlnaHQpO1xuICAgICAgICAgICAgY29uc3QgbWF4SGVpZ2h0ID0gcGFyc2VTaXplKG9wdHM/Lm1heEhlaWdodCk7XG4gICAgICAgICAgICBjb25zdCBsb2FkZXJNaW5IZWlnaHQgPSBvcHRzPy5sb2FkZXJNaW5IZWlnaHQgPz8gNTA7XG5cbiAgICAgICAgICAgIC8vIFJlc29sdmUgZXhwbGljaXQgZGltZW5zaW9uczogaG9zdCBvcHRpb25zIFx1MjE5MiBzaXplTWV0YSBmaWxsIG1vZGUgXHUyMTkyIHdpZHRoIGRlZmF1bHRzIHRvIFwiMTAwJVwiXG4gICAgICAgICAgICAvLyBXaWR0aCBkZWZhdWx0cyB0byBcIjEwMCVcIiAoYmxvY2sgZWxlbWVudCBiZWhhdmlvcikgdG8gcHJldmVudCB0aGUgc2hyaW5rLXRvLTAgbWVhc3VyZW1lbnQgYnVnLlxuICAgICAgICAgICAgLy8gSGVpZ2h0IGhhcyBubyBkZWZhdWx0IHNvIGl0IGF1dG8tc2l6ZXMgdG8gY29udGVudC5cbiAgICAgICAgICAgIC8vIE9ubHkgc2l6ZU1ldGEgXCIxMDAlXCIgKGZpbGwgbW9kZSkgaXMgdHJlYXRlZCBhcyBleHBsaWNpdCBhbmQgZGlzYWJsZXMgYXV0by1zaXppbmcuXG4gICAgICAgICAgICAvLyBQaXhlbCBzaXplTWV0YSB2YWx1ZXMgKGUuZy4sIGhlaWdodDogMjAwKSBhcmUgaW5pdGlhbCBoaW50cywgTk9UIGV4cGxpY2l0IGNvbnN0cmFpbnRzLlxuICAgICAgICAgICAgY29uc3Qgc2l6ZU1ldGFGaWxsV2lkdGggPSB0aGlzLnNpemVNZXRhPy53aWR0aCA9PT0gXCIxMDAlXCIgPyBcIjEwMCVcIiA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IHNpemVNZXRhRmlsbEhlaWdodCA9IHRoaXMuc2l6ZU1ldGE/LmhlaWdodCA9PT0gXCIxMDAlXCIgPyBcIjEwMCVcIiA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkRXhwbGljaXRXaWR0aCA9IG9wdHM/LmV4cGxpY2l0V2lkdGggPz8gc2l6ZU1ldGFGaWxsV2lkdGggPz8gXCIxMDAlXCI7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZEV4cGxpY2l0SGVpZ2h0ID0gb3B0cz8uZXhwbGljaXRIZWlnaHQgPz8gc2l6ZU1ldGFGaWxsSGVpZ2h0O1xuICAgICAgICAgICAgY29uc3QgaGFzRXhwbGljaXRXaWR0aCA9IHJlc29sdmVkRXhwbGljaXRXaWR0aCAhPT0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgaGFzRXhwbGljaXRIZWlnaHQgPSByZXNvbHZlZEV4cGxpY2l0SGVpZ2h0ICE9PSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgIC8vIERldGVjdCBjb2xsYXBzZWQgZGltZW5zaW9ucyBmcm9tIGNvbnRhaW5lciAodGhpcy5jb250YWluZXIpXG4gICAgICAgICAgICBjb25zdCBjb250YWluZXJSZWN0ID0gdGhpcy5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICBjb25zdCBjb2xsYXBzZWRXaWR0aCA9IGNvbnRhaW5lclJlY3Qud2lkdGggPT09IDA7XG4gICAgICAgICAgICAvLyBDb25zaWRlciBjb2xsYXBzZWQgaWYgaGVpZ2h0IGlzIDAgT1IgZXF1YWxzIHRoZSBsb2FkZXIgbWluSGVpZ2h0XG4gICAgICAgICAgICBjb25zdCBjb2xsYXBzZWRIZWlnaHQgPSBjb250YWluZXJSZWN0LmhlaWdodCA9PT0gMCB8fCBjb250YWluZXJSZWN0LmhlaWdodCA9PT0gbG9hZGVyTWluSGVpZ2h0O1xuXG4gICAgICAgICAgICAvLyBEZXRlcm1pbmUgd2hpY2ggZGltZW5zaW9ucyB0byBhdXRvLXNpemU6XG4gICAgICAgICAgICAvLyAtIElmIGZvcmNlQXV0b1NpemUgaXMgdHJ1ZSwgYXV0by1zaXplIHVubGVzcyBleHBsaWNpdCBkaW1lbnNpb24gaXMgc2V0XG4gICAgICAgICAgICAvLyAtIE90aGVyd2lzZSwgYXV0by1zaXplIG9ubHkgaWYgY29sbGFwc2VkXG4gICAgICAgICAgICBjb25zdCBzaG91bGRBdXRvV2lkdGggPSBvcHRzPy5mb3JjZUF1dG9TaXplXG4gICAgICAgICAgICAgICAgPyAhaGFzRXhwbGljaXRXaWR0aFxuICAgICAgICAgICAgICAgIDogKGNvbGxhcHNlZFdpZHRoICYmICFoYXNFeHBsaWNpdFdpZHRoKTtcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZEF1dG9IZWlnaHQgPSBvcHRzPy5mb3JjZUF1dG9TaXplXG4gICAgICAgICAgICAgICAgPyAhaGFzRXhwbGljaXRIZWlnaHRcbiAgICAgICAgICAgICAgICA6IChjb2xsYXBzZWRIZWlnaHQgJiYgIWhhc0V4cGxpY2l0SGVpZ2h0KTtcblxuICAgICAgICAgICAgLy8gSWYgbm90aGluZyBuZWVkcyBhdXRvLXNpemluZywgYXBwbHkgZXhwbGljaXQvcGVyY2VudGFnZSBkaW1lbnNpb25zXG4gICAgICAgICAgICBpZiAoIXNob3VsZEF1dG9XaWR0aCAmJiAhc2hvdWxkQXV0b0hlaWdodCkge1xuICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS53aWR0aCA9IHR5cGVvZiByZXNvbHZlZEV4cGxpY2l0V2lkdGggPT09ICdudW1iZXInID8gYCR7cmVzb2x2ZWRFeHBsaWNpdFdpZHRofXB4YCA6ICcxMDAlJztcbiAgICAgICAgICAgICAgICBpZnJhbWUuc3R5bGUuaGVpZ2h0ID0gdHlwZW9mIHJlc29sdmVkRXhwbGljaXRIZWlnaHQgPT09ICdudW1iZXInID8gYCR7cmVzb2x2ZWRFeHBsaWNpdEhlaWdodH1weGAgOiAnMTAwJSc7XG5cbiAgICAgICAgICAgICAgICBvcHRzPy5vblNpemVDaGFuZ2U/Lih7XG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiB0eXBlb2YgcmVzb2x2ZWRFeHBsaWNpdFdpZHRoID09PSAnbnVtYmVyJyA/IHJlc29sdmVkRXhwbGljaXRXaWR0aCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiB0eXBlb2YgcmVzb2x2ZWRFeHBsaWNpdEhlaWdodCA9PT0gJ251bWJlcicgPyByZXNvbHZlZEV4cGxpY2l0SGVpZ2h0IDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBhdXRvU2l6aW5nV2lkdGg6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBhdXRvU2l6aW5nSGVpZ2h0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIERpc2FibGUgQ1NTIHRyYW5zaXRpb25zIG9uIGlmcmFtZSBhbmQgY29udGFpbmVyIGZvciB0aGUgZW50aXJlXG4gICAgICAgICAgICAvLyBtZWFzdXJlbWVudCArIGhlaWdodC1zZXR0aW5nIGN5Y2xlLiBIb3N0IGFwcHMgbWF5IHNldCBgdHJhbnNpdGlvbjogYWxsYFxuICAgICAgICAgICAgLy8gd2hpY2ggd291bGQgYW5pbWF0ZSB0aGUgMHB4IGNvbGxhcHNlIGFuZCBmaW5hbCBoZWlnaHQgY2hhbmdlLCBjYXVzaW5nXG4gICAgICAgICAgICAvLyB2aXNpYmxlIGp1bXBzIGR1cmluZyBzY3JvbGwuXG4gICAgICAgICAgICBjb25zdCBwcmV2VHJhbnNpdGlvbiA9IGlmcmFtZS5zdHlsZS50cmFuc2l0aW9uO1xuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jb250YWluZXI7XG4gICAgICAgICAgICBjb25zdCBwcmV2Q29udGFpbmVyVHJhbnNpdGlvbiA9IGNvbnRhaW5lci5zdHlsZS50cmFuc2l0aW9uO1xuICAgICAgICAgICAgaWZyYW1lLnN0eWxlLnRyYW5zaXRpb24gPSAnbm9uZSc7XG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUudHJhbnNpdGlvbiA9ICdub25lJztcblxuICAgICAgICAgICAgLy8gUXVpY2sgcHJlLWNoZWNrOiByZWFkIHNjcm9sbEhlaWdodC9XaWR0aCBCRUZPUkUgY29sbGFwc2luZyB0aGUgaWZyYW1lLlxuICAgICAgICAgICAgLy8gSWYgY29udGVudCBvbmx5IGdyZXcgKHNjcm9sbEhlaWdodCA+IGlmcmFtZSBoZWlnaHQpLCB3ZSBjYW4gc2tpcCB0aGVcbiAgICAgICAgICAgIC8vIDBweCBjb2xsYXBzZSBcdTIwMTQgc2Nyb2xsSGVpZ2h0IG5hdHVyYWxseSBleHBhbmRzIGJleW9uZCB0aGUgaWZyYW1lLlxuICAgICAgICAgICAgY29uc3QgY3VycmVudElmcmFtZUhlaWdodCA9IGlmcmFtZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50SWZyYW1lV2lkdGggPSBpZnJhbWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgICAgICAgICBjb25zdCBwcmVTY3JvbGxIZWlnaHQgPSBNYXRoLmNlaWwoTWF0aC5tYXgoY29udGVudERvYy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0LCBjb250ZW50RG9jLmJvZHkuc2Nyb2xsSGVpZ2h0LCBjb250ZW50RG9jLmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0KSk7XG4gICAgICAgICAgICBjb25zdCBwcmVTY3JvbGxXaWR0aCA9IE1hdGguY2VpbChNYXRoLm1heChjb250ZW50RG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxXaWR0aCwgY29udGVudERvYy5ib2R5LnNjcm9sbFdpZHRoLCBjb250ZW50RG9jLmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgpKTtcblxuICAgICAgICAgICAgbGV0IGNvbnRlbnRXaWR0aCA9IHByZVNjcm9sbFdpZHRoO1xuICAgICAgICAgICAgbGV0IGNvbnRlbnRIZWlnaHQgPSBwcmVTY3JvbGxIZWlnaHQ7XG5cbiAgICAgICAgICAgIGNvbnN0IGhlaWdodEdyZXcgPSBzaG91bGRBdXRvSGVpZ2h0ICYmIHByZVNjcm9sbEhlaWdodCA+IGN1cnJlbnRJZnJhbWVIZWlnaHQgKyAxO1xuICAgICAgICAgICAgY29uc3Qgd2lkdGhHcmV3ID0gc2hvdWxkQXV0b1dpZHRoICYmIHByZVNjcm9sbFdpZHRoID4gY3VycmVudElmcmFtZVdpZHRoICsgMTtcblxuICAgICAgICAgICAgLy8gRm9yIG5vbi1ncm93IGNhc2VzIChzaHJpbmsgb3Igbm8tY2hhbmdlKSwgd2UgbXVzdCBjb2xsYXBzZSB0byAwcHggdG9cbiAgICAgICAgICAgIC8vIG1lYXN1cmUgdGhlIHRydWUgY29udGVudCBoZWlnaHQuIHNjcm9sbEhlaWdodCBjYW4gbmV2ZXIgZGVjcmVhc2UgYmVsb3dcbiAgICAgICAgICAgIC8vIHRoZSBpZnJhbWUncyBjbGllbnRIZWlnaHQsIHNvIHNocmluayBpcyB1bmRldGVjdGFibGUgd2l0aG91dCBjb2xsYXBzaW5nLlxuICAgICAgICAgICAgLy8gV2l0aCB0cmFuc2l0aW9ucyBkaXNhYmxlZCArIGNvbnRhaW5lciBtaW4taGVpZ2h0IGhlbGQsIHRoZSBjb2xsYXBzZVxuICAgICAgICAgICAgLy8gaXMgaW52aXNpYmxlIChubyBsYXlvdXQgc2hpZnQsIG5vIGFuaW1hdGlvbikuXG4gICAgICAgICAgICBjb25zdCBuZWVkc0hlaWdodENvbGxhcHNlID0gc2hvdWxkQXV0b0hlaWdodCAmJiAhaGVpZ2h0R3JldztcbiAgICAgICAgICAgIGNvbnN0IG5lZWRzV2lkdGhDb2xsYXBzZSA9IHNob3VsZEF1dG9XaWR0aCAmJiAhd2lkdGhHcmV3O1xuXG4gICAgICAgICAgICBpZiAobmVlZHNIZWlnaHRDb2xsYXBzZSB8fCBuZWVkc1dpZHRoQ29sbGFwc2UpIHtcbiAgICAgICAgICAgICAgICAvLyBIb2xkIHRoZSBjb250YWluZXIncyBtaW4taGVpZ2h0L3dpZHRoIGR1cmluZyBtZWFzdXJlbWVudCB0byBwcmV2ZW50XG4gICAgICAgICAgICAgICAgLy8gbGF5b3V0IHNoaWZ0IChlbGVtZW50cyBiZWxvdyB0aGUgaWZyYW1lIHdvbid0IGp1bXApLlxuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZNaW5IZWlnaHQgPSBjb250YWluZXIuc3R5bGUubWluSGVpZ2h0O1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZNaW5XaWR0aCA9IGNvbnRhaW5lci5zdHlsZS5taW5XaWR0aDtcbiAgICAgICAgICAgICAgICBpZiAobmVlZHNIZWlnaHRDb2xsYXBzZSkgY29udGFpbmVyLnN0eWxlLm1pbkhlaWdodCA9IGAke2N1cnJlbnRJZnJhbWVIZWlnaHR9cHhgO1xuICAgICAgICAgICAgICAgIGlmIChuZWVkc1dpZHRoQ29sbGFwc2UpIGNvbnRhaW5lci5zdHlsZS5taW5XaWR0aCA9IGAke2N1cnJlbnRJZnJhbWVXaWR0aH1weGA7XG5cbiAgICAgICAgICAgICAgICBpZiAobmVlZHNIZWlnaHRDb2xsYXBzZSkgaWZyYW1lLnN0eWxlLmhlaWdodCA9ICcwcHgnO1xuICAgICAgICAgICAgICAgIGlmIChuZWVkc1dpZHRoQ29sbGFwc2UpIGlmcmFtZS5zdHlsZS53aWR0aCA9ICcwcHgnO1xuXG4gICAgICAgICAgICAgICAgY29udGVudFdpZHRoID0gTWF0aC5jZWlsKE1hdGgubWF4KGNvbnRlbnREb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFdpZHRoLCBjb250ZW50RG9jLmJvZHkuc2Nyb2xsV2lkdGgsIGNvbnRlbnREb2MuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCkpO1xuICAgICAgICAgICAgICAgIGNvbnRlbnRIZWlnaHQgPSBNYXRoLmNlaWwoTWF0aC5tYXgoY29udGVudERvYy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0LCBjb250ZW50RG9jLmJvZHkuc2Nyb2xsSGVpZ2h0LCBjb250ZW50RG9jLmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0KSk7XG5cbiAgICAgICAgICAgICAgICAvLyBGYWxsYmFjazogaWYgY29sbGFwc2luZyB0byAwcHggZ2F2ZSBhIG5lYXItemVybyBtZWFzdXJlbWVudCwgdGhlIGNvbXBvbmVudFxuICAgICAgICAgICAgICAgIC8vIGxpa2VseSBoYXMgYGhlaWdodDogMTAwJWAgY2hhaW5zIChodG1sID4gYm9keSA+IC5hcHAtY29udGFpbmVyKSB0aGF0IGNhc2NhZGVkXG4gICAgICAgICAgICAgICAgLy8gdGhlIGNvbGxhcHNlIGludG8gYWxsIGNoaWxkcmVuLiBSZXRyeSB3aXRoIGEgbnVjbGVhciBvdmVycmlkZSB0aGF0IGZvcmNlcyBhbGxcbiAgICAgICAgICAgICAgICAvLyBlbGVtZW50cyB0byBpbnRyaW5zaWMgc2l6aW5nLiBUaGlzIGlzIG9ubHkgYSBmYWxsYmFjayBiZWNhdXNlIHRoZSBvdmVycmlkZVxuICAgICAgICAgICAgICAgIC8vIGJyZWFrcyBleHBsaWNpdCBwaXhlbCBoZWlnaHRzIChlLmcuIDhweCBpbmRpY2F0b3IgZG90cyBcdTIxOTIgMHB4KS5cbiAgICAgICAgICAgICAgICBjb25zdCBuZWVkc051Y2xlYXJIZWlnaHQgPSBuZWVkc0hlaWdodENvbGxhcHNlICYmIGNvbnRlbnRIZWlnaHQgPCAyO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5lZWRzTnVjbGVhcldpZHRoID0gbmVlZHNXaWR0aENvbGxhcHNlICYmIGNvbnRlbnRXaWR0aCA8IDI7XG4gICAgICAgICAgICAgICAgaWYgKG5lZWRzTnVjbGVhckhlaWdodCB8fCBuZWVkc051Y2xlYXJXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWFzdXJlU3R5bGUgPSBjb250ZW50RG9jLmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgICAgICAgICAgICAgIG1lYXN1cmVTdHlsZS5pZCA9ICdfX215b3BfbWVhc3VyZSc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1bGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmVlZHNOdWNsZWFySGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBydWxlcy5wdXNoKCdoZWlnaHQ6IGF1dG8gIWltcG9ydGFudCcsICdtaW4taGVpZ2h0OiAwICFpbXBvcnRhbnQnLCAnbWF4LWhlaWdodDogbm9uZSAhaW1wb3J0YW50Jyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5lZWRzTnVjbGVhcldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBydWxlcy5wdXNoKCd3aWR0aDogYXV0byAhaW1wb3J0YW50JywgJ21pbi13aWR0aDogMCAhaW1wb3J0YW50JywgJ21heC13aWR0aDogbm9uZSAhaW1wb3J0YW50Jyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVhc3VyZVN0eWxlLnRleHRDb250ZW50ID0gYCosICo6OmJlZm9yZSwgKjo6YWZ0ZXIgeyAke3J1bGVzLmpvaW4oJzsgJyl9OyBmbGV4LWJhc2lzOiBhdXRvICFpbXBvcnRhbnQ7IGZsZXgtZ3JvdzogMCAhaW1wb3J0YW50OyB9YDtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudERvYy5oZWFkLmFwcGVuZENoaWxkKG1lYXN1cmVTdHlsZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29udGVudFdpZHRoID0gTWF0aC5jZWlsKE1hdGgubWF4KGNvbnRlbnREb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFdpZHRoLCBjb250ZW50RG9jLmJvZHkuc2Nyb2xsV2lkdGgsIGNvbnRlbnREb2MuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCkpO1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50SGVpZ2h0ID0gTWF0aC5jZWlsKE1hdGgubWF4KGNvbnRlbnREb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCwgY29udGVudERvYy5ib2R5LnNjcm9sbEhlaWdodCwgY29udGVudERvYy5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCkpO1xuXG4gICAgICAgICAgICAgICAgICAgIG1lYXN1cmVTdHlsZS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIGNvbnRhaW5lciBjb25zdHJhaW50cyBpbW1lZGlhdGVseSAoc2FtZSBmcmFtZSwgYmVmb3JlIHBhaW50KVxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5taW5IZWlnaHQgPSBwcmV2TWluSGVpZ2h0O1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5taW5XaWR0aCA9IHByZXZNaW5XaWR0aDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSBjbGFtcChjb250ZW50V2lkdGgsIG1pbldpZHRoLCBtYXhXaWR0aCk7XG4gICAgICAgICAgICBjb25zdCBoZWlnaHQgPSBjbGFtcChjb250ZW50SGVpZ2h0LCBtaW5IZWlnaHQsIG1heEhlaWdodCk7XG5cbiAgICAgICAgICAgIC8vIFNldCBhdXRvLXNpemVkIGRpbWVuc2lvbnMgdG8gbWVhc3VyZWQgdmFsdWVzLCBub24tYXV0byB0byBleHBsaWNpdC8xMDAlXG4gICAgICAgICAgICBpZiAoc2hvdWxkQXV0b1dpZHRoKSB7XG4gICAgICAgICAgICAgICAgaWZyYW1lLnN0eWxlLndpZHRoID0gYCR7d2lkdGh9cHhgO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZnJhbWUuc3R5bGUud2lkdGggPSB0eXBlb2YgcmVzb2x2ZWRFeHBsaWNpdFdpZHRoID09PSAnbnVtYmVyJyA/IGAke3Jlc29sdmVkRXhwbGljaXRXaWR0aH1weGAgOiAnMTAwJSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2hvdWxkQXV0b0hlaWdodCkge1xuICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZnJhbWUuc3R5bGUuaGVpZ2h0ID0gdHlwZW9mIHJlc29sdmVkRXhwbGljaXRIZWlnaHQgPT09ICdudW1iZXInID8gYCR7cmVzb2x2ZWRFeHBsaWNpdEhlaWdodH1weGAgOiAnMTAwJSc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZvcmNlIHJlZmxvdyBzbyB0aGUgZmluYWwgZGltZW5zaW9ucyBhcmUgYXBwbGllZCB3aXRob3V0IHRyYW5zaXRpb24sXG4gICAgICAgICAgICAvLyB0aGVuIHJlc3RvcmUgdGhlIG9yaWdpbmFsIHRyYW5zaXRpb25zLlxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xuICAgICAgICAgICAgaWZyYW1lLm9mZnNldEhlaWdodDtcbiAgICAgICAgICAgIGlmcmFtZS5zdHlsZS50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUudHJhbnNpdGlvbiA9IHByZXZDb250YWluZXJUcmFuc2l0aW9uO1xuXG4gICAgICAgICAgICAvLyBEb24ndCBmb3JjZSBvdmVyZmxvdyBcdTIwMTQgbGV0IHRoZSBjb21wb25lbnQvcGFyZW50IGNvbnRyb2wgc2Nyb2xsaW5nLlxuICAgICAgICAgICAgLy8gT25seSBzZXQgb3ZlcmZsb3c6IGF1dG8gd2hlbiBjb250ZW50IGV4Y2VlZHMgbWF4IGNvbnN0cmFpbnRzLlxuICAgICAgICAgICAgY29uc3QgaXNXaWR0aENvbnN0cmFpbmVkID0gc2hvdWxkQXV0b1dpZHRoICYmIG1heFdpZHRoICE9PSB1bmRlZmluZWQgJiYgY29udGVudFdpZHRoID4gbWF4V2lkdGg7XG4gICAgICAgICAgICBjb25zdCBpc0hlaWdodENvbnN0cmFpbmVkID0gc2hvdWxkQXV0b0hlaWdodCAmJiBtYXhIZWlnaHQgIT09IHVuZGVmaW5lZCAmJiBjb250ZW50SGVpZ2h0ID4gbWF4SGVpZ2h0O1xuICAgICAgICAgICAgY29udGVudERvYy5kb2N1bWVudEVsZW1lbnQuc3R5bGUub3ZlcmZsb3dYID0gaXNXaWR0aENvbnN0cmFpbmVkID8gJ2F1dG8nIDogJyc7XG4gICAgICAgICAgICBjb250ZW50RG9jLmRvY3VtZW50RWxlbWVudC5zdHlsZS5vdmVyZmxvd1kgPSBpc0hlaWdodENvbnN0cmFpbmVkID8gJ2F1dG8nIDogJyc7XG5cbiAgICAgICAgICAgIG9wdHM/Lm9uU2l6ZUNoYW5nZT8uKHtcbiAgICAgICAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgICAgICAgYXV0b1NpemluZ1dpZHRoOiBzaG91bGRBdXRvV2lkdGgsXG4gICAgICAgICAgICAgICAgYXV0b1NpemluZ0hlaWdodDogc2hvdWxkQXV0b0hlaWdodFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gSW5pdGlhbCBzaXplIChydW4gc3luY2hyb25vdXNseSwgbm90IGRlYm91bmNlZClcbiAgICAgICAgdXBkYXRlU2l6ZSgpO1xuXG4gICAgICAgIC8vIFN0b3JlIHVwZGF0ZVNpemUgZm9yIHJlZW50cmFudCBjYWxsc1xuICAgICAgICB0aGlzLl9hdXRvU2l6ZVVwZGF0ZSA9IHVwZGF0ZVNpemU7XG5cbiAgICAgICAgLy8gRGVib3VuY2Ugb2JzZXJ2ZXIgY2FsbGJhY2tzIHZpYSByQUYgXHUyMDE0IGF0IG1vc3Qgb25lIHVwZGF0ZVNpemUgcGVyIGZyYW1lLlxuICAgICAgICAvLyBQcmV2ZW50cyBsYXlvdXQgdGhyYXNoaW5nIGZyb20gaGlnaC1mcmVxdWVuY3kgbXV0YXRpb25zIChlLmcuIENTUyBhbmltYXRpb25zKS5cbiAgICAgICAgbGV0IHJhZklkOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHNjaGVkdWxlVXBkYXRlID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHJhZklkICE9PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgICAgIHJhZklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICByYWZJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB1cGRhdGVTaXplKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBPYnNlcnZlIGZvciBjaGFuZ2VzXG4gICAgICAgIGNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHNjaGVkdWxlVXBkYXRlKCkpO1xuICAgICAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKGRvYy5ib2R5KTtcbiAgICAgICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShkb2MuZG9jdW1lbnRFbGVtZW50KTtcblxuICAgICAgICAvLyBNdXRhdGlvbk9ic2VydmVyIGNhdGNoZXMgRE9NIGNvbnRlbnQgY2hhbmdlcyAoZS5nLiByZW1vdmluZyBsaXN0IGl0ZW1zLCB0b2dnbGluZyB2aWV3cylcbiAgICAgICAgLy8gdGhhdCBkb24ndCB0cmlnZ2VyIFJlc2l6ZU9ic2VydmVyIGJlY2F1c2UgdGhlIGJvZHkgYm94LXNpemUgc3RheXMgdGhlIHNhbWVcbiAgICAgICAgLy8gKGJvZHkgZmlsbHMgaWZyYW1lLCBpZnJhbWUgaGFzbid0IHNocnVuayB5ZXQpLlxuICAgICAgICAvLyBgYXR0cmlidXRlczogdHJ1ZWAgY2F0Y2hlcyBDU1MgY2xhc3Mvc3R5bGUgY2hhbmdlcyAoZS5nLiBkaXNwbGF5Om5vbmUgdG9nZ2xpbmcgdmlld3MpLlxuICAgICAgICBjb25zdCBtdXRhdGlvbk9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gc2NoZWR1bGVVcGRhdGUoKSk7XG4gICAgICAgIG11dGF0aW9uT2JzZXJ2ZXIub2JzZXJ2ZShkb2MuYm9keSwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUsIGNoYXJhY3RlckRhdGE6IHRydWUsIGF0dHJpYnV0ZXM6IHRydWUgfSk7XG5cbiAgICAgICAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICAgICAgICAgIHJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIG11dGF0aW9uT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgaWYgKHJhZklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShyYWZJZCk7XG4gICAgICAgICAgICAgICAgcmFmSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9hdXRvU2l6ZVVwZGF0ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuX2F1dG9TaXplQ2xlYW51cCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fYXV0b1NpemVDbGVhbnVwID0gY2xlYW51cDtcbiAgICAgICAgcmV0dXJuIGNsZWFudXA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYnJpZGdlU2l6ZUNsZWFudXA/OiBDbGVhbnVwSGFuZGxlcjtcblxuICAgIC8qKlxuICAgICAqIEF1dG8taGVpZ2h0IGZvciBhIGZyYW1lIHRoZSBob3N0IGNhbid0IHJlYWQgKGNyb3NzLW9yaWdpbikuIFJ1bnMgYWZ0ZXIgdGhlIElmcmFtZVNES1xuICAgICAqIGhhbmRzaGFrZTogdGhlIGZyYW1lIHJlcG9ydHMgYm9keSByZXNpemVzIGFuZCB0aGUgaG9zdCByZS1yZWFkcyB0aGUgc2Nyb2xsIGhlaWdodC5cbiAgICAgKi9cbiAgICBvYnNlcnZlSGVpZ2h0VmlhQnJpZGdlID0gKCk6IENsZWFudXBIYW5kbGVyID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2JyaWRnZVNpemVDbGVhbnVwKSByZXR1cm4gdGhpcy5fYnJpZGdlU2l6ZUNsZWFudXA7XG5cbiAgICAgICAgbGV0IG9ic2VydmVyQ2xlYW51cDogQ2xlYW51cEhhbmRsZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBzdG9wcGVkID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgICAgICBzdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIG9ic2VydmVyQ2xlYW51cD8uKCk7XG4gICAgICAgICAgICB0aGlzLl9icmlkZ2VTaXplQ2xlYW51cCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fYnJpZGdlU2l6ZUNsZWFudXAgPSBjbGVhbnVwO1xuXG4gICAgICAgIHRoaXMuaW5pdGlhdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBpZiAoc3RvcHBlZCB8fCB0aGlzLm1hcmtlZEZvckRpc3Bvc2VkKSByZXR1cm47XG4gICAgICAgICAgICAvLyBMZWF2ZSB0aGUgYWJzb2x1dGUgMTAwJSBvdmVybGF5IGFuZCB0YWtlIHBhcnQgaW4gdGhlIGNvbnRhaW5lcidzIGxheW91dC5cbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaW5zZXQgPSAnYXV0byc7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgICAgICAgICB0aGlzLnNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQoKTtcbiAgICAgICAgICAgIG9ic2VydmVyQ2xlYW51cCA9IHRoaXMuc2VuZChuZXcgU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlKCkpO1xuICAgICAgICB9KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgLy8gTm90IGZhdGFsOiB0aGUgY29tcG9uZW50IHN0aWxsIHJlbmRlcnMsIGl0IGp1c3QgbmV2ZXIgZ2V0cyBhIGhlaWdodCBhbmQgc2l0c1xuICAgICAgICAgICAgLy8gYXQgdGhlIGlmcmFtZSBkZWZhdWx0LiBXaXRob3V0IHRoaXMgbGluZSB0aGF0IGlzIGNvbXBsZXRlbHkgaW52aXNpYmxlIC0tXG4gICAgICAgICAgICAvLyBub3RoaW5nIHRocm93cywgbm90aGluZyBsb2dzLCBhbmQgdGhlIG9ubHkgc3ltcHRvbSBpcyBhIDE1MHB4IGZyYW1lLiBBXG4gICAgICAgICAgICAvLyBzaWxlbnQgc2l6aW5nIGZhaWx1cmUgb2YgZXhhY3RseSB0aGlzIHNoYXBlIGlzIHdoYXQgbWFkZSB0aGUgaW5pdCByYWNlXG4gICAgICAgICAgICAvLyAoMjAyNi0xMC0xNywgc2VlIElOSVQtSEFORFNIQUtFLm1kKSB0YWtlIGZvdXIgZGF5cyB0byBmaW5kOiBpbml0aWF0ZWQoKVxuICAgICAgICAgICAgLy8gcmVqZWN0ZWQsIHRoaXMgY2F0Y2ggc3dhbGxvd2VkIGl0LCBhbmQgYXV0by1oZWlnaHQgc2ltcGx5IG5ldmVyIGhhcHBlbmVkLlxuICAgICAgICAgICAgY29uc29sZS53YXJuKGBbTXlvcElmcmFtZUNvbXBvbmVudF0gYXV0by1oZWlnaHQgc2tpcHBlZCBmb3IgJHt0aGlzLmlkfTogJHtlfWApO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gY2xlYW51cDtcbiAgICB9XG5cbiAgICBzZXRTaXplQmFzZWRPbkRvY3VtZW50RWxlbWVudCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSB0aGlzLnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHtoZWlnaHQsIHdpZHRofSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIHJldHVybiB7aGVpZ2h0LCB3aWR0aH1cbiAgICAgICAgfSwgKHJldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7cmV0LmNvbnRlbnQud2lkdGh9cHhgO1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke3JldC5jb250ZW50LmhlaWdodH1weGA7XG4gICAgICAgICAgICBjbGVhbnVwSGFuZGxlcigpO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSB0aGlzLnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCgpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIC8vIHJldHVybiB3aW5kb3cuZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQgKyAncHgnO1xuXG5cbiAgICAgICAgICAgIC8vVE9ETzogZml4IHRoYXQgaGFjaywga2VlcCB0aGUgZnVuY3Rpb24gaW4gcmlnaHQgZm9ybWF0IHdoaWxlIG1pbmlmaWVkIDooXG4gICAgICAgICAgICBjb25zdCBub09wID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIE5vIG9wZXJhdGlvbiBwZXJmb3JtZWRcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRvIGVuc3VyZSBpdCdzIG5vdCBvcHRpbWl6ZWQgYXdheSwgeW91IGNhbiBjYWxsIGl0IGF0IGxlYXN0IG9uY2VcbiAgICAgICAgICAgIGxldCB4ID0gbm9PcCgpO1xuICAgICAgICAgICAgeCsrO1xuICAgICAgICAgICAgeC0tO1xuXG4gICAgICAgICAgICAvL3JldHVybiBgJHt3aW5kb3cuZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHR9cHhgO1xuXG4gICAgICAgICAgICAvL1RPRE8gOiBjaGVjayB0aGF0ICsxID9cbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1heChNYXRoLm1heChcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQpXG4gICAgICAgICAgICAgICAgLCB3aW5kb3cuZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQpICsgeCArICdweCdcblxuICAgICAgICB9LCAocmV0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gcmV0LmNvbnRlbnQ7XG4gICAgICAgICAgICBjbGVhbnVwSGFuZGxlcigpO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgICAgIGxldCBtZXNzYWdlXyA9IHsuLi5tZXNzYWdlfSBhcyBCYXNlTXlvcE1lc3NhZ2U7XG4gICAgICAgIC8vVE9ETyA6ID8hPyEgc2hvdWxkIGl0IGJlIGhlcmUgP1xuICAgICAgICBpZiAobWVzc2FnZV8ubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5FeGVjdXRlQ29tcG9uZW50TWV0aG9kKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgPSAobWVzc2FnZV8gYXMgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZClcbiAgICAgICAgICAgIHRoaXNbdHlwZWRNZXNzYWdlLm1ldGhvZF0oKTtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL1RPRE8gOiBmaXggdGhhdCBoYWNrIDooXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy9jb25zdCBoYW5kbGVyID0gbWVzc2FnZS5oYW5kbGVyXG5cbiAgICAgICAgbWVzc2FnZV8uZGlyZWN0aW9uID0gTWVzc2FnZURpcmVjdGlvbi5kb3duO1xuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHN1cGVyLnNlbmQobWVzc2FnZV8pO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQ/LmNvbnRlbnRXaW5kb3c/LnBvc3RNZXNzYWdlKG1lc3NhZ2VfLCAnKicpO1xuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy9tZXNzYWdlLmhhbmRsZXIgPSBoYW5kbGVyXG5cbiAgICAgICAgcmV0dXJuIGNsZWFudXBIYW5kbGVyO1xuICAgIH07XG5cbiAgICBvbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGluY29tZU1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbi5NdXRhdGlvbk9ic2VydmVyTWVzc2FnZVxuICAgICAgICAgICAgfHwgaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluLlJlc2l6ZU9ic2VydmVyTWVzc2FnZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KCk7XG4gICAgICAgICAgICAvL2RlYnVnZ2VyXG4gICAgICAgICAgICAvL3RoaXMuc2V0SGVpZ2h0QmFzZWRPbkRvY3VtZW50RWxlbWVudCgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3VwZXIub25NZXNzYWdlUmVjZWl2ZWQoaW5jb21lTWVzc2FnZSk7XG4gICAgfVxuXG4gICAgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5fYnJpZGdlU2l6ZUNsZWFudXA/LigpO1xuICAgICAgICBpZiAodGhpcy5fYXV0b1NpemVDbGVhbnVwKSB7XG4gICAgICAgICAgICB0aGlzLl9hdXRvU2l6ZUNsZWFudXAoKTtcbiAgICAgICAgICAgIHRoaXMuX2F1dG9TaXplQ2xlYW51cCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5faXNvTXNnSGFuZGxlcikge1xuICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLl9pc29Nc2dIYW5kbGVyKTtcbiAgICAgICAgICAgIHRoaXMuX2lzb01zZ0hhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY2xlYW51cEluc3BlY3QpXG4gICAgICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0KCk7XG5cbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgICAgICAvLyBPcHRpb25hbC1jaGFpbmVkOiBkaXNwb3NlIG5vdyBhbHNvIHJ1bnMgZm9yIGNvbXBvbmVudHMgdGhhdCBuZXZlciBpbml0aWF0ZWQsIGFuZFxuICAgICAgICAvLyBmb3IgdGhvc2UgdGhlIGZyYW1lIG1heSBhbHJlYWR5IGJlIGdvbmUgLS0gdGhlIGRpYWxvZyB0aGF0IGNvbnRhaW5lZCBpdCB3YXMgdG9yblxuICAgICAgICAvLyBkb3duLCBvciBpdCB3YXMgbmV2ZXIgYXR0YWNoZWQuIEEgdGhyb3cgaGVyZSB3b3VsZCBhYm9ydCB0aGUgcmVzdCBvZiB0aGUgY2xlYW51cC5cbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnBhcmVudE5vZGU/LnJlbW92ZUNoaWxkKHRoaXMuSWZyYW1lRWxlbWVudCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLXCI7XG5pbXBvcnQge0lDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJU2tpbkNvbmZpZywgU2tpbkxvYWRlclR5cGV9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcblxuZXhwb3J0IGludGVyZmFjZSBJTXlvcExvYWRlciB7XG4gICAgdHlwZTogU2tpbkxvYWRlclR5cGU7XG4gICAgbG9hZDogKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IFByb21pc2U8SU15b3BDb21wb25lbnQ+O1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU15b3BMb2FkZXIgaW1wbGVtZW50cyBJTXlvcExvYWRlciB7XG4gICAgYWJzdHJhY3QgdHlwZTogU2tpbkxvYWRlclR5cGU7XG4gICAgYWJzdHJhY3QgbG9hZDogKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IFByb21pc2U8SU15b3BDb21wb25lbnQ+O1xuXG4gICAgYXBwZW5kQ2hpbGQgPSAoY29udGFpbmVyOiBIVE1MRWxlbWVudCwgZWxlbWVudDogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zLCkgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucz8ucmVsYXRpdmUpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnJlbGF0aXZlLmRpcmVjdGlvbiA9PT0gJ2JlZm9yZScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbmVyLmluc2VydEJlZm9yZShlbGVtZW50LCBvcHRpb25zLnJlbGF0aXZlLmNoaWxkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVsYXRpdmUuZGlyZWN0aW9uID09PSAnYWZ0ZXInKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dFNpYmxpbmcgPSBvcHRpb25zLnJlbGF0aXZlLmNoaWxkPy5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbmVyLmluc2VydEJlZm9yZShlbGVtZW50LCBuZXh0U2libGluZyA/IG5leHRTaWJsaW5nIDogbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcElmcmFtZUNvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbXlvcElmcmFtZUNvbXBvbmVudFwiO1xuaW1wb3J0IHtCYXNlTXlvcExvYWRlcn0gZnJvbSBcIi4vSU15b3BMb2FkZXJcIjtcbmltcG9ydCB7dXVpZHY0fSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREtcIjtcbmltcG9ydCB7SUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElJZnJhbWVMb2FkZXJDb25maWcsIElTa2luQ29uZmlnLCBTa2luTG9hZGVyc30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuXG5jb25zdCBhZGRRdWVyeVBhcmFtID0gKHVybDogc3RyaW5nLCBwYXJhbTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgLy8gQ3JlYXRlIGEgVVJMIG9iamVjdFxuICAgIGNvbnN0IHVybE9iaiA9IG5ldyBVUkwodXJsKTtcblxuICAgIC8vIEFkZCB0aGUgcXVlcnkgcGFyYW1ldGVyXG4gICAgdXJsT2JqLnNlYXJjaFBhcmFtcy5hcHBlbmQocGFyYW0sIHZhbHVlKTtcblxuICAgIC8vIFJldHVybiB0aGUgdXBkYXRlZCBVUkxcbiAgICByZXR1cm4gdXJsT2JqLnRvU3RyaW5nKCk7XG59XG5cbmV4cG9ydCBjbGFzcyBNeW9wSWZyYW1lTG9hZGVyIGV4dGVuZHMgQmFzZU15b3BMb2FkZXIge1xuICAgIHR5cGUgPSBTa2luTG9hZGVycy5JZnJhbWVMb2FkZXJcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBsb2FkID0gYXN5bmMgKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IHtcbiAgICAgICAgbGV0IElmcmFtZUVsZW1lbnQ6IEhUTUxJRnJhbWVFbGVtZW50O1xuXG4gICAgICAgIGNvbnN0IHR5cGVkTG9hZGVyQ29uZmlnID0gKHNraW4ubG9hZGVyIGFzIElJZnJhbWVMb2FkZXJDb25maWcpO1xuXG4gICAgICAgIGlmIChjb250YWluZXI/Lm5vZGVOYW1lID09PSBcIklGUkFNRVwiKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnbmVlZHMgdG8gbG9hZCBpbnRvIGFuIGV4c2lzdGluZyBJZnJhbWUuLi4nLCB0eXBlZExvYWRlckNvbmZpZy51cmwsIGNvbnRhaW5lcik7XG5cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQgPSAoY29udGFpbmVyIGFzIEhUTUxJRnJhbWVFbGVtZW50KVxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zcmMgPSB0eXBlZExvYWRlckNvbmZpZy51cmxcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHVuaXFJZCA9IHV1aWR2NCgpO1xuICAgICAgICAgICAgY29uc3QgZG9tSWQgPSBgbXlvcC1jb21wLSR7dW5pcUlkfWBcblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5pZCA9IGRvbUlkO1xuXG4gICAgICAgICAgICAvLyBTZXQgYWxsIHN0eWxlcyBCRUZPUkUgYXBwZW5kaW5nIHRvIHByZXZlbnQgZmxhc2ggYXQgd3JvbmcgcG9zaXRpb25cbiAgICAgICAgICAgIGNvbnN0IGlmcmFtZVN0eWxlcyA9IGBcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgICAgICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgICAgICAgaW5zZXQ6IDA7XG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAke3R5cGVkTG9hZGVyQ29uZmlnLmF1dG9IZWlnaHQgfHwgIXR5cGVkTG9hZGVyQ29uZmlnLmhlaWdodCA/ICcxMDAlJyA6IHR5cGVkTG9hZGVyQ29uZmlnLmhlaWdodH07XG4gICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgICAgICAgICAgb3BhY2l0eTogJHtvcHRpb25zPy5oaWRkZW4gPyAnMCcgOiAnMSd9O1xuICAgICAgICAgICAgICAgIHBvaW50ZXItZXZlbnRzOiAke29wdGlvbnM/LmhpZGRlbiA/ICdub25lJyA6ICdhbGwnfTtcbiAgICAgICAgICAgIGA7XG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LnN0eWxlLmNzc1RleHQgPSBpZnJhbWVTdHlsZXM7XG5cbiAgICAgICAgICAgIC8vIFNldCBlbGVtZW50IGF0dHJpYnV0ZXMgaWYgcHJvdmlkZWRcbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5lbGVtZW50QXR0cmlidXRlcykge1xuICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKG9wdGlvbnMuZWxlbWVudEF0dHJpYnV0ZXMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgJycpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCBTdHJpbmcodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpbiBvcmRlciB0byBoYW5kbGUgaXNzdWUgdG8gbG9hZCBpZnJhbWUgaW5zaWRlIGFuIGlmcmFtZSB3aXRoIHRoZSBzYW1lIHVybFxuICAgICAgICAgICAgbGV0IHVybDJsb2FkID0gKHNraW4ubG9hZGVyIGFzIElJZnJhbWVMb2FkZXJDb25maWcpLnVybDtcbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5faGFzUGFyZW50KVxuICAgICAgICAgICAgICAgIHVybDJsb2FkID0gYWRkUXVlcnlQYXJhbSh1cmwybG9hZCwgXCJfbXlvcC1jb21wXCIsIHVuaXFJZCk7XG5cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc3JjID0gdXJsMmxvYWQ7XG5cbiAgICAgICAgICAgIC8vIFRPRE8gOiBkbyBpdCBvbmx5IHdpdGggZmxhZyA/XG4gICAgICAgICAgICBpZiAoIWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbaWRePVwibXlvcC1jb21wLVwiXScpKVxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudCA9IHRoaXMuYXBwZW5kQ2hpbGQoY29udGFpbmVyLCBJZnJhbWVFbGVtZW50LCBvcHRpb25zKSBhcyBIVE1MSUZyYW1lRWxlbWVudDtcbiAgICAgICAgICAgIC8vICAgSWZyYW1lRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRvbUlkKSBhcyBIVE1MSUZyYW1lRWxlbWVudDtcbiAgICAgICAgICAgIC8vTk8gOiBJZnJhbWVFbGVtZW50ID0gY29udGFpbmVyLmxhc3RFbGVtZW50Q2hpbGQgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgTXlvcElmcmFtZUNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIGBhdXRvSGVpZ2h0YCBpbiB0aGUgdjEgY29uZmlnIHVzZWQgdG8gb25seSBzZXQgaGVpZ2h0OjEwMCUgb24gYW4gYWJzb2x1dGUgZnJhbWUsIHNvIGluIGFuXG4gICAgICAgIC8vIHVuc2l6ZWQgY29udGFpbmVyIHRoZSBmcmFtZSBzdGF5ZWQgYXQgdGhlIDE1MHB4IENTUyBkZWZhdWx0LlxuICAgICAgICBpZiAodHlwZWRMb2FkZXJDb25maWcuYXV0b0hlaWdodCAmJiBvcHRpb25zPy5hdXRvU2l6ZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5vYnNlcnZlSGVpZ2h0VmlhQnJpZGdlKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgIH1cbn1cbiIsICJleHBvcnQgY29uc3QgbXlvcFdlYmNvbXBvbmVudENvbnN0cyA9IHtcbiAgICB3ZWJjb21wb25lbnRfbWVzc2FnZV9rZXk6ICdteW9wX3dlYmNvbXBvbmVudF9tZXNzYWdlJ1xufVxuIiwgImltcG9ydCB7bXlvcFdlYmNvbXBvbmVudENvbnN0c30gZnJvbSBcIi4uLy4uL3dlYmNvbXBvbmVudC9jb25zdHNcIjtcbmltcG9ydCB7QmFzZU15b3BDb21wb25lbnR9IGZyb20gXCIuL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyLCBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSVNraW5Db25maWd9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7c2V0RGVidWdTdHlsZX0gZnJvbSBcIi4uL2NvbXBvbmVudENvcmVcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREtcIjtcblxuZXhwb3J0IGNsYXNzIE15b3BXZWJDb21wb25lbnQgZXh0ZW5kcyBCYXNlTXlvcENvbXBvbmVudCB7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBwcml2YXRlIGN1c3RvbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykge1xuICAgICAgICBzdXBlcihjb21wb25lbnREZWZpbml0aW9uLCBjb250YWluZXIgLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gY3VzdG9tRWxlbWVudDtcbiAgICB9XG5cbiAgICBjbGVhbnVwSW5zcGVjdDogQ2xlYW51cEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgfVxuXG4gICAgaW5zcGVjdCgpIHtcbiAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCA9IHNldERlYnVnU3R5bGUodGhpcy5pZCwgJ015b3BXZWJDb21wb25lbnQnLCAwLCB0aGlzLmNvbnRhaW5lciwgdGhpcy5jdXN0b21FbGVtZW50LCB0aGlzLmNvbXBvbmVudERlZmluaXRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGVhbnVwSW5zcGVjdDtcbiAgICB9XG5cbiAgICBoaWRlKCkge1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJ1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS53aWR0aCA9ICcwJ1xuICAgIH1cblxuICAgIHNob3coKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzEnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAndW5zZXQnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2FsbCdcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLndpZHRoID0gJyc7XG4gICAgfVxuXG4gICAgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2U8YW55PikgPT4ge1xuICAgICAgICBsZXQgbWVzc2FnZV8gPSB7Li4ubWVzc2FnZX0gYXMgQmFzZU15b3BNZXNzYWdlO1xuXG4gICAgICAgIC8vVE9ETyA6IGNhbiBiZSBkb25lIHdpdGhvdXQgY2xvbmluZz9cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvL2NvbnN0IGhhbmRsZXIgPSBtZXNzYWdlXy5oYW5kbGVyXG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gc3VwZXIuc2VuZChtZXNzYWdlXyk7XG5cbiAgICAgICAgY29uc3QgbXNnID0gbmV3IEN1c3RvbUV2ZW50PEJhc2VNeW9wTWVzc2FnZT4obXlvcFdlYmNvbXBvbmVudENvbnN0cy53ZWJjb21wb25lbnRfbWVzc2FnZV9rZXksIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGRldGFpbDogbWVzc2FnZV8sXG4gICAgICAgICAgICAvLyBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgLy8gY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAvLyBjb21wb3NlZDogdHJ1ZVxuICAgICAgICB9KVxuXG4gICAgICAgIC8vdGhpcy5jb250YWluZXIuZGlzcGF0Y2hFdmVudChtc2cpXG5cbiAgICAgICAgLy9zZW5kaW5nIGRhdGEgZnJvbSBob3N0IHRvIHRoZSBjb21wb25lbnRcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5kaXNwYXRjaEV2ZW50KG1zZylcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLmN1c3RvbUVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgIC8vICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuY2hpbGRyZW5bMF0uZGlzcGF0Y2hFdmVudChtc2cpXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdlcnJvciB3aGlsZSB0cnlpbmcgdG8gZGlzcGF0Y2hFdmVudCcsIGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvL21lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXJcblxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfVxuXG4gICAgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQucGFyZW50Tm9kZT8ucmVtb3ZlQ2hpbGQodGhpcy5jdXN0b21FbGVtZW50KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wV2ViQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wV2ViY29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTG9hZGVyfSBmcm9tIFwiLi9JTXlvcExvYWRlclwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuaW1wb3J0IHt1dWlkdjQsIHdhaXR9IGZyb20gXCIuLi8uLi91dGlscy91dGlscy50c1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSVNraW5Db25maWcsIElXZWJDb21wb25lbnRMb2FkZXJDb25maWcsIFNraW5Mb2FkZXJzfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5cbmNvbnN0IHNlZW46IFJlY29yZDxzdHJpbmcsIFByb21pc2U8dm9pZD4+ID0ge307XG5cbmV4cG9ydCBjbGFzcyBXZWJjb21wb25lbnRMb2FkZXIgZXh0ZW5kcyBCYXNlTXlvcExvYWRlciB7XG5cbiAgICB0eXBlID0gU2tpbkxvYWRlcnMuV2ViQ29tcG9uZW50TG9hZGVyXG5cbiAgICBsb2FkID0gYXN5bmMgKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IHtcblxuICAgICAgICBjb25zdCBsb2FkZXJDb25maWcgPSAoc2tpbi5sb2FkZXIgYXMgSVdlYkNvbXBvbmVudExvYWRlckNvbmZpZyk7XG5cbiAgICAgICAgaWYgKCFzZWVuW2xvYWRlckNvbmZpZy51cmxdKSB7XG4gICAgICAgICAgICAvLyBhd2FpdCBpbXBvcnQoIC8qIEB2aXRlLWlnbm9yZSAqLyB3ZWJDb21wb25lbnRMb2FkVXJsKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdtb2R1bGUgbG9hZGVkJyk7XG4gICAgICAgICAgICBzZWVuW2xvYWRlckNvbmZpZy51cmxdID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdlYkNvbXBvbmVudExvYWRVcmwgPSBsb2FkZXJDb25maWcudXJsXG4gICAgICAgICAgICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgICAgICAgICAgc2NyaXB0LnR5cGUgPSAnbW9kdWxlJztcbiAgICAgICAgICAgICAgICBzY3JpcHQuc3JjID0gd2ViQ29tcG9uZW50TG9hZFVybDtcbiAgICAgICAgICAgICAgICBzY3JpcHQub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc2NyaXB0Lm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ01vZHVsZSBhbHJlZGF5IGxvYWRlZCBvciBpbiBsb2FkaW5nIHByb2Nlc3MnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHNlZW5bbG9hZGVyQ29uZmlnLnVybF07XG5cbiAgICAgICAgLy9UT0RPIDogYWRkIHJldHJ5IG1lY2hhbmlzbSBpbiBmYWlsIGNhc2UuXG5cbiAgICAgICAgLy9UT0RPIDogZml4IHRoYXQgaGFjaywgc2hvdWxkIGZpeCB0aGUgcmFjZSBjb25kaXRpb24gZm9yIGxvYWRlZCBtb2R1bGVzXG4gICAgICAgIGF3YWl0IHdhaXQoMSk7XG5cbiAgICAgICAgbGV0IGRvbUlkID0gYG15b3AtY29tcC0ke3V1aWR2NCgpfWBcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobG9hZGVyQ29uZmlnLnRhZyk7XG5cbiAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcignW2lkXj1cIm15b3AtY29tcC1cIl0nKSlcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAvL2VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICBlbGVtZW50LmlkID0gZG9tSWQ7XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmhpZGRlbikge1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgKGNvbnRhaW5lci5pZC5zdGFydHNXaXRoKCdteW9wLWNvbXAtJykpIHtcbiAgICAgICAgLy8gICAgIC8vIGluIHBsYWNlIHJlcGxhY2VtZW50XG4gICAgICAgIC8vICAgICBjb250YWluZXIucmVwbGFjZVdpdGgoZWxlbWVudCk7XG4gICAgICAgIC8vICAgICAvL2NvbnRhaW5lciA9IGVsZW1lbnQucGFyZW50RWxlbWVudCE7XG4gICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgIC8vIH1cblxuICAgICAgICBpZihvcHRpb25zPy5fZW52aXJvbm1lbnQpe1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZWxlbWVudC5fbXlvcEVudmlyb25tZW50ID0gb3B0aW9ucz8uX2Vudmlyb25tZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgICAgICAvL2VsZW1lbnQuaW5uZXJIVE1MID0gYDwke2xvYWRlckNvbmZpZy50YWd9IC8+YDtcbiAgICAgICAgcmV0dXJuIG5ldyBNeW9wV2ViQ29tcG9uZW50KGNvbXBvbmVudERlZmluaXRpb24sIHNraW4sIGNvbnRhaW5lciwgZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgfVxuXG59XG4iLCAiLyoqXG4gKiBUaGUgY2xpZW50IHdpbmRvdzogd2hhdCBhIHJldHVybmluZyB2aXNpdG9yIGRvZXMgTk9UIGFzayBmb3IuXG4gKlxuICogQSBjb21wb25lbnQgdGhlIGJyb3dzZXIgYWxyZWFkeSBob2xkcywgc3RpbGwgaW5zaWRlIGl0cyBmcmVzaG5lc3Mgd2luZG93LCBpcyByZW5kZXJlZFxuICogd2l0aCBubyBuZXR3b3JrIGF0IGFsbC4gT25jZSB0aGUgd2luZG93IGVuZHMgdGhlIGJyb3dzZXIgZG9lcyBub3QgcmUtZG93bmxvYWQgaXQgZWl0aGVyXG4gKiBcdTIwMTQgaXQgc2VuZHMgYmFjayB0aGUgdmVyc2lvbiBpdCBob2xkcyBhbmQgaXMgdXN1YWxseSB0b2xkIFwidW5jaGFuZ2VkXCIgaW4gYSBmZXcgaHVuZHJlZFxuICogYnl0ZXMuXG4gKlxuICogVEhFIFdJTkRPVyBJUyBUSEUgU0VSVkVSJ1MsIE5PVCBPVVJTLiBJdCBjb21lcyBmcm9tIHRoZSByZXNwb25zZTogYHMtbWF4YWdlYCBpcyB0aGVcbiAqIGZyZXNobmVzcyB0aGUgc2VydmVyIHByb21pc2VkLCBhbmQgYEFnZWAgaXMgaG93IG11Y2ggb2YgaXQgYSBDRE4gYWxyZWFkeSBzcGVudCBiZWZvcmVcbiAqIHRoZSBieXRlcyByZWFjaGVkIHVzLiBUaGUgd2luZG93IHdlIG1heSBrZWVwIGlzIHRoZXJlZm9yZSBgcy1tYXhhZ2UgLSBBZ2VgLCBuZXZlclxuICogYHMtbWF4YWdlYCBcdTIwMTQgb3RoZXJ3aXNlIGEgY29weSB0aGF0IHNhdCBhdCB0aGUgZWRnZSBmb3IgNTUgb2YgaXRzIDYwIHNlY29uZHMgd291bGQgYmVcbiAqIGhlbGQgZm9yIGFub3RoZXIgNjAgaGVyZSwgYW5kIGEgcHVibGlzaCB3b3VsZCB0YWtlIHR3aWNlIGFzIGxvbmcgdG8gYmUgc2VlbiBhcyBwcm9taXNlZC5cbiAqIFRoaXMgaXMgdGhlIHNpbmdsZSBlYXNpZXN0IHRoaW5nIHRvIGdldCB3cm9uZyBpbiBhIGNsaWVudCBjYWNoZSwgYW5kIGl0IGlzIGludmlzaWJsZSBpblxuICogdGVzdGluZyBiZWNhdXNlIGl0IG9ubHkgc2hvd3MgdXAgYXMgXCJzb21ldGltZXMgc3RhbGVcIi5cbiAqXG4gKiBJbmRleGVkREIsIG5vdCBsb2NhbFN0b3JhZ2U6IGNvbXBvbmVudHMgcnVuIHRvIGh1bmRyZWRzIG9mIEtCLCBsb2NhbFN0b3JhZ2UgY2FwcyBhcm91bmRcbiAqIDUgTUIgYW5kIGJsb2NrcyB0aGUgbWFpbiB0aHJlYWQuIEV2ZXJ5IHBhdGggZGVncmFkZXMgdG8gdGhlIG5ldHdvcmsgXHUyMDE0IGEgYnJvd3NlciBpblxuICogcHJpdmF0ZSBtb2RlLCB3aXRoIHN0b3JhZ2UgZGlzYWJsZWQgb3Igb3ZlciBxdW90YSwgbXVzdCByZW5kZXIgdGhlIHBhZ2UsIG5vdCBmYWlsIGl0LlxuICovXG5cbmNvbnN0IERCX05BTUUgPSAnbXlvcC1kZWxpdmVyeSc7XG5jb25zdCBTVE9SRSA9ICdjb21wb25lbnRzJztcbmNvbnN0IERCX1ZFUlNJT04gPSAxO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0b3JlZEVudHJ5IHtcbiAgICBrZXk6IHN0cmluZztcbiAgICAvKiogdGhlIHJlc29sdmVkIGNvbXBvbmVudCBjb25maWcsIGV4YWN0bHkgYXMgdGhlIG5ldHdvcmsgcGF0aCBwcm9kdWNlcyBpdCAqL1xuICAgIGNvbmZpZzogYW55O1xuICAgIC8qKiB0aGUgc2VydmVyJ3MgdmVyc2lvbiB0b2tlbiBmb3IgdGhlc2UgYnl0ZXM6IGA8cmV2Pn48b3B0PmAgKi9cbiAgICB0YWc6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIHdoZW4gdGhpcyBicm93c2VyIHN0b3JlZCBpdCAqL1xuICAgIHN0b3JlZEF0OiBudW1iZXI7XG4gICAgLyoqIGhvdyBsb25nIGl0IG1heSBiZSB1c2VkIHdpdGhvdXQgYXNraW5nLCBpbiBtcyAoYWxyZWFkeSBBZ2UtYWRqdXN0ZWQpICovXG4gICAgd2luZG93TXM6IG51bWJlcjtcbiAgICAvKiogd2hpY2ggaG9zdCBwcm9kdWNlZCBpdCBcdTIwMTQgYSBrZXkgZnJvbSBhbm90aGVyIGhvc3QgaXMgbmV2ZXIgcmV1c2VkICovXG4gICAgaG9zdDogc3RyaW5nO1xuICAgIC8qKiB3aXJlIHNpemUgb2YgdGhlIHJlc3BvbnNlIGl0IGNhbWUgZnJvbSwgc28gc3RhdHMgY2FuIHNheSB3aGF0IHRoZSB3aW5kb3cgc2F2ZWQgKi9cbiAgICBieXRlcz86IG51bWJlcjtcbn1cblxubGV0IGRiUHJvbWlzZTogUHJvbWlzZTxJREJEYXRhYmFzZSB8IG51bGw+IHwgbnVsbCA9IG51bGw7XG5cbmZ1bmN0aW9uIG9wZW5EYigpOiBQcm9taXNlPElEQkRhdGFiYXNlIHwgbnVsbD4ge1xuICAgIGlmIChkYlByb21pc2UpIHJldHVybiBkYlByb21pc2U7XG4gICAgZGJQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaW5kZXhlZERCID09PSAndW5kZWZpbmVkJykgcmV0dXJuIHJlc29sdmUobnVsbCk7XG4gICAgICAgICAgICBjb25zdCByZXEgPSBpbmRleGVkREIub3BlbihEQl9OQU1FLCBEQl9WRVJTSU9OKTtcbiAgICAgICAgICAgIHJlcS5vbnVwZ3JhZGVuZWVkZWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGIgPSByZXEucmVzdWx0O1xuICAgICAgICAgICAgICAgIGlmICghZGIub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhTVE9SRSkpIGRiLmNyZWF0ZU9iamVjdFN0b3JlKFNUT1JFLCB7IGtleVBhdGg6ICdrZXknIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlcS5vbnN1Y2Nlc3MgPSAoKSA9PiByZXNvbHZlKHJlcS5yZXN1bHQpO1xuICAgICAgICAgICAgcmVxLm9uZXJyb3IgPSAoKSA9PiByZXNvbHZlKG51bGwpO1xuICAgICAgICAgICAgLy8gQSBibG9ja2VkIHVwZ3JhZGUgbXVzdCBub3QgaGFuZyB0aGUgcGFnZSBsb2FkLlxuICAgICAgICAgICAgcmVxLm9uYmxvY2tlZCA9ICgpID0+IHJlc29sdmUobnVsbCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBkYlByb21pc2U7XG59XG5cbmZ1bmN0aW9uIHR4PFQ+KG1vZGU6IElEQlRyYW5zYWN0aW9uTW9kZSwgZm46IChzdG9yZTogSURCT2JqZWN0U3RvcmUpID0+IElEQlJlcXVlc3QpOiBQcm9taXNlPFQgfCBudWxsPiB7XG4gICAgcmV0dXJuIG9wZW5EYigpLnRoZW4oZGIgPT4gbmV3IFByb21pc2U8VCB8IG51bGw+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGlmICghZGIpIHJldHVybiByZXNvbHZlKG51bGwpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdCA9IGRiLnRyYW5zYWN0aW9uKFNUT1JFLCBtb2RlKTtcbiAgICAgICAgICAgIGNvbnN0IHJlcSA9IGZuKHQub2JqZWN0U3RvcmUoU1RPUkUpKTtcbiAgICAgICAgICAgIHJlcS5vbnN1Y2Nlc3MgPSAoKSA9PiByZXNvbHZlKHJlcS5yZXN1bHQgYXMgVCk7XG4gICAgICAgICAgICByZXEub25lcnJvciA9ICgpID0+IHJlc29sdmUobnVsbCk7XG4gICAgICAgICAgICB0Lm9uYWJvcnQgPSAoKSA9PiByZXNvbHZlKG51bGwpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICAgIH1cbiAgICB9KSk7XG59XG5cbi8qKlxuICogQSBTWU5DSFJPTk9VUyBzaGFkb3cgb2Ygd2hhdCB3ZSBob2xkLCBmb3IgY29kZSB0aGF0IHJ1bnMgYmVmb3JlIEluZGV4ZWREQiBjYW4gYW5zd2VyLlxuICpcbiAqIFRoZSBwYWdlJ3MgSFRNTCBjYW4gc3RhcnQgdGhlIGNvbXBvbmVudCByZXF1ZXN0IHdoaWxlIHRoZSBKUyBidW5kbGUgaXMgc3RpbGwgZG93bmxvYWRpbmdcbiAqIFx1MjAxNCBidXQgb25seSBpZiBpdCBrbm93cywgYXQgcGFyc2UgdGltZSwgd2hldGhlciBhIHJlcXVlc3QgaXMgbmVlZGVkIGF0IGFsbCBhbmQgd2hpY2ggb25lLlxuICogSW5kZXhlZERCIGlzIGFzeW5jLCBzbyBhbiBpbmxpbmUgc2NyaXB0IGNhbm5vdCBhc2sgaXQuIGxvY2FsU3RvcmFnZSBjYW4gYmUgcmVhZFxuICogc3luY2hyb25vdXNseSwgc28gZWFjaCBlbnRyeSBtaXJyb3JzIHR3byB0aW55IGZhY3RzIGhlcmU6IHRoZSB2ZXJzaW9uIHRhZyBhbmQgd2hlbiB0aGVcbiAqIHdpbmRvdyBlbmRzLiBOb3RoaW5nIGVsc2UgXHUyMDE0IHRoZSBjb21wb25lbnQgaXRzZWxmIHN0YXlzIGluIEluZGV4ZWREQiB3aGVyZSBpdCBiZWxvbmdzLlxuICpcbiAqIFdpdGhvdXQgdGhpcyB0aGUgcHJlbG9hZCBoaW50IGlzIGFjdGl2ZWx5IGhhcm1mdWw6IGl0IGRvd25sb2FkcyB0aGUgd2hvbGUgY29tcG9uZW50XG4gKiBldmVyeSB0aW1lLCBpbmNsdWRpbmcgb24gdGhlIHZpc2l0cyB3aGVyZSB0aGUgc3RvcmVkIGNvcHkgd2FzIGdvaW5nIHRvIGFuc3dlciBmb3IgZnJlZS5cbiAqIE1lYXN1cmVkIG9uIG15b3AuZGV2IGJlZm9yZSBpdCBleGlzdGVkIFx1MjAxNCA5OCBLQiBmZXRjaGVkLCB0aGVuIGRpc2NhcmRlZCwgb24gZXZlcnkgcmVsb2FkLlxuICovXG5jb25zdCBISU5UX1BSRUZJWCA9ICdteW9wLmQuJztcblxuZnVuY3Rpb24gd3JpdGVIaW50KGtleTogc3RyaW5nLCB0YWc6IHN0cmluZyB8IG51bGwsIGV4cGlyZXNBdDogbnVtYmVyKSB7XG4gICAgdHJ5IHsgbG9jYWxTdG9yYWdlLnNldEl0ZW0oSElOVF9QUkVGSVggKyBrZXksIEpTT04uc3RyaW5naWZ5KHsgdDogdGFnLCBlOiBleHBpcmVzQXQgfSkpOyB9XG4gICAgY2F0Y2ggeyAvKiBwcml2YXRlIG1vZGUsIHF1b3RhLCBkaXNhYmxlZCBcdTIwMTQgdGhlIGhpbnQgaXMgYW4gb3B0aW1pc2F0aW9uLCBuZXZlciBhIHJlcXVpcmVtZW50ICovIH1cbn1cblxuZnVuY3Rpb24gY2xlYXJIaW50KGtleTogc3RyaW5nKSB7XG4gICAgdHJ5IHsgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oSElOVF9QUkVGSVggKyBrZXkpOyB9IGNhdGNoIHsgLyogYXMgYWJvdmUgKi8gfVxufVxuXG4vKiogQSBtZW1vcnkgbGF5ZXIgaW4gZnJvbnQgb2Ygc3RvcmFnZTogYSBzZWNvbmQgY29tcG9uZW50IG9uIHRoZSBzYW1lIHBhZ2UgbXVzdCBub3Qgd2FpdCBvbiBJTy4gKi9cbmNvbnN0IG1lbW9yeSA9IG5ldyBNYXA8c3RyaW5nLCBTdG9yZWRFbnRyeT4oKTtcblxuZXhwb3J0IGNvbnN0IGRlbGl2ZXJ5U3RvcmUgPSB7XG4gICAga2V5KGhvc3Q6IHN0cmluZywgY29tcG9uZW50SWQ6IHN0cmluZywgZW52OiBzdHJpbmcsIHByZXZpZXc6IGJvb2xlYW4sIG9wdDogc3RyaW5nKSB7XG4gICAgICAgIC8vIFRoZSBIT1NUIGlzIHBhcnQgb2YgdGhlIGtleS4gVHdvIHN0YWNrcyBjYW4gc2VydmUgdGhlIHNhbWUgY29tcG9uZW50IHdpdGhcbiAgICAgICAgLy8gZGlmZmVyZW50IGZyZXNobmVzcywgYW5kIGVudHJpZXMgZnJvbSBvbmUgbXVzdCBuZXZlciBiZSByZWFkIGFzIHRoZSBvdGhlcidzLlxuICAgICAgICByZXR1cm4gYCR7aG9zdH18JHtjb21wb25lbnRJZH18JHtlbnZ9fCR7cHJldmlldyA/ICdwcmV2aWV3JyA6ICdsaXZlJ318JHtvcHQgfHwgJ3Jhdyd9YDtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTxTdG9yZWRFbnRyeSB8IG51bGw+IHtcbiAgICAgICAgY29uc3QgbSA9IG1lbW9yeS5nZXQoa2V5KTtcbiAgICAgICAgaWYgKG0pIHJldHVybiBtO1xuICAgICAgICBjb25zdCBlID0gYXdhaXQgdHg8U3RvcmVkRW50cnk+KCdyZWFkb25seScsIHMgPT4gcy5nZXQoa2V5KSk7XG4gICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICBtZW1vcnkuc2V0KGtleSwgZSk7XG4gICAgICAgICAgICAvLyBTRUxGLUhFQUwuIFRoZSB0d28gc3RvcmVzIGNhbiBkaXNhZ3JlZTogYW4gZW50cnkgd3JpdHRlbiBiZWZvcmUgdGhlIGhpbnRcbiAgICAgICAgICAgIC8vIGV4aXN0ZWQsIGEgYnJvd3NlciB0aGF0IGV2aWN0ZWQgbG9jYWxTdG9yYWdlIGJ1dCBub3QgSW5kZXhlZERCLCBhIHVzZXIgd2hvXG4gICAgICAgICAgICAvLyBjbGVhcmVkIG9uZS4gQSBtaXNzaW5nIGhpbnQgbWFrZXMgdGhlIHByZWxvYWQgZmFsbCBiYWNrIHRvIHRoZSBGVUxMIGNvbXBvbmVudFxuICAgICAgICAgICAgLy8gd2hpbGUgdGhlIFNESywgd2hpY2ggY2FuIHNlZSBJbmRleGVkREIsIG9ubHkgd2FudHMgdGhlIHZlcnNpb24gY2hlY2sgLS0gdHdvXG4gICAgICAgICAgICAvLyByZXF1ZXN0cyB3aGVyZSB0aGVyZSBzaG91bGQgYmUgb25lLiBTZWVuIGluIHRoZSB3aWxkIG9uIHRoZSBmaXJzdCBsb2FkIGFmdGVyXG4gICAgICAgICAgICAvLyB0aGUgaGludCBzaGlwcGVkLiBSZXdyaXRpbmcgaXQgaGVyZSBjb3N0cyBub3RoaW5nIGFuZCBjbG9zZXMgdGhlIGdhcCBmb3IgZ29vZC5cbiAgICAgICAgICAgIHdyaXRlSGludChrZXksIGUudGFnLCBlLnN0b3JlZEF0ICsgZS53aW5kb3dNcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgfSxcblxuICAgIGFzeW5jIHB1dChlbnRyeTogU3RvcmVkRW50cnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbWVtb3J5LnNldChlbnRyeS5rZXksIGVudHJ5KTtcbiAgICAgICAgd3JpdGVIaW50KGVudHJ5LmtleSwgZW50cnkudGFnLCBlbnRyeS5zdG9yZWRBdCArIGVudHJ5LndpbmRvd01zKTtcbiAgICAgICAgYXdhaXQgdHgoJ3JlYWR3cml0ZScsIHMgPT4gcy5wdXQoZW50cnkpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZHJvcChrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBtZW1vcnkuZGVsZXRlKGtleSk7XG4gICAgICAgIGNsZWFySGludChrZXkpO1xuICAgICAgICBhd2FpdCB0eCgncmVhZHdyaXRlJywgcyA9PiBzLmRlbGV0ZShrZXkpKTtcbiAgICB9LFxuXG4gICAgLyoqIFN0aWxsIHVzYWJsZSB3aXRob3V0IGFza2luZyB0aGUgc2VydmVyPyAqL1xuICAgIGZyZXNoKGU6IFN0b3JlZEVudHJ5IHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISFlICYmIChEYXRlLm5vdygpIC0gZS5zdG9yZWRBdCkgPCBlLndpbmRvd01zO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUaGUgd2luZG93IHRoaXMgcmVzcG9uc2UgbGljZW5zZXM6IHRoZSBzZXJ2ZXIncyBmcmVzaG5lc3MgbWludXMgd2hhdCBhIENETiBhbHJlYWR5XG4gICAgICogc3BlbnQuIFJldHVybnMgMCB3aGVuIHRoZSBzZXJ2ZXIgc2FpZCBub3RoaW5nIGFib3V0IGNhY2hpbmcsIHdoaWNoIG1lYW5zIFwiZG8gbm90XG4gICAgICogaG9sZCB0aGlzXCIgXHUyMDE0IHRoZSBzYWZlIHJlYWRpbmcsIGFuZCB3aGF0IHByb2R1Y3Rpb24gc2VuZHMgdG9kYXkuXG4gICAgICovXG4gICAgd2luZG93RnJvbShoZWFkZXJzOiBIZWFkZXJzKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgY2MgPSBoZWFkZXJzLmdldCgnY2FjaGUtY29udHJvbCcpIHx8ICcnO1xuICAgICAgICBpZiAoL25vLXN0b3JlfG5vLWNhY2hlL2kudGVzdChjYykpIHJldHVybiAwO1xuICAgICAgICBjb25zdCBtID0gL3MtbWF4YWdlXFxzKj1cXHMqKFxcZCspL2kuZXhlYyhjYykgfHwgL21heC1hZ2VcXHMqPVxccyooXFxkKykvaS5leGVjKGNjKTtcbiAgICAgICAgaWYgKCFtKSByZXR1cm4gMDtcbiAgICAgICAgY29uc3QgdG90YWwgPSBOdW1iZXIobVsxXSk7XG4gICAgICAgIGNvbnN0IGFnZSA9IE51bWJlcihoZWFkZXJzLmdldCgnYWdlJykgfHwgMCk7XG4gICAgICAgIHJldHVybiBNYXRoLm1heCgwLCAodG90YWwgLSAoaXNOYU4oYWdlKSA/IDAgOiBhZ2UpKSkgKiAxMDAwO1xuICAgIH0sXG5cbiAgICAvKiogRm9yIHRlc3RzIGFuZCBmb3IgYHJlZnJlc2goKWA6IGZvcmdldCBldmVyeXRoaW5nIHRoaXMgYnJvd3NlciBob2xkcy4gKi9cbiAgICBhc3luYyBjbGVhcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbWVtb3J5LmNsZWFyKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gbG9jYWxTdG9yYWdlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgayA9IGxvY2FsU3RvcmFnZS5rZXkoaSk7XG4gICAgICAgICAgICAgICAgaWYgKGsgJiYgay5zdGFydHNXaXRoKEhJTlRfUFJFRklYKSkgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggeyAvKiBub3RoaW5nIHRvIGNsZWFuIHVwIGlmIGl0IHdhcyBuZXZlciB3cml0YWJsZSAqLyB9XG4gICAgICAgIGF3YWl0IHR4KCdyZWFkd3JpdGUnLCBzID0+IHMuY2xlYXIoKSk7XG4gICAgfSxcbn07XG4iLCAiaW1wb3J0IHtcbiAgICBJQ29tcG9uZW50Q29uZmlnLFxuICAgIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgIElDb21wb25lbnRJbnN0YW5jZUNvbmZpZyxcbiAgICBJRGVkaWNhdGVkU2tpbkNvbmZpZyxcbiAgICBJUHJvcENvbmZpZyxcbiAgICBJU2tpbkNvbmZpZyxcbiAgICBJVXNlckZsb3csXG4gICAgUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMsXG4gICAgdjJfSVZhcmlhbnRDb25maWdcbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHsgZGVsaXZlcnlTdG9yZSB9IGZyb20gXCIuL2RlbGl2ZXJ5U3RvcmVcIjtcblxuY29uc3QgY29udmVydFYyVmFyaWFudFRvQ29tcG9uZW50Q29uZmlnID0gKGNvbmZpZzogdjJfSVZhcmlhbnRDb25maWcpOiBJQ29tcG9uZW50Q29uZmlnID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgICBpbnN0YW5jZToge1xuICAgICAgICAgICAgaWQ6ICdhdXRvJyxcbiAgICAgICAgICAgIGNvbXBvbmVudElkOiBjb25maWcuY29tcG9uZW50SWQsXG4gICAgICAgICAgICBjb21wb25lbnROYW1lOiBjb25maWcubmFtZSxcblxuICAgICAgICAgICAgc2tpblNlbGVjdG9yOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0RlZGljYXRlZCcsXG4gICAgICAgICAgICAgICAgc2tpbjoge1xuICAgICAgICAgICAgICAgICAgICBpZDogJ3NraW5fYXV0b192Ml9jb252ZXJ0ZWQnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZ1xuXG4gICAgICAgIH0gYXMgSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBpZDogY29uZmlnLmlkLFxuICAgICAgICAgICAgbmFtZTogY29uZmlnLm5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogY29uZmlnLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgcHJvcHM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiAnaW5fYXV0b192Ml9jb252ZXJ0ZWQnLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnbXlvcF9pbml0X2ludGVyZmFjZScsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdhbnknLFxuICAgICAgICAgICAgICAgICAgICBiZWhhdmlvcjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMuY29kZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBhcyBJUHJvcENvbmZpZyxcblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdvdXRfYXV0b192Ml9jb252ZXJ0ZWQnLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnbXlvcF9jdGFfaGFuZGxlcicsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdhbnknLFxuICAgICAgICAgICAgICAgICAgICBiZWhhdmlvcjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMuY29kZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBhcyBJUHJvcENvbmZpZ1xuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHJlZnM6IFtdLFxuICAgICAgICAgICAgc2tpbnM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiAnc2tpbl9hdXRvX3YyX2NvbnZlcnRlZCcsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdhdXRvX3YyX2NvbnZlcnRlZCcsXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogaGFuZGxlIGVtcHR5IDpcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBsb2FkZXI6IGNvbmZpZy5jb25zdW1lX3ZhcmlhbnRbMF0ubG9hZGVyXG4gICAgICAgICAgICAgICAgfSBhcyBJU2tpbkNvbmZpZ1xuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGRlZmF1bHRTa2luOiAwXG4gICAgICAgIH0gYXMgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgICAgIG5hbWU6IGNvbmZpZy5uYW1lXG4gICAgfSBhcyBJQ29tcG9uZW50Q29uZmlnO1xufTtcblxuLyoqXG4gKiBDbG91ZFJlcG9zaXRvcnkgLSBVbmlmaWVkIGNsb3VkIGRhdGEgYWNjZXNzIGxheWVyIGZvciBNeW9wIGNvbXBvbmVudHNcbiAqXG4gKiBTdXBwb3J0cyBib3RoIHYyIChkZWZhdWx0KSBhbmQgdjEgbW9kZXM6XG4gKiAtIHYyOiBVc2VzIC9jb25zdW1lIGVuZHBvaW50IGZvciBmZXRjaGluZyB2YXJpYW50c1xuICogLSB2MTogVXNlcyAvZmxvdyBlbmRwb2ludCBmb3IgZmV0Y2hpbmcgdXNlciBmbG93c1xuICovXG4vLyBVc2UgYSBnbG9iYWwgc2luZ2xldG9uIHRvIGVuc3VyZSBvbmx5IG9uZSBDbG91ZFJlcG9zaXRvcnkuTWFpbiBleGlzdHNcbi8vIGV2ZW4gd2hlbiB0aGUgbW9kdWxlIGlzIGxvYWRlZCBtdWx0aXBsZSB0aW1lcyBieSBkaWZmZXJlbnQgYnVuZGxlcnNcbmNvbnN0IEdMT0JBTF9LRVkgPSAnX19NWU9QX0NMT1VEX1JFUE9TSVRPUllfTUFJTl9fJztcblxuY29uc3QgZ2V0R2xvYmFsTWFpbiA9ICgpOiBDbG91ZFJlcG9zaXRvcnkgfCB1bmRlZmluZWQgPT4ge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gKHdpbmRvdyBhcyBhbnkpW0dMT0JBTF9LRVldO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiAoZ2xvYmFsVGhpcyBhcyBhbnkpW0dMT0JBTF9LRVldO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufTtcblxuY29uc3Qgc2V0R2xvYmFsTWFpbiA9IChpbnN0YW5jZTogQ2xvdWRSZXBvc2l0b3J5KSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICh3aW5kb3cgYXMgYW55KVtHTE9CQUxfS0VZXSA9IGluc3RhbmNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIChnbG9iYWxUaGlzIGFzIGFueSlbR0xPQkFMX0tFWV0gPSBpbnN0YW5jZTtcbiAgICB9XG59O1xuXG5leHBvcnQgY2xhc3MgQ2xvdWRSZXBvc2l0b3J5IHtcbiAgICBwcml2YXRlIHN0YXRpYyBfbWFpbjogQ2xvdWRSZXBvc2l0b3J5IHwgbnVsbCA9IG51bGw7XG5cbiAgICBzdGF0aWMgZ2V0IE1haW4oKTogQ2xvdWRSZXBvc2l0b3J5IHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgYSBnbG9iYWwgaW5zdGFuY2UgYWxyZWFkeSBleGlzdHMgKGZyb20gYW5vdGhlciBidW5kbGUpXG4gICAgICAgIGNvbnN0IGdsb2JhbE1haW4gPSBnZXRHbG9iYWxNYWluKCk7XG4gICAgICAgIGlmIChnbG9iYWxNYWluKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2xvYmFsTWFpbjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSBuZXcgaW5zdGFuY2UgaWYgbmVlZGVkXG4gICAgICAgIGlmICghQ2xvdWRSZXBvc2l0b3J5Ll9tYWluKSB7XG4gICAgICAgICAgICBDbG91ZFJlcG9zaXRvcnkuX21haW4gPSBuZXcgQ2xvdWRSZXBvc2l0b3J5KCk7XG4gICAgICAgICAgICBzZXRHbG9iYWxNYWluKENsb3VkUmVwb3NpdG9yeS5fbWFpbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIENsb3VkUmVwb3NpdG9yeS5fbWFpbjtcbiAgICB9XG5cbiAgICAvLyB2MiBjYWNoZSAtIGtleWVkIGJ5IGNvbXBvbmVudElkOmVudjpwcmV2aWV3fGxpdmVcbiAgICAvLyBFYWNoIFByb21pc2UgaXMgdGFnZ2VkIHdpdGggYSBgcmVzb2x2ZWRgIHByb3BlcnR5IGFmdGVyIHNldHRsaW5nIChzZWUgZmV0Y2hDb21wb25lbnRWMikuXG4gICAgcHJpdmF0ZSB2YXJpYW50czogUmVjb3JkPHN0cmluZywgUHJvbWlzZTxJQ29tcG9uZW50Q29uZmlnPiAmIHsgcmVzb2x2ZWQ/OiBJQ29tcG9uZW50Q29uZmlnIH0+ID0ge307XG5cbiAgICAvLyBUcmFjayB3aGljaCBjb21wb25lbnRzIHdlcmUgcHJlbG9hZGVkIGFuZCB3aXRoIHdoYXQgcGFyYW1zXG4gICAgLy8gS2V5OiBjb21wb25lbnRJZCwgVmFsdWU6IHsgZW52LCBwcmV2aWV3IH1cbiAgICBwcml2YXRlIHByZWxvYWRlZENvbXBvbmVudHM6IFJlY29yZDxzdHJpbmcsIHsgZW52OiBzdHJpbmc7IHByZXZpZXc6IGJvb2xlYW4gfT4gPSB7fTtcblxuICAgIC8vIHYxIGNhY2hlXG4gICAgcHJpdmF0ZSB1c2VyRmxvd3M6IFJlY29yZDxzdHJpbmcsIFByb21pc2U8SVVzZXJGbG93Pj4gPSB7fTtcblxuICAgIHByaXZhdGUgX2RlZmF1bHRFbnYgPSAncHJvZHVjdGlvbic7XG4gICAgcHJpdmF0ZSBfZW52RXhwbGljaXRseVNldCA9IGZhbHNlO1xuICAgIHByaXZhdGUgX3N0YXRpY01vZGUgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9xdWVyeVBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBfYmFzZVVybCA9ICdodHRwczovL2Nsb3VkLm15b3AuZGV2Jykge1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhvdyBiaWcgdGhlIGNvbXBvbmVudCB3ZSBhcmUgTk9UIHJlLWRvd25sb2FkaW5nIGlzLiBEZWxpYmVyYXRlbHkgbWVhc3VyZWQgZnJvbSB3aGF0XG4gICAgICogd2UgaG9sZCByYXRoZXIgdGhhbiBmcm9tIENvbnRlbnQtTGVuZ3RoOiBvbmNlIGEgcmVzcG9uc2UgaXMgY29tcHJlc3NlZCB0aGUgaGVhZGVyIGlzXG4gICAgICogbm90IHJlYWRhYmxlIGNyb3NzLW9yaWdpbiwgc28gcmVhZGluZyBpdCB0aGVyZSByZXBvcnRlZCAwIGV2ZXJ5IHNpbmdsZSB0aW1lLlxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIHNpemVPZkhlbGQoZTogYW55KTogbnVtYmVyIHtcbiAgICAgICAgdHJ5IHsgcmV0dXJuIChlPy5jb25maWc/LnR5cGU/LnNraW5zPy5bMF0/LmxvYWRlcj8uSFRNTCB8fCAnJykubGVuZ3RoOyB9IGNhdGNoIHsgcmV0dXJuIDA7IH1cbiAgICB9XG5cbiAgICAvKiogVGhlIGhvc3QgZXZlcnkgcmVxdWVzdCBnb2VzIHRvIHVubGVzcyBkZWxpdmVyeSgpIG1vdmVkIGl0LiBOZXZlciBjaGFuZ2VzLiAqL1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfSE9TVCA9ICdodHRwczovL2Nsb3VkLm15b3AuZGV2JztcblxuICAgIC8qKlxuICAgICAqIE9wdC1pbiBkZWxpdmVyeSBzZXR0aW5ncywgc2V0IGJ5IG15b3AuZGVsaXZlcnkoKS4gT2ZmIG1lYW5zOiB0aGlzIGZpbGUgYmVoYXZlc1xuICAgICAqIEVYQUNUTFkgYXMgaXQgZGlkIGJlZm9yZSBcdTIwMTQgc2FtZSBob3N0LCBzYW1lIFVSTCwgc2FtZSBldmVyeXRoaW5nLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2RlbGl2ZXJ5OiB7IG1pbmlmeTogYm9vbGVhbjsgaG9zdDogc3RyaW5nIHwgbnVsbDsgY2FjaGU6IGJvb2xlYW4gfSA9XG4gICAgICAgIHsgbWluaWZ5OiBmYWxzZSwgaG9zdDogbnVsbCwgY2FjaGU6IGZhbHNlIH07XG5cbiAgICAvKipcbiAgICAgKiBXaGF0IGFjdHVhbGx5IGhhcHBlbmVkLCBmb3IgbXlvcC5kZWxpdmVyeS5zdGF0cygpLiBgZmVsbEJhY2tgIGlzIHRoZSBudW1iZXIgdGhhdFxuICAgICAqIG1hdHRlcnM6IGl0IGlzIGhvdyB5b3UgZmluZCBvdXQgdGhlIGxhbmUgaXMgdW5oZWFsdGh5IHdpdGhvdXQgd2FpdGluZyBmb3IgYVxuICAgICAqIGJ1ZyByZXBvcnQsIGJlY2F1c2UgYSBmYWxsYmFjayBpcyBJTlZJU0lCTEUgdG8gdGhlIHBhZ2UgKGl0IHN0aWxsIHJlbmRlcnMpLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2RlbGl2ZXJ5U3RhdHMgPSB7XG4gICAgICAgIHJlcXVlc3RzOiAwLCB2aWFEZWxpdmVyeTogMCwgZmVsbEJhY2s6IDAsIGxhc3RFcnJvcjogbnVsbCBhcyBzdHJpbmcgfCBudWxsLFxuICAgICAgICAvKiogd2hlcmUgdGhlIGxhc3QgbG9hZHMgd2VyZSBhbnN3ZXJlZCBmcm9tIFx1MjAxNCB0aGUgbnVtYmVyIHRoZSBjbGllbnQgd2luZG93IGV4aXN0cyB0byBtb3ZlICovXG4gICAgICAgIGZyb21NZW1vcnk6IDAsIGZyb21TdG9yYWdlOiAwLCBmcm9tTmV0d29yazogMCxcbiAgICAgICAgLyoqIHJlLWNoZWNrcyBhZnRlciB0aGUgd2luZG93IGVuZGVkLCBhbmQgaG93IG1hbnkgd2VyZSBhbnN3ZXJlZCBcIm5vdGhpbmcgY2hhbmdlZFwiICovXG4gICAgICAgIHJldmFsaWRhdGlvbnM6IDAsIHVuY2hhbmdlZDogMCwgYnl0ZXNTYXZlZDogMCxcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVHVybiBvbiB0aGUgb3B0LWluIGRlbGl2ZXJ5IHBhdGguXG4gICAgICpcbiAgICAgKiBPcHRpbmcgaW4gSVMgY2hvb3NpbmcgdGhlIGRlbGl2ZXJ5IHN0YWNrOiB0aGlzIHBvaW50cyAvY29uc3VtZSBhdCBgaG9zdGAgKGEgc2Vjb25kLFxuICAgICAqIGNvbXBsZXRlIHN0YWNrIHJlYWRpbmcgdGhlIHNhbWUgZGF0YSkgYW5kIGFza3MgZm9yIHRoZSBtaW5pZmllZCBhcnRpZmFjdC4gTGVhdmUgdGhpc1xuICAgICAqIHVuY2FsbGVkIGFuZCBub3RoaW5nIGFib3V0IHRoZSBTREsgY2hhbmdlcy5cbiAgICAgKlxuICAgICAqIERlbGliZXJhdGVseSBtdXRhdGVzIFRISVMgaW5zdGFuY2UgcmF0aGVyIHRoYW4gY29uc3RydWN0aW5nIGEgbmV3IHJlcG9zaXRvcnk6XG4gICAgICogQ2xvdWRSZXBvc2l0b3J5Lk1haW4gaXMgYSBnbG9iYWwgc2luZ2xldG9uIHNoYXJlZCBhY3Jvc3MgYnVuZGxlcyAoc2VlIGdldEdsb2JhbE1haW4pLFxuICAgICAqIHNvIGEgc2Vjb25kIGluc3RhbmNlIHdvdWxkIGJlIGlnbm9yZWQgYnkgZXZlcnkgY29tcG9uZW50IGFscmVhZHkgdXNpbmcgdGhlIGZpcnN0LlxuICAgICAqL1xuICAgIHNldERlbGl2ZXJ5KG9wdHM6IHsgbWluaWZ5PzogYm9vbGVhbjsgaG9zdD86IHN0cmluZyB8IG51bGw7IGNhY2hlPzogYm9vbGVhbiB9ID0ge30pIHtcbiAgICAgICAgaWYgKG9wdHMubWluaWZ5ICE9PSB1bmRlZmluZWQpIHRoaXMuX2RlbGl2ZXJ5Lm1pbmlmeSA9ICEhb3B0cy5taW5pZnk7XG4gICAgICAgIGlmIChvcHRzLmhvc3QgIT09IHVuZGVmaW5lZCkgdGhpcy5fZGVsaXZlcnkuaG9zdCA9IG9wdHMuaG9zdDtcbiAgICAgICAgaWYgKG9wdHMuY2FjaGUgIT09IHVuZGVmaW5lZCkgdGhpcy5fZGVsaXZlcnkuY2FjaGUgPSAhIW9wdHMuY2FjaGU7XG4gICAgfVxuXG4gICAgZGVsaXZlcnlTdGF0cygpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4udGhpcy5fZGVsaXZlcnlTdGF0cywgaG9zdDogdGhpcy5fZGVsaXZlcnkuaG9zdCA/PyBDbG91ZFJlcG9zaXRvcnkuREVGQVVMVF9IT1NULFxuICAgICAgICAgICAgICAgICBtaW5pZnk6IHRoaXMuX2RlbGl2ZXJ5Lm1pbmlmeSwgY2FjaGU6IHRoaXMuX2RlbGl2ZXJ5LmNhY2hlIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9yZ2V0IHdoYXQgdGhpcyBicm93c2VyIGhvbGRzLCBzbyB0aGUgbmV4dCBsb2FkIGFza3MgdGhlIHNlcnZlci5cbiAgICAgKiBgcmVmcmVzaCgpYCB3aXRoIG5vIGlkcyBkcm9wcyBldmVyeXRoaW5nOyB0aGUgY291bnRlcnBhcnQgdG8gdGhlIHdpbmRvdyBmb3IgdGhlIGNhc2VcbiAgICAgKiB3aGVyZSBhIGNoYW5nZSBoYXMgdG8gYmUgdmlzaWJsZSBvbiBUSElTIGxvYWQgXHUyMDE0IHJpZ2h0IGFmdGVyIHNvbWVvbmUgcHVibGlzaGVzLlxuICAgICAqL1xuICAgIGFzeW5jIHJlZnJlc2hEZWxpdmVyeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgZGVsaXZlcnlTdG9yZS5jbGVhcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvY2FsIHNlcnZlcyB3YWl0aW5nIHRvIGJlIHJlcG9ydGVkOiBjb21wb25lbnRJZCAtPiB7ZW52LCBjb3VudH0uXG4gICAgICpcbiAgICAgKiBUSEUgTUVBU1VSRU1FTlQgUFJPQkxFTSBUSElTIFNPTFZFUy4gVGhlIGJldHRlciB0aGlzIGNhY2hlIHdvcmtzLCB0aGUgbW9yZSB1c2FnZVxuICAgICAqIHZhbmlzaGVzOiBhIHZpc2l0b3IgaW5zaWRlIHRoZWlyIGZyZXNobmVzcyB3aW5kb3cgcmVuZGVycyB0aGUgcGFnZSB3aXRoIG5vIHJlcXVlc3QsXG4gICAgICogc28gbmVpdGhlciB0aGUgc2VydmVyIG5vciB0aGUgQ0ROIGNhbiBzZWUgdGhlbS4gTGVmdCBhbG9uZSwgYSBzdWNjZXNzZnVsIHJvbGxvdXRcbiAgICAgKiBsb29rcyBpbiB0aGUgbGVkZ2VyIGV4YWN0bHkgbGlrZSBjdXN0b21lcnMgbGVhdmluZy5cbiAgICAgKlxuICAgICAqIFNvIGxvY2FsIHNlcnZlcyBhcmUgY291bnRlZCBoZXJlIGFuZCByZXBvcnRlZCBhZnRlcndhcmRzLCBiYXRjaGVkLCBvbiBhIHBhdGggdGhhdFxuICAgICAqIG5ldmVyIGJsb2NrcyByZW5kZXJpbmc6IGZsdXNoZWQgd2hlbiB0aGUgcGFnZSBpcyBoaWRkZW4gKGtlZXBhbGl2ZSwgc28gaXQgc3Vydml2ZXNcbiAgICAgKiB0aGUgdGFiIGNsb3NpbmcpIGFuZCBvcHBvcnR1bmlzdGljYWxseSB3aGVuZXZlciB0aGUgU0RLIGlzIHRhbGtpbmcgdG8gdGhlIHNlcnZlclxuICAgICAqIGFueXdheS4gTm90aGluZyBpcyBzZW50IHdoaWxlIHRoZSBwYWdlIGlzIGxvYWRpbmcsIHdoaWNoIGlzIHRoZSBwb2ludCBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIHByaXZhdGUgX2xvY2FsU2VydmVzID0gbmV3IE1hcDxzdHJpbmcsIHtlbnY6IHN0cmluZzsgY291bnQ6IG51bWJlcn0+KCk7XG4gICAgcHJpdmF0ZSBfZmx1c2hCb3VuZCA9IGZhbHNlO1xuXG4gICAgcHJpdmF0ZSBub3RlTG9jYWxTZXJ2ZShjb21wb25lbnRJZDogc3RyaW5nLCBlbnY6IHN0cmluZykge1xuICAgICAgICBjb25zdCBjdXIgPSB0aGlzLl9sb2NhbFNlcnZlcy5nZXQoY29tcG9uZW50SWQpO1xuICAgICAgICBpZiAoY3VyKSBjdXIuY291bnQrKztcbiAgICAgICAgZWxzZSB0aGlzLl9sb2NhbFNlcnZlcy5zZXQoY29tcG9uZW50SWQsIHtlbnYsIGNvdW50OiAxfSk7XG4gICAgICAgIHRoaXMuYmluZEZsdXNoKCk7XG4gICAgfVxuXG4gICAgLyoqIFJlcG9ydCBvbiBwYWdlLWhpZGUsIHdoaWNoIGlzIHRoZSBvbmx5IGV2ZW50IHRoYXQgcmVsaWFibHkgZmlyZXMgb24gbW9iaWxlLiAqL1xuICAgIHByaXZhdGUgYmluZEZsdXNoKCkge1xuICAgICAgICBpZiAodGhpcy5fZmx1c2hCb3VuZCB8fCB0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG4gICAgICAgIHRoaXMuX2ZsdXNoQm91bmQgPSB0cnVlO1xuICAgICAgICBjb25zdCBvbkhpZGUgPSAoKSA9PiB7IGlmIChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPT09ICdoaWRkZW4nKSB0aGlzLmZsdXNoTG9jYWxTZXJ2ZXMoKTsgfTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsIG9uSGlkZSk7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwYWdlaGlkZScsICgpID0+IHRoaXMuZmx1c2hMb2NhbFNlcnZlcygpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZW5kIHdoYXQgd2UgaGF2ZS4gYGtlZXBhbGl2ZWAgaXMgd2hhdCBtYWtlcyB0aGlzIHdvcmsgYXQgcGFnZS1oaWRlOiB0aGUgcmVxdWVzdFxuICAgICAqIG91dGxpdmVzIHRoZSBkb2N1bWVudC4gRmFpbHVyZSBpcyBpZ25vcmVkIFx1MjAxNCBhIGxvc3QgdXNhZ2UgcmVwb3J0IG11c3QgbmV2ZXIgYmVcbiAgICAgKiB2aXNpYmxlIHRvIGEgdmlzaXRvciwgYW5kIHRoZSBuZXh0IHBhZ2UgbG9hZCB3aWxsIHJlcG9ydCBpdHMgb3duLlxuICAgICAqL1xuICAgIGZsdXNoTG9jYWxTZXJ2ZXMoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5fbG9jYWxTZXJ2ZXMuc2l6ZSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBiYXRjaCA9IFsuLi50aGlzLl9sb2NhbFNlcnZlcy5lbnRyaWVzKCldXG4gICAgICAgICAgICAubWFwKChbaWQsIHZdKSA9PiBgJHtpZH06JHt2LmVudn06JHt2LmNvdW50fWApLmpvaW4oJywnKTtcbiAgICAgICAgdGhpcy5fbG9jYWxTZXJ2ZXMuY2xlYXIoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IGAke3RoaXMuZGVsaXZlcnlIb3N0KCl9L2NsaWVudFVzYWdlP2I9JHtlbmNvZGVVUklDb21wb25lbnQoYmF0Y2gpfWA7XG4gICAgICAgICAgICBmZXRjaCh1cmwsIHtrZWVwYWxpdmU6IHRydWUsIG1vZGU6ICdjb3JzJywgY3JlZGVudGlhbHM6ICdvbWl0J30pLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgfSBjYXRjaCB7IC8qIG5ldmVyIHRoZSB2aXNpdG9yJ3MgcHJvYmxlbSAqLyB9XG4gICAgfVxuXG4gICAgLyoqIFdoZXJlIC9jb25zdW1lIHNob3VsZCBiZSBmZXRjaGVkIGZyb20gcmlnaHQgbm93LiAqL1xuICAgIHByaXZhdGUgZGVsaXZlcnlIb3N0KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxpdmVyeS5ob3N0IHx8IHRoaXMuX2Jhc2VVcmw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmV0Y2ggYSBkZWxpdmVyeSBVUkwgd2l0aCBPTkUgZmFsbGJhY2sgdG8gdGhlIGRlZmF1bHQgaG9zdC5cbiAgICAgKlxuICAgICAqIFRoZSBmYWxsYmFjayBpcyB0aGUga2lsbCBzd2l0Y2g6IGJyZWFrIG9yIGRpc2FibGUgdGhlIGxhbmUgYW5kIGV2ZXJ5IGNsaWVudCBkcmlmdHNcbiAgICAgKiBiYWNrIHRvIGNsb3VkLm15b3AuZGV2IG9uIGl0cyBvd24sIHdpdGggbm8gY3VzdG9tZXIgZGVwbG95LiBJdCBtdXN0IHRoZXJlZm9yZSBiZVxuICAgICAqIGdlbnVpbmVseSBzaWxlbnQgdG8gdGhlIHBhZ2UgYW5kIGdlbnVpbmVseSBMT1VEIGluIHN0YXRzKCkgXHUyMDE0IGEgZmFsbGJhY2sgdGhhdCBub2JvZHlcbiAgICAgKiBjb3VudHMgaXMgYW4gb3V0YWdlIG5vYm9keSBub3RpY2VzLlxuICAgICAqXG4gICAgICogT25seSB0cmFuc3BvcnQgZmFpbHVyZXMgYW5kIDV4eCBmYWxsIGJhY2suIEEgNDA0IGlzIGFuIGFuc3dlcjogdGhlIGNvbXBvbmVudCByZWFsbHlcbiAgICAgKiBpcyBtaXNzaW5nLCBhbmQgcmV0cnlpbmcgZWxzZXdoZXJlIHdvdWxkIG9ubHkgaGlkZSBpdC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIGRlbGl2ZXJ5RmV0Y2gocGF0aDogc3RyaW5nKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgICAgICAvLyBXZSBhcmUgYWJvdXQgdG8gdXNlIHRoZSBuZXR3b3JrIGFueXdheTogYSBnb29kIG1vbWVudCB0byBoYW5kIG92ZXIgd2hhdGV2ZXIgdGhlXG4gICAgICAgIC8vIHdpbmRvdyBzZXJ2ZWQgb2ZmbGluZSwgcmF0aGVyIHRoYW4gd2FpdGluZyBmb3IgdGhlIHBhZ2UgdG8gYmUgY2xvc2VkLlxuICAgICAgICBpZiAodGhpcy5fbG9jYWxTZXJ2ZXMuc2l6ZSkgdGhpcy5mbHVzaExvY2FsU2VydmVzKCk7XG4gICAgICAgIGNvbnN0IGhvc3QgPSB0aGlzLmRlbGl2ZXJ5SG9zdCgpO1xuICAgICAgICBjb25zdCBwcmltYXJ5ID0gYCR7aG9zdH0ke3BhdGh9YDtcbiAgICAgICAgdGhpcy5fZGVsaXZlcnlTdGF0cy5yZXF1ZXN0cysrO1xuICAgICAgICBjb25zdCB1c2luZ0xhbmUgPSBob3N0ICE9PSB0aGlzLl9iYXNlVXJsO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2gocHJpbWFyeSk7XG4gICAgICAgICAgICBpZiAocmVzLm9rIHx8IHJlcy5zdGF0dXMgPCA1MDAgfHwgIXVzaW5nTGFuZSkge1xuICAgICAgICAgICAgICAgIGlmICh1c2luZ0xhbmUgJiYgcmVzLm9rKSB0aGlzLl9kZWxpdmVyeVN0YXRzLnZpYURlbGl2ZXJ5Kys7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2RlbGl2ZXJ5U3RhdHMubGFzdEVycm9yID0gYEhUVFAgJHtyZXMuc3RhdHVzfSBmcm9tICR7aG9zdH1gO1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIGlmICghdXNpbmdMYW5lKSB0aHJvdyBlO1xuICAgICAgICAgICAgdGhpcy5fZGVsaXZlcnlTdGF0cy5sYXN0RXJyb3IgPSBTdHJpbmcoZT8ubWVzc2FnZSA/PyBlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9kZWxpdmVyeVN0YXRzLmZlbGxCYWNrKys7XG4gICAgICAgIGNvbnNvbGUud2FybihgW215b3BdIGRlbGl2ZXJ5IGhvc3QgZmFpbGVkICgke3RoaXMuX2RlbGl2ZXJ5U3RhdHMubGFzdEVycm9yfSkgXHUyMDE0IGZhbGxpbmcgYmFjayB0byAke3RoaXMuX2Jhc2VVcmx9YCk7XG4gICAgICAgIHJldHVybiBhd2FpdCBmZXRjaChgJHt0aGlzLl9iYXNlVXJsfSR7cGF0aH1gKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGUgc3RhdGljIG1vZGUgZm9yIHNlbGYtaG9zdGVkIGNvbXBvbmVudCByZWdpc3RyaWVzLlxuICAgICAqIEluIHN0YXRpYyBtb2RlLCBVUkxzIGFyZSBjb25zdHJ1Y3RlZCBhcyBmaWxlIHBhdGhzIGluc3RlYWQgb2YgcXVlcnkgcGFyYW1zOlxuICAgICAqICAgJHtiYXNlVXJsfS9jb21wb25lbnRzLyR7Y29tcG9uZW50SWR9LyR7ZW52fS5qc29uXG4gICAgICovXG4gICAgZW5hYmxlU3RhdGljTW9kZSgpIHtcbiAgICAgICAgdGhpcy5fc3RhdGljTW9kZSA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHF1ZXJ5IHBhcmFtZXRlcnMgdG8gYXBwZW5kIHRvIGFsbCBmZXRjaCBVUkxzIChlLmcuIGZvciBDRE4gY2FjaGUgYnVzdGluZykuXG4gICAgICogRXhhbXBsZTogYHNldFF1ZXJ5UGFyYW1zKHsgbGFzdHVwZGF0ZTogJzExMTEyMDI2JyB9KWBcbiAgICAgKi9cbiAgICBzZXRRdWVyeVBhcmFtcyhwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pIHtcbiAgICAgICAgdGhpcy5fcXVlcnlQYXJhbXMgPSBwYXJhbXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBkZWZhdWx0IGVudmlyb25tZW50IGZvciB0aGlzIENsb3VkUmVwb3NpdG9yeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHNldEVudmlyb25tZW50KGVudjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRFbnYgPSBlbnY7XG4gICAgICAgIHRoaXMuX2VudkV4cGxpY2l0bHlTZXQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY3VycmVudCBkZWZhdWx0IGVudmlyb25tZW50XG4gICAgICovXG4gICAgZ2V0RGVmYXVsdEVudmlyb25tZW50KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0RW52O1xuICAgIH1cblxuICAgIC8vID09PT09PT09PT09PSBWMiBNZXRob2RzIChEZWZhdWx0KSA9PT09PT09PT09PT1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGEgY29tcG9uZW50IGlzIGFscmVhZHkgY2FjaGVkL3ByZWxvYWRlZCAodjIpXG4gICAgICogSWYgZW52IGFuZCBwcmV2aWV3IGFyZSBub3QgcHJvdmlkZWQsIGNoZWNrcyBpZiBBTlkgdmVyc2lvbiBpcyBwcmVsb2FkZWRcbiAgICAgKi9cbiAgICBpc1ByZWxvYWRlZChjb21wb25lbnRJZDogc3RyaW5nLCBlbnY/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgICAgIC8vIElmIHNwZWNpZmljIGVudi9wcmV2aWV3IHJlcXVlc3RlZCwgY2hlY2sgZXhhY3QgbWF0Y2hcbiAgICAgICAgaWYgKGVudiAhPT0gdW5kZWZpbmVkIHx8IHByZXZpZXcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBgJHtjb21wb25lbnRJZH06JHtlbnYgfHwgdGhpcy5fZGVmYXVsdEVudn06JHtwcmV2aWV3ID8gJ3ByZXZpZXcnIDogJ2xpdmUnfWA7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVLZXkgaW4gdGhpcy52YXJpYW50cztcbiAgICAgICAgfVxuICAgICAgICAvLyBPdGhlcndpc2UgY2hlY2sgaWYgYW55IHZlcnNpb24gd2FzIHByZWxvYWRlZFxuICAgICAgICByZXR1cm4gY29tcG9uZW50SWQgaW4gdGhpcy5wcmVsb2FkZWRDb21wb25lbnRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgcHJlbG9hZGVkIHBhcmFtcyBmb3IgYSBjb21wb25lbnQgKGlmIHByZWxvYWRlZClcbiAgICAgKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiBub3QgcHJlbG9hZGVkXG4gICAgICovXG4gICAgZ2V0UHJlbG9hZGVkUGFyYW1zKGNvbXBvbmVudElkOiBzdHJpbmcpOiB7IGVudjogc3RyaW5nOyBwcmV2aWV3OiBib29sZWFuIH0gfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5wcmVsb2FkZWRDb21wb25lbnRzW2NvbXBvbmVudElkXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlIGEgY29tcG9uZW50IGNvbmZpZzogZmV0Y2ggaXQgb25jZSwgdGhlbiBzZXJ2ZSBpdCBmcm9tIHRoaXNcbiAgICAgKiByZXBvc2l0b3J5J3MgY2FjaGUuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIHRoZSBuYW1lIHRvIHVzZS4gYGZldGNoQ29tcG9uZW50VjJgIGlzIHRoZSBzYW1lIG1ldGhvZCB1bmRlciBpdHNcbiAgICAgKiB2ZXJzaW9uZWQgbmFtZSBhbmQgc3RheXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgXHUyMDE0IG5vdGUgdGhhdCB0aGVcbiAgICAgKiB1bnZlcnNpb25lZCBgZmV0Y2hDb21wb25lbnRgIGlzIGEgKmRlcHJlY2F0ZWQgdjEqIEFQSSBhbmQgaXMgTk9UIHRoaXMuXG4gICAgICpcbiAgICAgKiBDb21wbGV0ZXMgdGhlIHRyaW8gd2l0aCB7QGxpbmsgZ2V0UmVzb2x2ZWRDb25maWd9IChzeW5jaHJvbm91cyByZWFkIG9mIGFuXG4gICAgICogYWxyZWFkeS1yZXNvbHZlZCBjb25maWcpIGFuZCB7QGxpbmsgaHlkcmF0ZUNvbXBvbmVudH0gKHNlZWQgb25lIHlvdVxuICAgICAqIGFscmVhZHkgaG9sZCkuXG4gICAgICpcbiAgICAgKiBQcmVmZXIgdGhlIG1vZHVsZS1sZXZlbCBgcHJlbG9hZENvbXBvbmVudHMoW2lkXSlgIGluIGFwcCBjb2RlOyByZWFjaCBmb3JcbiAgICAgKiB0aGlzIHdoZW4geW91IG5lZWQgYW4gaXNvbGF0ZWQgcmVwb3NpdG9yeSBpbnN0YW5jZSB3aG9zZSBjYWNoZSBsaWZldGltZVxuICAgICAqIHlvdSBjb250cm9sIFx1MjAxNCBhIHNlcnZlciB3aXRoIGl0cyBvd24gVFRMLCBmb3IgZXhhbXBsZS5cbiAgICAgKi9cbiAgICBhc3luYyByZXNvbHZlQ29tcG9uZW50KGNvbXBvbmVudElkOiBzdHJpbmcsIGVudj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pOiBQcm9taXNlPElDb21wb25lbnRDb25maWc+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hDb21wb25lbnRWMihjb21wb25lbnRJZCwgZW52LCBwcmV2aWV3KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGZXRjaCBhIHYyIGNvbXBvbmVudCBjb25maWdcbiAgICAgKiBJZiBlbnYvcHJldmlldyBub3Qgc3BlY2lmaWVkIGFuZCBjb21wb25lbnQgd2FzIHByZWxvYWRlZCwgdXNlcyBwcmVsb2FkZWQgcGFyYW1zXG4gICAgICpcbiAgICAgKiBAc2VlIHJlc29sdmVDb21wb25lbnQgXHUyMDE0IHRoZSB1bnZlcnNpb25lZCBuYW1lIGZvciB0aGlzIG1ldGhvZFxuICAgICAqL1xuICAgIGFzeW5jIGZldGNoQ29tcG9uZW50VjIoY29tcG9uZW50SWQ6IHN0cmluZywgZW52aXJvbm1lbnRJZGVudGlmaWVyPzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbik6IFByb21pc2U8SUNvbXBvbmVudENvbmZpZz4ge1xuICAgICAgICBjb25zdCB7IGVudiwgdXNlUHJldmlldywgY2FjaGVLZXkgfSA9IHRoaXMucmVzb2x2ZVBhcmFtcyhjb21wb25lbnRJZCwgZW52aXJvbm1lbnRJZGVudGlmaWVyLCBwcmV2aWV3KTtcblxuICAgICAgICBjb25zb2xlLmxvZygnW0Nsb3VkUmVwb3NpdG9yeV0gZmV0Y2hDb21wb25lbnRWMicsIHtcbiAgICAgICAgICAgIGNvbXBvbmVudElkOiBjb21wb25lbnRJZC5zbGljZSgwLCA4KSArICcuLi4nLFxuICAgICAgICAgICAgZW52LFxuICAgICAgICAgICAgdXNlUHJldmlldyxcbiAgICAgICAgICAgIGNhY2hlS2V5LFxuICAgICAgICAgICAgY2FjaGVkOiBjYWNoZUtleSBpbiB0aGlzLnZhcmlhbnRzXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghdGhpcy52YXJpYW50c1tjYWNoZUtleV0pIHtcbiAgICAgICAgICAgIC8vIFRyYWNrIHRoaXMgYXMgcHJlbG9hZGVkIChmaXJzdCBmZXRjaCBjb3VudHMgYXMgcHJlbG9hZClcbiAgICAgICAgICAgIGlmICghdGhpcy5wcmVsb2FkZWRDb21wb25lbnRzW2NvbXBvbmVudElkXSkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJlbG9hZGVkQ29tcG9uZW50c1tjb21wb25lbnRJZF0gPSB7IGVudiwgcHJldmlldzogdXNlUHJldmlldyB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXN5bmMtcHJvbWlzZS1leGVjdXRvclxuICAgICAgICAgICAgdGhpcy52YXJpYW50c1tjYWNoZUtleV0gPSBuZXcgUHJvbWlzZShcbiAgICAgICAgICAgICAgICBhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJsOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fc3RhdGljTW9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbGUgPSB1c2VQcmV2aWV3ID8gJ3ByZXZpZXcnIDogZW52O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IGAke3RoaXMuX2Jhc2VVcmx9L2NvbXBvbmVudHMvJHtjb21wb25lbnRJZH0vJHtmaWxlfS5qc29uYDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBxcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXModGhpcy5fcXVlcnlQYXJhbXMpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHFzKSB1cmwgKz0gYD8ke3FzfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IGAvY29uc3VtZT9pZD0ke2NvbXBvbmVudElkfSZlbnY9JHtlbnZ9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlUHJldmlldykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwgKz0gJyZwcmV2aWV3PXRydWUnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHByZXZpZXcgaXMgbmV2ZXIgbWluaWZpZWQ6IHRoZSBhcnRpZmFjdCBpcyBidWlsdCBmcm9tIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbGVhc2VkIHZhcmlhbnQsIGFuZCBhbiBhdXRob3IgbXVzdCBzZWUgdGhlaXIgb3duIGVkaXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2RlbGl2ZXJ5Lm1pbmlmeSAmJiAhdXNlUHJldmlldykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwgKz0gJyZvcHQ9bWluJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIC0tLS0gdGhlIGNsaWVudCB3aW5kb3cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBwcmV2aWV3IGlzIG5ldmVyIGhlbGQ6IGFuIGF1dGhvciBoYXMgdG8gc2VlIHRoZWlyIG93biBlZGl0LlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FjaGVhYmxlID0gdGhpcy5fZGVsaXZlcnkuY2FjaGUgJiYgIXRoaXMuX3N0YXRpY01vZGUgJiYgIXVzZVByZXZpZXc7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdG9yZUtleSA9IGNhY2hlYWJsZSA/IGRlbGl2ZXJ5U3RvcmUua2V5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVsaXZlcnlIb3N0KCksIGNvbXBvbmVudElkLCBlbnYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlUHJldmlldywgdGhpcy5fZGVsaXZlcnkubWluaWZ5ID8gJ21pbicgOiAncmF3JykgOiAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoZWxkID0gY2FjaGVhYmxlID8gYXdhaXQgZGVsaXZlcnlTdG9yZS5nZXQoc3RvcmVLZXkpIDogbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhlbGQgJiYgZGVsaXZlcnlTdG9yZS5mcmVzaChoZWxkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc2lkZSB0aGUgd2luZG93OiBubyByZXF1ZXN0IGF0IGFsbC4gQ291bnRlZCBsb2NhbGx5IGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcG9ydGVkIGxhdGVyLCBvciB0aGlzIHZpc2l0IGlzIGludmlzaWJsZSB0byB0aGUgbGVkZ2VyLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlbGl2ZXJ5U3RhdHMuZnJvbVN0b3JhZ2UrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGVMb2NhbFNlcnZlKGNvbXBvbmVudElkLCBlbnYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XSBhcyBhbnkpLnJlc29sdmVkID0gaGVsZC5jb25maWc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShoZWxkLmNvbmZpZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGVsZCAmJiBoZWxkLnRhZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSB3aW5kb3cgZW5kZWQuIFNlbmQgYmFjayB0aGUgdmVyc2lvbiB3ZSBob2xkIHJhdGhlciB0aGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmUtZG93bmxvYWRpbmc6IHRoZSBhbnN3ZXIgaXMgdXN1YWxseSBhIGZldyBodW5kcmVkIGJ5dGVzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IHRoZSBgaWRzPWAvYGhhdmU9YCByb3V0ZSBhbmQgTk9UIElmLU5vbmUtTWF0Y2g6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSByZXF1ZXN0IGhlYWRlciB0cmlnZ2VycyBhIENPUlMgcHJlZmxpZ2h0LCB0aGVyZSBpcyBubyBPUFRJT05TXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcm91dGUsIGFuZCBpdCBmYWlscyBpbiBhIGJyb3dzZXIgd2hpbGUgd29ya2luZyBwZXJmZWN0bHkgaW4gY3VybC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgdmFsaWRhdG9yIHRyYXZlbHMgaW4gdGhlIHF1ZXJ5IHN0cmluZywgc28gaXQgaXMgYSBwbGFpbiBHRVQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hlY2tVcmwgPSBgL2NvbnN1bWU/aWRzPSR7Y29tcG9uZW50SWR9JmVudj0ke2Vudn1gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuX2RlbGl2ZXJ5Lm1pbmlmeSA/ICcmb3B0PW1pbicgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJmhhdmU9JHtlbmNvZGVVUklDb21wb25lbnQoaGVsZC50YWcpfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVsaXZlcnlTdGF0cy5yZXZhbGlkYXRpb25zKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hlY2sgPSBhd2FpdCB0aGlzLmRlbGl2ZXJ5RmV0Y2goY2hlY2tVcmwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2sub2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCBjaGVjay5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGJvZHkudW5jaGFuZ2VkIHx8IFtdKS5pbmNsdWRlcyhjb21wb25lbnRJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWxpdmVyeVN0YXRzLnVuY2hhbmdlZCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlbGl2ZXJ5U3RhdHMuYnl0ZXNTYXZlZCArPSBDbG91ZFJlcG9zaXRvcnkuc2l6ZU9mSGVsZChoZWxkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxkLnN0b3JlZEF0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxkLndpbmRvd01zID0gZGVsaXZlcnlTdG9yZS53aW5kb3dGcm9tKGNoZWNrLmhlYWRlcnMpIHx8IGhlbGQud2luZG93TXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZGVsaXZlcnlTdG9yZS5wdXQoaGVsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMudmFyaWFudHNbY2FjaGVLZXldIGFzIGFueSkucmVzb2x2ZWQgPSBoZWxkLmNvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGhlbGQuY29uZmlnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCBjaGFuZ2VkLiBUaGUgYW5zd2VyIGFscmVhZHkgY2FycmllcyB0aGUgbmV3IGJ5dGVzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IChib2R5Lml0ZW1zIHx8IFtdKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2ZnID0gY29udmVydFYyVmFyaWFudFRvQ29tcG9uZW50Q29uZmlnKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlbGl2ZXJ5U3RhdHMuZnJvbU5ldHdvcmsrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBkZWxpdmVyeVN0b3JlLnB1dCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogc3RvcmVLZXksIGNvbmZpZzogY2ZnLCB0YWc6IGl0ZW0udGFnIHx8IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZEF0OiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dNczogZGVsaXZlcnlTdG9yZS53aW5kb3dGcm9tKGNoZWNrLmhlYWRlcnMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0OiB0aGlzLmRlbGl2ZXJ5SG9zdCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gYXMgYW55KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcy52YXJpYW50c1tjYWNoZUtleV0gYXMgYW55KS5yZXNvbHZlZCA9IGNmZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGNmZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgZmFpbGVkIHJlLWNoZWNrIG11c3Qgbm90IGZhaWwgdGhlIHBhZ2U6IGZhbGwgdGhyb3VnaCB0b1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgb3JkaW5hcnkgZmV0Y2ggYmVsb3cuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSB0aGlzLl9zdGF0aWNNb2RlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBhd2FpdCBmZXRjaCh1cmwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhd2FpdCB0aGlzLmRlbGl2ZXJ5RmV0Y2godXJsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgY29tcG9uZW50IFwiJHtjb21wb25lbnRJZH1cIiAoJHtyZXMuc3RhdHVzfSR7dGhpcy5fc3RhdGljTW9kZSA/IGAgZnJvbSAke3VybH1gIDogJyd9KWApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhcmlhbnQgPSBqc29uLml0ZW07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdmFyaWFudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYENvbXBvbmVudCBcIiR7Y29tcG9uZW50SWR9XCIgbm90IGZvdW5kYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YXJpYW50LmNvbnN1bWVfdmFyaWFudCB8fCAhdmFyaWFudC5jb25zdW1lX3ZhcmlhbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQ29tcG9uZW50IFwiJHtjb21wb25lbnRJZH1cIiBoYXMgbm8gaW1wbGVtZW50YXRpb24gZm9yIGVudmlyb25tZW50IFwiJHtlbnZ9XCJgKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRDb25maWcgPSBjb252ZXJ0VjJWYXJpYW50VG9Db21wb25lbnRDb25maWcodmFyaWFudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWxpdmVyeVN0YXRzLmZyb21OZXR3b3JrKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSG9sZCBpdCBmb3IgZXhhY3RseSBhcyBsb25nIGFzIHRoZSBzZXJ2ZXIgc2FpZCwgbWludXMgd2hhdCBhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ0ROIGFscmVhZHkgc3BlbnQgKGRlbGl2ZXJ5U3RvcmUud2luZG93RnJvbSkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZGVsaXZlcnlTdG9yZS5wdXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IHN0b3JlS2V5LCBjb25maWc6IGNvbXBvbmVudENvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnOiAodmFyaWFudCBhcyBhbnkpLnRhZyB8fCBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZWRBdDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93TXM6IGRlbGl2ZXJ5U3RvcmUud2luZG93RnJvbShyZXMuaGVhZGVycyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3Q6IHRoaXMuZGVsaXZlcnlIb3N0KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBhbnkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGFnIHRoZSBQcm9taXNlIHNvIGdldFJlc29sdmVkQ29uZmlnIGNhbiByZWFkIGl0IHN5bmNocm9ub3VzbHlcbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XSBhcyBhbnkpLnJlc29sdmVkID0gY29tcG9uZW50Q29uZmlnO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShjb21wb25lbnRDb25maWcpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciB0aGUgY2FjaGVkIHJlamVjdGVkIHByb21pc2Ugc28gdGhlIG5leHQgY2FsbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZXMgYSBmcmVzaCByZXF1ZXN0IChlLmcuIGFmdGVyIG5ldHdvcmsgcmVjb3ZlcnkpXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy52YXJpYW50c1tjYWNoZUtleV07XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudmFyaWFudHNbY2FjaGVLZXldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN5bmNocm9ub3VzIHZlcnNpb24gb2YgZmV0Y2hDb21wb25lbnRWMiBcdTIwMTQgcmV0dXJucyB0aGUgY29uZmlnIG9ubHkgaWZcbiAgICAgKiB0aGUgZmV0Y2ggYWxyZWFkeSBjb21wbGV0ZWQsIG51bGwgb3RoZXJ3aXNlLlxuICAgICAqXG4gICAgICogVXNlcyB0aGUgc2FtZSBgdGhpcy52YXJpYW50c2AgY2FjaGUgdGhhdCBmZXRjaENvbXBvbmVudFYyL3ByZWxvYWRDb21wb25lbnRzXG4gICAgICogcG9wdWxhdGUuIEVhY2ggY2FjaGVkIFByb21pc2UgaXMgdGFnZ2VkIHdpdGggYSBgLnJlc29sdmVkYCBwcm9wZXJ0eSB3aGVuXG4gICAgICogaXQgc2V0dGxlcyBcdTIwMTQgdGhpcyBtZXRob2QganVzdCByZWFkcyB0aGF0IHByb3BlcnR5LiBObyBzZXBhcmF0ZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIFdoeSB0aGlzIGV4aXN0czogUmVhY3QgTmF0aXZlIG5lZWRzIHRoZSBjb25maWcgYXQgcmVuZGVyIHRpbWUgdG8gZW1iZWQgaXRcbiAgICAgKiBpbiB0aGUgV2ViVmlldyBIVE1MIChjYW4ndCBhd2FpdCBpbiB1c2VTdGF0ZSkuIElmIHByZWxvYWRDb21wb25lbnRzIHJhblxuICAgICAqIGVhcmxpZXIgYW5kIHRoZSBmZXRjaCBjb21wbGV0ZWQsIHRoaXMgcmV0dXJucyB0aGUgcmVzdWx0IHN5bmNocm9ub3VzbHksXG4gICAgICogc2tpcHBpbmcgdGhlIFdFQlZJRVdfUkVBRFkgXHUyMTkyIGZldGNoIFx1MjE5MiBpbmplY3Qgcm91bmQgdHJpcCBlbnRpcmVseS5cbiAgICAgKi9cbiAgICBnZXRSZXNvbHZlZENvbmZpZyhjb21wb25lbnRJZDogc3RyaW5nLCBlbnY/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKTogSUNvbXBvbmVudENvbmZpZyB8IG51bGwge1xuICAgICAgICBjb25zdCB7IGNhY2hlS2V5IH0gPSB0aGlzLnJlc29sdmVQYXJhbXMoY29tcG9uZW50SWQsIGVudiwgcHJldmlldyk7XG4gICAgICAgIHJldHVybiB0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XT8ucmVzb2x2ZWQgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlIHdoaWNoIChlbnYsIHByZXZpZXcpIHBhaXIgXHUyMDE0IGFuZCB0aGVyZWZvcmUgd2hpY2ggY2FjaGUga2V5IFx1MjAxNCBhIGNhbGxcbiAgICAgKiBmb3IgYGNvbXBvbmVudElkYCByZWZlcnMgdG8uXG4gICAgICpcbiAgICAgKiBTaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciBmZXRjaENvbXBvbmVudFYyLCBnZXRSZXNvbHZlZENvbmZpZyBhbmRcbiAgICAgKiBoeWRyYXRlQ29tcG9uZW50LCBzbyBhIGh5ZHJhdGVkIGNvbmZpZyBhbHdheXMgbGFuZHMgb24gdGhlIGtleSBhIGxhdGVyXG4gICAgICogZmV0Y2ggd2lsbCBsb29rIHVuZGVyLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVzb2x2ZVBhcmFtcyhjb21wb25lbnRJZDogc3RyaW5nLCBlbnZpcm9ubWVudElkZW50aWZpZXI/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKSB7XG4gICAgICAgIC8vIElmIG5vIGV4cGxpY2l0IGVudi9wcmV2aWV3IGFuZCBjb21wb25lbnQgd2FzIHByZWxvYWRlZCwgdXNlIHByZWxvYWRlZCBwYXJhbXNcbiAgICAgICAgY29uc3QgcHJlbG9hZGVkID0gdGhpcy5wcmVsb2FkZWRDb21wb25lbnRzW2NvbXBvbmVudElkXTtcbiAgICAgICAgY29uc3QgaGFzRXhwbGljaXRQYXJhbXMgPSBlbnZpcm9ubWVudElkZW50aWZpZXIgIT09IHVuZGVmaW5lZCB8fCBwcmV2aWV3ICE9PSB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IGVudjogc3RyaW5nO1xuICAgICAgICBsZXQgdXNlUHJldmlldzogYm9vbGVhbjtcblxuICAgICAgICBpZiAoIWhhc0V4cGxpY2l0UGFyYW1zICYmIHByZWxvYWRlZCkge1xuICAgICAgICAgICAgLy8gVXNlIHByZWxvYWRlZCBwYXJhbXNcbiAgICAgICAgICAgIGVudiA9IHByZWxvYWRlZC5lbnY7XG4gICAgICAgICAgICB1c2VQcmV2aWV3ID0gcHJlbG9hZGVkLnByZXZpZXc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBVc2UgcHJvdmlkZWQgcGFyYW1zIG9yIGRlZmF1bHRzXG4gICAgICAgICAgICBlbnYgPSBlbnZpcm9ubWVudElkZW50aWZpZXIgfHwgdGhpcy5fZGVmYXVsdEVudjtcbiAgICAgICAgICAgIC8vIElmIHByZXZpZXcgZXhwbGljaXRseSB0cnVlIFx1MjE5MiB0cnVlXG4gICAgICAgICAgICAvLyBJZiBwcmV2aWV3IGV4cGxpY2l0bHkgZmFsc2UgXHUyMTkyIGZhbHNlXG4gICAgICAgICAgICAvLyBJZiBwcmV2aWV3IHVuZGVmaW5lZDogZW52IHdhcyBzcGVjaWZpZWQgKHZpYSBwYXJhbSBvciBzZXRFbnZpcm9ubWVudCkgXHUyMTkyIGZhbHNlLCBvdGhlcndpc2UgXHUyMTkyIHRydWVcbiAgICAgICAgICAgIGNvbnN0IGhhc0VmZmVjdGl2ZUVudiA9IGVudmlyb25tZW50SWRlbnRpZmllciB8fCB0aGlzLl9lbnZFeHBsaWNpdGx5U2V0O1xuICAgICAgICAgICAgdXNlUHJldmlldyA9IHByZXZpZXcgPT09IHRydWUgPyB0cnVlIDogKHByZXZpZXcgPT09IGZhbHNlID8gZmFsc2UgOiAhaGFzRWZmZWN0aXZlRW52KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGVudiwgdXNlUHJldmlldywgY2FjaGVLZXk6IGAke2NvbXBvbmVudElkfToke2Vudn06JHt1c2VQcmV2aWV3ID8gJ3ByZXZpZXcnIDogJ2xpdmUnfWAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWVkIGFuIGFscmVhZHktcmVzb2x2ZWQgY29tcG9uZW50IGNvbmZpZyBpbnRvIHRoZSBjYWNoZSwgd2l0aG91dCBhbnlcbiAgICAgKiBuZXR3b3JrIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBUaGUgY291bnRlcnBhcnQgdG8ge0BsaW5rIGZldGNoQ29tcG9uZW50VjJ9OiB1c2UgaXQgd2hlbiB0aGUgY29uZmlnIHdhc1xuICAgICAqIHJlc29sdmVkIHNvbWV3aGVyZSBlbHNlIFx1MjAxNCBtb3N0IG9mdGVuIG9uIGEgc2VydmVyLCB0aGVuIGVtYmVkZGVkIGluIHRoZVxuICAgICAqIHBhZ2UgXHUyMDE0IHNvIHRoZSBicm93c2VyIGNhbiByZW5kZXIgdGhlIGNvbXBvbmVudCB3aXRoIG5vIHJvdW5kIHRyaXAuXG4gICAgICpcbiAgICAgKiBBZnRlciBoeWRyYXRpbmcsIGBmZXRjaENvbXBvbmVudFYyYCwgYGdldFJlc29sdmVkQ29uZmlnYCBhbmQgYGlzUHJlbG9hZGVkYFxuICAgICAqIGFsbCBhbnN3ZXIgZm9yIHRoaXMgY29tcG9uZW50IGZyb20gbWVtb3J5LlxuICAgICAqXG4gICAgICogUGFzcyB0aGUgc2FtZSBgZW52YCAvIGBwcmV2aWV3YCB0aGUgY29uZmlnIHdhcyByZXNvbHZlZCB3aXRoOyB0aGUgZGVmYXVsdHNcbiAgICAgKiBtYXRjaCB3aGF0IGEgcGxhaW4gYGZldGNoQ29tcG9uZW50VjIoY29tcG9uZW50SWQpYCB3b3VsZCBoYXZlIHVzZWQuXG4gICAgICovXG4gICAgaHlkcmF0ZUNvbXBvbmVudChjb21wb25lbnRJZDogc3RyaW5nLCBjb25maWc6IElDb21wb25lbnRDb25maWcsIGVudj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgeyBlbnY6IHJlc29sdmVkRW52LCB1c2VQcmV2aWV3LCBjYWNoZUtleSB9ID0gdGhpcy5yZXNvbHZlUGFyYW1zKGNvbXBvbmVudElkLCBlbnYsIHByZXZpZXcpO1xuXG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoY29uZmlnKSBhcyBQcm9taXNlPElDb21wb25lbnRDb25maWc+ICYgeyByZXNvbHZlZD86IElDb21wb25lbnRDb25maWcgfTtcbiAgICAgICAgLy8gVGFnIGl0IHRoZSBzYW1lIHdheSBmZXRjaENvbXBvbmVudFYyIGRvZXMsIHNvIGdldFJlc29sdmVkQ29uZmlnIGNhblxuICAgICAgICAvLyByZWFkIGl0IHN5bmNocm9ub3VzbHkuXG4gICAgICAgIHByb21pc2UucmVzb2x2ZWQgPSBjb25maWc7XG5cbiAgICAgICAgdGhpcy52YXJpYW50c1tjYWNoZUtleV0gPSBwcm9taXNlO1xuICAgICAgICB0aGlzLnByZWxvYWRlZENvbXBvbmVudHNbY29tcG9uZW50SWRdID0geyBlbnY6IHJlc29sdmVkRW52LCBwcmV2aWV3OiB1c2VQcmV2aWV3IH07XG4gICAgfVxuXG4gICAgLy8gPT09PT09PT09PT09IFYxIE1ldGhvZHMgKExlZ2FjeSkgPT09PT09PT09PT09XG5cbiAgICAvKipcbiAgICAgKiBGZXRjaCBhIHYxIGNvbXBvbmVudCBmcm9tIGEgZmxvd1xuICAgICAqL1xuICAgIGFzeW5jIGZldGNoQ29tcG9uZW50VjEoY29tcG9uZW50SWQ6IHN0cmluZywgZmxvd0lkPzogc3RyaW5nKSB7XG4gICAgICAgIGlmIChmbG93SWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZsb3cgPSBhd2FpdCB0aGlzLmZldGNoRmxvdyhmbG93SWQpO1xuICAgICAgICAgICAgcmV0dXJuIGZsb3cuY29tcG9uZW50cy5maW5kKGMgPT4gYy50eXBlLmlkID09PSBjb21wb25lbnRJZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBmbG93ID0gYXdhaXQgdGhpcy5mZXRjaEF1dG9GbG93KGNvbXBvbmVudElkKTtcbiAgICAgICAgICAgIHJldHVybiBmbG93LmNvbXBvbmVudHNbMF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBmZXRjaEF1dG9GbG93KGNvbXBvbmVudElkOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLnVzZXJGbG93c1tjb21wb25lbnRJZF0pIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICAgICAgICB0aGlzLnVzZXJGbG93c1tjb21wb25lbnRJZF0gPSBuZXcgUHJvbWlzZShcbiAgICAgICAgICAgICAgICBhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHt0aGlzLl9iYXNlVXJsfS9mbG93P2lkPSR7Y29tcG9uZW50SWR9JmF1dG89dHJ1ZWBcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoanNvbi5pdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMudXNlckZsb3dzW2NvbXBvbmVudElkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy51c2VyRmxvd3NbY29tcG9uZW50SWRdO1xuICAgIH1cblxuICAgIGFzeW5jIGZldGNoRmxvdyhmbG93SWQ6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMudXNlckZsb3dzW2Zsb3dJZF0pIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICAgICAgICB0aGlzLnVzZXJGbG93c1tmbG93SWRdID0gbmV3IFByb21pc2UoXG4gICAgICAgICAgICAgICAgYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5fYmFzZVVybH0vZmxvdz9pZD0ke2Zsb3dJZH0mcmVzb2x2ZT1jb21wb25lbnRzYFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShqc29uLml0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy51c2VyRmxvd3NbZmxvd0lkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy51c2VyRmxvd3NbZmxvd0lkXTtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT0gQmFja3dhcmQgQ29tcGF0aWJpbGl0eSA9PT09PT09PT09PT1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSBmZXRjaENvbXBvbmVudFYyIG9yIGZldGNoQ29tcG9uZW50VjEgZXhwbGljaXRseVxuICAgICAqIERlZmF1bHRzIHRvIHYxIGJlaGF2aW9yIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgY29kZVxuICAgICAqL1xuICAgIGFzeW5jIGZldGNoQ29tcG9uZW50KGNvbXBvbmVudElkOiBzdHJpbmcsIGZsb3dJZD86IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaENvbXBvbmVudFYxKGNvbXBvbmVudElkLCBmbG93SWQpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgQ2xvdWRSZXBvc2l0b3J5IGluc3RlYWRcbiAqL1xuZXhwb3J0IGNvbnN0IHYyX0Nsb3VkUmVwb3NpdG9yeSA9IENsb3VkUmVwb3NpdG9yeTtcbiIsICJpbXBvcnQgeyBDbG91ZFJlcG9zaXRvcnkgfSBmcm9tIFwiLi9DbG91ZFJlcG9zaXRvcnlcIjtcbmltcG9ydCB7IElDb21wb25lbnRDb25maWcgfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmxldCBfY2xvdWRSZXBvc2l0b3J5ID0gQ2xvdWRSZXBvc2l0b3J5Lk1haW47XG5cbmV4cG9ydCBjb25zdCBnZXRDbG91ZFJlcG9zaXRvcnkgPSAoKSA9PiBfY2xvdWRSZXBvc2l0b3J5O1xuXG5leHBvcnQgY29uc3QgaXNQcmVsb2FkZWQgPSAoY29tcG9uZW50SWQ6IHN0cmluZywgZW52Pzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbik6IGJvb2xlYW4gPT4ge1xuICAgIHJldHVybiBfY2xvdWRSZXBvc2l0b3J5LmlzUHJlbG9hZGVkKGNvbXBvbmVudElkLCBlbnYsIHByZXZpZXcpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFByZWxvYWRlZFBhcmFtcyA9IChjb21wb25lbnRJZDogc3RyaW5nKSA9PiB7XG4gICAgcmV0dXJuIF9jbG91ZFJlcG9zaXRvcnkuZ2V0UHJlbG9hZGVkUGFyYW1zKGNvbXBvbmVudElkKTtcbn07XG5cbmV4cG9ydCBjb25zdCBlbmFibGVMb2NhbERldiA9ICgpID0+IHtcbiAgICBfY2xvdWRSZXBvc2l0b3J5ID0gbmV3IENsb3VkUmVwb3NpdG9yeShcImh0dHA6Ly9sb2NhbGhvc3Q6OTI5MlwiKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRDbG91ZFJlcG9zaXRvcnlVcmwgPSAodXJsOiBzdHJpbmcpID0+IHtcbiAgICBfY2xvdWRSZXBvc2l0b3J5ID0gbmV3IENsb3VkUmVwb3NpdG9yeSh1cmwpO1xufTtcblxuLyoqXG4gKiBDb25maWd1cmUgdGhlIFNESyB0byBmZXRjaCBjb21wb25lbnRzIGZyb20gYSBzZWxmLWhvc3RlZCBzdGF0aWMgcmVnaXN0cnkgKFMzLCBDRE4sIGV0Yy4pXG4gKiBpbnN0ZWFkIG9mIHRoZSBNeW9wIGNsb3VkLiBDb21wb25lbnRzIGFyZSBzZXJ2ZWQgYXMgc3RhdGljIEpTT04gZmlsZXM6XG4gKiAgIGAke2NkblVybH0vY29tcG9uZW50cy8ke2NvbXBvbmVudElkfS8ke2Vudmlyb25tZW50fS5qc29uYFxuICovXG5leHBvcnQgY29uc3QgZW5hYmxlU2VsZkhvc3RlZCA9IChjZG5Vcmw6IHN0cmluZywgcXVlcnlQYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSA9PiB7XG4gICAgX2Nsb3VkUmVwb3NpdG9yeSA9IG5ldyBDbG91ZFJlcG9zaXRvcnkoY2RuVXJsKTtcbiAgICBfY2xvdWRSZXBvc2l0b3J5LmVuYWJsZVN0YXRpY01vZGUoKTtcbiAgICBpZiAocXVlcnlQYXJhbXMpIHtcbiAgICAgICAgX2Nsb3VkUmVwb3NpdG9yeS5zZXRRdWVyeVBhcmFtcyhxdWVyeVBhcmFtcyk7XG4gICAgfVxufTtcblxuLyoqXG4gKiBUSEUgT1BULUlOLiBPbmUgY2FsbCwgYW5kIG5vdGhpbmcgY2hhbmdlcyBmb3IgYW55b25lIHdobyBkb2VzIG5vdCBtYWtlIGl0LlxuICpcbiAqICAgbXlvcC5kZWxpdmVyeSh7IG1pbmlmeTogdHJ1ZSB9KTtcbiAqXG4gKiBPcHRpbmcgaW4gSVMgY2hvb3NpbmcgdGhlIGRlbGl2ZXJ5IGxhbmU6IGEgc2Vjb25kLCBjb21wbGV0ZSBNeW9wIHN0YWNrIChpdHMgb3duIHNlcnZlclxuICogYW5kIENETikgcmVhZGluZyB0aGUgc2FtZSBjb21wb25lbnQgZGF0YS4gU28gdGhpcyBjYWxsIGRvZXMgdHdvIHRoaW5ncyBhdCBvbmNlIFx1MjAxNCBpdFxuICogcG9pbnRzIGAvY29uc3VtZWAgYXQgdGhhdCBzdGFjayBhbmQgYXNrcyBpdCBmb3IgdGhlIG1pbmlmaWVkIGFydGlmYWN0IFx1MjAxNCB3aGljaCBpcyB3aHlcbiAqIHR1cm5pbmcgdGhlIGZlYXR1cmUgb2ZmIGlzIGEgY29uZmlnIHZhbHVlIG9uIG91ciBzaWRlIG9yIG9uZSBsaW5lIG9uIHlvdXJzLCBhbmQgbmV2ZXJcbiAqIGEgRE5TIGNoYW5nZS5cbiAqXG4gKiBTYWZldHkgcHJvcGVydGllcywgYWxsIGRlbGliZXJhdGU6XG4gKiAgIC0gSWYgdGhlIGxhbmUgZmFpbHMgKHRyYW5zcG9ydCBlcnJvciBvciA1eHgpLCB0aGUgU0RLIHJldHJpZXMgT05DRSBhZ2FpbnN0XG4gKiAgICAgY2xvdWQubXlvcC5kZXYgYW5kIHRoZSBwYWdlIHJlbmRlcnMgYW55d2F5LiBgZGVsaXZlcnkuc3RhdHMoKS5mZWxsQmFja2AgY291bnRzIGl0LlxuICogICAtIGBjYWNoZTogdHJ1ZWAgYWRkcyB0aGUgY2xpZW50IHdpbmRvdzogYSBjb21wb25lbnQgdGhpcyBicm93c2VyIGFscmVhZHkgaG9sZHMsIHN0aWxsXG4gKiAgICAgaW5zaWRlIHRoZSBmcmVzaG5lc3MgdGhlIHNlcnZlciBwcm9taXNlZCwgaXMgcmVuZGVyZWQgd2l0aCBOTyByZXF1ZXN0LiBPbmNlIHRoZVxuICogICAgIHdpbmRvdyBlbmRzIHRoZSBicm93c2VyIHNlbmRzIGJhY2sgdGhlIHZlcnNpb24gaXQgaG9sZHMgaW5zdGVhZCBvZiByZS1kb3dubG9hZGluZy5cbiAqICAgLSBBIHByZXZpZXcgaXMgbmV2ZXIgbWluaWZpZWQgYW5kIG5ldmVyIGNhY2hlZC5cbiAqICAgLSBPbmx5IC9jb25zdW1lIG1vdmVzLiBFdmVyeXRoaW5nIGVsc2Uga2VlcHMgdGhlIGhvc3QgaXQgaGFzIHRvZGF5LlxuICogICAtIEFza2luZyBmb3IgYG1pbmlmeWAgZG9lcyBub3QgZm9yY2UgaXQ6IHRoZSBzZXJ2ZXIgZGVjaWRlcyBwZXIgY29tcG9uZW50LCBhbmQgYVxuICogICAgIGNvbXBvbmVudCB0aGF0IGlzIG5vdCBlbmFibGVkIGlzIHNlcnZlZCByYXcsIHdoaWNoIGlzIG5vdCBhbiBlcnJvci5cbiAqXG4gKiBgaG9zdGAgaXMgZm9yIHVzIChhIHN0YWdpbmcgbGFuZSwgYSBsb2NhbCBzZXJ2ZXIpOyBsZWF2ZSBpdCBvdXQuXG4gKi9cbmV4cG9ydCBjb25zdCBERUxJVkVSWV9IT1NUID0gJ2h0dHBzOi8vZGVsaXZlcnkubXlvcC5kZXYnO1xuXG5leHBvcnQgY29uc3QgZGVsaXZlcnkgPSAob3B0czogeyBtaW5pZnk/OiBib29sZWFuOyBjYWNoZT86IGJvb2xlYW47IGhvc3Q/OiBzdHJpbmcgfCBudWxsIH0gPSB7fSkgPT4ge1xuICAgIGNvbnN0IHdhbnRzTGFuZSA9IG9wdHMubWluaWZ5ICE9PSBmYWxzZSB8fCBvcHRzLmNhY2hlID09PSB0cnVlO1xuICAgIF9jbG91ZFJlcG9zaXRvcnkuc2V0RGVsaXZlcnkoe1xuICAgICAgICBtaW5pZnk6IG9wdHMubWluaWZ5ID8/IGZhbHNlLFxuICAgICAgICBjYWNoZTogb3B0cy5jYWNoZSA/PyBmYWxzZSxcbiAgICAgICAgaG9zdDogb3B0cy5ob3N0ICE9PSB1bmRlZmluZWQgPyBvcHRzLmhvc3QgOiAod2FudHNMYW5lID8gREVMSVZFUllfSE9TVCA6IG51bGwpLFxuICAgIH0pO1xuICAgIHJldHVybiBkZWxpdmVyeVN0YXRzKCk7XG59O1xuXG4vKipcbiAqIEZvcmdldCB3aGF0IHRoaXMgYnJvd3NlciBob2xkcywgc28gdGhlIG5leHQgbG9hZCBhc2tzIHRoZSBzZXJ2ZXIuIFVzZSBpdCB3aGVuIGEgY2hhbmdlXG4gKiBoYXMgdG8gYmUgdmlzaWJsZSBvbiBUSElTIGxvYWQgXHUyMDE0IHJpZ2h0IGFmdGVyIHNvbWVvbmUgcHVibGlzaGVzIFx1MjAxNCByYXRoZXIgdGhhbiB3aXRoaW4gdGhlXG4gKiBmcmVzaG5lc3Mgd2luZG93LlxuICovXG5leHBvcnQgY29uc3QgZGVsaXZlcnlSZWZyZXNoID0gYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IF9jbG91ZFJlcG9zaXRvcnkucmVmcmVzaERlbGl2ZXJ5KCk7XG4gICAgcmV0dXJuIGRlbGl2ZXJ5U3RhdHMoKTtcbn07XG5cbi8qKlxuICogV2hhdCBhbnN3ZXJlZCB0aGUgbGFzdCByZXF1ZXN0cywgYW5kIFx1MjAxNCB0aGUgbnVtYmVyIHdvcnRoIHdhdGNoaW5nIFx1MjAxNCBob3cgbWFueSB0aW1lcyB0aGVcbiAqIFNESyBoYWQgdG8gZmFsbCBiYWNrIHRvIHRoZSBkZWZhdWx0IGhvc3QgYmVjYXVzZSB0aGUgbGFuZSBkaWQgbm90IGFuc3dlci5cbiAqL1xuZXhwb3J0IGNvbnN0IGRlbGl2ZXJ5U3RhdHMgPSAoKSA9PiBfY2xvdWRSZXBvc2l0b3J5LmRlbGl2ZXJ5U3RhdHMoKTtcblxuLyoqIFVuZG8gZGVsaXZlcnkoKTogYmFjayB0byB0aGUgZGVmYXVsdCBob3N0IGFuZCByYXcgYnl0ZXMsIHdpdGggbm8gcmVsb2FkLiAqL1xuZXhwb3J0IGNvbnN0IGRlbGl2ZXJ5T2ZmID0gKCkgPT4ge1xuICAgIF9jbG91ZFJlcG9zaXRvcnkuc2V0RGVsaXZlcnkoeyBtaW5pZnk6IGZhbHNlLCBjYWNoZTogZmFsc2UsIGhvc3Q6IG51bGwgfSk7XG4gICAgcmV0dXJuIGRlbGl2ZXJ5U3RhdHMoKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRDbG91ZFJlcG9zaXRvcnkgPSAocmVwb3NpdG9yeTogQ2xvdWRSZXBvc2l0b3J5KSA9PiB7XG4gICAgX2Nsb3VkUmVwb3NpdG9yeSA9IHJlcG9zaXRvcnk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0RW52aXJvbm1lbnQgPSAoZW52OiBzdHJpbmcpID0+IHtcbiAgICBfY2xvdWRSZXBvc2l0b3J5LnNldEVudmlyb25tZW50KGVudik7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UmVzb2x2ZWRDb25maWcgPSAoY29tcG9uZW50SWQ6IHN0cmluZywgZW52Pzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbikgPT4ge1xuICAgIHJldHVybiBfY2xvdWRSZXBvc2l0b3J5LmdldFJlc29sdmVkQ29uZmlnKGNvbXBvbmVudElkLCBlbnYsIHByZXZpZXcpO1xufTtcblxuZXhwb3J0IGNvbnN0IHByZWxvYWRDb21wb25lbnRzID0gYXN5bmMgKGlkczogc3RyaW5nW10sIGVudj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pID0+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgICBpZHMubWFwKChpZCkgPT4gX2Nsb3VkUmVwb3NpdG9yeS5mZXRjaENvbXBvbmVudFYyKGlkLCBlbnYsIHByZXZpZXcpKSxcbiAgICApO1xufTtcblxuLyoqXG4gKiBTZWVkIGFscmVhZHktcmVzb2x2ZWQgY29tcG9uZW50IGNvbmZpZ3MgaW50byB0aGUgU0RLIGNhY2hlLCB3aXRoIG5vIG5ldHdvcmtcbiAqIHJlcXVlc3QuIFRoZSBjb3VudGVycGFydCB0byB7QGxpbmsgcHJlbG9hZENvbXBvbmVudHN9LlxuICpcbiAqIFVzZSBpdCB3aGVuIHRoZSBjb25maWdzIHdlcmUgcmVzb2x2ZWQgc29tZXdoZXJlIGVsc2UgXHUyMDE0IHR5cGljYWxseSBvbiBhIHNlcnZlclxuICogYW5kIGVtYmVkZGVkIGluIHRoZSBwYWdlIFx1MjAxNCBzbyB0aGUgY29tcG9uZW50IHJlbmRlcnMgd2l0aCB6ZXJvIHJvdW5kIHRyaXBzOlxuICpcbiAqIGBgYHRzXG4gKiAvLyBzZXJ2ZXI6IGNvbnN0IGNvbmZpZ3MgPSB7IFtpZF06IGF3YWl0IG5ldyBDbG91ZFJlcG9zaXRvcnkoKS5mZXRjaENvbXBvbmVudFYyKGlkKSB9XG4gKiAvLyBjbGllbnQ6XG4gKiBoeWRyYXRlQ29tcG9uZW50cyhjb25maWdzKTtcbiAqIC8vIDxNeW9wQ29tcG9uZW50IGNvbXBvbmVudElkPXtpZH0gLz4gbm93IHJlbmRlcnMgd2l0aG91dCBmZXRjaGluZ1xuICogYGBgXG4gKlxuICogUGFzcyB0aGUgc2FtZSBgZW52YCAvIGBwcmV2aWV3YCB0aGUgY29uZmlncyB3ZXJlIHJlc29sdmVkIHdpdGg7IHRoZSBkZWZhdWx0c1xuICogbWF0Y2ggd2hhdCBhIHBsYWluIGBwcmVsb2FkQ29tcG9uZW50cyhbaWRdKWAgd291bGQgaGF2ZSB1c2VkLlxuICovXG5leHBvcnQgY29uc3QgaHlkcmF0ZUNvbXBvbmVudHMgPSAoXG4gICAgY29uZmlnczogUmVjb3JkPHN0cmluZywgSUNvbXBvbmVudENvbmZpZz4sXG4gICAgZW52Pzogc3RyaW5nLFxuICAgIHByZXZpZXc/OiBib29sZWFuLFxuKSA9PiB7XG4gICAgZm9yIChjb25zdCBbaWQsIGNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlncykpIHtcbiAgICAgICAgX2Nsb3VkUmVwb3NpdG9yeS5oeWRyYXRlQ29tcG9uZW50KGlkLCBjb25maWcsIGVudiwgcHJldmlldyk7XG4gICAgfVxufTtcbiIsICJpbXBvcnQge0Jhc2VDb250ZXh0TWVzc2FnZUhhbmRsZXIsIEhvc3RlZENvbXBvbmVudH0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5cbmV4cG9ydCB0eXBlIE1lc3NhZ2VUb0hvc3QgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSA9PiB2b2lkXG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSA9IGFueT4gZXh0ZW5kcyBCYXNlQ29udGV4dE1lc3NhZ2VIYW5kbGVyPFQsIFJlY29yZDxzdHJpbmcsIEhvc3RlZENvbXBvbmVudDxTaGFkb3dSb290UmVmPj4+IHtcblxuICAgIGFic3RyYWN0IG1lc3NhZ2VUeXBlOiBzdHJpbmdcblxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2VUb0hvc3Q6IGFueSwgcHVibGljIGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIEhvc3RlZENvbXBvbmVudDxTaGFkb3dSb290UmVmPj4pIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZVRvSG9zdCk7XG4gICAgfVxuXG4gICAgYWJzdHJhY3QgaW5uZXJFeGVjdXRvcjogKGV2ZW50OiBULCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB2b2lkO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IFQpID0+IHtcbiAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgaWYgKGV2ZW50LmRlc3RpbmF0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbiA9IGV2ZW50LmRlc3RpbmF0aW9uO1xuICAgICAgICAgICAgaWYgKHRoaXMuY29udGV4dFtkZXN0aW5hdGlvbl0uY29udGV4dCkge1xuXG4gICAgICAgICAgICAgICAgLy8gcGF0Y2ggdGhlIHNvdXJjZSBpZCwgdGhpbmsgYWJvdXQgdGhhdCA/XG4gICAgICAgICAgICAgICAgY29uc3QgX21lc3NhZ2VUb0hvc3QgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3Qoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4ubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZXZlbnQuZGVzdGluYXRpb24gPyBldmVudC5kZXN0aW5hdGlvbiA6IGV2ZW50LnNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uOiBldmVudC5zb3VyY2UgPyBldmVudC5zb3VyY2UgOiBldmVudC5kZXN0aW5hdGlvblxuICAgICAgICAgICAgICAgICAgICB9IGFzIEJhc2VNeW9wTWVzc2FnZSwgcmVwbGF5VG8pXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5uZXJFeGVjdXRvcihldmVudCwgdGhpcy5jb250ZXh0W2Rlc3RpbmF0aW9uXS5jb250ZXh0LCBfbWVzc2FnZVRvSG9zdCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IG15b3BBdHRyaWJ1dGVzID0ge1xuICAgIGlkOiAnbXlvcC1pZCdcbn1cbiIsICJpbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzLnRzXCI7XG5pbXBvcnQge1JlZn0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5cbmV4cG9ydCBjb25zdCBnZXRFbGVtZW50c0J5UmVmID0gKHJlZjogUmVmLCBlbDogUGFyZW50Tm9kZSkgPT4ge1xuICAgIHJldHVybiBlbC5xdWVyeVNlbGVjdG9yQWxsKGBbJHtteW9wQXR0cmlidXRlcy5pZH09JyR7cmVmLnJlZkNvbmZpZy5zZWxlY3Rvcn0nXWApO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0Rmlyc3RFbGVtZW50QnlSZWYgPSAocmVmOiBSZWYsIGVsOiBQYXJlbnROb2RlKSA9PiB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBnZXRFbGVtZW50c0J5UmVmKHJlZiwgZWwpO1xuICAgIGlmIChlbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnRzLml0ZW0oMCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufSIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmluZENsaWNrTWVzc2FnZSwgQ2xpY2tSZXBsYXlNZXNzYWdlLCBNeW9wQmluZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIsIE1lc3NhZ2VUb0hvc3R9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBCaW5kT25DbGlja0hhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8QmluZENsaWNrTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQmluZENsaWNrTWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IEJpbmRDbGlja01lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KVxuICAgICAgICBjb25zdCBjbGVhbnVwVGFza3M6IGFueVtdID0gW107XG5cbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgQ2xpY2tSZXBsYXlNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCkpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZXIpO1xuICAgICAgICAgICAgY2xlYW51cFRhc2tzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5mb3JFYWNoKHRhc2sgPT4gdGFzaygpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7TXlvcEVsZW1lbnRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlVGV4dEhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8TXlvcEVsZW1lbnRNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5DaGFuZ2VUZXh0TWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IE15b3BFbGVtZW50TWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZikgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS50ZXh0Q29udGVudCA9IGV2ZW50LmNvbnRlbnQ7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7Um9vdFJlZn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5leHBvcnQgY2xhc3MgU2hhZG93Um9vdFJlZiBleHRlbmRzIFJvb3RSZWYge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBwdWJsaWMgc2hhZG93Um9vdDogU2hhZG93Um9vdCkge1xuICAgICAgICBzdXBlcihjb250YWluZXIsIHNoYWRvd1Jvb3QpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BFbGVtZW50UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlLCBEZXRlY3RNeW9wUmVmc01lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5cbmV4cG9ydCBjbGFzcyBEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPERldGVjdE15b3BSZWZzTWVzc2FnZT4ge1xuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IERldGVjdE15b3BSZWZzTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZikgPT4ge1xuXG4gICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgIGNvbnN0IGFsbE15b3BJdGVtcyA9IHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKGBbJHtteW9wQXR0cmlidXRlcy5pZH1dYCk7XG5cbiAgICAgICAgbGV0IG15b3BSZWZzOiBNeW9wRWxlbWVudFJlZltdID0gW107XG5cbiAgICAgICAgYWxsTXlvcEl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG5cbiAgICAgICAgICAgIC8vIFRPRE8gOiB0YWtlIHRoYXQgYmFjayB0byB0aGUgZGFzaGJvYXJkP1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhpdGVtLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTtcblxuICAgICAgICAgICAgY29uc3QgbXlvcElkID0gaXRlbS5nZXRBdHRyaWJ1dGUobXlvcEF0dHJpYnV0ZXMuaWQpO1xuXG4gICAgICAgICAgICBpZiAobXlvcElkKSB7XG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnd2MgcmVjdCcsICBpdGVtLnBhcmVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIG15b3BSZWZzLnB1c2gobmV3IE15b3BFbGVtZW50UmVmKG15b3BJZCwgaXRlbS50YWdOYW1lLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBpdGVtLm9mZnNldFRvcCwgaXRlbS5vZmZzZXRMZWZ0KSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IERldGVjdGVkTXlvcFJlZnNNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgbXlvcFJlZnMpKVxuICAgIH07XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5EZXRlY3RNeW9wUmVmc01lc3NhZ2U7XG5cblxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXRBdHRyaWJ1dGVNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWYudHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3Mgc2V0QXR0cmlidXRlSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxTZXRBdHRyaWJ1dGVNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRBdHRyaWJ1dGVNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogU2V0QXR0cmlidXRlTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZikgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5zZXRBdHRyaWJ1dGUoZXZlbnQubmFtZSwgZXZlbnQudmFsdWUpXG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtcbiAgICBBZGRFdmVudExpc3RlbmVyTWVzc2FnZSxcbiAgICBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlLFxufSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWYudHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuZXhwb3J0IGNsYXNzIEFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5BZGRFdmVudExpc3RlbmVyTWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG5cbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KTtcbiAgICAgICAgY29uc3QgY2xlYW51cFRhc2tzOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuXG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKGUpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBpbiBmYWN0IHdoZW4gcnVubmluZyBpbiBXZWJDb21wb25lbnQgd2UgY2FuIHRyYW5zZmVyIHRoZSBvcmlnaW5hbCBlXG4gICAgICAgICAgICAgICAgLy8gY3VycmVudGx5IHVzaW5nIG1ha2VTZXJpYWxpemFibGUgZm9yIG5lc3RlZCBjYXNlcywgdGhpbmsgYWJvdXQgdGhhdFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCAgbWFrZVNlcmlhbGl6YWJsZShlLCBldmVudC5zZXJpYWxpemFibGVTa2VsZXRvbikpKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcihldmVudC50eXBlLCBoYW5kbGVyKTtcblxuICAgICAgICAgICAgY2xlYW51cFRhc2tzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudC50eXBlLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MuZm9yRWFjaCh0YXNrID0+IHRhc2soKSlcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHNcIjtcbmltcG9ydCB7SG9zdFNES30gZnJvbSBcIi4uLy4uL2hvc3QvaG9zdFNES1wiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLCBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi8uLi9ob3N0XCI7XG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuXG4gICAgICAgIGNvbnN0IGNyZWF0ZVJlZiA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIC8vY29uc3QgYWxsSXRlbXMgPSBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oYFske215b3BBdHRyaWJ1dGVzLmlkfT0nJHtldmVudC5yZWY/LnJlZkNvbmZpZy5zZWxlY3Rvcn0nXWApO1xuICAgICAgICAgICAgY29uc3QgYWxsSXRlbXMgPSBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oYFske215b3BBdHRyaWJ1dGVzLmlkfT0nJHtldmVudC5yZWZDb25maWcuc2VsZWN0b3J9J11gKTtcblxuICAgICAgICAgICAgaWYgKGFsbEl0ZW1zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhvc3RTREsgPSBIb3N0U0RLLkluc3RhbmNlKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZWZDb21wb25lbnQgPSBob3N0U0RLLmNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT09IGV2ZW50Lm9wdGlvbnMuaWQpITtcbiAgICAgICAgICAgICAgICBpZiAocmVmQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vLy8+Pj4+XG4gICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vICBjb25zb2xlLmxvZyhgZmFpbGVkIHRvIGZpbmQgJHtldmVudC5vcHRpb25zLmlkfSBpbiBtZW0gc2NvcGVgLCBob3N0U0RLKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy93ZSBoYXZlIHRoZSByZWYgY29tcG9uZW50IGluIG91ciBIb3N0U0RLIChzYW1lIG1lbW9yeSB3aGVuIHVzaW5nIHdlYmNvbXBvbmVudClcbiAgICAgICAgICAgICAgICAvLyAgcmVmQ29tcG9uZW50LnBhcmVudCA9IGltcGxlbWVudGF0aW9uQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIC8vZGVsZXRlIHRoZSByZWYgY29tcG9uZW50XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBob3N0U0RLLmNvbXBvbmVudHMuaW5kZXhPZihyZWZDb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgaG9zdFNESy5jb21wb25lbnRzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2NyZWF0ZVJlZkNvbXBvbmVudCBjYWxsZWQgcmVtb3ZlZCB0ZW1wIHJlZiBjb21wb25lbnQnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdjcmVhdGVSZWZDb21wb25lbnQgY2FsbGVkIHVzaW5nIHRlbXAgcmVmIGNvbXBvbmVudCcpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGltcGxlbWVudGF0aW9uQ29tcG9uZW50ID0gYXdhaXQgaG9zdFNESy5sb2FkQ29tcG9uZW50KGV2ZW50Lm5lc3RlZENvbXBvbmVudENvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgYWxsSXRlbXMuaXRlbSgwKSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQub3B0aW9ucylcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IG5vIG5lZWQgdGhpcywgcGFzcyBvcHRpb25zIGZyb20gcGFyZW50XG4gICAgICAgICAgICAgICAgLy9pbXBsZW1lbnRhdGlvbkNvbXBvbmVudC5pZCA9IGV2ZW50LnByZWRlZmluZWRJZDtcbiAgICAgICAgICAgICAgICAvL3JlZkNvbXBvbmVudC5pZCArPSAnLic7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBub3QgcmVhbGx5IG5lZWRlZCA/XG4gICAgICAgICAgICAgICAgLy8gYXdhaXQgaW1wbGVtZW50YXRpb25Db21wb25lbnQuaW5pdGlhdGVkKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRSZWZDb25maWc6IGFueVtdID0gW107XG5cbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhpbXBsZW1lbnRhdGlvbkNvbXBvbmVudC5yZWZzKS5mb3JFYWNoKHJlZk5hbWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVmID0gaW1wbGVtZW50YXRpb25Db21wb25lbnQucmVmc1tyZWZOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgcmVmID0gcmVmLl9fbm9uUHJveGllZCB8fCByZWY7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKChyZWYgYXMgSU15b3BDb21wb25lbnQpLmNvbXBvbmVudERlZmluaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZFJlZkNvbmZpZy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudERlZmluaXRpb25JZDogKHJlZiBhcyBJTXlvcENvbXBvbmVudCkuY29tcG9uZW50RGVmaW5pdGlvbi5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgbmVzdGVkUmVmQ29uZmlnKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIC0gRE9NIGVsZW1lbnQgbm90IGZvdW5kJylcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgW10sIHRydWUpKTtcblxuICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY3JlYXRlUmVmKCkudGhlbigpXG4gICAgICAgIC8vcmV0dXJuaW5nIHVuZGVmaW5lZCBzbyBpdCB3b24ndCBhY3QgYXMgYSBjbGVhbnVwXG4gICAgfVxufVxuIiwgImltcG9ydCB7RXhlY3V0ZVNjcmlwdE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtSb290UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge21ha2VTZXJpYWxpemFibGV9IGZyb20gXCIuLi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmV4cG9ydCBjb25zdCBFeGVjdXRlU2NyaXB0SGFuZGxlckV4ZWN1dG9yID0gKGV2ZW50OiBFeGVjdXRlU2NyaXB0TWVzc2FnZSwgcmVwbGllcjogKGRhdGE6IGFueSkgPT4gdm9pZCwgcm9vdFJlZjogUm9vdFJlZikgPT4ge1xuICAgIGNvbnN0IF9fc2NyaXB0SW5wdXRzID0gZXZlbnQuc2NyaXB0SW5wdXRzID8gZXZlbnQuc2NyaXB0SW5wdXRzIDoge31cbiAgICBfX3NjcmlwdElucHV0cy5tYWtlU2VyaWFsaXphYmxlID0gbWFrZVNlcmlhbGl6YWJsZTtcblxuICAgIF9fc2NyaXB0SW5wdXRzLnNlbmQgPSByZXBsaWVyO1xuICAgIF9fc2NyaXB0SW5wdXRzLnJvb3RSZWYgPSByb290UmVmO1xuICAgIF9fc2NyaXB0SW5wdXRzLl9fc2NyaXB0SW5wdXRzID0gX19zY3JpcHRJbnB1dHM7XG5cbiAgICBjb25zdCBkeW5hbWljRnVuY3Rpb24gPSBuZXcgRnVuY3Rpb24oYHJldHVybiAoJHtldmVudC5zY3JpcHR9KSguLi5hcmd1bWVudHMpYCk7XG4gICAgY29uc3QgcmV0ID0gZHluYW1pY0Z1bmN0aW9uKF9fc2NyaXB0SW5wdXRzKTtcblxuICAgIC8vIGNvbnN0IGR5bmFtaWNGdW5jdGlvbiA9IEZ1bmN0aW9uKCdzZW5kJywgJ3Jvb3RSZWYnLCdfX3NjcmlwdElucHV0cycsIC4uLk9iamVjdC5rZXlzKF9fc2NyaXB0SW5wdXRzKSwgZXZlbnQuY29udGVudCA/IGV2ZW50LmNvbnRlbnQgOiAnJylcbiAgICAvL2NvbnN0IHJldCA9IGR5bmFtaWNGdW5jdGlvbihyZXBsaWVyLCByb290UmVmLCBfX3NjcmlwdElucHV0cywgLi4uT2JqZWN0LnZhbHVlcyhfX3NjcmlwdElucHV0cykpO1xuICAgIHJlcGxpZXIocmV0KTtcbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIsIE1lc3NhZ2VUb0hvc3R9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZi50c1wiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0SGFuZGxlckV4ZWN1dG9yfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9leGVjdXRlU2NyaXB0SGFuZGxlci50c1wiO1xuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZVNjcmlwdEhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8RXhlY3V0ZVNjcmlwdE1lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5FeGVjdXRlU2NyaXB0TWVzc2FnZVxuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogRXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHtcbiAgICAgICAgY29uc3QgcmVwbGllciA9IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBkYXRhKSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgRXhlY3V0ZVNjcmlwdEhhbmRsZXJFeGVjdXRvcihldmVudCwgcmVwbGllciwgc2hhZG93Um9vdFJlZik7XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlLCBGb3JtRGF0YUVudHJ5LCBHZXRFbGVtZW50VmFsdWVNZXNzYWdlLCBJbnB1dEVsZW1lbnRWYWx1ZSx9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIsIE1lc3NhZ2VUb0hvc3R9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZi50c1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzLnRzXCI7XG5pbXBvcnQge21ha2VTZXJpYWxpemFibGV9IGZyb20gXCIuLi8uLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5jb25zdCBnZXRJbnB1dFZhbHVlID0gKGVsZW1lbnQpOiBJbnB1dEVsZW1lbnRWYWx1ZSA9PiB7XG4gICAgaWYgKCFlbGVtZW50KSByZXR1cm4gbnVsbDtcblxuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBmb3JtXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ0ZPUk0nKSB7XG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBkYXRhT2JqZWN0OiBJbnB1dEVsZW1lbnRWYWx1ZSA9IHtcbiAgICAgICAgICAgIGZvcm1EYXRhOiB7fSxcbiAgICAgICAgICAgIHVubWFwcGVkRGF0YTogW11cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBNYW51YWxseSBhZGQgZWxlbWVudHMgd2l0aG91dCBuYW1lc1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEnKTtcbiAgICAgICAgbGV0IGF1dG9OYW1lSW5kZXhlciA9IC0xO1xuXG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXlvcElkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUobXlvcEF0dHJpYnV0ZXMuaWQpO1xuICAgICAgICAgICAgICAgIGxldCBrZXkgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnbmFtZScpO1xuXG4gICAgICAgICAgICAgICAgLy8gYF8keygrK2F1dG9OYW1lSW5kZXhlcil9YFxuXG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZURhdGE6IEZvcm1EYXRhRW50cnkgPSB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBlbGVtZW50LmlkLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBrZXksXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBnZXRJbnB1dFZhbHVlKGVsZW1lbnQpLFxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogZWxlbWVudC5yZXF1aXJlZCxcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRpdHk6IG1ha2VTZXJpYWxpemFibGUoZWxlbWVudC52YWxpZGl0eSwgdHJ1ZSksXG4gICAgICAgICAgICAgICAgICAgIG15b3BJZCxcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgaWYgKCFrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2gobm9kZURhdGEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XS52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKG5vZGVEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2goZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSA9IG5vZGVEYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldID0gbm9kZURhdGFcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGRhdGFPYmplY3Q7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhIGNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvblxuICAgIGlmIChlbGVtZW50LnR5cGUgPT09ICdjaGVja2JveCcgfHwgZWxlbWVudC50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmNoZWNrZWQgPyBlbGVtZW50LnZhbHVlIDogbnVsbDtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgaW5wdXQgYW5kIHRleHRhcmVhIGVsZW1lbnRzXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ0lOUFVUJyB8fCBlbGVtZW50LnRhZ05hbWUgPT09ICdURVhUQVJFQScpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQudmFsdWU7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHNlbGVjdCBlbGVtZW50cyAoZHJvcGRvd25zKVxuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdTRUxFQ1QnKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbHVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBlZGl0YWJsZSBkaXZzIChjb250ZW50RWRpdGFibGUpXG4gICAgaWYgKGVsZW1lbnQuaXNDb250ZW50RWRpdGFibGUpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuaW5uZXJUZXh0IHx8IGVsZW1lbnQudGV4dENvbnRlbnQ7XG4gICAgfVxuXG4gICAgLy8gSWYgaXQncyBhbiB1bnN1cHBvcnRlZCBlbGVtZW50IHR5cGVcbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGNsYXNzIEdldEVsZW1lbnRWYWx1ZUhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8R2V0RWxlbWVudFZhbHVlTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuR2V0RWxlbWVudFZhbHVlTWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IEVsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UoZ2V0SW5wdXRWYWx1ZShpdGVtKSksIGV2ZW50KTtcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NldElubmVySHRtbH0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge015b3BFbGVtZW50TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIFNldElubmVySHRtbEhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8U2V0SW5uZXJIdG1sPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRJbm5lckh0bWw7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBNeW9wRWxlbWVudE1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGl0ZW0uaW5uZXJIVE1MID0gZXZlbnQuY29udGVudDtcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqIFRoZSBXZWJjb21wb25lbnQgU0RLIGlzIHRhaWxvcmVkIGZvciB1c2luZyBNeW9wIGNvbXBvbmVudHMgcGFja2FnZWQgYXMgc2VwYXJhdGUgYnVuZGxlcyBhbmQgZXhwb3NlZCBhcyB3ZWIgY29tcG9uZW50cy48YnIvPlxuICogRGV2ZWxvcGVycyBpbXBvcnRpbmcgdGhpcyBTREsgY2FuIGxldmVyYWdlIEFQSXMgYW5kIHV0aWxpdGllcyBzcGVjaWZpY2FsbHkgY3JhZnRlZCB0byBzdXBwb3J0IHRoZSBsaWZlY3ljbGUgbWFuYWdlbWVudCBhbmQgY29tbXVuaWNhdGlvbiBwYXR0ZXJucyByZXF1aXJlZCBmb3Igd2ViIGNvbXBvbmVudHMgd2l0aGluIHRoZSBNeW9wIGFyY2hpdGVjdHVyZS48YnIvPlxuICogVGhpcyBTREsgcHJvbW90ZXMgcmV1c2FiaWxpdHkgYW5kIGVuY2Fwc3VsYXRpb24sIGVuYWJsaW5nIGRldmVsb3BlcnMgdG8gYnVpbGQgbW9kdWxhciwgc2VsZi1jb250YWluZWQgY29tcG9uZW50cyB0aGF0IGNhbiBiZSBzZWFtbGVzc2x5IGludGVncmF0ZWQgaW50byB0aGUgaG9zdCBhcHBsaWNhdGlvbidzIERPTSBzdHJ1Y3R1cmUuXG4gKlxuICpcbiAqIE9uY2UgbG9hZGVkIHRoZSBgUm9vdFNES2AsIHlvdSBjYW4gbG9hZCB0aGUgYElmcmFtZVNES2BcbiAqIGBgYGpzXG4gKiBjb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IChhd2FpdCB3aW5kb3cubXlvcC5yb290U0RLLmdldFdlYmNvbXBvbmVudE1vZHVsZSgpKTtcbiAqIGBgYFxuICogb3JcbiAqIGBgYHRzXG4gKiBpbXBvcnQge2dldFdlYmNvbXBvbmVudE1vZHVsZX0gZnJvbSAnQG15b3Avc2RrJztcbiAqIGNvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gKGF3YWl0IGdldFdlYmNvbXBvbmVudE1vZHVsZSgpKTtcbiAqIGBgYFxuICogb3JcbiAqIGBgYHRzXG4gKiBpbXBvcnQge1dlYkNvbXBvbmVudFNES30gZnJvbSAnQG15b3Avc2RrL3dlYmNvbXBvbmVudCc7XG4gKiBgYGBcbiAqXG4gKi9cbmltcG9ydCB7QmFzZU15b3BTREt9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtteW9wV2ViY29tcG9uZW50Q29uc3RzfSBmcm9tIFwiLi9jb25zdHNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge0JpbmRPbkNsaWNrSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlclwiO1xuaW1wb3J0IHtDaGFuZ2VUZXh0SGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2NoYW5nZVRleHRIYW5kbGVyXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7RGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7ZGVmaW5lRHluYW1pY0ltcG9ydH0gZnJvbSBcIi4uL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydFwiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsXG4gICAgSW5pdE1lc3NhZ2UsXG4gICAgSW5pdFJlcXVlc3QsXG4gICAgTWVzc2FnZURpcmVjdGlvbixcbiAgICBNeW9wQmluZE1lc3NhZ2UsXG4gICAgTXlvcEJpbmRSZXBsYXlNZXNzYWdlXG59IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtzZXRBdHRyaWJ1dGVIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvc2V0QXR0cmlidXRlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtBZGRFdmVudExpc3RlbmVySGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyLnRzXCI7XG5pbXBvcnQge0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9leGVjdXRlU2NyaXB0SGFuZGxlci50c1wiO1xuaW1wb3J0IHtHZXRFbGVtZW50VmFsdWVIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvR2V0RWxlbWVudFZhbHVlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTZXRJbm5lckh0bWxIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvc2V0SW5uZXJIdG1sSGFuZGxlci50c1wiO1xuXG4vKipcbiAqIFRoZSBXZWJjb21wb25lbnQgU0RLIGlzIHRhaWxvcmVkIGZvciB1c2luZyBNeW9wIGNvbXBvbmVudHMgcGFja2FnZWQgYXMgc2VwYXJhdGUgYnVuZGxlcyBhbmQgZXhwb3NlZCBhcyB3ZWIgY29tcG9uZW50cy48YnIvPlxuICogRGV2ZWxvcGVycyBpbXBvcnRpbmcgdGhpcyBTREsgY2FuIGxldmVyYWdlIEFQSXMgYW5kIHV0aWxpdGllcyBzcGVjaWZpY2FsbHkgY3JhZnRlZCB0byBzdXBwb3J0IHRoZSBsaWZlY3ljbGUgbWFuYWdlbWVudCBhbmQgY29tbXVuaWNhdGlvbiBwYXR0ZXJucyByZXF1aXJlZCBmb3Igd2ViIGNvbXBvbmVudHMgd2l0aGluIHRoZSBNeW9wIGFyY2hpdGVjdHVyZS48YnIvPlxuICogVGhpcyBTREsgcHJvbW90ZXMgcmV1c2FiaWxpdHkgYW5kIGVuY2Fwc3VsYXRpb24sIGVuYWJsaW5nIGRldmVsb3BlcnMgdG8gYnVpbGQgbW9kdWxhciwgc2VsZi1jb250YWluZWQgY29tcG9uZW50cyB0aGF0IGNhbiBiZSBzZWFtbGVzc2x5IGludGVncmF0ZWQgaW50byB0aGUgaG9zdCBhcHBsaWNhdGlvbidzIERPTSBzdHJ1Y3R1cmUuXG4gKlxuICpcbiAqIE9uY2UgbG9hZGVkIHRoZSBgUm9vdCBTREtgLCB5b3UgY2FuIGxvYWQgdGhlIGBJZnJhbWVTREtgXG4gKiBgYGBqc1xuICogY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSAoYXdhaXQgd2luZG93Lm15b3Aucm9vdFNESy5nZXRXZWJjb21wb25lbnRNb2R1bGUoKSk7XG4gKiBgYGBcbiAqIG9yXG4gKiBgYGB0c1xuICogaW1wb3J0IHtnZXRXZWJjb21wb25lbnRNb2R1bGV9IGZyb20gJ0BteW9wL3Nkayc7XG4gKiBjb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IChhd2FpdCBnZXRXZWJjb21wb25lbnRNb2R1bGUoKSk7XG4gKiBgYGBcbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJDb21wb25lbnRTREsgZXh0ZW5kcyBCYXNlTXlvcFNESyB7XG5cbiAgICBhbHdheXNQYXNzRW52ZWxvcGVzVG9Ib3N0ID0gdHJ1ZTtcblxuICAgIC8vd2hlbiBuZXcgd2ViIGNvbXBvbmVudCBjcmVhdGVkLlxuICAgIGNvbm5lY3RlZENhbGxiYWNrID0gKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHNoYWRvdzogU2hhZG93Um9vdCkgPT4ge1xuICAgICAgICBjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihteW9wV2ViY29tcG9uZW50Q29uc3RzLndlYmNvbXBvbmVudF9tZXNzYWdlX2tleSwgKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50Q29udGVudCA9IGUuZGF0YSA/IGUuZGF0YSA6IGUuZGV0YWlsO1xuICAgICAgICAgICAgaWYgKCFldmVudENvbnRlbnQgfHwgIWV2ZW50Q29udGVudC5teW9wKSB7XG4gICAgICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZWN2aWVkIHdlYmNvbXBvbmVudF9tZXNzYWdlIHdpdGggd3JvbmcgdHlwZScpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBldmVudENvbnRlbnQgYXMgQmFzZU15b3BNZXNzYWdlO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogc2VuZCBjb250YWluZXIgLyBjb21wb2VubnQgaWRlbnRpZmllciBmb3IgbXVsdGlsIGNvbXBvbmVudHMgc3VwcG9ydFxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlSW5jb21lTWVzc2FnZXMoZSlcblxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW5pdE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdDb21wb25lbnRJZCA9IChtZXNzYWdlIGFzIEluaXRNZXNzYWdlKS5jb250ZW50LmlkO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHNbbmV3Q29tcG9uZW50SWRdLmNvbnRleHQgPSBuZXcgU2hhZG93Um9vdFJlZihjb250YWluZXIsIHNoYWRvdylcblxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnN1cHBvcnRlZEhhbmRsZXJzLmZvckVhY2goaGFuZGxlciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBoYW5kbGVyLmNvbnRleHQgPSB0aGlzLnNoYWRvd1Jvb3RzO1xuICAgICAgICAgICAgICAgICAgICAvLyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgLy9UT0RPIDogZml4IHRoYXQgaGFjay4gcmFjZSBjb25kaXRpb24gd2l0aCBob3N0LmxvYWQgd2hlbiBtb2R1bGUgbG9hZGVkXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBJbml0UmVxdWVzdCgpKVxuICAgICAgICB9LCAxKVxuICAgIH1cblxuICAgIG1lc3NhZ2VUb0hvc3QgPSAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4ge1xuICAgICAgICBtZXNzYWdlLmRpcmVjdGlvbiA9IE1lc3NhZ2VEaXJlY3Rpb24udXBcbiAgICAgICAgLy9tZXNzYWdlLnJlcGxheVRvSGFuZGxlciA9IHJlcGxheVRvPy5oYW5kbGVyVW5pcXVlSWQ7XG5cbiAgICAgICAgaWYgKCFtZXNzYWdlLnJlcGxheVRvSGFuZGxlciAmJiByZXBsYXlUbz8uaGFuZGxlclVuaXF1ZUlkKVxuICAgICAgICAgICAgbWVzc2FnZS5yZXBsYXlUb0hhbmRsZXIgPSByZXBsYXlUby5oYW5kbGVyVW5pcXVlSWRcblxuICAgICAgICB3aW5kb3cubXlvcC5ob3N0U0RLLnNlbmQobWVzc2FnZSlcbiAgICB9XG5cbiAgICBzdXBwb3J0ZWRIYW5kbGVyczogQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyW10gPSBbXG4gICAgICAgIG5ldyBDaGFuZ2VUZXh0SGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBTZXRJbm5lckh0bWxIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IEJpbmRPbkNsaWNrSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IHNldEF0dHJpYnV0ZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgQWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgRXhlY3V0ZVNjcmlwdEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgR2V0RWxlbWVudFZhbHVlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIC8vXG4gICAgICAgIG5ldyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cylcbiAgICBdO1xuXG4gICAgcHVibGljIGluaXQgPSAoKSA9PiB7XG4gICAgICAgIC8vdGhpcy5teUNvbXBvbmVudElkXG4gICAgICAgIC8vdGhpcy5oYW5kbGVJbmNvbWVNZXNzYWdlc1xuICAgIH1cbn1cblxuZGVmaW5lRHluYW1pY0ltcG9ydCgnV2ViQ29tcG9uZW50U0RLJywgV2ViQ29tcG9uZW50U0RLKTtcbiIsICJleHBvcnQgKiBmcm9tIFwiLi9XZWJDb21wb25lbnRTREtcIjtcbiIsICJpbXBvcnQge015b3BXZWJDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL215b3BXZWJjb21wb25lbnRcIjtcbmltcG9ydCB7TXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudFwiO1xuaW1wb3J0IHtCYXNlTXlvcExvYWRlcn0gZnJvbSBcIi4vSU15b3BMb2FkZXJcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREsudHNcIjtcbmltcG9ydCB7dXVpZHY0fSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHMudHNcIjtcbmltcG9ydCB7XG4gICAgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgSUhUTUxMb2FkZXJDb25maWcsXG4gICAgSVNraW5Db25maWcsIFNoYWRvd1Jvb3RNb2RlVHlwZSxcbiAgICBTa2luTG9hZGVycyxcbiAgICBSZW5kZXJNb2RlLCBSZW5kZXJQb2xpY3lcbn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtXZWJDb21wb25lbnRTREt9IGZyb20gXCIuLi8uLi93ZWJjb21wb25lbnRcIjtcbmltcG9ydCB7TXlvcElmcmFtZUNvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbXlvcElmcmFtZUNvbXBvbmVudC50c1wiO1xuaW1wb3J0IHtFTUJFRERFRF9TREtfQ09OVEVOVCwgSEFTX0VNQkVEREVEX1NES30gZnJvbSBcIi4uL2VtYmVkZGVkU0RLLnRzXCI7XG4vL2ltcG9ydCB7Z2V0V2ViY29tcG9uZW50TW9kdWxlfSBmcm9tIFwiLi4vLi4vU0RLLnRzXCI7XG5cbmNvbnN0IE1ZT1BfV0VCX0NPTVBPTkVOVF9NQVJLRVIgPSAnPCEtLSBteW9wLXdlYi1jb21wb25lbnQgLS0+JztcbmNvbnN0IE1ZT1BfV0VCX0NPTVBPTkVOVF9TQ1JJUFRfSUQgPSAnbXlvcC13ZWItY29tcG9uZW50JztcblxuLy8gVHJhY2sgZXh0cmFjdGVkIHdlYiBjb21wb25lbnQgc2NyaXB0cyB0byBwcmV2ZW50IGRvdWJsZSByZWdpc3RyYXRpb24uXG4vLyBNYXBzIHNjcmlwdElkIC0+IHRoZSB0YWcgbmFtZSB0aGF0IHNjcmlwdCByZWdpc3RlcmVkLiBUaGUgdGFnIE1VU1QgYmUgcmVtZW1iZXJlZCBwZXJcbi8vIHNjcmlwdDogd2luZG93Ll9fTVlPUF9UQUdfTkFNRV9fIGlzIGEgc2luZ2xlIGdsb2JhbCBzbG90IHRoYXQgZXZlcnkgZXh0cmFjdGVkIGNvbXBvbmVudFxuLy8gb3ZlcndyaXRlcywgc28gb24gYSByZS1tb3VudCAoc2NyaXB0IHNraXBwZWQpIGl0IGhvbGRzIHdoaWNoZXZlciBjb21wb25lbnQgcmFuIGxhc3QuXG5jb25zdCBleHRyYWN0ZWRXZWJDb21wb25lbnRTY3JpcHRzOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xuXG5jb25zdCBzZWVuOiBzdHJpbmdbXSA9IFtdO1xubGV0IHNkaztcbmNvbnN0IGdldEluaXRpYXRlZFNkayA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAoIXNkaykge1xuICAgICAgICAvL2NvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gYXdhaXQgZ2V0V2ViY29tcG9uZW50TW9kdWxlKClcbiAgICAgICAgc2RrID0gbmV3IFdlYkNvbXBvbmVudFNESygpO1xuICAgICAgICBzZGsuaW5pdCgpO1xuICAgIH1cbiAgICByZXR1cm4gc2RrO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVIVE1MRWxlbWVudENvbnN0cnVjdG9yKGh0bWxTdHJpbmc6IHN0cmluZywgU2hhZG93Um9vdE1vZGU/OiBrZXlvZiB0eXBlb2YgU2hhZG93Um9vdE1vZGVUeXBlKTogbmV3ICgpID0+IEhUTUxFbGVtZW50IHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBIVE1MRWxlbWVudCB7XG5cbiAgICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICAgICAgICBjb25zdCBtb2RlID0gU2hhZG93Um9vdE1vZGUgPT09IFNoYWRvd1Jvb3RNb2RlVHlwZS5vcGVuID8gJ29wZW4nIDogJ2Nsb3NlZCc7XG4gICAgICAgICAgICBjb25zdCBzaGFkb3cgPSB0aGlzLmF0dGFjaFNoYWRvdyh7bW9kZX0pO1xuICAgICAgICAgICAgZ2V0SW5pdGlhdGVkU2RrKCkudGhlbigoc2RrKSA9PiB7XG4gICAgICAgICAgICAgICAgc2RrLmNvbm5lY3RlZENhbGxiYWNrKHRoaXMsIHNoYWRvdyk7XG4gICAgICAgICAgICAgICAgc2hhZG93LmlubmVySFRNTCA9IGh0bWxTdHJpbmdcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5jb25zdCBjcmVhdGVDdXN0b21XZWJDb21wb25lbnQgPSAoY29tcG9uZW50TmFtZTogc3RyaW5nLCBodG1sOiBzdHJpbmcsIFNoYWRvd1Jvb3RNb2RlPzoga2V5b2YgdHlwZW9mIFNoYWRvd1Jvb3RNb2RlVHlwZSkgPT4ge1xuICAgIGN1c3RvbUVsZW1lbnRzLmRlZmluZShjb21wb25lbnROYW1lLCBjcmVhdGVIVE1MRWxlbWVudENvbnN0cnVjdG9yKGh0bWwsIFNoYWRvd1Jvb3RNb2RlKSk7XG4gICAgY29uc29sZS5sb2coYGRlZmluZSgnJHtjb21wb25lbnROYW1lfScpIHdhcyBjYWxsZWQsIHdlYiBjb21wb25lbnQgcmVhZHkgdG8gdXNlYCk7XG59XG5cbmNvbnN0IHRvV2ViQ29tcG9uZW50TmFtZSA9IChzdHIpID0+IHtcbiAgICByZXR1cm4gc3RyXG4gICAgICAgIC5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCAnJDEtJDInKSAvLyBBZGQgaHlwaGVuIGJlZm9yZSB1cHBlcmNhc2UgbGV0dGVyc1xuICAgICAgICAucmVwbGFjZSgvKFxcZCspL2csICctJDEnKSAvLyBBZGQgaHlwaGVuIGJlZm9yZSBkaWdpdHNcbiAgICAgICAgLnRvTG93ZXJDYXNlKCk7IC8vIENvbnZlcnQgdG8gbG93ZXJjYXNlXG59XG5cbmNvbnN0IHRvQ3VzdG9tRWxlbWVudE5hbWUgPSAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgbmFtZSA9IHRvV2ViQ29tcG9uZW50TmFtZShuYW1lKTtcbiAgICByZXR1cm4gbmFtZS5yZXBsYWNlKC9fL2csICctJyk7XG59XG5cbmxldCBwYXJzZXI6IERPTVBhcnNlcjsgLy8gPSBuZXcgRE9NUGFyc2VyKCk7XG5cbmV4cG9ydCBjbGFzcyBIVE1MQ29tcG9uZW50TG9hZGVyIGV4dGVuZHMgQmFzZU15b3BMb2FkZXIge1xuXG4gICAgdHlwZSA9IFNraW5Mb2FkZXJzLkhUTUxMb2FkZXJcblxuICAgIC8qKlxuICAgICAqIERldGVjdCBpZiBIVE1MIGlzIGEgTXlvcCBXZWIgQ29tcG9uZW50LlxuICAgICAqXG4gICAgICogVEhFIE1BUktFUiBDT01NRU5UIEFMT05FIElTIE5PVCBBIFNBRkUgU0lHTkFMLCBCRUNBVVNFIE1JTklGSUVSUyBERUxFVEUgQ09NTUVOVFMuXG4gICAgICpcbiAgICAgKiBUaGlzIHVzZWQgdG8gYmUgYHN0YXJ0c1dpdGgoTVlPUF9XRUJfQ09NUE9ORU5UX01BUktFUilgIGFuZCBub3RoaW5nIGVsc2UuIFRoZVxuICAgICAqIGRlbGl2ZXJ5IGxhbmUgbWluaWZpZXMgd2l0aCBgcmVtb3ZlQ29tbWVudHM6IHRydWVgIChteW9wLXNlcnZlciBkZXJpdmUudHMgTUlOX0NGRyksXG4gICAgICogc28gdGhlIHN0b3JlZCBgbWluYCBhcnRpZmFjdCBvZiBldmVyeSB2MiB3ZWIgY29tcG9uZW50IGxvc2VzIGl0cyBsZWFkaW5nXG4gICAgICogYDwhLS0gbXlvcC13ZWItY29tcG9uZW50IC0tPmAuIERldGVjdGlvbiB0aGVuIHJldHVybmVkIGZhbHNlLCB0aGUgY29tcG9uZW50IGZlbGxcbiAgICAgKiBiYWNrIHRvIHBsYWluIGlmcmFtZSByZW5kZXJpbmcsIGFuZCB0aGUgd2hvbGUgYXV0aG9yZWQgZG9jdW1lbnQgd2FzIHNob3duIC0tXG4gICAgICogaW5jbHVkaW5nIHRoZSB2MiBhdXRob3Jpbmcgd3JhcHBlciwgc28gUGljLVRpbWUncyBwcm9kdWN0aW9uIGRhc2hib2FyZCBkaXNwbGF5ZWQgdGhlXG4gICAgICogcHJldmlldyBjaHJvbWUgKFwiV2ViIENvbXBvbmVudCB2MlwiLCBhIHRhZy1uYW1lIGJhZGdlIHJlYWRpbmcgYGxvYWRpbmcuLi5gLCBTSVpFIC9cbiAgICAgKiBPVkVSRkxPVyAvIEJHIGNvbnRyb2xzKSBpbnN0ZWFkIG9mIHRoZWlyIGNvbXBvbmVudC4gUmVwb3J0ZWQgMjAyNi0xMC0xODsgdGhlIHNlcnZlZFxuICAgICAqIEhUTUwgbWVhc3VyZWQgMzI4LDA3MSBieXRlcyBhZ2FpbnN0IDk1MSwxMzAgYXQgb3JpZ2luLCB3aXRoIHplcm8gYDwhLS1gIGxlZnQgaW4gaXQuXG4gICAgICpcbiAgICAgKiBUaGUgc2NyaXB0IGlkIGlzIHRoZSBzaWduYWwgdGhhdCBzdXJ2aXZlcywgYW5kIGl0IGlzIHRoZSBvbmUgYGV4dHJhY3RXZWJDb21wb25lbnRTY3JpcHRgXG4gICAgICogYWxyZWFkeSBkZXBlbmRzIG9uOiBpZiB0aGF0IGVsZW1lbnQgaXMgcHJlc2VudCwgZXh0cmFjdGlvbiB3b3Jrcywgc28gZGV0ZWN0aW9uXG4gICAgICogc2hvdWxkIGFncmVlLiBDaGVja2VkIHdpdGggYSByZWdleCByYXRoZXIgdGhhbiBET01QYXJzZXIgLS0gdGhpcyBydW5zIGZvciBldmVyeVxuICAgICAqIEhUTUwgY29tcG9uZW50LCBhbmQgcGFyc2luZyBhIDMwMCBLQiBkb2N1bWVudCB0byBhbnN3ZXIgYSB5ZXMvbm8gcXVlc3Rpb24gaXMgbm90XG4gICAgICogd29ydGggaXQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBpc015b3BXZWJDb21wb25lbnQoaHRtbDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChodG1sLnRyaW1TdGFydCgpLnN0YXJ0c1dpdGgoTVlPUF9XRUJfQ09NUE9ORU5UX01BUktFUikpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChgPHNjcmlwdFtePl0qXFxcXHNpZD1bXCInXT8ke01ZT1BfV0VCX0NPTVBPTkVOVF9TQ1JJUFRfSUR9W1wiJ1xcXFxzPl1gLCAnaScpLnRlc3QoaHRtbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSBob3cgdGhpcyBjb21wb25lbnQgc2hvdWxkIHJlbmRlciwgYXBwbHlpbmcgdGhlIGhvc3QgcmVuZGVyIHBvbGljeS5cbiAgICAgKiBQcmVjZWRlbmNlOiBvcHRpb25zLnJlbmRlclBvbGljeSAocGVyLWNhbGwpIGZ1bGx5IHJlcGxhY2VzIHRoZSBnbG9iYWxcbiAgICAgKiBob3N0U0RLLnNldFJlbmRlclBvbGljeSBcdTIwMTQgc28gYW4gYXBwIGNhbiByZXN0cmljdCBnbG9iYWxseSBhbmQgYWxsb3cgc3BlY2lmaWNzLlxuICAgICAqIFdpdGggbm8gcG9saWN5IHNldCwgYmVoYXZpb3IgaXMgdW5jaGFuZ2VkIGZyb20gYmVmb3JlIChtYXJrZXIgXHUyMUQyIHdlYiBjb21wb25lbnQpLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgcmVzb2x2ZVJlbmRlck1vZGUoXG4gICAgICAgIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgICAgICBza2luOiBJU2tpbkNvbmZpZyxcbiAgICAgICAgbG9hZGVyQ29uZmlnOiBJSFRNTExvYWRlckNvbmZpZyxcbiAgICAgICAgaXNXZWJDb21wb25lbnQ6IGJvb2xlYW4sXG4gICAgICAgIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zLFxuICAgICk6IFByb21pc2U8eyBtb2RlOiBSZW5kZXJNb2RlIHwgZmFsc2U7IGlzb2xhdGU6IGJvb2xlYW4gfT4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0ZWRNb2RlOiBSZW5kZXJNb2RlID0gaXNXZWJDb21wb25lbnRcbiAgICAgICAgICAgID8gJ3dlYkNvbXBvbmVudCdcbiAgICAgICAgICAgIDogKChsb2FkZXJDb25maWcuaXNvbGF0aW9uIHx8IG9wdGlvbnM/Lmlzb2xhdGlvbikgPyAnaXNvbGF0ZWRJZnJhbWUnIDogJ2lmcmFtZScpO1xuXG4gICAgICAgIC8vIHBlci1jYWxsIHBvbGljeSB3aW5zOyBlbHNlIGdsb2JhbCBwb2xpY3kgb24gdGhlIGhvc3QgU0RLIHNpbmdsZXRvbi5cbiAgICAgICAgY29uc3QgcG9saWN5OiBSZW5kZXJQb2xpY3kgfCB1bmRlZmluZWQgPVxuICAgICAgICAgICAgb3B0aW9ucz8ucmVuZGVyUG9saWN5ID8/ICh3aW5kb3cgYXMgYW55KT8ubXlvcD8uaG9zdFNESz8uZ2V0UmVuZGVyUG9saWN5Py4oKTtcblxuICAgICAgICBjb25zdCBtb2RlOiBSZW5kZXJNb2RlIHwgZmFsc2UgPSBwb2xpY3lcbiAgICAgICAgICAgID8gYXdhaXQgcG9saWN5KHsgY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgcmVxdWVzdGVkTW9kZSwgaXNXZWJDb21wb25lbnQgfSlcbiAgICAgICAgICAgIDogcmVxdWVzdGVkTW9kZTtcblxuICAgICAgICByZXR1cm4geyBtb2RlLCBpc29sYXRlOiBtb2RlID09PSAnaXNvbGF0ZWRJZnJhbWUnIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGluLWZyYW1lIGJyaWRnZSBmb3IgaXNvbGF0ZWQgY29tcG9uZW50cy4gUnVucyBpbnNpZGUgdGhlIHNhbmRib3hlZFxuICAgICAqIChvcGFxdWUtb3JpZ2luKSBpZnJhbWUsIHRyYW5zbGF0aW5nIHRoZSBzYW1lIGF1dGhvci1mYWNpbmcgY29udHJhY3QgdG8vZnJvbVxuICAgICAqIHBvc3RNZXNzYWdlIHNpbmNlIHRoZSBob3N0IGhhcyBubyBzYW1lLW9yaWdpbiBhY2Nlc3M6XG4gICAgICogICBcdTIwMjIgZGF0YS1pbiA6IHBhcmVudCBwb3N0cyB7dHlwZTonbXlvcDppbml0J30gXHUyMTkyIGNhbGxzIHdpbmRvdy5teW9wX2luaXRfaW50ZXJmYWNlXG4gICAgICogICAgICAgICAgICAgICAocGx1cyBhIGJha2VkIGluaXRpYWwgdmFsdWUgZm9yIHRoZSBmaXJzdCByZW5kZXIpXG4gICAgICogICBcdTIwMjIgZGF0YS1vdXQ6IHdpbmRvdy5teW9wX2N0YV9oYW5kbGVyIFx1MjE5MiBwYXJlbnQucG9zdE1lc3NhZ2Uoe3R5cGU6J215b3A6Y3RhJ30pXG4gICAgICogICBcdTIwMjIgcmVzaXplICA6IFJlc2l6ZU9ic2VydmVyIFx1MjE5MiBwYXJlbnQucG9zdE1lc3NhZ2Uoe3R5cGU6J215b3A6c2l6ZSd9KVxuICAgICAqXG4gICAgICogVE9ETyhkZXYtZXh0ZW5zaW9uKTogdGhlIGlzb2xhdGVkIHBhdGggZGVsaWJlcmF0ZWx5IHNraXBzIHRoZSBzYW1lLW9yaWdpblxuICAgICAqIGRhdGFTY3JpcHQsIHNvIGl0IG5ldmVyIHBvc3RzIHRoZSBgTVlPUF9QUkVJTkpFQ1RFRF9JTklUYCBtZXNzYWdlIHRoZSBNeW9wIGRldlxuICAgICAqIGV4dGVuc2lvbiBsaXN0ZW5zIGZvciB0byBsb2cgdGhlIElOSVRJQUwgcmVuZGVyIChgaW5pdCpgKS4gTGF0ZXIgaW5pdCB1cGRhdGVzIGFuZFxuICAgICAqIGFsbCBDVEFzIGFyZSBzdGlsbCB0cmFja2VkICh0aGUgZXh0ZW5zaW9uIHdyYXBzIGBjb21wLnByb3BzYCwgd2hpY2ggb3VyIGlzb2xhdGVkXG4gICAgICogY29ubmVjdFByb3BzIGJyYW5jaCByb3V0ZXMgdGhyb3VnaCksIHNvIG9ubHkgdGhlIGZpcnN0LXJlbmRlciBwYXlsb2FkIGlzIG1pc3NpbmdcbiAgICAgKiBmcm9tIHRoZSBleHRlbnNpb24ncyBhY3Rpdml0eSBsb2cgZm9yIGlzb2xhdGVkIGNvbXBvbmVudHMuIENsb3NpbmcgdGhpcyB3b3VsZCBiZSBhXG4gICAgICogfjEtbGluZSBgcGFyZW50LnBvc3RNZXNzYWdlKHt0eXBlOidNWU9QX1BSRUlOSkVDVEVEX0lOSVQnLCBwYXlsb2FkOntkYXRhfX0pYCBpbnNpZGVcbiAgICAgKiBmbHVzaEluaXRpYWwoKSBiZWxvdyBcdTIwMTQgaW50ZW50aW9uYWxseSBOT1QgZG9uZSBmb3Igbm93IHRvIGF2b2lkIGFkZGluZyBleHRlbnNpb24tb25seVxuICAgICAqIHRyYWZmaWMgdG8gdGhlIGNvbXBvbmVudCBydW50aW1lLiBXZWIgY29tcG9uZW50cyBoYXZlIHRoZSBzYW1lIGluaXRpYWwtaW5pdCBnYXBcbiAgICAgKiAoaW5pdFdpdGhEYXRhIGlzIGNhbGxlZCBvbiB0aGUgZWxlbWVudCwgbm90IHZpYSBjb21wLnByb3BzKSBhbmQgaXQgcHJlZGF0ZXMgdGhpcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGJ1aWxkSXNvbGF0aW9uQnJpZGdlKGluaXRpYWxEYXRhTGl0ZXJhbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGA8c2NyaXB0PlxuICAgICAgICAgICAgKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgX19pbml0aWFsID0gJHtpbml0aWFsRGF0YUxpdGVyYWx9O1xuICAgICAgICAgICAgICAgIHZhciBfX3BlbmRpbmc7XG4gICAgICAgICAgICAgICAgLy8gZGF0YS1vdXQgKGN0YSlcbiAgICAgICAgICAgICAgICB3aW5kb3cubXlvcF9jdGFfaGFuZGxlciA9IGZ1bmN0aW9uIChhY3Rpb24sIHBheWxvYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgcGFyZW50LnBvc3RNZXNzYWdlKHsgX19teW9wOiB0cnVlLCB0eXBlOiAnbXlvcDpjdGEnLCBhY3Rpb246IGFjdGlvbiwgcGF5bG9hZDogcGF5bG9hZCB9LCAnKicpOyB9IGNhdGNoIChlKSB7fVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gY2FsbEluaXQoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5teW9wX2luaXRfaW50ZXJmYWNlID09PSAnZnVuY3Rpb24nKSB7IHdpbmRvdy5teW9wX2luaXRfaW50ZXJmYWNlKGRhdGEpOyByZXR1cm4gdHJ1ZTsgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGRhdGEtaW4gKGluaXQgdXBkYXRlcylcbiAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkID0gZS5kYXRhO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWQgfHwgZC5fX215b3AgIT09IHRydWUpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGQudHlwZSA9PT0gJ215b3A6aW5pdCcpIHsgaWYgKCFjYWxsSW5pdChkLmRhdGEpKSBfX3BlbmRpbmcgPSBkLmRhdGE7IH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAvLyBmaXJzdCByZW5kZXI6IHVzZSBhIHBlbmRpbmcgdXBkYXRlIGlmIG9uZSBhcnJpdmVkLCBlbHNlIHRoZSBiYWtlZCBpbml0aWFsIGRhdGFcbiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gZmx1c2hJbml0aWFsKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IChfX3BlbmRpbmcgIT09IHVuZGVmaW5lZCkgPyBfX3BlbmRpbmcgOiBfX2luaXRpYWw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxJbml0KGRhdGEpKSB7IF9fcGVuZGluZyA9IHVuZGVmaW5lZDsgX19pbml0aWFsID0gdW5kZWZpbmVkOyB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZsdXNoSW5pdGlhbCk7XG4gICAgICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgICAgICAvLyByZXNpemUgKHJlcG9ydCBjb250ZW50IHNpemUpXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gY29udGVudEhlaWdodCgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTWVhc3VyZSB0aGUgQk9EWSAoY29udGVudCBib3gpLiBkb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0IGluY2x1ZGVzXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpZnJhbWUgdmlld3BvcnQgXHUyMDE0IHdoaWNoIHdlJ3JlIGRyaXZpbmcgXHUyMDE0IHNvIGl0IHdvdWxkIHJlcG9ydCB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBmcmFtZSBoZWlnaHQsIG5vdCB0aGUgY29udGVudCwgYW5kIG5ldmVyIHNocmluay5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBkb2N1bWVudC5ib2R5O1xuICAgICAgICAgICAgICAgICAgICBpZiAoYikgcmV0dXJuIE1hdGgubWF4KGIuc2Nyb2xsSGVpZ2h0LCBiLm9mZnNldEhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBwb3N0U2l6ZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX19teW9wOiB0cnVlLCB0eXBlOiAnbXlvcDpzaXplJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGNvbnRlbnRIZWlnaHQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFdpZHRoXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCAnKicpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBPYnNlcnZlIHRoZSBCT0RZIChyZWZsb3dzIHdpdGggY29udGVudCkgXHUyMDE0IG5vdCBkb2N1bWVudEVsZW1lbnQsIHdob3NlIGJveCBpc1xuICAgICAgICAgICAgICAgIC8vIHRoZSBpZnJhbWUgdmlld3BvcnQgYW5kIHdvdWxkIGZlZWQgYmFjayBpbnRvIGEgcmVzaXplIGxvb3AuIEEgTXV0YXRpb25PYnNlcnZlclxuICAgICAgICAgICAgICAgIC8vIGNhdGNoZXMgY29udGVudCBzd2FwcyAoZS5nLiBpbm5lckhUTUwgcmUtcmVuZGVyKSB0aGF0IGRvbid0IGNoYW5nZSBib2R5J3MgYm94LlxuICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuUmVzaXplT2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgdmFyIF9fcm8gPSBuZXcgUmVzaXplT2JzZXJ2ZXIocG9zdFNpemUpOyBpZiAoZG9jdW1lbnQuYm9keSkgX19yby5vYnNlcnZlKGRvY3VtZW50LmJvZHkpOyB9IGNhdGNoIChlKSB7fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAod2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIgJiYgZG9jdW1lbnQuYm9keSkge1xuICAgICAgICAgICAgICAgICAgICB0cnkgeyBuZXcgTXV0YXRpb25PYnNlcnZlcihwb3N0U2l6ZSkub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSwgYXR0cmlidXRlczogdHJ1ZSwgY2hhcmFjdGVyRGF0YTogdHJ1ZSB9KTsgfSBjYXRjaCAoZSkge31cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBwb3N0U2l6ZSk7XG4gICAgICAgICAgICAgICAgcG9zdFNpemUoKTtcbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgIDwvc2NyaXB0PmA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXh0cmFjdCB0aGUgd2ViIGNvbXBvbmVudCBzY3JpcHQgY29udGVudCBmcm9tIEhUTUxcbiAgICAgKi9cbiAgICBwcml2YXRlIGV4dHJhY3RXZWJDb21wb25lbnRTY3JpcHQoaHRtbDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgY29uc3QgZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhodG1sLCAndGV4dC9odG1sJyk7XG4gICAgICAgIGNvbnN0IHNjcmlwdCA9IGRvYy5nZXRFbGVtZW50QnlJZChNWU9QX1dFQl9DT01QT05FTlRfU0NSSVBUX0lEKTtcbiAgICAgICAgcmV0dXJuIHNjcmlwdD8udGV4dENvbnRlbnQgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlIHRoZSB3ZWIgY29tcG9uZW50IHNjcmlwdCBvbiB0aGUgaG9zdCBkb2N1bWVudC5cbiAgICAgKiBSZXR1cm5zIHRoZSBjdXN0b20gZWxlbWVudCB0YWcgbmFtZSB0aGlzIHNjcmlwdCByZWdpc3RlcmVkLlxuICAgICAqL1xuICAgIHByaXZhdGUgZXhlY3V0ZVdlYkNvbXBvbmVudFNjcmlwdChzY3JpcHRDb250ZW50OiBzdHJpbmcsIHNjcmlwdElkOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICAvLyBDaGVjayBpZiBhbHJlYWR5IGV4ZWN1dGVkIChieSBzY3JpcHQgY29udGVudCBoYXNoKVxuICAgICAgICBjb25zdCBjYWNoZWRUYWdOYW1lID0gZXh0cmFjdGVkV2ViQ29tcG9uZW50U2NyaXB0cy5nZXQoc2NyaXB0SWQpO1xuICAgICAgICBpZiAoY2FjaGVkVGFnTmFtZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFtNeW9wV2ViQ29tcG9uZW50XSBTY3JpcHQgYWxyZWFkeSBleGVjdXRlZCBmb3IgJHtzY3JpcHRJZH0sIHJldXNpbmcgPCR7Y2FjaGVkVGFnTmFtZX0+YCk7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkVGFnTmFtZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgICBzY3JpcHQudGV4dENvbnRlbnQgPSBzY3JpcHRDb250ZW50O1xuICAgICAgICBzY3JpcHQuaWQgPSBgbXlvcC1leHRyYWN0ZWQtJHtzY3JpcHRJZH1gO1xuICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgZ2xvYmFsIGltbWVkaWF0ZWx5OiB0aGUgbmV4dCBleHRyYWN0ZWQgc2NyaXB0IHRvIHJ1biB3aWxsIG92ZXJ3cml0ZSBpdC5cbiAgICAgICAgY29uc3QgdGFnTmFtZSA9ICh3aW5kb3cgYXMgYW55KS5fX01ZT1BfVEFHX05BTUVfXztcbiAgICAgICAgaWYgKHRhZ05hbWUpIHtcbiAgICAgICAgICAgIGV4dHJhY3RlZFdlYkNvbXBvbmVudFNjcmlwdHMuc2V0KHNjcmlwdElkLCB0YWdOYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgW015b3BXZWJDb21wb25lbnRdIEV4ZWN1dGVkIHdlYiBjb21wb25lbnQgc2NyaXB0OiAke3NjcmlwdElkfSAtPiA8JHt0YWdOYW1lfT5gKTtcbiAgICAgICAgcmV0dXJuIHRhZ05hbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZCBhIE15b3AgV2ViIENvbXBvbmVudCAoZXh0cmFjdGVkIGFuZCBydW4gb24gaG9zdCBkb2N1bWVudClcbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIGxvYWRFeHRyYWN0ZWRXZWJDb21wb25lbnQoXG4gICAgICAgIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgICAgICBza2luOiBJU2tpbkNvbmZpZyxcbiAgICAgICAgY29udGFpbmVyOiBIVE1MRWxlbWVudCxcbiAgICAgICAgaHRtbDogc3RyaW5nLFxuICAgICAgICBvcHRpb25zPzogbG9hZGVyT3B0aW9uc1xuICAgICk6IFByb21pc2U8TXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudD4ge1xuICAgICAgICBjb25zdCBzY3JpcHRDb250ZW50ID0gdGhpcy5leHRyYWN0V2ViQ29tcG9uZW50U2NyaXB0KGh0bWwpO1xuXG4gICAgICAgIGlmICghc2NyaXB0Q29udGVudCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbTXlvcFdlYkNvbXBvbmVudF0gTm8gPHNjcmlwdCBpZD1cIm15b3Atd2ViLWNvbXBvbmVudFwiPiBmb3VuZCBpbiBIVE1MJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVc2UgY29tcG9uZW50IGRlZmluaXRpb24gaWQgYXMgc2NyaXB0IGlkZW50aWZpZXIgZm9yIGRlZHVwbGljYXRpb25cbiAgICAgICAgY29uc3Qgc2NyaXB0SWQgPSBgJHtjb21wb25lbnREZWZpbml0aW9uLmlkfS0ke3NraW4uaWR9YDtcblxuICAgICAgICAvLyBFeGVjdXRlIHRoZSBzY3JpcHQgb24gdGhlIGhvc3QgZG9jdW1lbnQsIG9yIHJldXNlIHRoZSB0YWcgaXQgcmVnaXN0ZXJlZCBlYXJsaWVyLlxuICAgICAgICAvLyBOZXZlciByZS1yZWFkIHdpbmRvdy5fX01ZT1BfVEFHX05BTUVfXyBoZXJlOiBvbiBhIHJlLW1vdW50IHRoZSBzY3JpcHQgaXMgc2tpcHBlZCBhbmRcbiAgICAgICAgLy8gdGhlIGdsb2JhbCBzdGlsbCBwb2ludHMgYXQgd2hpY2hldmVyIGNvbXBvbmVudCdzIHNjcmlwdCByYW4gbGFzdCwgd2hpY2ggd291bGQgYnVpbGRcbiAgICAgICAgLy8gdGhpcyBjb250YWluZXIncyBlbGVtZW50IGZyb20gYW5vdGhlciBjb21wb25lbnQncyB0YWcuXG4gICAgICAgIGNvbnN0IHRhZ05hbWUgPSB0aGlzLmV4ZWN1dGVXZWJDb21wb25lbnRTY3JpcHQoc2NyaXB0Q29udGVudCwgc2NyaXB0SWQpO1xuXG4gICAgICAgIGlmICghdGFnTmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbTXlvcFdlYkNvbXBvbmVudF0gU2NyaXB0IGRpZCBub3Qgc2V0IHdpbmRvdy5fX01ZT1BfVEFHX05BTUVfXycpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBjdXN0b20gZWxlbWVudFxuICAgICAgICBjb25zdCBkb21JZCA9IGBteW9wLWNvbXAtJHt1dWlkdjQoKX1gO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTtcbiAgICAgICAgZWxlbWVudC5pZCA9IGRvbUlkO1xuXG4gICAgICAgIGlmIChvcHRpb25zPy5oaWRkZW4pIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMCc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gJzAnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciBjb250YWluZXIgaWYgbmVlZGVkXG4gICAgICAgIGlmICghY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJteW9wLWNvbXAtXCJdJykpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENPTlNUUlVDVCBCRUZPUkUgQVBQRU5ESU5HLiBBcHBlbmRpbmcgaXMgd2hhdCBjb25uZWN0cyB0aGUgZWxlbWVudCBhbmQgZmlyZXMgaXRzXG4gICAgICAgIC8vIGNvbm5lY3RlZENhbGxiYWNrLCBhbmQgdGhlIHdyYXBwZXIncyBjb25zdHJ1Y3RvciBpcyB3aGVyZSB0aGUgc2luZ2xlICdteW9wLWN0YSdcbiAgICAgICAgLy8gbGlzdGVuZXIgaXMgYXR0YWNoZWQuIFdpdGggdGhlIGFwcGVuZCBmaXJzdCwgYW55IENUQSBhIGNvbXBvbmVudCBlbWl0cyBmcm9tXG4gICAgICAgIC8vIGNvbm5lY3RlZENhbGxiYWNrIC0tIGEgc2VhcmNoIGJveCBhbm5vdW5jaW5nIGl0cyBpbml0aWFsIHN0YXRlLCBhIHdpZGdldFxuICAgICAgICAvLyByZXBvcnRpbmcgYSBkZWZhdWx0IHNlbGVjdGlvbiAtLSB3YXMgZGlzcGF0Y2hlZCBiZWZvcmUgYW55dGhpbmcgd2FzIGxpc3RlbmluZ1xuICAgICAgICAvLyBhbmQgc2lsZW50bHkgbG9zdC4gVGhlIHdyYXBwZXIgb25seSBuZWVkcyB0aGUgZWxlbWVudCByZWZlcmVuY2UsIG5vdCBhIGNvbm5lY3RlZFxuICAgICAgICAvLyBlbGVtZW50LCBzbyBjb25zdHJ1Y3RpbmcgZmlyc3QgY29zdHMgbm90aGluZyBhbmQgbWFrZXMgdGhlIGJ1ZmZlciBjb3ZlciB0aGVcbiAgICAgICAgLy8gd2hvbGUgZmlyc3QgcmVuZGVyIHJhdGhlciB0aGFuIG9ubHkgdGhlIGluaXRXaXRoRGF0YSBwYXJ0IG9mIGl0LlxuICAgICAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgTXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudChcbiAgICAgICAgICAgIGNvbXBvbmVudERlZmluaXRpb24sXG4gICAgICAgICAgICBza2luLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgIHRhZ05hbWUsXG4gICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIGVsZW1lbnQsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIEluaXRpYWxpemUgd2l0aCBkYXRhIGlmIHByb3ZpZGVkLiBgbnVsbGAgaXMgbm90IGRhdGEgLS0gc2VlIHRoZSBkYXRhIHNjcmlwdFxuICAgICAgICAvLyBndWFyZCBpbiB0aGUgSFRNTCBwYXRoIGZvciB3aHkgY2FsbGluZyBhbiBpbml0IGludGVyZmFjZSB3aXRoIG51bGwgaXMgd29yc2VcbiAgICAgICAgLy8gdGhhbiBub3QgY2FsbGluZyBpdC5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmRhdGEgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zPy5kYXRhICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb21wb25lbnQuaW5pdFdpdGhEYXRhKG9wdGlvbnMuZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZyhgW015b3BXZWJDb21wb25lbnRdIExvYWRlZCA8JHt0YWdOYW1lfT4gaW50byBjb250YWluZXJgKTtcblxuICAgICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgIH1cblxuICAgIGxvYWQgPSBhc3luYyAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4ge1xuXG4gICAgICAgIGNvbnN0IGxvYWRlckNvbmZpZyA9IChza2luLmxvYWRlciBhcyBJSFRNTExvYWRlckNvbmZpZyk7XG5cbiAgICAgICAgY29uc3QgaXNXQyA9IHRoaXMuaXNNeW9wV2ViQ29tcG9uZW50KGxvYWRlckNvbmZpZy5IVE1MKTtcbiAgICAgICAgY29uc3QgeyBtb2RlLCBpc29sYXRlIH0gPSBhd2FpdCB0aGlzLnJlc29sdmVSZW5kZXJNb2RlKGNvbXBvbmVudERlZmluaXRpb24sIHNraW4sIGxvYWRlckNvbmZpZywgaXNXQywgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKG1vZGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFtNeW9wXSBSZW5kZXJpbmcgYmxvY2tlZCBieSByZW5kZXIgcG9saWN5IGZvciBjb21wb25lbnQgXCIke2NvbXBvbmVudERlZmluaXRpb24uaWR9XCJgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc1dDKSB7XG4gICAgICAgICAgICAvLyBXZWItY29tcG9uZW50IEhUTUwgb25seSBzdXBwb3J0cyB0aGUgd2ViLWNvbXBvbmVudCBjb250cmFjdDsgYSBwb2xpY3kgdGhhdFxuICAgICAgICAgICAgLy8gZGVuaWVzIGl0IGhhcyBubyBpZnJhbWUgZmFsbGJhY2sgKHNlZSBwbGFuIFx1MDBBNzMuMykgXHUyMDE0IGJsb2NrIHJhdGhlciB0aGFuXG4gICAgICAgICAgICAvLyBzaWxlbnRseSByZW5kZXIgYnJva2VuLiBVbnRydXN0ZWQgY29udHJpYnV0b3JzIG11c3Qgc2hpcCBpZnJhbWUgY29tcG9uZW50cy5cbiAgICAgICAgICAgIGlmIChtb2RlICE9PSAnd2ViQ29tcG9uZW50Jykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgW015b3BdIFdlYi1jb21wb25lbnQgcmVuZGVyaW5nIGRlbmllZCBieSByZW5kZXIgcG9saWN5IGZvciBjb21wb25lbnQgXCIke2NvbXBvbmVudERlZmluaXRpb24uaWR9XCJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRFeHRyYWN0ZWRXZWJDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgY29udGFpbmVyLCBsb2FkZXJDb25maWcuSFRNTCwgb3B0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZG9tSWQgPSBgbXlvcC1jb21wLSR7dXVpZHY0KCl9YFxuICAgICAgICBsZXQgZWxlbWVudDtcblxuICAgICAgICBpZiAobG9hZGVyQ29uZmlnLnNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUubG9jYWxGcmFtZSkge1xuICAgICAgICAgICAgY29uc3QgdW5pcUlkID0gdXVpZHY0KCk7XG4gICAgICAgICAgICBjb25zdCBkb21JZCA9IGBteW9wLWNvbXAtJHt1bmlxSWR9YFxuXG4gICAgICAgICAgICBsZXQgSWZyYW1lRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5pZCA9IGRvbUlkO1xuXG4gICAgICAgICAgICAvLyBGdWxsIGlzb2xhdGlvbjogYSBzYW5kYm94IFdJVEhPVVQgYWxsb3ctc2FtZS1vcmlnaW4gZ2l2ZXMgdGhlIGZyYW1lIGFuXG4gICAgICAgICAgICAvLyBvcGFxdWUgb3JpZ2luIFx1MjAxNCBubyBob3N0IERPTS9jb29raWVzL3BhcmVudCBhY2Nlc3MuIE11c3QgYmUgc2V0IGJlZm9yZVxuICAgICAgICAgICAgLy8gdGhlIGZyYW1lIG5hdmlnYXRlcyAoaS5lLiBiZWZvcmUgc3JjZG9jIC8gYXBwZW5kKS5cbiAgICAgICAgICAgIGlmIChpc29sYXRlKSB7XG4gICAgICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3NhbmRib3gnLCAnYWxsb3ctc2NyaXB0cyBhbGxvdy1mb3JtcyBhbGxvdy1wb3B1cHMnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2V0IGFsbCBzdHlsZXMgQkVGT1JFIGFwcGVuZGluZyB0byBwcmV2ZW50IGZsYXNoIGF0IHdyb25nIHBvc2l0aW9uXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LnN0eWxlLmNzc1RleHQgPSBgXG4gICAgICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgICAgICAgIGluc2V0OiAwO1xuICAgICAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgICAgICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgICAgICAgICAgIG9wYWNpdHk6ICR7b3B0aW9ucz8uaGlkZGVuID8gJzAnIDogJzEnfTtcbiAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgICAgICAgICAgcG9pbnRlci1ldmVudHM6ICR7b3B0aW9ucz8uaGlkZGVuID8gJ25vbmUnIDogJ2FsbCd9O1xuICAgICAgICAgICAgYDtcblxuICAgICAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgICAgIGlmICghY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJteW9wLWNvbXAtXCJdJykpXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuXG4gICAgICAgICAgICAvLyBXcml0ZSBjb250ZW50IGludG8gdGhlIGlmcmFtZS4gQW4gaXNvbGF0ZWQgKHNhbmRib3hlZCwgb3BhcXVlLW9yaWdpbikgZnJhbWVcbiAgICAgICAgICAgIC8vIGNhbid0IGJlIGRvYy53cml0ZSgpJ24gZnJvbSB0aGUgaG9zdCwgc28gYWNjdW11bGF0ZSB0aGUgbWFya3VwIGFuZCBzZXQgaXQgdmlhXG4gICAgICAgICAgICAvLyBzcmNkb2Mgb24gY2xvc2UoKS4gTm9uLWlzb2xhdGVkIGZyYW1lcyBrZWVwIHRoZSBzYW1lLW9yaWdpbiBkb2Mud3JpdGUgcGF0aC5cbiAgICAgICAgICAgIGNvbnN0IF9fc3JjUGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICBjb25zdCBkb2M6IHsgb3BlbigpOiB2b2lkOyB3cml0ZWxuKHM6IHN0cmluZyk6IHZvaWQ7IGNsb3NlKCk6IHZvaWQgfSA9IGlzb2xhdGVcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgb3BlbigpIHt9LFxuICAgICAgICAgICAgICAgICAgICB3cml0ZWxuKHM6IHN0cmluZykgeyBfX3NyY1BhcnRzLnB1c2gocyk7IH0sXG4gICAgICAgICAgICAgICAgICAgIGNsb3NlKCkgeyBJZnJhbWVFbGVtZW50LnNyY2RvYyA9IF9fc3JjUGFydHMuam9pbignXFxuJyk7IH0sXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDogKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGQgPSBJZnJhbWVFbGVtZW50LmNvbnRlbnREb2N1bWVudCB8fCBJZnJhbWVFbGVtZW50LmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGQub3BlbigpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgICAgICAgICB9KSgpO1xuXG5cbiAgICAgICAgICAgIC8vIFBhcnNlIG15b3A6c2l6ZSBtZXRhIHRhZyBiZWZvcmUgaWZyYW1lIGNyZWF0aW9uIChzYW1lIERPTVBhcnNlciBwYXNzIHBhdHRlcm4gYXMgbXlvcF9wcmV2aWV3IHJlbW92YWwpLlxuICAgICAgICAgICAgLy8gVGhpcyBsZXRzIHRoZSBSZWFjdCBob3N0IGRldGVybWluZSBzaXppbmcgbW9kZSAoZmlsbCB2cyBjb250ZW50KSBmcm9tIHRoZSBzdGFydC5cbiAgICAgICAgICAgIGxldCBwYXJzZWRTaXplTWV0YTogeyB3aWR0aD86IHN0cmluZyB8IG51bWJlcjsgaGVpZ2h0Pzogc3RyaW5nIHwgbnVtYmVyOyBtaW5XaWR0aD86IG51bWJlcjsgbWF4V2lkdGg/OiBudW1iZXI7IG1pbkhlaWdodD86IG51bWJlcjsgbWF4SGVpZ2h0PzogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCBfcHJlUGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IF9wcmVEb2MgPSBfcHJlUGFyc2VyLnBhcnNlRnJvbVN0cmluZyhsb2FkZXJDb25maWcuSFRNTCwgJ3RleHQvaHRtbCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNpemVNZXRhID0gX3ByZURvYy5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJteW9wOnNpemVcIl0nKTtcbiAgICAgICAgICAgICAgICBpZiAoc2l6ZU1ldGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgcGFyc2VkU2l6ZU1ldGEgPSBKU09OLnBhcnNlKHNpemVNZXRhLmdldEF0dHJpYnV0ZSgnY29udGVudCcpIHx8ICd7fScpOyB9IGNhdGNoIHt9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgSFRNTDJSZW5kZXIgPSBsb2FkZXJDb25maWcuSFRNTDtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/Ll9pbnNwZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgLy9pbmplY3QgaW5zcGVjdGlvbiBzY3JpcHQgZm9yIHByb3BzIGRldGVjdGlvblxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBfZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhsb2FkZXJDb25maWcuSFRNTCwgJ3RleHQvaHRtbCcpO1xuXG4gICAgICAgICAgICAgICAgLy8gVE9ETyA6IHBhcnQgb2YgQUkgY29tcG9uZW50cywgdGhpbmsgYWJvdXQgdGhhdCwgZG9jdW1lbnQgaXQuXG4gICAgICAgICAgICAgICAgY29uc3QgbXlvcF9wcmV2aWV3X3NjcmlwdCA9IF9kb2MuZ2V0RWxlbWVudEJ5SWQoJ215b3BfcHJldmlldycpO1xuICAgICAgICAgICAgICAgIG15b3BfcHJldmlld19zY3JpcHQ/LnJlbW92ZUF0dHJpYnV0ZSgndHlwZScpO1xuXG4gICAgICAgICAgICAgICAgLy8gUGFyc2UgdGhlIGluamVjdGVkIEhUTUwgc3RyaW5nIGludG8gYSBub2RlXG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcCA9IF9kb2MuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCk7XG4gICAgICAgICAgICAgICAgdGVtcC5ib2R5LmlubmVySFRNTCA9IGA8c2NyaXB0PlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmVmb3JlS2V5c1dpbmRvdyA9IG5ldyBTZXQoT2JqZWN0LmtleXMod2luZG93KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubXlvcFN0YXRlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZUtleXNXaW5kb3csXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIDwvc2NyaXB0PmA7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gdGVtcC5ib2R5LmZpcnN0Q2hpbGQ7XG5cbiAgICAgICAgICAgICAgICBpZiAobm9kZSAmJiBfZG9jLmhlYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgX2RvYy5oZWFkLmluc2VydEJlZm9yZShfZG9jLmltcG9ydE5vZGUobm9kZSwgdHJ1ZSksIF9kb2MuaGVhZC5maXJzdENoaWxkKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBQcmVwZW5kIERPQ1RZUEU6IGRvY3VtZW50RWxlbWVudC5vdXRlckhUTUwgcmV0dXJucyBvbmx5IDxodG1sPi4uLjwvaHRtbD5cbiAgICAgICAgICAgICAgICAvLyBhbmQgZHJvcHMgdGhlIGRvY3R5cGUsIHdoaWNoIHdvdWxkIHB1dCB0aGUgaWZyYW1lIGluIHF1aXJrcyBtb2RlLlxuICAgICAgICAgICAgICAgIC8vIFF1aXJrcyBtb2RlIGJyZWFrcyBhdXRvLXNpemluZyBiZWNhdXNlIDxib2R5PiBzdHJldGNoZXMgdG8gdGhlIGlmcmFtZVxuICAgICAgICAgICAgICAgIC8vIHZpZXdwb3J0IGluc3RlYWQgb2Ygc2hyaW5raW5nIHRvIGNvbnRlbnQsIHNvIFJlc2l6ZU9ic2VydmVyIG9uIGJvZHlcbiAgICAgICAgICAgICAgICAvLyBuZXZlciBmaXJlcyB3aGVuIGNvbnRlbnQgcmVmbG93cyAoZS5nLiBhZnRlciBmb250IHN3YXApLlxuICAgICAgICAgICAgICAgIEhUTUwyUmVuZGVyID0gJzwhRE9DVFlQRSBodG1sPicgKyBfZG9jLmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnM/LmRhdGEgIT09IHVuZGVmaW5lZCkge1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPOiBpbXByb3ZlIGJ5IGRvIGl0IG9uIHRoZSBzZXJ2ZSBvbmNlXG5cbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgbXlvcF9wcmV2aWV3IHNjcmlwdCB3aGVuIG5vdCBpbiBpbnNwZWN0aW9uIG1vZGVcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgX2RvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcobG9hZGVyQ29uZmlnLkhUTUwsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBteW9wX3ByZXZpZXdfc2NyaXB0ID0gX2RvYy5nZXRFbGVtZW50QnlJZCgnbXlvcF9wcmV2aWV3Jyk7XG5cbiAgICAgICAgICAgICAgICBpZiAobXlvcF9wcmV2aWV3X3NjcmlwdCkge1xuICAgICAgICAgICAgICAgICAgICBteW9wX3ByZXZpZXdfc2NyaXB0LnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICAvLyBTZWUgbm90ZSBhYm92ZTogcHJlcGVuZCBET0NUWVBFIHRvIGtlZXAgdGhlIGlmcmFtZSBpbiBzdGFuZGFyZHMgbW9kZS5cbiAgICAgICAgICAgICAgICAgICAgSFRNTDJSZW5kZXIgPSAnPCFET0NUWVBFIGh0bWw+JyArIF9kb2MuZG9jdW1lbnRFbGVtZW50Lm91dGVySFRNTDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEluamVjdCBob3N0LXByb3ZpZGVkIENTUyBiZWZvcmUgdGhlIGlmcmFtZSBpcyB3cml0dGVuIHNvIHN0eWxlcyBhcmVcbiAgICAgICAgICAgIC8vIHByZXNlbnQgb24gZmlyc3QgcGFpbnQgKG5vIEZPVUMpLiBBcHBlbmRlZCBsYXN0IGluIDxoZWFkPiBzbyBpdCB3aW5zXG4gICAgICAgICAgICAvLyBvdmVyIHRoZSBjb21wb25lbnQncyBvd24gc3R5bGVzIHZpYSBub3JtYWwgY2FzY2FkZSBvcmRlci5cbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5pbmplY3RDc3MpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgX2RvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoSFRNTDJSZW5kZXIsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdHlsZVRhZyA9IF9kb2MuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgICAgICAgICBzdHlsZVRhZy5zZXRBdHRyaWJ1dGUoJ2RhdGEtbXlvcC1pbmplY3RlZCcsICd0cnVlJyk7XG4gICAgICAgICAgICAgICAgLy8gPHN0eWxlPiBpcyBhbiBIVE1MIHJhdy10ZXh0IGVsZW1lbnQ6IHRoZSBzZXJpYWxpemVyIGJlbG93IHdyaXRlcyBpdHNcbiAgICAgICAgICAgICAgICAvLyBjb250ZW50cyBMSVRFUkFMTFksIHdpdGhvdXQgZXNjYXBpbmcuIENTUyBjb250YWluaW5nIFwiPC9zdHlsZT5cIiB3b3VsZFxuICAgICAgICAgICAgICAgIC8vIHRoZXJlZm9yZSBjbG9zZSB0aGUgdGFnIGFuZCBpbmplY3QgbGl2ZSBtYXJrdXAgaW50byB0aGUgaWZyYW1lLCB3aGljaFxuICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGVzIHNhbWUtb3JpZ2luIHdpdGggdGhpcyBwYWdlLiBOZXV0cmFsaXplIHRoZSBzZXF1ZW5jZSBcdTIwMTQgbm8gcmVhbFxuICAgICAgICAgICAgICAgIC8vIHN0eWxlc2hlZXQgY29udGFpbnMgaXQuIChTYW1lIGNsYXNzIG9mIGJ1ZyBhcyB0aGUgPC9zY3JpcHQ+IGVzY2FwZSBpblxuICAgICAgICAgICAgICAgIC8vIHRoZSBkYXRhIHBheWxvYWQgYmVsb3cuKVxuICAgICAgICAgICAgICAgIHN0eWxlVGFnLnRleHRDb250ZW50ID0gb3B0aW9ucy5pbmplY3RDc3MucmVwbGFjZSgvPFxccypcXC9cXHMqc3R5bGUvZ2ksICc8XFxcXC9zdHlsZScpO1xuICAgICAgICAgICAgICAgIChfZG9jLmhlYWQgfHwgX2RvYy5kb2N1bWVudEVsZW1lbnQpLmFwcGVuZENoaWxkKHN0eWxlVGFnKTtcbiAgICAgICAgICAgICAgICAvLyBTZWUgbm90ZSBhYm92ZTogcHJlcGVuZCBET0NUWVBFIHRvIGtlZXAgdGhlIGlmcmFtZSBpbiBzdGFuZGFyZHMgbW9kZS5cbiAgICAgICAgICAgICAgICBIVE1MMlJlbmRlciA9ICc8IURPQ1RZUEUgaHRtbD4nICsgX2RvYy5kb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MO1xuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIGRvYy53cml0ZWxuKEhUTUwyUmVuZGVyKTtcblxuICAgICAgICAgICAgLy8gd2luZG93Ll9fZmVkZXJhdGlvbl9fID1cbiAgICAgICAgICAgIC8vICAgICB7IC4uLndpbmRvdy5fX2ZlZGVyYXRpb25fXyxcbiAgICAgICAgICAgIC8vICAgICAgICAgLy9UT0RPIDogZ2V0IGZyb20gRU5WIGF0IGJ1aWxkIHRpbWUsXG4gICAgICAgICAgICAvLyAgICAgICAgIC8vIGluamVjdCB2YWx1ZSB0byBtb2R1bGUgYXQgYnVpbGQgdGltZVxuICAgICAgICAgICAgLy8gICAgICAgICAvLyB0b2RheSB3ZSBkb2luZyBzbyBqdXN0IGZvciB0aGUgQ0pTIHZlcnNpb25cbiAgICAgICAgICAgIC8vICAgICAgICAgX19wdWJsaWNfcGF0aF9fIDonaHR0cHM6Ly9jZG4ubXlvcC5kZXYvc2RrL25leHQnXG4gICAgICAgICAgICAvLyAgICAgICAgICwuLi4ke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICB3aW5kb3cuX19mZWRlcmF0aW9uX18pXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gICAgIH07XG5cbiAgICAgICAgICAgIC8vIEZvciBucG0gcGFja2FnZSB1c2VycyB3aXRoIGJ1bmRsZXJzIChWaXRlL1dlYnBhY2spLCBpbmplY3QgU0RLIGlubGluZVxuICAgICAgICAgICAgLy8gRm9yIENETiB1c2VycyAoc2NyaXB0IHRhZyksIHVzZSBDRE4gVVJMXG4gICAgICAgICAgICBjb25zdCBzZGtTY3JpcHQgPSBIQVNfRU1CRURERURfU0RLXG4gICAgICAgICAgICAgICAgPyBgPHNjcmlwdD4ke0VNQkVEREVEX1NES19DT05URU5UfTwvc2NyaXB0PmBcbiAgICAgICAgICAgICAgICA6IGA8c2NyaXB0IHNyYz1cIiR7d2luZG93Lm15b3AuX19ST09UX1NES19QVUJMSUNfVVJMX199XCI+PC9zY3JpcHQ+YDtcblxuICAgICAgICAgICAgLy8gRGlmZmVyZW50IGluaXQgc2NyaXB0IGZvciBlbWJlZGRlZCB2cyBDRE4gU0RLXG4gICAgICAgICAgICAvLyAtIEVtYmVkZGVkIChidW5kbGVkIElJRkUpOiB1c2VzIE15b3BTREsuZ2V0SWZyYW1lTW9kdWxlKCkgd2hpY2ggcmV0dXJucyBtb2R1bGUgZGlyZWN0bHlcbiAgICAgICAgICAgIC8vIC0gQ0ROIChkeW5hbWljIGxvYWRpbmcpOiB1c2VzIHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0SWZyYW1lTW9kdWxlKCkgd2hpY2ggd3JhcHMgd2l0aCAuZ2V0KClcbiAgICAgICAgICAgIGNvbnN0IGluaXRTY3JpcHQgPSBIQVNfRU1CRURERURfU0RLXG4gICAgICAgICAgICAgICAgPyBgPHNjcmlwdD5cbiAgICAgICAgICAgICAgICAgICBjb25zdCBfX215b3BfaW5pdCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlmcmFtZU1vZHVsZSA9IGF3YWl0IE15b3BTREsuZ2V0SWZyYW1lTW9kdWxlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJZnJhbWVTREsgPSBpZnJhbWVNb2R1bGUuSWZyYW1lU0RLO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2RrID0gbmV3IElmcmFtZVNESygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2RrLmluaXQoKTtcbiAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgX19teW9wX2luaXQoKS50aGVuKCk7XG4gICAgICAgICAgICAgICAgPC9zY3JpcHQ+YFxuICAgICAgICAgICAgICAgIDogYDxzY3JpcHQ+XG4gICAgICAgICAgICAgICAgICAgd2luZG93Ll9fZmVkZXJhdGlvbl9fLl9fcHVibGljX3BhdGhfXyA9IHdpbmRvdy5fX2ZlZGVyYXRpb25fXy5fX3B1YmxpY19wYXRoX187XG4gICAgICAgICAgICAgICAgICAgY29uc3QgX19teW9wX2luaXQgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7SWZyYW1lU0RLfSA9IChhd2FpdCB3aW5kb3cubXlvcC5yb290U0RLLmdldElmcmFtZU1vZHVsZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNkayA9IG5ldyBJZnJhbWVTREsoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNkay5pbml0KCk7XG4gICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgIF9fbXlvcF9pbml0KCkudGhlbigpO1xuICAgICAgICAgICAgICAgIDwvc2NyaXB0PmA7XG5cbiAgICAgICAgICAgIC8vIElzb2xhdGVkIGZyYW1lcyB1c2UgdGhlIHBvc3RNZXNzYWdlIGJyaWRnZSBpbnN0ZWFkIG9mIHRoZSBzYW1lLW9yaWdpblxuICAgICAgICAgICAgLy8gSWZyYW1lU0RLICsgZGF0YS1pbmplY3Rpb24gc2NyaXB0cyAod2hpY2ggcmVseSBvbiBob3N0XHUyMTk0ZnJhbWUgYWNjZXNzKS5cbiAgICAgICAgICAgIGlmICghaXNvbGF0ZSkge1xuICAgICAgICAgICAgICAgIGRvYy53cml0ZWxuKGAke3Nka1NjcmlwdH0ke2luaXRTY3JpcHR9YCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEluamVjdCBkYXRhIHNjcmlwdCBpZiBkYXRhIG9wdGlvbiBpcyBwcm92aWRlZC5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBgbnVsbGAgQ09VTlRTIEFTIE5PIERBVEEsIE5PVCBBUyBEQVRBLiBUaGUgY2hlY2sgdXNlZCB0byBiZSBgIT09IHVuZGVmaW5lZGAsXG4gICAgICAgICAgICAvLyBhbmQgYG51bGwgIT09IHVuZGVmaW5lZGAgaXMgdHJ1ZSAtLSBzbyBhIGhvc3QgdGhhdCBwYXNzZXMgYGRhdGE6IG51bGxgICh0aGVcbiAgICAgICAgICAgIC8vIG5hdHVyYWwgd2F5IHRvIHNheSBcIm5vdGhpbmcgdG8gc2VuZCB5ZXRcIikgZ290IHRoZSB3aG9sZSBkYXRhIHNjcmlwdCBpbmplY3RlZFxuICAgICAgICAgICAgLy8gYW5kIHRoZSBjb21wb25lbnQncyBvd24gYG15b3BfaW5pdF9pbnRlcmZhY2VgIGludm9rZWQgd2l0aCBudWxsLiBBIGNvbXBvbmVudFxuICAgICAgICAgICAgLy8gdGhhdCB2YWxpZGF0ZXMgaXRzIGlucHV0IHRoZW4gcmVqZWN0cyBpdCwgd2hpY2ggaXMgd2hlcmUgUGljLVRpbWUncyBjb25zb2xlXG4gICAgICAgICAgICAvLyBlcnJvciBgbXlvcF9pbml0X2ludGVyZmFjZTogSW52YWxpZCBjb25maWcgcHJvdmlkZWQuYCBjYW1lIGZyb206IG1lYXN1cmVkIG9uXG4gICAgICAgICAgICAvLyB0aGVpciBwYWdlIDIwMjYtMTAtMTgsIEFMTCAxMyBjb21wb25lbnRzIGFyZSBtb3VudGVkIHdpdGggYGRhdGE6IG51bGxgLCBzb1xuICAgICAgICAgICAgLy8gZXZlcnkgb25lIG9mIHRoZW0gcGFpZCBmb3IgYW4gaW5qZWN0ZWQgc2NyaXB0IGFuZCBhIG1lYW5pbmdsZXNzIGluaXQgY2FsbC5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBJbml0aWFsaXNpbmcgYSBjb21wb25lbnQgd2l0aCBudWxsIGNhbiBuZXZlciB0ZWxsIGl0IGFueXRoaW5nIHRoYXQgb21pdHRpbmdcbiAgICAgICAgICAgIC8vIHRoZSBjYWxsIGRvZXMgbm90LCBzbyB0aGUgdHdvIGFyZSBub3cgdHJlYXRlZCB0aGUgc2FtZS5cbiAgICAgICAgICAgIGlmICghaXNvbGF0ZSAmJiBvcHRpb25zPy5kYXRhICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucz8uZGF0YSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIFNldHVwIENUQSBxdWV1ZSAtIGNhcHR1cmVzIGFueSBDVEFzIGVtaXR0ZWQgZHVyaW5nIGluaXQgYmVmb3JlIGhvc3QgcmVnaXN0ZXJzIGhhbmRsZXJcbiAgICAgICAgICAgICAgICBjb25zdCBjdGFRdWV1ZVNjcmlwdCA9IGA8c2NyaXB0PlxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuX19teW9wX2N0YV9xdWV1ZSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubXlvcF9jdGFfaGFuZGxlciA9IGZ1bmN0aW9uKGFjdGlvbiwgcGF5bG9hZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fbXlvcF9jdGFfcXVldWUucHVzaCh7YWN0aW9uOiBhY3Rpb24sIHBheWxvYWQ6IHBheWxvYWR9KTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICA8L3NjcmlwdD5gO1xuXG4gICAgICAgICAgICAgICAgLy8gRXNjYXBlIGRhdGEgZm9yIHNhZmUgZW1iZWRkaW5nIGluIHNjcmlwdCB0YWdcbiAgICAgICAgICAgICAgICAvLyBKU09OLnN0cmluZ2lmeSBkb2Vzbid0IGVzY2FwZSA8L3NjcmlwdD4gd2hpY2ggY291bGQgYnJlYWsgSFRNTCBwYXJzaW5nXG4gICAgICAgICAgICAgICAgY29uc3QgZXNjYXBlZERhdGEgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zLmRhdGEpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC88XFwvc2NyaXB0L2dpLCAnXFxcXHUwMDNjL3NjcmlwdCcpO1xuXG4gICAgICAgICAgICAgICAgLy8gU2VsZi1jb250YWluZWQgZGF0YSBpbmplY3Rpb24gc2NyaXB0IHRoYXQ6XG4gICAgICAgICAgICAgICAgLy8gMS4gQ2FsbHMgbXlvcF9pbml0X2ludGVyZmFjZSBpbW1lZGlhdGVseSBpZiBhbHJlYWR5IGRlZmluZWRcbiAgICAgICAgICAgICAgICAvLyAyLiBXYXRjaGVzIGZvciBsYXRlLWRlZmluZWQgbXlvcF9pbml0X2ludGVyZmFjZSB2aWEgZGVmaW5lUHJvcGVydHlcbiAgICAgICAgICAgICAgICAvLyAzLiBDbGVhbnMgdXAgYWZ0ZXIgaXRzZWxmIChyZW1vdmVzIHNjcmlwdCB0YWcgYW5kIHdpbmRvdyBkYXRhKVxuICAgICAgICAgICAgICAgIC8vIDQuIFBvc3RzIG1lc3NhZ2UgdG8gcGFyZW50IGZvciBleHRlbnNpb24gdHJhY2tpbmcgKHByZS1pbmplY3RlZCBpbml0KilcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhU2NyaXB0ID0gYDxzY3JpcHQgaWQ9XCJfX215b3BfaW5pdF9kYXRhX3NjcmlwdFwiPlxuICAgICAgICAgICAgICAgICAgICAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9ICR7ZXNjYXBlZERhdGF9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNjcmlwdEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ19fbXlvcF9pbml0X2RhdGFfc2NyaXB0Jyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWxsSW5pdEludGVyZmFjZSA9IGZ1bmN0aW9uKGZuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hcmsgYXMgcHJlLWluamVjdGVkIGRhdGEgY2FsbCBmb3IgZXh0ZW5zaW9uIHRyYWNraW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fbXlvcF9pbml0X3ByZWluamVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbihkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuX19teW9wX2luaXRfcHJlaW5qZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGR1cmF0aW9uID0gcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydFRpbWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RpZnkgZXh0ZW5zaW9uIHZpYSBwb3N0TWVzc2FnZSAoaW5pdCogPSBwcmUtaW5qZWN0ZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnTVlPUF9QUkVJTkpFQ1RFRF9JTklUJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgJyonKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYW51cDogcmVtb3ZlIHNjcmlwdCB0YWcgYW5kIHN0b3JlZCBkYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjcmlwdEVsICYmIHNjcmlwdEVsLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0RWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzY3JpcHRFbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB3aW5kb3cuX19teW9wX2luaXRfZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93Lm15b3BfaW5pdF9pbnRlcmZhY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGdW5jdGlvbiBhbHJlYWR5IGV4aXN0cyAtIGNhbGwgaW1tZWRpYXRlbHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsSW5pdEludGVyZmFjZSh3aW5kb3cubXlvcF9pbml0X2ludGVyZmFjZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZ1bmN0aW9uIG5vdCB5ZXQgZGVmaW5lZCAtIHN0b3JlIGRhdGEgYW5kIHdhdGNoIGZvciBkZWZpbml0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fbXlvcF9pbml0X2RhdGEgPSBkYXRhO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9vcmlnaW5hbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCAnbXlvcF9pbml0X2ludGVyZmFjZScsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKGZuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb3JpZ2luYWwgPSBmbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuX19teW9wX2luaXRfZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0b3JlZERhdGEgPSB3aW5kb3cuX19teW9wX2luaXRfZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgd2luZG93Ll9fbXlvcF9pbml0X2RhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbEluaXRJbnRlcmZhY2UoZm4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9vcmlnaW5hbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgICAgIDwvc2NyaXB0PmA7XG4gICAgICAgICAgICAgICAgZG9jLndyaXRlbG4oY3RhUXVldWVTY3JpcHQgKyBkYXRhU2NyaXB0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSXNvbGF0ZWQgZnJhbWVzOiBpbmplY3QgdGhlIHBvc3RNZXNzYWdlIGJyaWRnZSAoaW5pdCBpbiAvIGN0YSBvdXQgLyBzaXplIG91dCkuXG4gICAgICAgICAgICBpZiAoaXNvbGF0ZSkge1xuICAgICAgICAgICAgICAgIC8vIFNhbWUgcnVsZSBhcyB0aGUgbm9uLWlzb2xhdGVkIHBhdGggYWJvdmU6IG51bGwgaXMgbm8gZGF0YS5cbiAgICAgICAgICAgICAgICBjb25zdCBlc2NhcGVkRGF0YSA9IG9wdGlvbnM/LmRhdGEgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zPy5kYXRhICE9PSBudWxsXG4gICAgICAgICAgICAgICAgICAgID8gSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5kYXRhKS5yZXBsYWNlKC88XFwvc2NyaXB0L2dpLCAnXFxcXHUwMDNjL3NjcmlwdCcpXG4gICAgICAgICAgICAgICAgICAgIDogJ3VuZGVmaW5lZCc7XG4gICAgICAgICAgICAgICAgZG9jLndyaXRlbG4odGhpcy5idWlsZElzb2xhdGlvbkJyaWRnZShlc2NhcGVkRGF0YSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkb2MuY2xvc2UoKTtcblxuICAgICAgICAgICAgLy8gVE9ETyA6IGNvbnRyb2wgZnJvbSBkYXNoYm9hcmRcbiAgICAgICAgICAgIC8vICAoc2tpbi5sb2FkZXIgYXMgSUlmcmFtZUxvYWRlckNvbmZpZykuYXV0b0hlaWdodCA9IHRydWU7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbXAgPSBuZXcgTXlvcElmcmFtZUNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpO1xuXG4gICAgICAgICAgICAvLyBJc29sYXRlZDogd2lyZSB0aGUgaG9zdCBzaWRlIG9mIHRoZSBwb3N0TWVzc2FnZSBicmlkZ2UgKGN0YSBpbiwgc2l6ZSBpbiwgaW5pdCBvdXQpLlxuICAgICAgICAgICAgaWYgKGlzb2xhdGUpIGNvbXAuZW5hYmxlSXNvbGF0aW9uKCk7XG5cbiAgICAgICAgICAgIC8vIFN0b3JlIHBhcnNlZCBzaXplTWV0YSBvbiB0aGUgY29tcG9uZW50IHNvIHRoZSBSZWFjdCBob3N0IGNhbiByZWFkIGl0XG4gICAgICAgICAgICBjb21wLnNpemVNZXRhID0gcGFyc2VkU2l6ZU1ldGE7XG5cbiAgICAgICAgICAgIC8vIEF1dG8tc2l6ZTogb2JzZXJ2ZSBjb250ZW50IHNpemUgYW5kIHN5bmMgdG8gaWZyYW1lIGRpbWVuc2lvbnMuXG4gICAgICAgICAgICAvLyBUaGlzIHdvcmtzIGZvciBhbGwgaG9zdHMgKHZhbmlsbGEgU0RLLCBSZWFjdCwgVnVlLCBBbmd1bGFyKS5cbiAgICAgICAgICAgIC8vIElmIGEgZnJhbWV3b3JrIGhvc3QgKGUuZy4gQG15b3AvcmVhY3QpIGFsc28gY2FsbHMgb2JzZXJ2ZUF1dG9TaXplKCksXG4gICAgICAgICAgICAvLyBpdCBjbGVhbmx5IHJlcGxhY2VzIHRoZXNlIG9ic2VydmVycyB2aWEgX2F1dG9TaXplQ2xlYW51cCB0cmFja2luZy5cbiAgICAgICAgICAgIGNvbXAuaW5pdGlhdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnM/LmF1dG9TaXplID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBObyBhdXRvLXNpemluZy4gSWZyYW1lIHN0YXlzIHBvc2l0aW9uOmFic29sdXRlIGZpbGxpbmcgY29udGFpbmVyLlxuICAgICAgICAgICAgICAgICAgICAvLyBIb3N0IGlzIGZ1bGx5IHJlc3BvbnNpYmxlIGZvciBjb250YWluZXIgZGltZW5zaW9ucyAoZS5nLiBSZWFjdCBOYXRpdmUgV2ViVmlldykuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHNob3duID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29tcC5vYnNlcnZlQXV0b1NpemUoe1xuICAgICAgICAgICAgICAgICAgICBmb3JjZUF1dG9TaXplOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBvblNpemVDaGFuZ2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNob3cgYWZ0ZXIgZmlyc3QgbWVhc3VyZW1lbnQgY29tcGxldGVzIChub3QgYmVmb3JlKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBpZnJhbWUgdHJhbnNpdGlvbnMgZnJvbSBhYnNvbHV0ZSBvdmVybGF5IHRvIGRvY3VtZW50IGZsb3dcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0IHRoZSBtZWFzdXJlZCBoZWlnaHQsIHByZXZlbnRpbmcgZmxhc2ggYXQgd3Jvbmcgc2l6ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2hvd24gJiYgIW9wdGlvbnM/LmhpZGRlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3duID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wLnNob3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAvLyBjb21wLnByb3BzLl9nbG9iYWwgPSBjb21wLmVsZW1lbnQuY29udGVudFdpbmRvdztcbiAgICAgICAgICAgIHJldHVybiBjb21wO1xuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobG9hZGVyQ29uZmlnLnNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUubm9uZSkge1xuICAgICAgICAgICAgLy8gcGFyc2VyID0gcGFyc2VyID8gcGFyc2VyIDogbmV3IERPTVBhcnNlcigpO1xuICAgICAgICAgICAgLy8gY29uc3QgZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhsb2FkZXJDb25maWcuSFRNTCwgJ3RleHQvaHRtbCcpO1xuICAgICAgICAgICAgLy8gZWxlbWVudCA9IGRvYy5ib2R5LmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICAvL2VsZW1lbnQuc2V0QXR0cmlidXRlKCdpZCcsIGRvbUlkKTtcblxuICAgICAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xuICAgICAgICAgICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gbG9hZGVyQ29uZmlnLkhUTUw7Ly8udHJpbSgpO1xuICAgICAgICAgICAgZWxlbWVudCA9IHRlbXBsYXRlLmNvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cbiAgICAgICAgICAgIC8vICAgY29uc3QgZmlyc3RFbGVtZW50ID0gdGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICAgICAgICAgIC8vICAgY29uc3QgeiA9IGZpcnN0RWxlbWVudCA/IGZpcnN0RWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgOiBudWxsO1xuICAgICAgICAgICAgLy8gICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vICAgY29uc29sZS5sb2codGVtcGxhdGUsIGZpcnN0RWxlbWVudCwgeilcbiAgICAgICAgICAgIC8vICAgZWxlbWVudCA9IGZpcnN0RWxlbWVudFxuXG4gICAgICAgICAgICAvLyBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0Ym9keScpO1xuICAgICAgICAgICAgLy8gZGVidWdnZXI7XG4gICAgICAgICAgICAvLyBjb250YWluZXIuaW5uZXJIVE1MID0gbG9hZGVyQ29uZmlnLkhUTUw7XG4gICAgICAgICAgICAvLyBlbGVtZW50ID0gY29udGFpbmVyLmZpcnN0RWxlbWVudENoaWxkO1xuXG4gICAgICAgICAgICBnZXRJbml0aWF0ZWRTZGsoKS50aGVuKChzZGspID0+IHtcbiAgICAgICAgICAgICAgICBzZGsuY29ubmVjdGVkQ2FsbGJhY2soZWxlbWVudCwgZWxlbWVudCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY3VzdG9tRWxlbWVudE5hbWUgPSB0b0N1c3RvbUVsZW1lbnROYW1lKGNvbXBvbmVudERlZmluaXRpb24ubmFtZSArIHNraW4uaWQpO1xuXG4gICAgICAgICAgICAvL1RPRE8gOiBzdXBwb3J0IHJlZGVmaW5lICFcbiAgICAgICAgICAgIGlmICghc2Vlbi5pbmNsdWRlcyhjdXN0b21FbGVtZW50TmFtZSkpIHtcbiAgICAgICAgICAgICAgICBjcmVhdGVDdXN0b21XZWJDb21wb25lbnQoY3VzdG9tRWxlbWVudE5hbWUsIGxvYWRlckNvbmZpZy5IVE1MLCBsb2FkZXJDb25maWcuc2hhZG93Um9vdE1vZGUpO1xuICAgICAgICAgICAgICAgIHNlZW4ucHVzaChjdXN0b21FbGVtZW50TmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChjdXN0b21FbGVtZW50TmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcignW2lkXj1cIm15b3AtY29tcC1cIl0nKSlcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAvL2VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICBlbGVtZW50LmlkID0gZG9tSWQ7XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmhpZGRlbikge1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgKGNvbnRhaW5lci5pZC5zdGFydHNXaXRoKCdteW9wLWNvbXAtJykpIHtcbiAgICAgICAgLy8gICAgIC8vIGluIHBsYWNlIHJlcGxhY2VtZW50XG4gICAgICAgIC8vICAgICBjb250YWluZXIucmVwbGFjZVdpdGgoZWxlbWVudCk7XG4gICAgICAgIC8vICAgICAvL2NvbnRhaW5lciA9IGVsZW1lbnQucGFyZW50RWxlbWVudCE7XG4gICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgIC8vIH1cblxuICAgICAgICB0aGlzLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgZWxlbWVudCwgb3B0aW9ucyk7XG5cbiAgICAgICAgLy9lbGVtZW50LmlubmVySFRNTCA9IGA8JHtjdXN0b21FbGVtZW50TmFtZX0gLz5gO1xuICAgICAgICByZXR1cm4gbmV3IE15b3BXZWJDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgY29udGFpbmVyLCBlbGVtZW50LCBvcHRpb25zKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgKiBhcyBDU1MgZnJvbSBcImNzc3R5cGVcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi9ob3N0XCI7XG5pbXBvcnQge3V1aWR2NH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzLnRzXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRNZXNzYWdlfSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcblxuLy8gaWdub3JpbmcgZG9jdW1lbnRhdGlvblxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ1NTUHJvcGVydGllcyBleHRlbmRzIENTUy5Qcm9wZXJ0aWVzPHN0cmluZyB8IG51bWJlcj4ge1xufVxuXG5leHBvcnQgdHlwZSBTdHlsZXNoZWV0RGVmaW5pdGlvbiA9IHsgW2tleTogc3RyaW5nXTogQ1NTUHJvcGVydGllcyB9O1xuXG5leHBvcnQgY29uc3QgYXBwbHlTdHlsZXNoZWV0ID0gKGNvbXBvbmVudDogSU15b3BDb21wb25lbnQsIHN0eWxlc2hlZXQ6IFN0eWxlc2hlZXREZWZpbml0aW9uLCBjc3M/OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCB0YWdJZCA9IGBteW9wLWNzcy0ke3V1aWR2NCgpfWA7XG4gICAgY29tcG9uZW50LnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCh7cm9vdFJlZiwgX3N0eWxlc2hlZXQsIF90YWdJZCwgX2Nzc30pID0+IHtcbiAgICAgICAgY29uc3Qgc3R5bGVUYWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgICBzdHlsZVRhZy50eXBlID0gJ3RleHQvY3NzJztcblxuICAgICAgICAvLyBCdWlsZCB0aGUgQ1NTIHN0cmluZyBmcm9tIHRoZSBzdHlsZXMgb2JqZWN0XG4gICAgICAgIGxldCBjc3NTdHJpbmcgPSBfY3NzO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc2VsZWN0b3IgaW4gX3N0eWxlc2hlZXQpIHtcbiAgICAgICAgICAgIGNzc1N0cmluZyArPSBgJHtzZWxlY3Rvcn0geyBgO1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IF9zdHlsZXNoZWV0W3NlbGVjdG9yXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gcHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgIGNzc1N0cmluZyArPSBgJHtwcm9wZXJ0eX06ICR7cHJvcGVydGllc1twcm9wZXJ0eV19OyBgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3NzU3RyaW5nICs9ICd9ICc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgdGhlIENTUyBzdHJpbmcgYXMgdGhlIGNvbnRlbnQgb2YgdGhlIDxzdHlsZT4gZWxlbWVudFxuICAgICAgICBzdHlsZVRhZy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3NTdHJpbmcpKTtcbiAgICAgICAgc3R5bGVUYWcuaWQgPSBfdGFnSWQ7XG4gICAgICAgIC8vIEFwcGVuZCB0aGUgPHN0eWxlPiBlbGVtZW50XG4gICAgICAgIChyb290UmVmLnNoYWRvd1Jvb3QgfHwgcm9vdFJlZi5jb250YWluZXIpLmFwcGVuZENoaWxkKHN0eWxlVGFnKTtcblxuICAgIH0sICgpID0+IHtcbiAgICB9LCB7XG4gICAgICAgIF9zdHlsZXNoZWV0OiBzdHlsZXNoZWV0LFxuICAgICAgICBfY3NzIDogY3NzID8gY3NzIDogJycsXG4gICAgICAgIF90YWdJZDogdGFnSWRcbiAgICB9KSk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKHtyb290UmVmLCBfdGFnSWR9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gKHJvb3RSZWYuc2hhZG93Um9vdCB8fCBkb2N1bWVudCkuZ2V0RWxlbWVudEJ5SWQoX3RhZ0lkKTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgKCkgPT4ge1xuICAgICAgICB9LCB7XG4gICAgICAgICAgICBfdGFnSWQ6IHRhZ0lkXG4gICAgICAgIH0pKVxuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IGFwcGx5U3R5bGVzaGVldExpbmsgPSAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgbGluazogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgdGFnSWQgPSBgbXlvcC1jc3MtJHt1dWlkdjQoKX1gO1xuICAgIGNvbXBvbmVudC5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoe3Jvb3RSZWYsIF90YWdJZCwgX2xpbmt9KSA9PiB7XG4gICAgICAgIGNvbnN0IGxpbmtFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgICAgICBsaW5rRWxlbWVudC5pZCA9IF90YWdJZDtcbiAgICAgICAgbGlua0VsZW1lbnQucmVsID0gJ3N0eWxlc2hlZXQnO1xuICAgICAgICBsaW5rRWxlbWVudC5ocmVmID0gX2xpbms7XG4gICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobGlua0VsZW1lbnQpO1xuXG4gICAgICAgIC8vIEFwcGVuZCB0aGUgPHN0eWxlPiBlbGVtZW50XG4gICAgICAgIChyb290UmVmLnNoYWRvd1Jvb3QgfHwgcm9vdFJlZi5jb250YWluZXIpLmFwcGVuZENoaWxkKGxpbmtFbGVtZW50KTtcbiAgICB9LCAoKSA9PiB7XG4gICAgfSwge1xuICAgICAgICBfbGluayA6IGxpbmssXG4gICAgICAgIF90YWdJZDogdGFnSWRcbiAgICB9KSk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKHtyb290UmVmLCBfdGFnSWR9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gKHJvb3RSZWYuc2hhZG93Um9vdCB8fCBkb2N1bWVudCkuZ2V0RWxlbWVudEJ5SWQoX3RhZ0lkKTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgKCkgPT4ge1xuICAgICAgICB9LCB7XG4gICAgICAgICAgICBfdGFnSWQ6IHRhZ0lkXG4gICAgICAgIH0pKVxuICAgIH1cbn1cbiIsICJpbXBvcnQge0lJZnJhbWVMb2FkZXJDb25maWcsIElTa2luQ29uZmlnfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmV4cG9ydCB0eXBlIFRva2VuTWFwID0gUmVjb3JkPHN0cmluZywgc3RyaW5nfCBudW1iZXI+XG5cbmNvbnN0IHJlcGxhY2VUb2tlbnMgPSAoaW5wdXQ6IHN0cmluZywgdG9rZW5NYXA6IFRva2VuTWFwKTogc3RyaW5nID0+IHtcbiAgICAvLyBDcmVhdGUgYSByZWdleCBwYXR0ZXJuIGZyb20gdGhlIGtleXMgb2YgdGhlIHRva2VuTWFwXG4gICAgY29uc3QgcGF0dGVybiA9IG5ldyBSZWdFeHAoT2JqZWN0LmtleXModG9rZW5NYXApLmpvaW4oJ3wnKSwgJ2cnKTtcblxuICAgIC8vIFJlcGxhY2UgdG9rZW5zIGluIHRoZSBpbnB1dCBzdHJpbmcgdXNpbmcgdGhlIHJlZ2V4XG4gICAgcmV0dXJuIGlucHV0LnJlcGxhY2UocGF0dGVybiwgKG1hdGNoZWQpID0+IHtcbiAgICAgICAgLy8gUmV0dXJuIHRoZSByZXBsYWNlbWVudCB2YWx1ZSBmcm9tIHRoZSB0b2tlbk1hcFxuICAgICAgICByZXR1cm4gKHRva2VuTWFwW21hdGNoZWRdIHx8IG1hdGNoZWQpLnRvU3RyaW5nKCk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVJZnJhbWVTa2luQnlUb2tlbml6ZXIgPSAoc2VsZWN0ZWRTa2luOiBJU2tpbkNvbmZpZywgdG9rZW5NYXA6IFRva2VuTWFwKSA9PiB7XG4gICAgY29uc3QgdHlwZWRTa2luQ29uZmlnID0gKHNlbGVjdGVkU2tpbi5sb2FkZXIgYXMgSUlmcmFtZUxvYWRlckNvbmZpZylcbiAgICBpZiAodHlwZWRTa2luQ29uZmlnLnR5cGUgIT09ICdJZnJhbWVMb2FkZXInKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgaWZyYW1lU2tpblVybFRva2VuaXplciByZWNlaXZlZCBza2luIHdpdGggbG9hZGVyIHR5cGUgXCIke3R5cGVkU2tpbkNvbmZpZy50eXBlfVwiLCBjdXJyZW50bHkgb25seSBcIklmcmFtZUxvYWRlclwiIGlzIHN1cHBvcnRlZGApXG4gICAgfVxuXG4gICAgc2VsZWN0ZWRTa2luLmxvYWRlciA9IHtcbiAgICAgICAgLi4uc2VsZWN0ZWRTa2luLmxvYWRlclxuICAgIH1cblxuICAgIHNlbGVjdGVkU2tpbi5sb2FkZXIudXJsID0gcmVwbGFjZVRva2VucyhzZWxlY3RlZFNraW4ubG9hZGVyLnVybCwgdG9rZW5NYXApO1xuXG4gICAgcmV0dXJuIHNlbGVjdGVkU2tpbjtcbn1cblxuZXhwb3J0IGNvbnN0IGNoYW5nZVNraW5VcmxCeVRva2VuaXplciA9ICh0b2tlbk1hcDogVG9rZW5NYXApID0+IHtcbiAgICByZXR1cm4gYXN5bmMgKHNlbGVjdGVkU2tpbjogSVNraW5Db25maWcpID0+IHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUlmcmFtZVNraW5CeVRva2VuaXplcihzZWxlY3RlZFNraW4sIHRva2VuTWFwKTtcbiAgICB9XG59IiwgImltcG9ydCB7Q3VzdG9tUmVmTWVzc2FnZX0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vaG9zdFwiO1xuXG4vLyBjb25zdCBzcGFjZSA9ICcgJztcbi8vIGV4cG9ydCBjb25zdCBnZXRDbGFzc2VzID0gYXN5bmMgKGNvbm5lY3RlZFJlZjogUmVmKTogUHJvbWlzZTxzdHJpbmdbXT4gPT4gKGF3YWl0IGV4ZWMoYWN0QXM8SFRNTERpdkVsZW1lbnQ+KGNvbm5lY3RlZFJlZikuY2xhc3NMaXN0KSkudmFsdWUuc3BsaXQoc3BhY2UpO1xuLy8gZXhwb3J0IGNvbnN0IGFkZENsYXNzID0gYXN5bmMgKGNvbm5lY3RlZFJlZjogUmVmLCBjbGFzc05hbWU6IHN0cmluZykgPT4ge1xuLy8gICAgIGNvbnN0IGNsYXNzZXMgPSBhd2FpdCBnZXRDbGFzc2VzKGNvbm5lY3RlZFJlZik7XG4vLyAgICAgY2xhc3Nlcy5pbmNsdWRlcyhjbGFzc05hbWUpIHx8IGNsYXNzZXMucHVzaChjbGFzc05hbWUpO1xuLy8gICAgIC8vIEB0cy1pZ25vcmVcbi8vICAgICBjb25uZWN0ZWRSZWYuY2xhc3NMaXN0ID0gY2xhc3Nlcy5qb2luKHNwYWNlKTtcbi8vIH1cbi8vIGV4cG9ydCBjb25zdCByZW1vdmVDbGFzcyA9IGFzeW5jIChjb25uZWN0ZWRSZWY6IFJlZiwgY2xhc3NOYW1lOiBzdHJpbmcsKSA9PiB7XG4vLyAgICAgbGV0IGNsYXNzZXMgPSBhd2FpdCBnZXRDbGFzc2VzKGNvbm5lY3RlZFJlZik7XG4vLyAgICAgLy8gQHRzLWlnbm9yZVxuLy8gICAgIGNvbm5lY3RlZFJlZi5jbGFzc0xpc3QgPSBjbGFzc2VzLmZpbHRlcihjID0+IGMgIT09IGNsYXNzTmFtZSkuam9pbihzcGFjZSk7XG4vLyB9XG4vL1xuLy9cblxuZXhwb3J0IGNvbnN0IGFkZENsYXNzID0gKGNvbXBvbmVudDogSU15b3BDb21wb25lbnQsIGNsYXNzTmFtZTogc3RyaW5nLCBteW9wSWQ6IHN0cmluZykgPT4ge1xuICAgIGNvbXBvbmVudC5zZW5kKG5ldyBDdXN0b21SZWZNZXNzYWdlKCh7cmVmLCBfY2xhc3NOYW1lfSkgPT4ge1xuICAgICAgICByZWY/LmNsYXNzTGlzdC5hZGQoX2NsYXNzTmFtZSk7XG4gICAgfSwge1xuICAgICAgICBlbGVtZW50SWQ6IG15b3BJZCxcbiAgICAgICAgX2NsYXNzTmFtZTogY2xhc3NOYW1lXG4gICAgfSkpO1xufVxuXG5leHBvcnQgY29uc3QgcmVtb3ZlQ2xhc3MgPSAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgY2xhc3NOYW1lOiBzdHJpbmcsIG15b3BJZDogc3RyaW5nKSA9PiB7XG4gICAgY29tcG9uZW50LnNlbmQobmV3IEN1c3RvbVJlZk1lc3NhZ2UoKHtyZWYsIF9jbGFzc05hbWV9KSA9PiB7XG4gICAgICAgIHJlZj8uY2xhc3NMaXN0LnJlbW92ZShfY2xhc3NOYW1lKTtcbiAgICB9LCB7XG4gICAgICAgIGVsZW1lbnRJZDogbXlvcElkLFxuICAgICAgICBfY2xhc3NOYW1lOiBjbGFzc05hbWVcbiAgICB9KSk7XG59IiwgImltcG9ydCB7XG4gICAgSUNvbXBvbmVudENvbmZpZyxcbiAgICBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICBJQ29tcG9uZW50SW5zdGFuY2VDb25maWcsIElIVE1MTG9hZGVyQ29uZmlnLCBJUmVmQ29uZmlnLFxuICAgIElTa2luTG9hZGVyQ29uZmlnLFxuICAgIElTa2luU2VsZWN0b3JDb25maWcsXG4gICAgSURlZGljYXRlZFNraW5Db25maWcsIElTa2luQ29uZmlnXG59IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7dXVpZHY0fSBmcm9tIFwiLi4vdXRpbHMvdXRpbHMudHNcIjtcblxuZXhwb3J0IGNsYXNzIFNraW5Db25maWcgaW1wbGVtZW50cyBJU2tpbkNvbmZpZyB7XG4gICAgX3J1blRpbWVJbnN0YW5jZUlkID0gJ3J1bnRpbWUtaW5zdGFuY2UtaWQtJyArIHV1aWR2NCgpO1xuICAgIF9ydW5UaW1lSWQgPSAncnVudGltZS1pZC0nICsgdXVpZHY0KCk7XG4gICAgX3J1blRpbWVOYW1lID0gJ3J1bnRpbWUtbmFtZS0nICsgdXVpZHY0KCk7XG5cbiAgICBzdGF0aWMgY3JlYXRlID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFNraW5Db25maWcoKTtcbiAgICB9XG5cbiAgICBpZCA9IHRoaXMuX3J1blRpbWVJZDtcbiAgICBuYW1lID0gdGhpcy5fcnVuVGltZU5hbWU7XG4gICAgZGVzY3JpcHRpb24gPSAnJztcbiAgICBsb2FkZXIgPSBudWxsIGFzIHVua25vd24gYXMgSVNraW5Mb2FkZXJDb25maWc7XG5cbiAgICB3aXRoTG9hZGVyID0gKGxvYWRlcjogSVNraW5Mb2FkZXJDb25maWcpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkZXIgPSBsb2FkZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHdpdGhIVE1MTG9hZGVyID0gKGxvYWRlcjogT21pdDxJSFRNTExvYWRlckNvbmZpZywgJ3R5cGUnPikgPT4ge1xuICAgICAgICBsb2FkZXIudHlwZSA9ICdIVE1MTG9hZGVyJztcbiAgICAgICAgdGhpcy5sb2FkZXIgPSBsb2FkZXIgYXMgSUhUTUxMb2FkZXJDb25maWc7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGJ1aWxkID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb21wb25lbnRDb25maWcgaW1wbGVtZW50cyBJQ29tcG9uZW50Q29uZmlnIHtcbiAgICBfcnVuVGltZUluc3RhbmNlSWQgPSAncnVudGltZS1pbnN0YW5jZS1pZC0nICsgdXVpZHY0KCk7XG4gICAgX3J1blRpbWVJZCA9ICdydW50aW1lLWlkLScgKyB1dWlkdjQoKTtcbiAgICBfcnVuVGltZU5hbWUgPSAncnVudGltZS1uYW1lLScgKyB1dWlkdjQoKTtcblxuICAgIHN0YXRpYyBjcmVhdGUgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50Q29uZmlnKCk7XG4gICAgfVxuXG4gICAgaW5zdGFuY2UgPSB7XG4gICAgICAgIGlkOiB0aGlzLl9ydW5UaW1lSW5zdGFuY2VJZCxcbiAgICAgICAgY29tcG9uZW50SWQ6IHRoaXMuX3J1blRpbWVJZCxcbiAgICAgICAgY29tcG9uZW50TmFtZTogdGhpcy5fcnVuVGltZU5hbWUsXG4gICAgICAgIHNraW5TZWxlY3RvcjogbnVsbCBhcyB1bmtub3duIGFzIElTa2luU2VsZWN0b3JDb25maWdcbiAgICB9IGFzIElDb21wb25lbnRJbnN0YW5jZUNvbmZpZztcblxuICAgIG5hbWUgPSB0aGlzLl9ydW5UaW1lTmFtZVxuICAgIHR5cGUgPSB7XG4gICAgICAgIGlkOiB0aGlzLl9ydW5UaW1lSWQsXG4gICAgICAgIG5hbWU6IHRoaXMuX3J1blRpbWVOYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgIHByb3BzOiBbXSxcbiAgICAgICAgcmVmczogW10sXG4gICAgICAgIHNraW5zOiBbXSxcbiAgICAgICAgZGVmYXVsdFNraW46IDBcbiAgICB9IGFzIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnXG5cbiAgICB3aXRoSW5zdGFuY2UgPSAoaW5zdGFuY2U6IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZykgPT4ge1xuICAgICAgICB0aGlzLmluc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHdpdGhUeXBlID0gKHR5cGU6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnKSA9PiB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHdpdGhOYW1lID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB3aXRoRGVmYXVsdFNraW4gPSAoZGVmYXVsdFNraW46IElTa2luQ29uZmlnKSA9PiB7XG4gICAgICAgIHRoaXMudHlwZS5za2lucy5wdXNoKGRlZmF1bHRTa2luKTtcbiAgICAgICAgdGhpcy50eXBlLmRlZmF1bHRTa2luID0gdGhpcy50eXBlLnNraW5zLmxlbmd0aCAtIDE7XG4gICAgICAgIHRoaXMuaW5zdGFuY2Uuc2tpblNlbGVjdG9yID0ge1xuICAgICAgICAgICAgdHlwZTogJ0RlZGljYXRlZCcsXG4gICAgICAgICAgICBza2luOiB7XG4gICAgICAgICAgICAgICAgaWQ6IGRlZmF1bHRTa2luLmlkXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gYXMgSURlZGljYXRlZFNraW5Db25maWdcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB3aXRoUmVmID0gKHJlZjogSVJlZkNvbmZpZykgPT4ge1xuICAgICAgICB0aGlzLnR5cGUucmVmcy5wdXNoKHJlZik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHdpdGhCYXNpY1JlZiA9IChyZWZTZWxlY3Rvcjogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld0Jhc2ljUmVmID0ge1xuICAgICAgICAgICAgaWQ6ICcnLFxuICAgICAgICAgICAgbmFtZTogcmVmU2VsZWN0b3IsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgICAgICBzZWxlY3RvclR5cGU6ICdpZC1hdHRyaWJ1dGUnLFxuICAgICAgICAgICAgc2VsZWN0b3I6IHJlZlNlbGVjdG9yLFxuICAgICAgICAgICAgYmVoYXZpb3I6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnY29kZSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBhcyBJUmVmQ29uZmlnXG5cbiAgICAgICAgdGhpcy50eXBlLnJlZnMucHVzaChuZXdCYXNpY1JlZik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGJ1aWxkID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzKSlcbiAgICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IGV4ZWMgPSBhc3luYyAoZ2V0dGVyOiBhbnkpID0+IHtcbiAgICByZXR1cm4gYXdhaXQgZ2V0dGVyKClcbn1cbiIsICJleHBvcnQgKiBmcm9tIFwiLi9hcHBseVN0eWxlc2hlZXRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2lmcmFtZVNraW5VcmxUb2tlbml6ZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NsYXNzTGlzdFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29uZmlnQnVpbGRlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vQ2xvdWRSZXBvc2l0b3J5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9leGVjXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jbG91ZFJlcG9zaXRvcnlIZWxwZXJzXCI7IiwgImltcG9ydCB7ZGVjb21wcmVzc1VVSURzfSBmcm9tIFwiLi4vdXRpbHMvdXVpZC50c1wiO1xuaW1wb3J0IHtDbG91ZFJlcG9zaXRvcnl9IGZyb20gXCIuLi9oZWxwZXJzXCI7XG5pbXBvcnQge1xuICAgIEV4cGVyaWVuY2VUeXBlcyxcbiAgICBJQ29tcG9uZW50Q29uZmlnLCBJRGVkaWNhdGVkU2tpbkNvbmZpZyxcbiAgICBJU2VnbWVudGVkU2tpbkNvbmZpZyxcbiAgICBJU2VnbWVudEV4cGVyaWVuY2UsIElTa2luSW5zdGFuY2VDb25maWcsXG4gICAgU2tpblNlbGVjdG9yVHlwZXNcbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5leHBvcnQgY29uc3QgY2hlY2tNeW9wT3ZlcnJpZGUgPSBhc3luYyAoY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnKTogUHJvbWlzZTxJQ29tcG9uZW50Q29uZmlnIHwgbnVsbD4gPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIC8vVE9ETzogc3VwcG9ydCBkaXNhYmxpbmcgdGhlIG1lY2hhbmlzbVxuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh1cmwuc2VhcmNoKTtcbiAgICAgICAgY29uc3QgbXlvcE92ZXJyaWRlID0gcGFyYW1zLmdldCgnbXlvcE92ZXJyaWRlJyk7XG4gICAgICAgIGlmIChteW9wT3ZlcnJpZGUpIHtcbiAgICAgICAgICAgIGNvbnN0IFtzb3VyY2UsIC4uLnV1aWRzXSA9IGRlY29tcHJlc3NVVUlEcyhteW9wT3ZlcnJpZGUpO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKHNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NvbXBvbmVudCc6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW2NvbXBvbmVudElkLCBza2luSWRdID0gdXVpZHM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFRvT3ZlcnJpZGUgPSBhd2FpdCBDbG91ZFJlcG9zaXRvcnkuTWFpbi5mZXRjaENvbXBvbmVudChjb21wb25lbnRJZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRUb092ZXJyaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2RvOiBjaGVjayBmZXRjaEF1dG9GbG93LiBMb29rcyBsaWtlIG9ubHkgb25lIHNraW4gaXMgcmV0dXJuZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNraW4gPSBjb21wb25lbnRUb092ZXJyaWRlLnR5cGUuc2tpbnMuZmluZChza2luID0+IHNraW4uaWQgPT09IHNraW5JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2tpbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvZG86IGZvciBub3cganVzdCBzZXQgc2tpbiBpZC4gQ2hlY2sgdGhlIGNsb3VkIGltcGxlbWVudGF0aW9uXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnNraW5TZWxlY3RvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogU2tpblNlbGVjdG9yVHlwZXMuRGVkaWNhdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2luOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogc2tpbklkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gYXMgSVNraW5JbnN0YW5jZUNvbmZpZ1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRUb092ZXJyaWRlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgLy8gICAgY2FzZSAnZmxvdyc6IHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0IDoge1xuICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IFtmbG93SWQsIGV4cGVyaW1lbnRJZF0gPSB1dWlkcztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW2Zsb3dJZCwgZXhwZXJpbWVudElkXSA9IGRlY29tcHJlc3NVVUlEcyhteW9wT3ZlcnJpZGUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG93ID0gYXdhaXQgQ2xvdWRSZXBvc2l0b3J5Lk1haW4uZmV0Y2hGbG93KGZsb3dJZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFRvT3ZlcnJpZGUgPSBmbG93LmNvbXBvbmVudHMuZmluZChjID0+IGMudHlwZS5pZCA9PT0gY29tcG9uZW50Q29uZmlnLnR5cGUuaWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50VG9PdmVycmlkZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2Uuc2tpblNlbGVjdG9yLnR5cGUgPT09IFNraW5TZWxlY3RvclR5cGVzLlNlZ21lbnRlZCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2UucmVzb2x2ZWRFeHBlcmllbmNlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZEV4cGVyaWVuY2UgPSBjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnJlc29sdmVkRXhwZXJpZW5jZXMuZmluZChlID0+IGUuaWQgPT09IGV4cGVyaW1lbnRJZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkRXhwZXJpZW5jZT8udHlwZSA9PT0gRXhwZXJpZW5jZVR5cGVzLlNlZ21lbnQpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRSZXNvbHZlZEV4cGVyaWVuY2UgPSByZXNvbHZlZEV4cGVyaWVuY2UgYXMgSVNlZ21lbnRFeHBlcmllbmNlXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkU2tpblNlbGVjdG9yID0gY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5za2luU2VsZWN0b3IgYXMgSVNlZ21lbnRlZFNraW5Db25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlZ21lbnQgPSB0eXBlZFNraW5TZWxlY3Rvci5zZWdtZW50cy5maW5kKHMgPT4gcy5zZWdtZW50SWQgPT09IHR5cGVkUmVzb2x2ZWRFeHBlcmllbmNlLnNlZ21lbnQuaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnNraW5TZWxlY3RvciA9IHNlZ21lbnQ/LnNraW5TZWxlY3RvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50VG9PdmVycmlkZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59IiwgIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKiBUaGUgSG9zdCBTREsgaXMgZGVzaWduZWQgZm9yIGludGVncmF0aW9uIHdpdGhpbiB0aGUgaG9zdCBhcHBsaWNhdGlvbiB0aGF0IHNlcnZlcyBhcyB0aGUgY29udGFpbmVyIGZvciBNeW9wICBjb21wb25lbnRzLjxici8+PGJyLz5cbiAqIEl0IHByb3ZpZGVzIGVzc2VudGlhbCBmdW5jdGlvbmFsaXRpZXMgYW5kIEFQSXMgZm9yIHJlZ2lzdGVyaW5nLCBtYW5hZ2luZywgYW5kIGNvbW11bmljYXRpbmcgd2l0aCBNeW9wIGNvbXBvbmVudHMuPGJyLz48YnIvPlxuICogVGhpcyBTREsgZW5hYmxlcyBzZWFtbGVzcyBlbWJlZGRpbmcgb2YgaW5kZXBlbmRlbnRseSBkZXZlbG9wZWQgY29tcG9uZW50cyBpbnRvIHRoZSBob3N0IGFwcGxpY2F0aW9uLCBlbnN1cmluZyBzbW9vdGggaW50ZXJvcGVyYWJpbGl0eSBhbmQgY29uc2lzdGVudCB1c2VyIGV4cGVyaWVuY2UgYWNyb3NzIHZhcmlvdXMgTXlvcCBjb21wb25lbnQgaW1wbGVtZW50YXRpb25zLlxuICovXG5pbXBvcnQge2RlZmluZUR5bmFtaWNJbXBvcnR9IGZyb20gXCIuLi9keW5hbWljSW1wb3J0L2RlZmluZUR5bmFtaWNJbXBvcnRcIjtcbmltcG9ydCB7SU15b3BMb2FkZXJ9IGZyb20gXCIuL2xvYWRlcnMvSU15b3BMb2FkZXJcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuL2NvbXBvbmVudHMvSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsXG4gICAgRW52ZWxvcGVkTWVzc2FnZSwgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCxcbiAgICBJbml0TWVzc2FnZSxcbiAgICBJbml0UmVzcG9uc2UsIE1lc3NhZ2VEaXJlY3Rpb24sIFJlZlxufSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7TXlvcElmcmFtZUxvYWRlcn0gZnJvbSBcIi4vbG9hZGVycy9pZnJhbWVMb2FkZXJcIjtcbmltcG9ydCB7V2ViY29tcG9uZW50TG9hZGVyfSBmcm9tIFwiLi9sb2FkZXJzL3dlYmNvbXBvbmVudExvYWRlclwiO1xuaW1wb3J0IHtSZW5kZXJQb2xpY3l9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB0eXBlIHtJZnJhbWVTREt9IGZyb20gXCIuLi9JZnJhbWVcIjtcbmltcG9ydCB7Y29ubmVjdFByb3BzLCBjb25uZWN0UmVmcywgY3JlYXRlUmVmQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRDb3JlXCI7XG5pbXBvcnQge1xuICAgIEV4cGVyaWVuY2VUeXBlcyxcbiAgICBJQ29tcG9uZW50Q29uZmlnLFxuICAgIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgIElEZWRpY2F0ZWRTa2luQ29uZmlnLCBJRXhwZXJpZW5jZSwgSUZ1bmN0aW9uUmVzdWx0c1NlZ21lbnQsIElTZWdtZW50ZWRTa2luQ29uZmlnLCBJU2VnbWVudEV4cGVyaWVuY2UsXG4gICAgSVNraW5Db25maWcsIElTa2luU2VsZWN0b3JDb25maWcsIFNraW5TZWxlY3RvclR5cGVzLFxuXG5cbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuLy8gQHRzLWlnbm9yZSBoYW5kbGVkIGJ5IGN1c3RvbSBlc2J1aWxkIHBsdWdpblxuaW1wb3J0IHZlcnNpb24gZnJvbSBcIm15b3Atc2RrLXZlcnNpb25cIjtcbmltcG9ydCB7ZGVsaXZlcnksIGRlbGl2ZXJ5T2ZmLCBkZWxpdmVyeVJlZnJlc2gsIGRlbGl2ZXJ5U3RhdHN9IGZyb20gXCIuLi9oZWxwZXJzL2Nsb3VkUmVwb3NpdG9yeUhlbHBlcnNcIjtcbmltcG9ydCB7SFRNTENvbXBvbmVudExvYWRlcn0gZnJvbSBcIi4vbG9hZGVycy9IVE1MQ29tcG9uZW50TG9hZGVyXCI7XG5pbXBvcnQge2NoZWNrTXlvcE92ZXJyaWRlfSBmcm9tIFwiLi9teW9wT3ZlcnJpZGUudHNcIjtcblxuaW50ZXJmYWNlIGNvbXBvbmVudExvYWRlckNyZWF0b3Ige1xuICAgIG5ldyhsb2FkZXJzOiBJTXlvcExvYWRlcltdKTogYW55O1xufVxuXG4vLyBjb25zdCBnZXRDb21wb25lbnREZWZpbml0aW9uQ29uZmlnID0gYXN5bmMgKGlkOiBzdHJpbmcpID0+IHtcbi8vICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgaHR0cDovL2xvY2FsaG9zdDozMDAwL2NvbXBvbmVudD9pZD0ke2lkfWApO1xuLy8gICAgIGNvbnN0IGNvbXBvbmVudERlZjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcgPSAoYXdhaXQgcmVzLmpzb24oKSkuaXRlbTtcbi8vICAgICByZXR1cm4gY29tcG9uZW50RGVmXG4vLyB9XG5cbi8vY29uc3QgX19ST09UX1NES19QVUJMSUNfVVJMX18gPSAnaHR0cHM6Ly9kZmRsazJwMW0xODd2LmNsb3VkZnJvbnQubmV0L215b3Bfc2RrLm1pbi5qcydcbmNvbnN0IF9fUk9PVF9TREtfUFVCTElDX1VSTF9fID0gJ2h0dHBzOi8vY2RuLm15b3AuZGV2L3Nkay9uZXh0L215b3Bfc2RrLm1pbi5qcydcblxuLyoqXG4gKiBUaGUgSG9zdCBTREsgaXMgZGVzaWduZWQgZm9yIGludGVncmF0aW9uIHdpdGhpbiB0aGUgaG9zdCBhcHBsaWNhdGlvbiB0aGF0IHNlcnZlcyBhcyB0aGUgY29udGFpbmVyIGZvciBNeW9wICBjb21wb25lbnRzLjxici8+PGJyLz5cbiAqIEl0IHByb3ZpZGVzIGVzc2VudGlhbCBmdW5jdGlvbmFsaXRpZXMgYW5kIEFQSXMgZm9yIHJlZ2lzdGVyaW5nLCBtYW5hZ2luZywgYW5kIGNvbW11bmljYXRpbmcgd2l0aCBNeW9wIGNvbXBvbmVudHMuPGJyLz48YnIvPlxuICogVGhpcyBTREsgZW5hYmxlcyBzZWFtbGVzcyBlbWJlZGRpbmcgb2YgaW5kZXBlbmRlbnRseSBkZXZlbG9wZWQgY29tcG9uZW50cyBpbnRvIHRoZSBob3N0IGFwcGxpY2F0aW9uLCBlbnN1cmluZyBzbW9vdGggaW50ZXJvcGVyYWJpbGl0eSBhbmQgY29uc2lzdGVudCB1c2VyIGV4cGVyaWVuY2UgYWNyb3NzIHZhcmlvdXMgTXlvcCBjb21wb25lbnQgaW1wbGVtZW50YXRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgSG9zdFNESyB7XG4gICAgc3RhdGljIEluc3RhbmNlID0gKCkgPT4gd2luZG93Lm15b3AuaG9zdFNESztcblxuICAgIGNvbXBvbmVudHMyaW5pdDogSU15b3BDb21wb25lbnRbXSA9IFtdO1xuICAgIGNvbXBvbmVudHM6IElNeW9wQ29tcG9uZW50W10gPSBbXTtcbiAgICBjb21wb25lbnRzTG9hZGVyczogSU15b3BMb2FkZXJbXSA9IFtdO1xuXG4gICAgLy8gR2xvYmFsIHJlbmRlciBwb2xpY3kgKGFsbG93L2RlbnkvbW9kZSBnYXRlKS4gQSBwZXItY2FsbCBvcHRpb25zLnJlbmRlclBvbGljeVxuICAgIC8vIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGlzIFx1MjAxNCBzZWUgSFRNTENvbXBvbmVudExvYWRlci5yZXNvbHZlUmVuZGVyTW9kZS5cbiAgICBwcml2YXRlIF9yZW5kZXJQb2xpY3k/OiBSZW5kZXJQb2xpY3k7XG4gICAgcHVibGljIHNldFJlbmRlclBvbGljeSA9IChwb2xpY3k/OiBSZW5kZXJQb2xpY3kpID0+IHsgdGhpcy5fcmVuZGVyUG9saWN5ID0gcG9saWN5OyB9O1xuICAgIHB1YmxpYyBnZXRSZW5kZXJQb2xpY3kgPSAoKTogUmVuZGVyUG9saWN5IHwgdW5kZWZpbmVkID0+IHRoaXMuX3JlbmRlclBvbGljeTtcblxuICAgIHB1YmxpYyBpbml0aWF0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHB1YmxpYyB2ZXJzaW9uID0gdmVyc2lvbjtcblxuICAgIHR5cGUySW5zdGFuY2VDb3VudDogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICAgIHB1YmxpYyBhc3NpZ25JZCA9IChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZykgPT4ge1xuICAgICAgICBpZiAoIXRoaXMudHlwZTJJbnN0YW5jZUNvdW50W2NvbXBvbmVudERlZmluaXRpb24uaWRdKSB7XG4gICAgICAgICAgICB0aGlzLnR5cGUySW5zdGFuY2VDb3VudFtjb21wb25lbnREZWZpbml0aW9uLmlkXSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke2NvbXBvbmVudERlZmluaXRpb24uaWR9XyR7Kyt0aGlzLnR5cGUySW5zdGFuY2VDb3VudFtjb21wb25lbnREZWZpbml0aW9uLmlkXX1gO1xuICAgIH1cblxuICAgIC8vVE9ETyA6IGZpeCB0aGUgaW5zcGVjdCBpbXBsZW1lbnRhdGlvbiBpbnNpZGUgcmVmQ29tcG9uZW50XG4gICAgLy90aGVuIGluc3BlY3RlZCBtYXliZSBjYW4gYmUgZHJvcHBlZFxuICAgIHByaXZhdGUgaW5zcGVjdGVkID0gZmFsc2U7XG4gICAgcHVibGljIGluc3BlY3QgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmluc3BlY3RlZClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICB0aGlzLmluc3BlY3RlZCA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5jb21wb25lbnRzLmZvckVhY2goY29tcG9uZW50ID0+IHtcbiAgICAgICAgICAgIGlmIChjb21wb25lbnQuaW5zcGVjdCkge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbnNwZWN0KClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyBBIGNvbXBvbmVudCdzIG9yaWdpbiBpcyB3aGF0ZXZlciBpdHMgaWZyYW1lIFVSTCBpcywgc28gYW4gb3JpZ2luIGFsbG93bGlzdCBjYW4ndCB3b3JrIGhlcmUuXG4gICAgLy8gSW5zdGVhZCBvbmx5IGZyYW1lcyB0aGlzIFNESyBjcmVhdGVkIChvciBhZG9wdGVkKSBtYXkgdGFsayB0byBpdC4gYHNlbmQoKWAgZGlzcGF0Y2hlc1xuICAgIC8vIHN5bnRoZXRpYyBldmVudHMsIHdoaWNoIGhhdmUgbm8gc291cmNlLlxuICAgIHByaXZhdGUgaXNUcnVzdGVkU291cmNlID0gKHNvdXJjZTogTWVzc2FnZUV2ZW50U291cmNlIHwgbnVsbCkgPT4ge1xuICAgICAgICBpZiAoIXNvdXJjZSB8fCBzb3VyY2UgPT09IHdpbmRvdykgcmV0dXJuIHRydWU7XG4gICAgICAgIGNvbnN0IGlzT3duRnJhbWUgPSAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGNvbXBvbmVudC5lbGVtZW50IGFzIEhUTUxJRnJhbWVFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ/Lm5vZGVOYW1lID09PSAnSUZSQU1FJyAmJiBlbGVtZW50LmNvbnRlbnRXaW5kb3cgPT09IHNvdXJjZTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcG9uZW50cy5zb21lKGlzT3duRnJhbWUpIHx8IHRoaXMuY29tcG9uZW50czJpbml0LnNvbWUoaXNPd25GcmFtZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbmNvbWluZ01lc3NhZ2VIYW5kbGVyID0gKGV2ZW50OiBNZXNzYWdlRXZlbnQ8QmFzZU15b3BNZXNzYWdlPikgPT4ge1xuICAgICAgICBpZiAoIWV2ZW50LmRhdGE/Lm15b3ApIHJldHVybjtcblxuICAgICAgICBpZiAoIXRoaXMuaXNUcnVzdGVkU291cmNlKGV2ZW50LnNvdXJjZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5kYXRhLm15b3ApIHtcbiAgICAgICAgICAgIGlmIChldmVudC5kYXRhLmRpcmVjdGlvbiAhPT0gTWVzc2FnZURpcmVjdGlvbi51cCAmJiBldmVudC5kYXRhLm1lc3NhZ2VUeXBlICE9PSBNeW9wTWVzc2FnZXMuRW52ZWxvcGVkTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ21lc3NhZ2UgZHJvcHBlZCBpbiBob3N0c2RrLCBkaXJlY3Rpb24gd2FzICcsIGV2ZW50LmRhdGEuZGlyZWN0aW9uKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZXZlbnQgb24gaG9zdCBzaWRlIFwiLCBldmVudCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG15b3BNZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UgPSBldmVudC5kYXRhO1xuXG4gICAgICAgICAgICBpZiAobXlvcE1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbml0UmVxdWVzdCkge1xuICAgICAgICAgICAgICAgIC8vIEFOU1dFUiBUSEUgRlJBTUUgVEhBVCBBU0tFRCwgTk9UIEVWRVJZIFBFTkRJTkcgQ09NUE9ORU5ULlxuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gYGV2ZW50LnNvdXJjZWAgbmFtZXMgdGhlIGFza2luZyBmcmFtZSwgYW5kIGlnbm9yaW5nIGl0IG1hZGUgdGhlIGFuc3dlciBhXG4gICAgICAgICAgICAgICAgLy8gYnJvYWRjYXN0OiBuIGNvbXBvbmVudHMgZWFjaCBhbm5vdW5jZSBvbmNlLCBhbmQgZWFjaCBhbm5vdW5jZSByZS1zZW50XG4gICAgICAgICAgICAgICAgLy8gSW5pdE1lc3NhZ2UgdG8gYWxsIG4gcGVuZGluZywgc28gYSBwYWdlIHBhaWQgbl4yIHBvc3RNZXNzYWdlcyBkdXJpbmcgdGhlXG4gICAgICAgICAgICAgICAgLy8gZXhhY3Qgd2luZG93IGl0IHdhcyBidXNpZXN0IGJvb3RpbmcgZnJhbWVzLiBNZWFzdXJlZCBvbiBhIDEyLWNvbXBvbmVudFxuICAgICAgICAgICAgICAgIC8vIHBhZ2UgKFBpYy1UaW1lJ3Mgc2hhcGUpOiAxNDQgSW5pdE1lc3NhZ2VzIHdoZXJlIDEyIHdlcmUgbmVlZGVkLlxuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gKEEgZnJhbWUtc2lkZSByZXRyeSBsb29wIGJyaWVmbHkgZXhpc3RlZCBoZXJlIHRvbzsgaXQgd2FzIHJlbW92ZWQgYXNcbiAgICAgICAgICAgICAgICAvLyBkZWFkIHdlaWdodCBvbmNlIGZpeCAxIGxhbmRlZC4gVGFyZ2V0aW5nIG1lYW5zIGEgcmVwZWF0IGFubm91bmNlLCBmcm9tXG4gICAgICAgICAgICAgICAgLy8gYW55IGZ1dHVyZSBzb3VyY2UsIGNvc3RzIG9uZSBtZXNzYWdlIHJhdGhlciB0aGFuIG4uKVxuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gRkFMTCBCQUNLIFRPIFRIRSBCUk9BRENBU1Qgd2hlbiB0aGUgc291cmNlIGNhbm5vdCBiZSBtYXRjaGVkIHRvIGEgZnJhbWUuXG4gICAgICAgICAgICAgICAgLy8gYHNlbmQoKWAgZGlzcGF0Y2hlcyBzeW50aGV0aWMgZXZlbnRzLCB3aGljaCBjYXJyeSBubyBzb3VyY2UsIGFuZCBhIHdlYlxuICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudCdzIEluaXRSZXF1ZXN0IGNvbWVzIGZyb20gYHdpbmRvd2AgaXRzZWxmIC0tIG5laXRoZXIgaGFzIGFcbiAgICAgICAgICAgICAgICAvLyBjb250ZW50V2luZG93IHRvIG1hdGNoLCBhbmQgYm90aCBtdXN0IGtlZXAgd29ya2luZyBleGFjdGx5IGFzIGJlZm9yZS5cbiAgICAgICAgICAgICAgICBjb25zdCBmcm9tQXNraW5nRnJhbWUgPSB0aGlzLmNvbXBvbmVudHMyaW5pdC5maWx0ZXIoY29tcG9uZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGNvbXBvbmVudC5lbGVtZW50IGFzIEhUTUxJRnJhbWVFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudD8ubm9kZU5hbWUgPT09ICdJRlJBTUUnICYmIGVsZW1lbnQuY29udGVudFdpbmRvdyA9PT0gZXZlbnQuc291cmNlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldHMgPSBmcm9tQXNraW5nRnJhbWUubGVuZ3RoID8gZnJvbUFza2luZ0ZyYW1lIDogdGhpcy5jb21wb25lbnRzMmluaXQ7XG4gICAgICAgICAgICAgICAgdGFyZ2V0cy5mb3JFYWNoKGNvbXBvbmVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBJbml0TWVzc2FnZShjb21wb25lbnQuaWQpKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG15b3BNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW5pdFJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gY29tcG9uZW50cyAyIGluaXRcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzMmluaXQgPSB0aGlzLmNvbXBvbmVudHMyaW5pdC5maWx0ZXIoY29tcG9uZW50ID0+IGNvbXBvbmVudC5pZCAhPT0gKG15b3BNZXNzYWdlIGFzIEluaXRSZXNwb25zZSkuY29udGVudC5pZClcblxuICAgICAgICAgICAgICAgIGNvbnN0IGluaXRpYXRlZENvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50cy5maW5kKGNvbXBvbmVudCA9PiBjb21wb25lbnQuaWQgPT09IChteW9wTWVzc2FnZSBhcyBJbml0UmVzcG9uc2UpLmNvbnRlbnQ/LmlkKTtcbiAgICAgICAgICAgICAgICBpbml0aWF0ZWRDb21wb25lbnQ/LnNldEluaXRpYXRlZCgpXG4gICAgICAgICAgICAgICAgLy9pbml0aWF0ZWRDb21wb25lbnQ/LnBhcmVudD8uc2V0SW5pdGlhdGVkKCk7XG4gICAgICAgICAgICAgICAgLy8gVE9ETyA6IGlzIGl0IHRydWUgdG8gbm90IHBhc3MgZnVydGhlciAoIHRvIHRoZSBjb21wb25lbnQgKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG15b3BNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuRW52ZWxvcGVkTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZWRNZXNzYWdlID0gbXlvcE1lc3NhZ2UgYXMgRW52ZWxvcGVkTWVzc2FnZVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50cy5maW5kKGNvbXBvbmVudCA9PiBjb21wb25lbnQuaWQgPT09IHR5cGVkTWVzc2FnZS5kZXN0aW5hdGlvbik7XG5cbiAgICAgICAgICAgICAgICBpZiAocmVmQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZE1lc3NhZ2UuZGlyZWN0aW9uID09PSBNZXNzYWdlRGlyZWN0aW9uLmRvd24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZE1lc3NhZ2UubWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gRXhlY3V0ZUNvbXBvbmVudE1ldGhvZC5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50Lm9uTWVzc2FnZVJlY2VpdmVkKHR5cGVkTWVzc2FnZS5tZXNzYWdlKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVkTWVzc2FnZS5tZXNzYWdlLnJvdXRlID0gdHlwZWRNZXNzYWdlLnJvdXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5zZW5kKHR5cGVkTWVzc2FnZS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlubmVyQ29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzLmZpbmQoY29tcG9uZW50ID0+IGNvbXBvbmVudC5pZCA9PT0gdHlwZWRNZXNzYWdlLm1lc3NhZ2UuZGVzdGluYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5uZXJDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyQ29tcG9uZW50LnNlbmQodHlwZWRNZXNzYWdlLm1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIDogbG9nID9cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgLy9jb21wb25lbnQucmVmcy5ib2R5Lm9uTWVzc2FnZVJlY2VpdmVkKG15b3BNZXNzYWdlLm1lc3NhZ2UpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHMuZmluZChjb21wb25lbnQgPT4gY29tcG9uZW50LmlkID09PSBteW9wTWVzc2FnZS5kZXN0aW5hdGlvbik7XG5cbiAgICAgICAgICAgIGlmICghY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgLy9ubyBpbiBtZW0gY29tcG9uZW50XG4gICAgICAgICAgICAgICAgLy9wYXNzIHRvIHBhcmVudCBIb3N0U0RLIHRvIHRyeSBwcm9jZXNzIHRoZXJlXG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5teW9wLklmcmFtZVNESykge1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubXlvcC5JZnJhbWVTREsubWVzc2FnZVRvSG9zdChteW9wTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQub25NZXNzYWdlUmVjZWl2ZWQobXlvcE1lc3NhZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvL25vdCBwcm9jZXNzZWQgaW4gb25NZXNzYWdlUmVjZWl2ZWRcbiAgICAgICAgICAgICAgICAgICAgLy9wYXNzIHRvIHBhcmVudCBIb3N0U0RLIHRvIHRyeSBwcm9jZXNzIHRoZXJlXG4gICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cubXlvcC5JZnJhbWVTREspXG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubXlvcC5JZnJhbWVTREsubWVzc2FnZVRvSG9zdChteW9wTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gZXZlbnQuc291cmNlLnBvc3RNZXNzYWdlKFxuICAgICAgICAvLyAgICAgXCJoaSB0aGVyZSB5b3Vyc2VsZiEgIHRoZSBzZWNyZXQgcmVzcG9uc2UgXCIgKyBcImlzOiByaGVlZWVldCFcIixcbiAgICAgICAgLy8gICAgIGV2ZW50Lm9yaWdpbixcbiAgICAgICAgLy8gICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBzeW50aGV0aWNFdmVudCA9IG5ldyBNZXNzYWdlRXZlbnQ8QmFzZU15b3BNZXNzYWdlPignJyxcbiAgICAgICAgICAgIHtkYXRhOiBtZXNzYWdlfVxuICAgICAgICApXG5cbiAgICAgICAgdGhpcy5pbmNvbWluZ01lc3NhZ2VIYW5kbGVyKHN5bnRoZXRpY0V2ZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaW5pdCA9IChjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9ycz86IGNvbXBvbmVudExvYWRlckNyZWF0b3JbXSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pbml0aWF0ZWQpIHtcbiAgICAgICAgICAgIC8vIGdldEhvc3RNb2R1bGUoKSBhbHJlYWR5IGluaXRpYXRlcyB0aGUgU0RLLCBhbmQgdGhlIFJFQURNRSB0ZWxscyBob3N0cyB0byBjYWxsIGluaXQoKVxuICAgICAgICAgICAgLy8gYWZ0ZXIgaXQuIE9ubHkgbWVyZ2UgY3VzdG9tIGxvYWRlcnM7IHRoZSBtZXNzYWdlIGxpc3RlbmVyIGlzIGFscmVhZHkgYXR0YWNoZWQuXG4gICAgICAgICAgICBpZiAoY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvcnM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyTG9hZGVycyhjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9ycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiYXNpY0xvYWRlcnMgPSBbXG4gICAgICAgICAgICBuZXcgTXlvcElmcmFtZUxvYWRlcigpLFxuICAgICAgICAgICAgbmV3IFdlYmNvbXBvbmVudExvYWRlcigpLFxuICAgICAgICAgICAgbmV3IEhUTUxDb21wb25lbnRMb2FkZXIoKVxuICAgICAgICBdO1xuXG4gICAgICAgIHRoaXMuY29tcG9uZW50c0xvYWRlcnMgPSBbXG4gICAgICAgICAgICAuLi5iYXNpY0xvYWRlcnNcbiAgICAgICAgXTtcblxuICAgICAgICBpZiAoY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvcnMpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyTG9hZGVycyhjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9ycyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbmNvbW1pbmcgbWVzc2FnZXMgZnJvbSBJRnJhbWVzXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgXCJtZXNzYWdlXCIsXG4gICAgICAgICAgICB0aGlzLmluY29taW5nTWVzc2FnZUhhbmRsZXIsXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zb2xlLmxvZygnbXlvcCBob3N0U0RLIGluaXRpYXRlZCcsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgICB0aGlzLmluaXRpYXRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVnaXN0ZXJMb2FkZXJzID0gKGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3JzOiBjb21wb25lbnRMb2FkZXJDcmVhdG9yW10pID0+IHtcbiAgICAgICAgY29uc3QgbG9hZGVyQnlUeXBlOiBSZWNvcmQ8c3RyaW5nLCBJTXlvcExvYWRlcj4gPSB7fTtcblxuICAgICAgICBjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9ycy5mb3JFYWNoKGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3IgPT4ge1xuICAgICAgICAgICAgY29uc3QgY3VzdG9tTG9hZGVyID0gbmV3IGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3IodGhpcy5jb21wb25lbnRzTG9hZGVycyk7XG4gICAgICAgICAgICBsb2FkZXJCeVR5cGVbY3VzdG9tTG9hZGVyLnR5cGVdID0gY3VzdG9tTG9hZGVyO1xuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMuY29tcG9uZW50c0xvYWRlcnMuZm9yRWFjaChsb2FkZXIgPT4ge1xuICAgICAgICAgICAgaWYgKCFsb2FkZXJCeVR5cGVbbG9hZGVyLnR5cGVdKVxuICAgICAgICAgICAgICAgIGxvYWRlckJ5VHlwZVtsb2FkZXIudHlwZV0gPSBsb2FkZXI7XG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5jb21wb25lbnRzTG9hZGVycyA9IE9iamVjdC52YWx1ZXMobG9hZGVyQnlUeXBlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRTa2luSWRCeVNraW5TZWxlY3RvciA9IGFzeW5jIChza2luU2VsZWN0b3I6IElTa2luU2VsZWN0b3JDb25maWcsIGV4cGVyaWVuY2VzOiBJRXhwZXJpZW5jZVtdID0gW10sIGhvb2tzPzogbG9hZGVySG9va3MpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgICAgICBhc3luYyBmdW5jdGlvbiBhc3luY0ZpbmQ8VD4oXG4gICAgICAgICAgICBhcnJheTogVFtdLFxuICAgICAgICAgICAgcHJlZGljYXRlOiAoaXRlbTogVCkgPT4gUHJvbWlzZTxib29sZWFuPlxuICAgICAgICApOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBhcnJheSkge1xuICAgICAgICAgICAgICAgIGlmIChhd2FpdCBwcmVkaWNhdGUoaXRlbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gUmV0dXJuIHVuZGVmaW5lZCBpZiBubyBtYXRjaCBpcyBmb3VuZFxuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChza2luU2VsZWN0b3IudHlwZSkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY2FzZSBcIkRlZGljYXRlZFNraW5cIiA6IC8vYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgY2FzZSBTa2luU2VsZWN0b3JUeXBlcy5EZWRpY2F0ZWQ6IHtcbiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRTa2luSWQgPSAoc2tpblNlbGVjdG9yIGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnKS5za2luPy5pZFxuICAgICAgICAgICAgICAgICAgICB8fCAoc2tpblNlbGVjdG9yIGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnKS5za2lucyFbMF0uaWQ7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRTa2luSWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNraW5TZWxlY3RvclR5cGVzLlNlZ21lbnRlZDoge1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkU2tpblNlbGVjdG9yID0gKHNraW5TZWxlY3RvciBhcyBJU2VnbWVudGVkU2tpbkNvbmZpZylcbiAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50ID0gYXdhaXQgYXN5bmNGaW5kKHR5cGVkU2tpblNlbGVjdG9yLnNlZ21lbnRzLCBhc3luYyBzZWdtZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQuc2VnbWVudElkID09PSAnRGVmYXVsdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhwZXJpZW5jZSA9IGV4cGVyaWVuY2VzLmZpbmQoZXhwZXJpZW5jZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhwZXJpZW5jZS50eXBlID09PSBFeHBlcmllbmNlVHlwZXMuU2VnbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZXhwZXJpZW5jZSBhcyBJU2VnbWVudEV4cGVyaWVuY2UpLnNlZ21lbnQuaWQgPT09IHNlZ21lbnQuc2VnbWVudElkXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghZXhwZXJpZW5jZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZXhwZXJpZW5jZSBub3QgZm91bmRcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZEV4cGVyaWVuY2UgPSBleHBlcmllbmNlIGFzIElTZWdtZW50RXhwZXJpZW5jZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRTZWdtZW50ID0gKHR5cGVkRXhwZXJpZW5jZS5zZWdtZW50IGFzIElGdW5jdGlvblJlc3VsdHNTZWdtZW50KVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlZ21lbnRGdW5jdGlvbiA9IChob29rcyA/IGhvb2tzIDoge30pW3R5cGVkU2VnbWVudC5mdW5jdGlvbl07XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50RnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBzZWdtZW50RnVuY3Rpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBzZWdtZW50SWQ6JHtzZWdtZW50LnNlZ21lbnRJZH0sICR7dHlwZWRTZWdtZW50LmZ1bmN0aW9ufSBmdW5jdGlvbiBub3QgcHJvdmlkZWQgIWApXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc2VnbWVudClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFNraW5JZEJ5U2tpblNlbGVjdG9yKHNlZ21lbnQuc2tpblNlbGVjdG9yLCBleHBlcmllbmNlcyk7XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJycgLy9UT0RPXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBydW5Ta2luU2VsZWN0b3IgPSBhc3luYyAoY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBob29rcz86IGxvYWRlckhvb2tzKSA9PiB7XG4gICAgICAgIGNvbnN0IHNraW5JZCA9IGF3YWl0IHRoaXMuX2dldFNraW5JZEJ5U2tpblNlbGVjdG9yKGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5za2luU2VsZWN0b3IsIGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5yZXNvbHZlZEV4cGVyaWVuY2VzLCBob29rcyk7XG4gICAgICAgIHJldHVybiBjb21wb25lbnRDb25maWcudHlwZS5za2lucy5maW5kKHNraW4gPT4gc2tpbi5pZCA9PT0gc2tpbklkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZGVySG9va3M/OiBsb2FkZXJIb29rcztcblxuICAgIHB1YmxpYyBsb2FkQ29tcG9uZW50ID0gYXN5bmMgPFQgZXh0ZW5kcyBJTXlvcENvbXBvbmVudCA9IElNeW9wQ29tcG9uZW50Pihjb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsIGNvbnRhaW5lcj86IEhUTUxFbGVtZW50IHwgUmVmLCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucyk6XG4gICAgICAgIFByb21pc2U8VD4gPT4ge1xuXG4gICAgICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbm8gY29udGFpbmVyIHdhcyBmb3VuZCBmb3IgdGhpcyBjb21wb25lbnQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG92ZXJyaWRkZW5Db25maWcgPSBhd2FpdCBjaGVja015b3BPdmVycmlkZShjb21wb25lbnRDb25maWcpO1xuICAgICAgICBpZiAob3ZlcnJpZGRlbkNvbmZpZykge1xuICAgICAgICAgICAgLy9UT0RPIDogbG9nXG4gICAgICAgICAgICBjb21wb25lbnRDb25maWcgPSBvdmVycmlkZGVuQ29uZmlnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gLy8gQHRzLWlnbm9yZVxuICAgICAgICAvLyBpZiAoIWNvbnRhaW5lci5fX25vblByb3hpZWQpIHtcbiAgICAgICAgLy8gICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IChjb250YWluZXIgYXMgdW5rbm93biBhcyBNeW9wUmVmQ29tcG9uZW50KTtcbiAgICAgICAgLy8gICAgIC8vaWYgd2UgZ290IGxvYWRDb21wb25lbnQgb3ZlciBNeW9wUmVmQ29tcG9uZW50XG4gICAgICAgIC8vICAgICBpZiAocmVmQ29tcG9uZW50LmlkICYmIHJlZkNvbXBvbmVudC5wYXJlbnQpIHtcbiAgICAgICAgLy8gICAgICAgICByZXR1cm4gdGhpcy5sb2FkQ29tcG9uZW50KGNvbXBvbmVudENvbmZpZywgcmVmQ29tcG9uZW50LnJlZiwgb3B0aW9ucyk7XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgICAgICAgLy8gbGV0IHJvb3RDb21wb25lbnQ6IElNeW9wQ29tcG9uZW50ID0gcmVmQ29tcG9uZW50O1xuICAgICAgICAvLyAgICAgICAgIC8vIHdoaWxlKCFyb290Q29tcG9uZW50LmVsZW1lbnQgJiYgcm9vdENvbXBvbmVudC5wYXJlbnQpe1xuICAgICAgICAvLyAgICAgICAgIC8vICAgICByb290Q29tcG9uZW50ID0gcm9vdENvbXBvbmVudC5wYXJlbnRcbiAgICAgICAgLy8gICAgICAgICAvLyB9XG4gICAgICAgIC8vICAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICAgICAvLyByb290Q29tcG9uZW50LmVsZW1lbnRcbiAgICAgICAgLy8gICAgICAgICAvLyAvL3doYXQgbm93ID9cbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuXG4gICAgICAgIGNvbnN0IGhvb2tzID0gey4uLih0aGlzLmxvYWRlckhvb2tzID8/IHt9KSwgLi4uKG9wdGlvbnM/Lmhvb2tzID8/IHt9KX07XG5cbiAgICAgICAgY29uc3QgcmVmID0gY29udGFpbmVyIGFzIFJlZjtcbiAgICAgICAgaWYgKHJlZi5teW9wKSB7XG4gICAgICAgICAgICBpZiAocmVmLmNvbXBvbmVudCkge1xuXG4gICAgICAgICAgICAgICAgY29tcG9uZW50Q29uZmlnID0gey4uLmNvbXBvbmVudENvbmZpZ307XG4gICAgICAgICAgICAgICAgY29tcG9uZW50Q29uZmlnLmluc3RhbmNlID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi5jb21wb25lbnRDb25maWcuaW5zdGFuY2VcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRTa2luID0gYXdhaXQgdGhpcy5ydW5Ta2luU2VsZWN0b3IoY29tcG9uZW50Q29uZmlnLCBob29rcykhXG4gICAgICAgICAgICAgICAgaWYgKCFzZWxlY3RlZFNraW4pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicnVuU2tpblNlbGVjdG9yIGZhaWxlZCB0byBjaG9vc2Ugc2tpbiwgY2hlY2sgdGhlIHByb3ZpZGVkIGNvbmZpZ1wiKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucz8uaG9va3M/LmFmdGVyU2tpblNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkU2tpbiA9IGF3YWl0IG9wdGlvbnMuaG9va3MuYWZ0ZXJTa2luU2VsZWN0ZWQoey4uLnNlbGVjdGVkU2tpbn0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5za2luU2VsZWN0b3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFNraW5TZWxlY3RvclR5cGVzLkRlZGljYXRlZCxcbiAgICAgICAgICAgICAgICAgICAgc2tpbjogc2VsZWN0ZWRTa2luXG4gICAgICAgICAgICAgICAgICAgIC8vICBza2luczogW3NlbGVjdGVkU2tpbl1cbiAgICAgICAgICAgICAgICB9IGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnXG5cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gey4uLm9wdGlvbnN9XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBvcHRpb25zLmhvb2tzXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVmQ29tcG9uZW50ID0gYXdhaXQgY3JlYXRlUmVmQ29tcG9uZW50PFQ+KHJlZiwgY29tcG9uZW50Q29uZmlnLCB0aGlzLmNvbXBvbmVudHMsIG9wdGlvbnMpO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogY29ubmVjdCByZWZzIGFuZCBwcm9wcyBpbnNvZGUgY3JlYXRlUmVmQ29tcG9uZW50LCBlbHNld2hlcmUgaXRzIG5vdCByZWFsbHkgPFQ+XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZkNvbXBvbmVudDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdsb2FkIGNvbXBvbmVudCBnb3QgYSBkZXRhY2hlZCByZWYuJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lciBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICAvKipcbiAgICAgICAgICpcbiAgICAgICAgICogY2hvb3NlIHNraW4gb24gcnVudGltZSAuLi5cbiAgICAgICAgICogICAgICAgIGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5za2luU2VsZWN0b3IudHlwZVxuICAgICAgICAgKi9cblxuICAgICAgICBsZXQgc2VsZWN0ZWRTa2luID0gYXdhaXQgdGhpcy5ydW5Ta2luU2VsZWN0b3IoY29tcG9uZW50Q29uZmlnLCBob29rcykhXG5cbiAgICAgICAgaWYgKCFzZWxlY3RlZFNraW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInJ1blNraW5TZWxlY3RvciBmYWlsZWQgdG8gY2hvb3NlIHNraW4sIGNoZWNrIHRoZSBwcm92aWRlZCBjb25maWdcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8uaG9va3M/LmFmdGVyU2tpblNlbGVjdGVkKSB7XG4gICAgICAgICAgICBzZWxlY3RlZFNraW4gPSBhd2FpdCBvcHRpb25zLmhvb2tzLmFmdGVyU2tpblNlbGVjdGVkKHsuLi5zZWxlY3RlZFNraW59KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb21wb25lbnRMb2FkZXIgPSB0aGlzLmNvbXBvbmVudHNMb2FkZXJzLmZpbmQobG9hZGVyID0+IGxvYWRlci50eXBlID09PSBzZWxlY3RlZFNraW4ubG9hZGVyLnR5cGUpO1xuXG4gICAgICAgIGlmICghY29tcG9uZW50TG9hZGVyKSB7XG4gICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgbm8gbG9hZGVyIFwiJHtzZWxlY3RlZFNraW4ubG9hZGVyLnR5cGV9XCIgd2FzIGZvdW5kIGZvciBjb21wb25lbnRgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vZm9yIGxvYWRlZCB3ZWJjb21wb25lbnQgbW9kdWxlcyB0byBmb2xsb3dpbmcgbGluZSBjcmVhdGVzIGEgcmFjZSBjb25kaXRpb24gd2l0aCB0aGUgaW5pdCBtZXNzYWdlIGZsb3dcbiAgICAgICAgbGV0IGNvbXBvbmVudCA9IGF3YWl0IGNvbXBvbmVudExvYWRlci5sb2FkKGNvbXBvbmVudENvbmZpZy50eXBlLCBzZWxlY3RlZFNraW4sIGNvbnRhaW5lciwgb3B0aW9ucyk7XG5cbiAgICAgICAgLy8gVE9ETyA6IHdoZW4gdGhpcyBpcyBub3QgdHJ1ZSA/XG4gICAgICAgIGlmICghY29tcG9uZW50LmlzSW5pdGlhdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMyaW5pdC5wdXNoKGNvbXBvbmVudClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbXBvbmVudC5iaW5kKCdvbkRpc3Bvc2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdjb21wb25lbnQgZGlzcG9zZScsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMgPSB0aGlzLmNvbXBvbmVudHMuZmlsdGVyKGMgPT4gYyAhPT0gY29tcG9uZW50KVxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzMmluaXQgPSB0aGlzLmNvbXBvbmVudHMyaW5pdC5maWx0ZXIoYyA9PiBjICE9PSBjb21wb25lbnQpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLmNvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xuXG4gICAgICAgIC8vIERPIE5PVCBXQUlUIFRPIEJFIEFTS0VEIC0tIEJVVCBPTkxZIE9OQ0UgRlVMTFkgUkVHSVNURVJFRC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhlIGNvbXBvbmVudCBhbm5vdW5jZXMgaXRzZWxmIGFzIHNvb24gYXMgaXQgYm9vdHMsIGFuZCB3ZSBhbnN3ZXIgYnkgbG9va2luZyBpdFxuICAgICAgICAvLyB1cC4gQnV0IGl0IG9ubHkgbGFuZHMgaW4gb3VyIGxpc3RzIEhFUkUsIGFmdGVyIHRoZSBhd2FpdCBhYm92ZSwgd2hpY2ggdGhlXG4gICAgICAgIC8vIGNvbW1lbnQgb24gdGhhdCBsaW5lIGFscmVhZHkgY2FsbHMgYSByYWNlOiBhIGNvbXBvbmVudCB0aGF0IGJvb3RlZCBpbnNpZGUgdGhlXG4gICAgICAgIC8vIGF3YWl0IGFubm91bmNlZCBpbnRvIGFuIGVtcHR5IGxpc3QsIGl0cyBJbml0UmVxdWVzdCB3YXMgZHJvcHBlZCwgYW5kIG5vdGhpbmdcbiAgICAgICAgLy8gZXZlciBzZW50IHRoZSBJbml0TWVzc2FnZSBpdCB3YXMgYmxvY2tlZCBvbiAtLSBpbml0aWF0ZWQoKSB0aGVuIHJlamVjdGVkIHdpdGhcbiAgICAgICAgLy8gdGltZW91dF88bXM+LiBNaW5pZmljYXRpb24gbWFkZSB0aGF0IGNvbW1vbiBieSBib290aW5nIGZyYW1lcyBzb29uZXIuIFJlcG9ydGVkXG4gICAgICAgIC8vIGJ5IFBpYy1UaW1lIDIwMjYtMTAtMTcuIFNlbmRpbmcgaGVyZSBjbG9zZXMgdGhlIG9yZGVyaW5nIGhvbGUgaW5zdGVhZCBvZiBob3BpbmdcbiAgICAgICAgLy8gdG8gc3Vydml2ZSBpdC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVEhJUyBNVVNUIENPTUUgQUZURVIgYGNvbXBvbmVudHMucHVzaGAsIE5PVCBCRUZPUkUgSVQuIFRoZSB0d28gY29tcG9uZW50IGNsYXNzZXNcbiAgICAgICAgLy8gZG8gbm90IHNoYXJlIGEgdHJhbnNwb3J0OiBhbiBpZnJhbWUgaXMgbWVzc2FnZWQgd2l0aCBwb3N0TWVzc2FnZSwgd2hpY2ggaXNcbiAgICAgICAgLy8gYXN5bmMsIHNvIHJlZ2lzdHJhdGlvbiBhbHdheXMgd29uIHRoZSByYWNlIGJ5IGx1Y2suIEEgd2ViIGNvbXBvbmVudCBpcyBtZXNzYWdlZFxuICAgICAgICAvLyB3aXRoIGEgU1lOQ0hST05PVVMgY3VzdG9tRWxlbWVudC5kaXNwYXRjaEV2ZW50LCBzbyBpdCByZWdpc3RlcnMgYW5kIHJlcGxpZXMgd2l0aFxuICAgICAgICAvLyBJbml0UmVzcG9uc2UgKmluc2lkZSogdGhpcyBjYWxsIC0tIGFuZCB0aGUgSW5pdFJlc3BvbnNlIGhhbmRsZXIgcmVzb2x2ZXMgdGhlXG4gICAgICAgIC8vIGNvbXBvbmVudCBvdXQgb2YgYHRoaXMuY29tcG9uZW50c2AuIFNlbmRpbmcgd2hpbGUgdGhhdCBhcnJheSB3YXMgc3RpbGwgbWlzc2luZ1xuICAgICAgICAvLyB0aGUgY29tcG9uZW50IG1lYW50IHRoZSBsb29rdXAgZm91bmQgbm90aGluZywgc2V0SW5pdGlhdGVkKCkgbmV2ZXIgcmFuLCBhbmRcbiAgICAgICAgLy8gc2luY2UgY29tcG9uZW50czJpbml0IGhhZCBhbHJlYWR5IGJlZW4gZmlsdGVyZWQgdGhlIGNvbXBvbmVudCBjb3VsZCBuZXZlciBiZVxuICAgICAgICAvLyByZWNvdmVyZWQ6IGV2ZXJ5IHdlYiBjb21wb25lbnQgaHVuZyB1bnRpbCB0aW1lb3V0LiBDYXVnaHQgYnlcbiAgICAgICAgLy8gdGVzdC9pbml0LXdlYmNvbXBvbmVudC5lMmUubWpzLlxuICAgICAgICAvL1xuICAgICAgICAvLyBBIGZyYW1lIHRoYXQgaGFzIG5vdCBib290ZWQgeWV0IGhhcyBhIG51bGwgY29udGVudFdpbmRvdywgc28gYHNlbmRgIGlzIGEgbm8tb3BcbiAgICAgICAgLy8gKGl0IGlzIG9wdGlvbmFsLWNoYWluZWQpIGFuZCB0aGF0IGNvbXBvbmVudCdzIG93biBJbml0UmVxdWVzdCBpcyBhbnN3ZXJlZFxuICAgICAgICAvLyBub3JtYWxseSAtLSB3ZSBhcmUgcmVnaXN0ZXJlZCBieSB0aGVuLlxuICAgICAgICBpZiAoIWNvbXBvbmVudC5pc0luaXRpYXRlZCkge1xuICAgICAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IEluaXRNZXNzYWdlKGNvbXBvbmVudC5pZCkpXG4gICAgICAgIH1cblxuICAgICAgICAvLyB0cnVlIGJ5IGRlZmF1bHRcbiAgICAgICAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMuY29ubmVjdFByb3BzICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgLy9UT0RPIDogbWFrZSB0eXBlIGZpZWxkIGNvbmRpdGlvbmFsIHR5cGUgaW5mZXIgXCJzdHJpbmdcIiA+IHN0cmluZywgXCJudW1iZXJcIiA+IG51bWJlciwgZXRjLi4uXG4gICAgICAgICAgICBjb21wb25lbnQgPSBjb25uZWN0UHJvcHMoY29tcG9uZW50LCBjb21wb25lbnRDb25maWcudHlwZS5wcm9wcywgc2VsZWN0ZWRTa2luKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvL1RPRE8gOiBtYWtlIG9wdGlvbmFsP1xuICAgICAgICAgICAgLy9UT0RPIDogZml4IGlzc3VlcyB3aXRoIHRpbWVvdXQgYW5kIHdyb25nIHJlZiBuYW1lcyBmcm9tIGNvbmZpZyB2cyBjdXJyZW50IHNraW5cbiAgICAgICAgICAgIGF3YWl0IGNvbm5lY3RSZWZzKGNvbXBvbmVudCwgY29tcG9uZW50Q29uZmlnLCB0aGlzLmNvbXBvbmVudHMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vIFRPT0QgOiB0aHJvdyA/XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFvcHRpb25zPy5za2lwSW5pdClcbiAgICAgICAgICAgIGF3YWl0IGNvbXBvbmVudC5pbml0aWF0ZWQoKTtcblxuICAgICAgICByZXR1cm4gY29tcG9uZW50IGFzIFQ7XG4gICAgfVxuXG4gICAgcHVibGljIG5hdmlnYXRlID0gYXN5bmMgPFQgZXh0ZW5kcyBJTXlvcENvbXBvbmVudCA9IElNeW9wQ29tcG9uZW50Pihjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBuZXdDb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsIG9wdGlvbnM/OiBuYXZpZ2F0aW9uT3B0aW9ucykgPT4ge1xuICAgICAgICBpZiAoY29tcG9uZW50LnBhcmVudCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOYXZpZ2F0aW5nIG9uIHJlbW90ZSByZWYgY29tcG9uZW50cyBpcyBub3QgaW1wbGVtZW50ZWQgeWV0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICAvL2NvbXBvbmVudC5tYXJrZWRGb3JEaXNwb3NlZCA9IHRydWU7XG5cbiAgICAgICAgLy8gaWYgKG9wdGlvbnM/LmlucGxhY2UpIHtcbiAgICAgICAgLy8gICAgIGlmIChjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgICAvLyAgICAgICAgIGxldCBuZXdDb21wb25lbnQgPSBhd2FpdCB0aGlzLmxvYWRDb21wb25lbnQ8VD4obmV3Q29tcG9uZW50Q29uZmlnLCBjb21wb25lbnQuZWxlbWVudCk7XG4gICAgICAgIC8vICAgICAgICAgYXdhaXQgbmV3Q29tcG9uZW50LmluaXRpYXRlZCgpO1xuICAgICAgICAvL1xuICAgICAgICAvLyAgICAgICAgIGlmIChvcHRpb25zLmluaXQpXG4gICAgICAgIC8vICAgICAgICAgICAgIGF3YWl0IG9wdGlvbnMuaW5pdChuZXdDb21wb25lbnQpO1xuICAgICAgICAvL1xuICAgICAgICAvLyAgICAgICAgIHJldHVybiBuZXdDb21wb25lbnQ7XG4gICAgICAgIC8vICAgICB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgICAgIHRocm93IG5ldyBFcnJvcignLi4uJylcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5zdGFnZWQpIHtcbiAgICAgICAgICAgIC8vY29uc3Qgc2VsZWN0ZWRTa2luID0gdGhpcy5ydW5Ta2luU2VsZWN0b3IobmV3Q29tcG9uZW50Q29uZmlnKVxuICAgICAgICAgICAgbGV0IG5ld0NvbXBvbmVudCA9IGF3YWl0IHRoaXMubG9hZENvbXBvbmVudDxUPihuZXdDb21wb25lbnRDb25maWcsIGNvbXBvbmVudC5jb250YWluZXIsIHtcbiAgICAgICAgICAgICAgICBoaWRkZW46IHRydWUsXG4gICAgICAgICAgICAgICAgcmVsYXRpdmU6IHtkaXJlY3Rpb246ICdhZnRlcicsIGNoaWxkOiBjb21wb25lbnQuZWxlbWVudCF9LFxuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnNcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5pbml0KVxuICAgICAgICAgICAgICAgIGF3YWl0IG9wdGlvbnMuaW5pdChuZXdDb21wb25lbnQpO1xuXG4gICAgICAgICAgICBuZXdDb21wb25lbnQuc2hvdygpO1xuICAgICAgICAgICAgY29tcG9uZW50LmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHJldHVybiBuZXdDb21wb25lbnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0U2libGluZyA9IGNvbXBvbmVudC5lbGVtZW50IS5uZXh0U2libGluZztcblxuICAgICAgICAgICAgY29tcG9uZW50LmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRDb21wb25lbnQ8VD4obmV3Q29tcG9uZW50Q29uZmlnLCBjb21wb25lbnQuY29udGFpbmVyLCB7XG4gICAgICAgICAgICAgICAgcmVsYXRpdmU6IHtcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBcImJlZm9yZVwiLFxuICAgICAgICAgICAgICAgICAgICBjaGlsZDogbmV4dFNpYmxpbmcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgbmF2aWdhdGlvbk9wdGlvbnMgPSB7XG4gICAgc3RhZ2VkPzogYm9vbGVhbixcbiAgICAvL2lucGxhY2U/OiBib29sZWFuLFxuICAgIGluaXQ/OiAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCkgPT4gUHJvbWlzZTx2b2lkPlxuICAgIHNraXBJbml0PzogYm9vbGVhblxufSAmIGxvYWRlck9wdGlvbnNcblxudHlwZSByZWxhdGl2ZUxvYWRDb25maWdEaXJlY3Rpb24gPSAnYmVmb3JlJyB8ICdhZnRlcic7XG5cblxuZXhwb3J0IHR5cGUgbG9hZGVySG9va3MgPSB7XG4gICAgYWZ0ZXJTa2luU2VsZWN0ZWQ/OiAoc2VsZWN0ZWRTa2luOiBJU2tpbkNvbmZpZykgPT4gUHJvbWlzZTxJU2tpbkNvbmZpZz5cbn0gJlxuICAgIC8vIHNlZ21lbnRhdGlvbiBob29rc1xuICAgICh7IFtrZXk6IHN0cmluZ106ICgpID0+IFByb21pc2U8Ym9vbGVhbj4gfCBib29sZWFuIH0gfCB7fSlcblxuLy9UT0RPOiBzdXBwb3J0IHNlcmlhbGl6YWJsZSB2ZXJzaW9uIG9mIHRoYXQgb2JqZWN0XG5leHBvcnQgaW50ZXJmYWNlIHJlbGF0aXZlTG9hZENvbmZpZyB7XG4gICAgLy9JZiB0aGlzIGlzIG51bGwsIHRoZW4gbmV3Tm9kZSBpcyBpbnNlcnRlZCBhdCB0aGUgZW5kIG9mIG5vZGUncyBjaGlsZCBub2Rlcy5cbiAgICAvL2h0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Ob2RlL2luc2VydEJlZm9yZVxuICAgIGNoaWxkOiBDaGlsZE5vZGUgfCBudWxsXG4gICAgZGlyZWN0aW9uOiByZWxhdGl2ZUxvYWRDb25maWdEaXJlY3Rpb25cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRW52aXJvbm1lbnQge1xuICAgIFtrZXk6IHN0cmluZ106IGFueVxufVxuXG50eXBlIEVsZW1lbnRBdHRyaWJ1dGVzID0ge1xuICAgIFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCB1bmRlZmluZWQgfCBudWxsO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBsb2FkZXJPcHRpb25zIHtcbiAgICBpZD86IHN0cmluZ1xuICAgIGhpZGRlbj86IGJvb2xlYW5cbiAgICBjb25uZWN0UHJvcHM/OiBib29sZWFuXG4gICAgdGltZW91dD86IG51bWJlclxuICAgIHNraXBJbml0PzogYm9vbGVhblxuICAgIHJlbGF0aXZlPzogcmVsYXRpdmVMb2FkQ29uZmlnXG4gICAgaG9va3M/OiBsb2FkZXJIb29rc1xuICAgIGVsZW1lbnRBdHRyaWJ1dGVzPzogRWxlbWVudEF0dHJpYnV0ZXNcbiAgICBfZW52aXJvbm1lbnQ/OiBJRW52aXJvbm1lbnRcbiAgICBfaGFzUGFyZW50PzogYm9vbGVhblxuICAgIF9pbnNwZWN0aW9uPzogYm9vbGVhblxuICAgIGRhdGE/OiBhbnlcbiAgICAvKipcbiAgICAgKiBSYXcgQ1NTIGluamVjdGVkIGludG8gdGhlIGNvbXBvbmVudCdzIGlmcmFtZSA8aGVhZD4gYmVmb3JlIGZpcnN0IHBhaW50LlxuICAgICAqIEFwcGVuZGVkIGxhc3Qgc28gaXQgb3ZlcnJpZGVzIHRoZSBjb21wb25lbnQncyBvd24gc3R5bGVzIHZpYSBjYXNjYWRlIG9yZGVyLlxuICAgICAqIFVzZWZ1bCBmb3IgdGhlbWluZyB2MiAoSFRNTCkgY29tcG9uZW50cyBcdTIwMTQgY29sb3JzLCBmb250cywgc3BhY2luZywgZXRjLlxuICAgICAqL1xuICAgIGluamVjdENzcz86IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIENvbnRyb2wgaWZyYW1lIGF1dG8tc2l6aW5nIGJlaGF2aW9yLlxuICAgICAqIC0gdHJ1ZSAoZGVmYXVsdCk6IGlmcmFtZSBhdXRvLXNpemVzIHRvIGNvbnRlbnQgaGVpZ2h0LCB3aWR0aCBmaWxscyBwYXJlbnQuXG4gICAgICogLSBmYWxzZTogbm8gc2l6aW5nIGxvZ2ljIHJ1bnMuIE5vIG9ic2VydmVycywgbm8gbWVhc3VyZW1lbnRzLCBubyBzdHlsZSBjaGFuZ2VzLlxuICAgICAqICAgVGhlIGlmcmFtZSBzdGF5cyBhdCBwb3NpdGlvbjphYnNvbHV0ZSBmaWxsaW5nIHRoZSBjb250YWluZXIuXG4gICAgICogICBUaGUgaG9zdCBpcyBmdWxseSByZXNwb25zaWJsZSBmb3IgY29udGFpbmVyIGRpbWVuc2lvbnMuXG4gICAgICovXG4gICAgYXV0b1NpemU/OiBib29sZWFuXG5cbiAgICAvKipcbiAgICAgKiBQZXItY2FsbCByZW5kZXIgcG9saWN5LiBUYWtlcyBwcmVjZWRlbmNlIG92ZXIgaG9zdFNESy5zZXRSZW5kZXJQb2xpY3kgXHUyMDE0IGxldHMgYW5cbiAgICAgKiBhcHAgcmVzdHJpY3QgZ2xvYmFsbHkgYW5kIGFsbG93IChvciBmdXJ0aGVyIHJlc3RyaWN0KSBzcGVjaWZpYyBsb2FkQ29tcG9uZW50IGNhbGxzLlxuICAgICAqL1xuICAgIHJlbmRlclBvbGljeT86IFJlbmRlclBvbGljeVxuXG4gICAgLyoqXG4gICAgICogRm9yY2UgZnVsbCBpc29sYXRpb24gZm9yIGFuIGlubGluZS1IVE1MIChsb2NhbEZyYW1lKSBjb21wb25lbnQ6IHNhbmRib3hlZCxcbiAgICAgKiBjcm9zcy1vcmlnaW4gaWZyYW1lIHdpdGggbm8gaG9zdC1kb2N1bWVudCBhY2Nlc3MuIEEgcmVuZGVyIHBvbGljeSByZXR1cm5pbmdcbiAgICAgKiAnaXNvbGF0ZWRJZnJhbWUnIGhhcyB0aGUgc2FtZSBlZmZlY3QuXG4gICAgICovXG4gICAgaXNvbGF0aW9uPzogYm9vbGVhblxufVxuXG5pZiAoIXdpbmRvdy5teW9wKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHdpbmRvdy5teW9wID0ge1xuICAgICAgICBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfX1xuICAgIH07XG59XG5cbmlmICghd2luZG93Lm15b3AuaG9zdFNESykge1xuICAgIGNvbnN0IF9ob3N0U0RLID0gbmV3IEhvc3RTREsoKTtcbiAgICAvL1RPRE86IGVuYWJsZSBsYXp5IGluaXQ/XG4gICAgX2hvc3RTREsuaW5pdCgpO1xuXG4gICAgaWYgKCF3aW5kb3cubXlvcCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHdpbmRvdy5teW9wID0ge1xuICAgICAgICAgICAgX19ST09UX1NES19QVUJMSUNfVVJMX19cbiAgICAgICAgfTtcbiAgICB9XG4gICAgd2luZG93Lm15b3AuaG9zdFNESyA9IF9ob3N0U0RLO1xufVxuXG4vLyBUaGUgb3B0LWluLCByZWFjaGFibGUgd2l0aCBubyBpbXBvcnQgYW5kIG5vIGJ1aWxkIGNoYW5nZSBvbiB0aGUgaG9zdCBwYWdlOlxuLy9cbi8vICAgbXlvcC5kZWxpdmVyeSh7IG1pbmlmeTogdHJ1ZSwgY2FjaGU6IHRydWUgfSk7ICAgLy8gbGFuZSArIHRoZSBjbGllbnQgd2luZG93XG4vLyAgIG15b3AuZGVsaXZlcnkuc3RhdHMoKTsgICAgICAgICAgICAgICAgLy8gd2hhdCBhbnN3ZXJlZCwgYW5kIGhvdyBvZnRlbiBpdCBmZWxsIGJhY2tcbi8vICAgbXlvcC5kZWxpdmVyeS5vZmYoKTsgICAgICAgICAgICAgICAgICAvLyBiYWNrIHRvIHRvZGF5J3MgaG9zdCwgbm8gcmVsb2FkXG4vL1xuLy8gQXR0YWNoZWQgaGVyZSByYXRoZXIgdGhhbiBleHBvcnRlZCBvbmx5IGFzIGEgbW9kdWxlIGZ1bmN0aW9uIGJlY2F1c2UgdGhlIGhvc3QgYXBwIHRoYXRcbi8vIG9wdHMgaW4gaXMgb2Z0ZW4gbG9hZGluZyB0aGUgU0RLIGZyb20gYSBzY3JpcHQgdGFnLCB3aGVyZSBgaW1wb3J0YCBpcyBub3QgYXZhaWxhYmxlLlxuaWYgKHdpbmRvdy5teW9wICYmICEod2luZG93Lm15b3AgYXMgYW55KS5kZWxpdmVyeSkge1xuICAgIGNvbnN0IGFwaTogYW55ID0gKG9wdHM/OiB7bWluaWZ5PzogYm9vbGVhbjsgaG9zdD86IHN0cmluZyB8IG51bGx9KSA9PiBkZWxpdmVyeShvcHRzKTtcbiAgICBhcGkuc3RhdHMgPSBkZWxpdmVyeVN0YXRzO1xuICAgIGFwaS5vZmYgPSBkZWxpdmVyeU9mZjtcbiAgICBhcGkucmVmcmVzaCA9IGRlbGl2ZXJ5UmVmcmVzaDtcbiAgICAod2luZG93Lm15b3AgYXMgYW55KS5kZWxpdmVyeSA9IGFwaTtcbn1cblxuLy8gQHRzLWlnbm9yZVxuZXhwb3J0IGNvbnN0IGhvc3RTREs6IEhvc3RTREsgPSB3aW5kb3cubXlvcC5ob3N0U0RLO1xuXG5kZWZpbmVEeW5hbWljSW1wb3J0KCdob3N0U0RLJywgaG9zdFNESyk7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICAgICAgbXlvcDoge1xuICAgICAgICAgICAgX19ST09UX1NES19QVUJMSUNfVVJMX186IHN0cmluZyxcbiAgICAgICAgICAgIGhvc3RTREs6IEhvc3RTREssXG4gICAgICAgICAgICBJZnJhbWVTREs6IEluc3RhbmNlVHlwZTx0eXBlb2YgSWZyYW1lU0RLPlxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0c1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXIsIElFbGVtZW50UmVmLCBNeW9wRWxlbWVudFJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtEZXRlY3RlZE15b3BSZWZzTWVzc2FnZSwgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcblxuZXhwb3J0IGNsYXNzIERldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8RGV0ZWN0TXlvcFJlZnNNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5EZXRlY3RNeW9wUmVmc01lc3NhZ2U7XG5cbiAgICBleGVjdXRvciA9IChtZXNzYWdlOiBEZXRlY3RNeW9wUmVmc01lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgYWxsTXlvcEl0ZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9XWApO1xuICAgICAgICAvL2NvbnN0IGFsbE15b3BJdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYCpgKTtcblxuICAgICAgICBsZXQgbXlvcFJlZnM6IElFbGVtZW50UmVmW10gPSBbXTtcblxuICAgICAgICAvL2xldCBjb3VudGVyczogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuXG4gICAgICAgIGFsbE15b3BJdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuXG4gICAgICAgICAgICBjb25zdCBteW9wSWQgPSBpdGVtLmdldEF0dHJpYnV0ZShteW9wQXR0cmlidXRlcy5pZCk7XG4gICAgICAgICAgICBpZiAobXlvcElkKSB7XG4gICAgICAgICAgICAgICAgbXlvcFJlZnMucHVzaChuZXcgTXlvcEVsZW1lbnRSZWYobXlvcElkLCBpdGVtLnRhZ05hbWUsIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpKVxuICAgICAgICAgICAgfSAvL2Vsc2Uge1xuICAgICAgICAgICAgLy8gICAgIGlmICghY291bnRlcnNbaXRlbS50YWdOYW1lXSkge1xuICAgICAgICAgICAgLy8gICAgICAgICBjb3VudGVyc1tpdGVtLnRhZ05hbWVdID0gMDtcbiAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAvLyAgICAgY291bnRlcnNbaXRlbS50YWdOYW1lXSA9IGNvdW50ZXJzW2l0ZW0udGFnTmFtZV0gKyAxO1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vICAgICBteW9wUmVmcy5wdXNoKG5ldyBYUGF0aEVsZW1lbnRSZWYoYCR7aXRlbS50YWdOYW1lfSgke2NvdW50ZXJzW2l0ZW0udGFnTmFtZV19KWAsIGl0ZW0udGFnTmFtZSwgaXRlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSkpXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBEZXRlY3RlZE15b3BSZWZzTWVzc2FnZShtZXNzYWdlLmhhbmRsZXJVbmlxdWVJZCwgbXlvcFJlZnMpKVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0JpbmRDbGlja01lc3NhZ2UsIENsaWNrUmVwbGF5TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIEJpbmRPbkNsaWNrSGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxCaW5kQ2xpY2tNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5CaW5kQ2xpY2tNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IEJpbmRDbGlja01lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cFRhc2tzOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIGRvY3VtZW50KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBDbGlja1JlcGxheU1lc3NhZ2UoKSwgZXZlbnQpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyKTtcblxuICAgICAgICAgICAgY29uc3QgY2xlYW5VcFRhc2sgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZXIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MucHVzaChjbGVhblVwVGFzayk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vY2xlYW4gdXBcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5mb3JFYWNoKHRhc2sgPT4gdGFzaygpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBNeW9wTWVzc2FnZXMgfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtDaGFuZ2VUZXh0TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBDaGFuZ2VUZXh0SGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxDaGFuZ2VUZXh0TWVzc2FnZT4ge1xuICBcbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5DaGFuZ2VUZXh0TWVzc2FnZTtcbiAgICBcbiAgICBleGVjdXRvciA9IChldmVudDogQ2hhbmdlVGV4dE1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgZG9jdW1lbnQpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgaXRlbS50ZXh0Q29udGVudCA9IGV2ZW50LmNvbnRlbnQ7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0TWVzc2FnZSwgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlciwgUm9vdFJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0SGFuZGxlckV4ZWN1dG9yfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9leGVjdXRlU2NyaXB0SGFuZGxlci50c1wiO1xuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZVNjcmlwdEhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8RXhlY3V0ZVNjcmlwdE1lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5FeGVjdXRlU2NyaXB0TWVzc2FnZVxuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcGxpZXIgPSAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBkYXRhKSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgRXhlY3V0ZVNjcmlwdEhhbmRsZXJFeGVjdXRvcihldmVudCwgcmVwbGllciwgbmV3IFJvb3RSZWYoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7QWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UsIEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgQWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8QWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAobWVzc2FnZTogQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UpID0+IHtcblxuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYobWVzc2FnZS5yZWYsIGRvY3VtZW50KTtcbiAgICAgICAgY29uc3QgY2xlYW51cFRhc2tzOiBhbnlbXSA9IFtdO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuXG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKGUpID0+IHtcbiAgICAgICAgICAgICAgICAvL1RPRE86IHRoaW5rIGFib3V0IHRoYXQgcmVxdWVzdEFuaW1hdGlvbkZyYW1lXG4gICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlKG1lc3NhZ2UuaGFuZGxlclVuaXF1ZUlkLCBtYWtlU2VyaWFsaXphYmxlKGUsIG1lc3NhZ2Uuc2VyaWFsaXphYmxlU2tlbGV0b24pKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKG1lc3NhZ2UudHlwZSwgaGFuZGxlcilcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIobWVzc2FnZS50eXBlLCBoYW5kbGVyKVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY2xlYW51cFRhc2tzLmZvckVhY2godGFzayA9PiB7XG4gICAgICAgICAgICAgICAgdGFzaygpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2V0QXR0cmlidXRlTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBzZXRBdHRyaWJ1dGVIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPFNldEF0dHJpYnV0ZU1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLlNldEF0dHJpYnV0ZU1lc3NhZ2U7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogU2V0QXR0cmlidXRlTWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBpdGVtLnNldEF0dHJpYnV0ZShldmVudC5uYW1lLCBldmVudC52YWx1ZSlcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtIb3N0U0RLfSBmcm9tIFwiLi4vLi4vaG9zdC9ob3N0U0RLXCI7XG5pbXBvcnQge0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UsIFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZS50c1wiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uLy4uL2hvc3RcIjtcblxuZXhwb3J0IGNsYXNzIENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkNyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2U7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBjcmVhdGVSZWYgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAvL1RPRE8gOiB1c2UgcmVmIGhlbHBlciBoZXJlXG4gICAgICAgICAgICBjb25zdCBhbGxJdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KGBbJHtteW9wQXR0cmlidXRlcy5pZH09JyR7ZXZlbnQucmVmQ29uZmlnLnNlbGVjdG9yfSddYCk7XG4gICAgICAgICAgICBpZiAoYWxsSXRlbXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaG9zdFNESyA9IEhvc3RTREsuSW5zdGFuY2UoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWZDb21wb25lbnQgPSBhd2FpdCBob3N0U0RLLmxvYWRDb21wb25lbnQoZXZlbnQubmVzdGVkQ29tcG9uZW50Q29uZmlnLFxuICAgICAgICAgICAgICAgICAgICBhbGxJdGVtcy5pdGVtKDApLFxuICAgICAgICAgICAgICAgICAgICBldmVudC5vcHRpb25zKVxuXG4gICAgICAgICAgICAgICAgLy8gd2UgbmVlZCBpdCB0byBwYXNzIHRoZSBhc3NpZ25lZCBpZHNcbiAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRSZWZDb25maWc6IGFueVtdID0gW107XG5cbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhyZWZDb21wb25lbnQucmVmcykuZm9yRWFjaChyZWZOYW1lID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlZiA9IHJlZkNvbXBvbmVudC5yZWZzW3JlZk5hbWVdO1xuICAgICAgICAgICAgICAgICAgICByZWYgPSByZWYuX19ub25Qcm94aWVkIHx8IHJlZjtcblxuICAgICAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKHJlZiBhcyBJTXlvcENvbXBvbmVudCkuY29tcG9uZW50RGVmaW5pdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGVkUmVmQ29uZmlnLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZk5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RGVmaW5pdGlvbklkOiAocmVmIGFzIElNeW9wQ29tcG9uZW50KS5jb21wb25lbnREZWZpbml0aW9uLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcblxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBuZXN0ZWRSZWZDb25maWcpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIgLSBET00gZWxlbWVudCBub3QgZm91bmQnKVxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBbXSwgdHJ1ZSkpO1xuICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY3JlYXRlUmVmKCkudGhlbigpO1xuICAgICAgICAvL3JldHVybmluZyB1bmRlZmluZWQgc28gaXQgd29uJ3QgYWN0IGFzIGEgY2xlYW51cFxuICAgIH1cbn1cbiIsICIvLyBAdHMtbm9jaGVja1xuZXhwb3J0IGNvbnN0IG9ic2VydmVET00gPSAob2JqOiBIVE1MRWxlbWVudCB8IG51bGwsIGNhbGxiYWNrOiAobXV0YXRpb25SZWNvcmRzPzogTXV0YXRpb25SZWNvcmRbXSkgPT4gdm9pZCkgPT4ge1xuICAgIGlmICghb2JqKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCduJyk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IE11dGF0aW9uT2JzZXJ2ZXIgPSB3aW5kb3cuTXV0YXRpb25PYnNlcnZlciB8fCB3aW5kb3cuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcblxuICAgIGlmICghb2JqIHx8IG9iai5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuO1xuXG4gICAgaWYgKE11dGF0aW9uT2JzZXJ2ZXIpIHtcbiAgICAgICAgLy8gZGVmaW5lIGEgbmV3IG9ic2VydmVyXG4gICAgICAgIGNvbnN0IG11dGF0aW9uT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihjYWxsYmFjaylcbiAgICAgICAgLy8gaGF2ZSB0aGUgb2JzZXJ2ZXIgb2JzZXJ2ZSBmb3IgY2hhbmdlcyBpbiBjaGlsZHJlblxuICAgICAgICBjb25zdCBjb25maWcgPSB7YXR0cmlidXRlczogdHJ1ZSwgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlfTtcbiAgICAgICAgbXV0YXRpb25PYnNlcnZlci5vYnNlcnZlKG9iaiwgY29uZmlnKVxuICAgICAgICByZXR1cm4gbXV0YXRpb25PYnNlcnZlclxuICAgIH1cblxuICAgIC8vIGJyb3dzZXIgc3VwcG9ydCBmYWxsYmFja1xuICAgIGVsc2UgaWYgKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKCdET01Ob2RlSW5zZXJ0ZWQnLCBjYWxsYmFjaywgZmFsc2UpXG4gICAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKCdET01Ob2RlUmVtb3ZlZCcsIGNhbGxiYWNrLCBmYWxzZSlcbiAgICB9XG59IiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0TWVzc2FnZSwgTXV0YXRpb25PYnNlcnZlck1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7b2JzZXJ2ZURPTX0gZnJvbSBcIi4uLy4uL2NvbW1vbi91dGlscy9kb21PYnNlcnZlclwiO1xuXG5leHBvcnQgY2xhc3MgU2V0TXV0YXRpb25PYnNlcnZlckhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8RXhlY3V0ZVNjcmlwdE1lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZVxuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKSA9PiB7XG4gICAgICAgIGlmIChldmVudC5zb3VyY2UpIHtcbiAgICAgICAgICAgIG9ic2VydmVET00oZG9jdW1lbnQuYm9keSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UoKVxuICAgICAgICAgICAgICAgICAgICAvLyAgbmV3IEVudmVsb3BlZE1lc3NhZ2UoZXZlbnQuc291cmNlISwgbmV3IE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlKCkpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0VsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UsIEZvcm1EYXRhRW50cnksIEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2UsIElucHV0RWxlbWVudFZhbHVlLH0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge21ha2VTZXJpYWxpemFibGV9IGZyb20gXCIuLi8uLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmNvbnN0IGdldElucHV0VmFsdWUgPSAoZWxlbWVudCk6IElucHV0RWxlbWVudFZhbHVlID0+IHtcbiAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhIGZvcm1cbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnRk9STScpIHtcbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGRhdGFPYmplY3Q6IElucHV0RWxlbWVudFZhbHVlID0ge1xuICAgICAgICAgICAgZm9ybURhdGE6IHt9LFxuICAgICAgICAgICAgdW5tYXBwZWREYXRhOiBbXVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIE1hbnVhbGx5IGFkZCBlbGVtZW50cyB3aXRob3V0IG5hbWVzXG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYScpO1xuICAgICAgICBsZXQgYXV0b05hbWVJbmRleGVyID0gLTE7XG5cbiAgICAgICAgZWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZWxlbWVudC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBteW9wSWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShteW9wQXR0cmlidXRlcy5pZCk7XG4gICAgICAgICAgICAgICAgbGV0IGtleSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCduYW1lJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBgXyR7KCsrYXV0b05hbWVJbmRleGVyKX1gXG5cbiAgICAgICAgICAgICAgICBjb25zdCBub2RlRGF0YTogRm9ybURhdGFFbnRyeSA9IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGtleSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGdldElucHV0VmFsdWUoZWxlbWVudCksXG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBlbGVtZW50LnJlcXVpcmVkLFxuICAgICAgICAgICAgICAgICAgICB2YWxpZGl0eTogbWFrZVNlcmlhbGl6YWJsZShlbGVtZW50LnZhbGlkaXR5LCB0cnVlKSxcbiAgICAgICAgICAgICAgICAgICAgbXlvcElkLFxuICAgICAgICAgICAgICAgIH07XG5cblxuICAgICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKG5vZGVEYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmKCFkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldIHx8ICFkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldLnZhbHVlIHx8IG5vZGVEYXRhLnZhbHVlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0gPSBub2RlRGF0YVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gaWYgKCFrZXkpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2gobm9kZURhdGEpO1xuICAgICAgICAgICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGlmIChkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBpZiAoZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XS52YWx1ZSkge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKG5vZGVEYXRhKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2goZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSk7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSA9IG5vZGVEYXRhXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldID0gbm9kZURhdGFcbiAgICAgICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGRhdGFPYmplY3Q7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhIGNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvblxuICAgIGlmIChlbGVtZW50LnR5cGUgPT09ICdjaGVja2JveCcgfHwgZWxlbWVudC50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmNoZWNrZWQgPyBlbGVtZW50LnZhbHVlIDogbnVsbDtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgaW5wdXQgYW5kIHRleHRhcmVhIGVsZW1lbnRzXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ0lOUFVUJyB8fCBlbGVtZW50LnRhZ05hbWUgPT09ICdURVhUQVJFQScpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQudmFsdWU7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHNlbGVjdCBlbGVtZW50cyAoZHJvcGRvd25zKVxuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdTRUxFQ1QnKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbHVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBlZGl0YWJsZSBkaXZzIChjb250ZW50RWRpdGFibGUpXG4gICAgaWYgKGVsZW1lbnQuaXNDb250ZW50RWRpdGFibGUpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuaW5uZXJUZXh0IHx8IGVsZW1lbnQudGV4dENvbnRlbnQ7XG4gICAgfVxuXG4gICAgLy8gSWYgaXQncyBhbiB1bnN1cHBvcnRlZCBlbGVtZW50IHR5cGVcbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGNsYXNzIEdldEVsZW1lbnRWYWx1ZUhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8R2V0RWxlbWVudFZhbHVlTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuR2V0RWxlbWVudFZhbHVlTWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBHZXRFbGVtZW50VmFsdWVNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIGRvY3VtZW50KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZShcbiAgICAgICAgICAgICAgICBnZXRJbnB1dFZhbHVlKGl0ZW0pXG4gICAgICAgICAgICApLCBldmVudCk7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7R2V0QXR0cmlidXRlTWVzc2FnZSwgR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge2dldEZpcnN0RWxlbWVudEJ5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBHZXRBdHRyaWJ1dGVIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEdldEF0dHJpYnV0ZU1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkdldEF0dHJpYnV0ZU1lc3NhZ2U7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogR2V0QXR0cmlidXRlTWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtID0gZ2V0Rmlyc3RFbGVtZW50QnlSZWYoZXZlbnQucmVmLCBkb2N1bWVudClcbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZShpdGVtLmdldEF0dHJpYnV0ZShldmVudC5uYW1lKSksIGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge1Jlc2l6ZU9ic2VydmVyTWVzc2FnZSwgU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlfSBmcm9tICcuLi8uLi9tZXNzYWdlcydcbmltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcblxuZXhwb3J0IGNsYXNzIFNldFJlc2l6ZU9ic2VydmVySGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2VcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHtcbiAgICAgICAgICAgIC8vVE9ETyA6IHBhc3MgdGhlIGhlaWdodFxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBSZXNpemVPYnNlcnZlck1lc3NhZ2UoKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHkpO1xuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICByZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KClcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2V0SW5uZXJIdG1sfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIFNldElubmVySHRtbEhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8U2V0SW5uZXJIdG1sPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRJbm5lckh0bWw7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogU2V0SW5uZXJIdG1sKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIGRvY3VtZW50KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGl0ZW0uaW5uZXJIVE1MID0gZXZlbnQuY29udGVudDtcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqIFRoZSBJZnJhbWUgU0RLIGlzIGludGVuZGVkIGZvciBzY2VuYXJpb3Mgd2hlcmUgZGV2ZWxvcGVycyB3aXNoIHRvIGltcGxlbWVudCBNeW9wIGNvbXBvbmVudHMgYXMgc2VwYXJhdGUgd2ViIGFwcGxpY2F0aW9ucyBob3N0ZWQgd2l0aGluIGlmcmFtZXMuPGJyLz48YnIvPlxuICogQnkgaW1wb3J0aW5nIHRoZSBJZnJhbWUgU0RLLCBkZXZlbG9wZXJzIGdhaW4gYWNjZXNzIHRvIHRvb2xzIGFuZCB1dGlsaXRpZXMgbmVjZXNzYXJ5IGZvciBoYW5kbGluZyBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIGhvc3QgYXBwbGljYXRpb24gYW5kIHRoZSBlbWJlZGRlZCBpZnJhbWUtYmFzZWQgTXlvcCBjb21wb25lbnRzPGJyLz48YnIvPlxuICogVGhpcyBTREsgZmFjaWxpdGF0ZXMgc2VjdXJlIGlzb2xhdGlvbiwgYWxsb3dpbmcgY29tcG9uZW50cyB0byBmdW5jdGlvbiBpbmRlcGVuZGVudGx5IHdoaWxlIHN0aWxsIGJlbmVmaXRpbmcgZnJvbSB0aGUgb3ZlcmFsbCBzdHJ1Y3R1cmUgYW5kIG1hbmFnZW1lbnQgY2FwYWJpbGl0aWVzIHByb3ZpZGVkIGJ5IHRoZSBob3N0IGFwcGxpY2F0aW9uLjxici8+PGJyLz5cbiAqXG4gT25jZSBsb2FkZWQgdGhlIGBSb290U0RLYCwgeW91IGNhbiBsb2FkIHRoZSBgSWZyYW1lU0RLYFxuIGBgYGpzXG4gY29uc3Qge0lmcmFtZVNES30gPSAoYXdhaXQgd2luZG93Lm15b3Aucm9vdFNESy5nZXRJZnJhbWVNb2R1bGUoKSk7XG4gYGBgXG4gb3JcbiBgYGB0c1xuIGltcG9ydCB7Z2V0SWZyYW1lTW9kdWxlfSBmcm9tICdAbXlvcC9zZGsnO1xuIGNvbnN0IHtJZnJhbWVTREt9ID0gKGF3YWl0IGdldElmcmFtZU1vZHVsZSgpKTtcbiBgYGBcbiBvclxuIGBgYHRzXG4gaW1wb3J0IHtJZnJhbWVTREt9IGZyb20gJ0BteW9wL3Nkay9pZnJhbWUnO1xuIGBgYFxuICpcbiAqL1xuaW1wb3J0IHtCYXNlTXlvcFNES30gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9EZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHtCaW5kT25DbGlja0hhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9iaW5kT25DbGlja0hhbmRsZXJcIjtcbmltcG9ydCB7Q2hhbmdlVGV4dEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlclwiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0SGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyXCI7XG5pbXBvcnQge2RlZmluZUR5bmFtaWNJbXBvcnR9IGZyb20gXCIuLi9keW5hbWljSW1wb3J0L2RlZmluZUR5bmFtaWNJbXBvcnRcIjtcbmltcG9ydCB7QWRkRXZlbnRMaXN0ZW5lckhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9hZGRFdmVudExpc3RlbmVySGFuZGxlclwiO1xuaW1wb3J0IHtzZXRBdHRyaWJ1dGVIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvc2V0QXR0cmlidXRlSGFuZGxlclwiO1xuaW1wb3J0IHtcbiAgICBJbml0UmVxdWVzdCxcbiAgICBNZXNzYWdlRGlyZWN0aW9uLFxuICAgIE15b3BCaW5kTWVzc2FnZSxcbiAgICBNeW9wQmluZFJlcGxheU1lc3NhZ2Vcbn0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7U2V0TXV0YXRpb25PYnNlcnZlckhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9TZXRNdXRhdGlvbk9ic2VydmVySGFuZGxlclwiO1xuaW1wb3J0IHtHZXRFbGVtZW50VmFsdWVIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvR2V0RWxlbWVudFZhbHVlSGFuZGxlci50c1wiO1xuLy8gQHRzLWlnbm9yZSBoYW5kbGVkIGJ5IGN1c3RvbSBlc2J1aWxkIHBsdWdpblxuaW1wb3J0IHZlcnNpb24gZnJvbSBcIm15b3Atc2RrLXZlcnNpb25cIjtcbmltcG9ydCB7R2V0QXR0cmlidXRlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2dldEF0dHJpYnV0ZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2V0UmVzaXplT2JzZXJ2ZXJIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvU2V0UmVzaXplT2JzZXJ2ZXJIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NldElubmVySHRtbEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9zZXRJbm5lckh0bWxIYW5kbGVyLnRzXCI7XG5cbi8qKlxuIFRoZSBJZnJhbWUgU0RLIGlzIGludGVuZGVkIGZvciBzY2VuYXJpb3Mgd2hlcmUgZGV2ZWxvcGVycyB3aXNoIHRvIGltcGxlbWVudCBNeW9wIGNvbXBvbmVudHMgYXMgc2VwYXJhdGUgd2ViIGFwcGxpY2F0aW9ucyBob3N0ZWQgd2l0aGluIGlmcmFtZXMuPGJyLz48YnIvPlxuIEJ5IGltcG9ydGluZyB0aGUgSWZyYW1lIFNESywgZGV2ZWxvcGVycyBnYWluIGFjY2VzcyB0byB0b29scyBhbmQgdXRpbGl0aWVzIG5lY2Vzc2FyeSBmb3IgaGFuZGxpbmcgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZSBob3N0IGFwcGxpY2F0aW9uIGFuZCB0aGUgZW1iZWRkZWQgaWZyYW1lLWJhc2VkIE15b3AgY29tcG9uZW50czxici8+PGJyLz5cbiBUaGlzIFNESyBmYWNpbGl0YXRlcyBzZWN1cmUgaXNvbGF0aW9uLCBhbGxvd2luZyBjb21wb25lbnRzIHRvIGZ1bmN0aW9uIGluZGVwZW5kZW50bHkgd2hpbGUgc3RpbGwgYmVuZWZpdGluZyBmcm9tIHRoZSBvdmVyYWxsIHN0cnVjdHVyZSBhbmQgbWFuYWdlbWVudCBjYXBhYmlsaXRpZXMgcHJvdmlkZWQgYnkgdGhlIGhvc3QgYXBwbGljYXRpb24uPGJyLz48YnIvPlxuXG4gT25jZSBsb2FkZWQgdGhlIGBSb290U0RLYCwgeW91IGNhbiBsb2FkIHRoZSBgSWZyYW1lU0RLYFxuIGBgYGpzXG4gY29uc3Qge0lmcmFtZVNES30gPSAoYXdhaXQgd2luZG93Lm15b3Aucm9vdFNESy5nZXRJZnJhbWVNb2R1bGUoKSk7XG4gYGBgXG4gb3JcbiBgYGB0c1xuIGltcG9ydCB7Z2V0SWZyYW1lTW9kdWxlfSBmcm9tICdAbXlvcC9zZGsnO1xuIGNvbnN0IHtJZnJhbWVTREt9ID0gKGF3YWl0IGdldElmcmFtZU1vZHVsZSgpKTtcbiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIElmcmFtZVNESyBleHRlbmRzIEJhc2VNeW9wU0RLIHtcblxuICAgIHB1YmxpYyB2ZXJzaW9uID0gdmVyc2lvbjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmICghd2luZG93Lm15b3ApIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHdpbmRvdy5teW9wID0ge31cbiAgICAgICAgfVxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHdpbmRvdy5teW9wLklmcmFtZVNESyA9IHRoaXM7XG4gICAgfVxuXG4gICAgbWVzc2FnZVRvSG9zdCA9IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB7XG4gICAgICAgIGlmICghbWVzc2FnZS5yZXBsYXlUb0hhbmRsZXIgJiYgcmVwbGF5VG8/LmhhbmRsZXJVbmlxdWVJZClcbiAgICAgICAgICAgIG1lc3NhZ2UucmVwbGF5VG9IYW5kbGVyID0gcmVwbGF5VG8uaGFuZGxlclVuaXF1ZUlkXG5cbiAgICAgICAgY29uc3QgY29tcG9uZW50SWRzID0gT2JqZWN0LmtleXModGhpcy5jb21wb25lbnRzKTtcblxuICAgICAgICBpZiAoIW1lc3NhZ2UuZGVzdGluYXRpb24pIHtcbiAgICAgICAgICAgIGlmIChyZXBsYXlUbz8ucm91dGUpIHtcbiAgICAgICAgICAgICAgICAvLyB0YWtpbmcgdGhlIGZpcnN0IGNvbXBvbmVudCB0aGF0IGluaXRpYXRlZCB0aGF0IGN5Y2xlXG4gICAgICAgICAgICAgICAgbWVzc2FnZS5kZXN0aW5hdGlvbiA9IHJlcGxheVRvLnJvdXRlW3JlcGxheVRvLnJvdXRlLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlLmRlc3RpbmF0aW9uID0gY29tcG9uZW50SWRzWzBdXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtZXNzYWdlLnNvdXJjZSlcbiAgICAgICAgICAgIG1lc3NhZ2Uuc291cmNlID0gY29tcG9uZW50SWRzWzBdO1xuXG4gICAgICAgIG1lc3NhZ2UuZGlyZWN0aW9uID0gTWVzc2FnZURpcmVjdGlvbi51cDtcblxuICAgICAgICAvLyBgaG9zdFdpbmRvd2AsIG5vdCBgd2luZG93LnBhcmVudGAgLS0gc2VlIHRoZSBmaWVsZCdzIGNvbW1lbnQuIEZvciBhIGNvbXBvbmVudFxuICAgICAgICAvLyBtb3VudGVkIGludG8gYW5vdGhlciBjb21wb25lbnQncyBkb2N1bWVudCB0aGUgcGFyZW50IGlzIGFuIGludGVybWVkaWF0ZSBmcmFtZVxuICAgICAgICAvLyB0aGF0IGRyb3BzIGNoaWxkIG1lc3NhZ2VzLCBzbyBhbiBJbml0UmVzcG9uc2Ugc2VudCB0aGVyZSBuZXZlciByZWFjaGVzIHRoZSBob3N0XG4gICAgICAgIC8vIGFuZCB0aGUgY29tcG9uZW50IHN0YXlzIHBlbmRpbmcgdW50aWwgaXQgdGltZXMgb3V0LlxuICAgICAgICAodGhpcy5ob3N0V2luZG93ID8/IHdpbmRvdy5wYXJlbnQpPy5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAuLi5tZXNzYWdlXG4gICAgICAgIH0sICcqJyk7XG4gICAgfVxuXG4gICAgc3VwcG9ydGVkSGFuZGxlcnM6IEJhc2VNZXNzYWdlSGFuZGxlcltdID0gW1xuICAgICAgICBuZXcgQ2hhbmdlVGV4dEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IFNldElubmVySHRtbEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IEJpbmRPbkNsaWNrSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgRXhlY3V0ZVNjcmlwdEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IEFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBzZXRBdHRyaWJ1dGVIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBHZXRFbGVtZW50VmFsdWVIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBTZXRNdXRhdGlvbk9ic2VydmVySGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgU2V0UmVzaXplT2JzZXJ2ZXJIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBHZXRBdHRyaWJ1dGVIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG5cbiAgICAgICAgLy9jb21wb3NpdGUgc3VwcG9ydCBtZXNzYWdlcyA6XG4gICAgICAgIG5ldyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpXG4gICAgXTtcblxuICAgIC8qKlxuICAgICAqIFRoZSB3aW5kb3cgdGhpcyBmcmFtZSBhbnN3ZXJzIHRvLiBEZWZhdWx0cyB0byB0aGUgcGFyZW50LCB3aGljaCBpcyBjb3JyZWN0IGZvciBhXG4gICAgICogY29tcG9uZW50IG1vdW50ZWQgZGlyZWN0bHkgYnkgdGhlIHBhZ2UncyBvd24gaG9zdC5cbiAgICAgKlxuICAgICAqIElUIElTIE5PVCBBTFdBWVMgVEhFIFBBUkVOVC4gQSBob3N0IGNhbiBtb3VudCBhIGNvbXBvbmVudCBpbnRvIGEgY29udGFpbmVyIHRoYXRcbiAgICAgKiBsaXZlcyBpbnNpZGUgQU5PVEhFUiBjb21wb25lbnQncyBkb2N1bWVudCAtLSBQaWMtVGltZSdzIHJlZWwgdGVtcGxhdGVzIGFyZSBtb3VudGVkXG4gICAgICogYnkgdGhlIHRvcC1sZXZlbCBob3N0IGludG8gYCNyZWVsU2xvdGAgaW5zaWRlIHRoZSByZWVsIGRpYWxvZydzIGZyYW1lLiBUaGUgcmVhbCBob3N0XG4gICAgICogaXMgdGhlbiBhIEdSQU5EcGFyZW50LCBhbmQgYHdpbmRvdy5wYXJlbnRgIGlzIGEgZnJhbWUgdGhhdCBrbm93cyBub3RoaW5nIGFib3V0IHRoaXNcbiAgICAgKiBjb21wb25lbnQ6IGl0cyBuZXN0ZWQgaG9zdFNESyBoYXMgbm8gZW50cnkgZm9yIGl0IGFuZCBpdHMgSWZyYW1lU0RLIGRyb3BzIG1lc3NhZ2VzXG4gICAgICogZnJvbSBhIGNoaWxkLiBSZXBsaWVzIHNlbnQgdG8gdGhlIHBhcmVudCBhcmUgc2ltcGx5IGxvc3QuXG4gICAgICpcbiAgICAgKiBTbyB3ZSBhZG9wdCB3aG9ldmVyIGFjdHVhbGx5IHRhbGtzIHRvIHVzLCB0aGUgZmlyc3QgdGltZSBhbiBhbmNlc3RvciBkb2VzLlxuICAgICAqL1xuICAgIHByaXZhdGUgaG9zdFdpbmRvdzogV2luZG93IHwgbnVsbCA9IHdpbmRvdy5wYXJlbnQ7XG5cbiAgICAvKipcbiAgICAgKiBDb21tYW5kcyAoaW5jbHVkaW5nIEV4ZWN1dGVTY3JpcHQpIG11c3QgY29tZSBmcm9tIGEgd2luZG93IHRoaXMgZnJhbWUgaXMgYWN0dWFsbHlcbiAgICAgKiBuZXN0ZWQgaW5zaWRlIC0tIG5ldmVyIGZyb20gYW4gb3BlbmVyIG9yIGEgc2libGluZyB0aGF0IG1lcmVseSBob2xkcyBhIHJlZmVyZW5jZS5cbiAgICAgKlxuICAgICAqIFRISVMgVVNFRCBUTyBDT01QQVJFIEFHQUlOU1QgYHdpbmRvdy5wYXJlbnRgIEFMT05FLCBhbmQgdGhhdCB3YXMgYSByZWdyZXNzaW9uIElcbiAgICAgKiBzaGlwcGVkIGluIDAuNC4wLWJldGE6IGl0IHNpbGVudGx5IGRyb3BwZWQgdGhlIGhvc3QncyBJbml0TWVzc2FnZSBmb3IgYW55IGNvbXBvbmVudFxuICAgICAqIG1vdW50ZWQgY3Jvc3MtZG9jdW1lbnQsIGJlY2F1c2UgdGhlIGhvc3QgaXMgYSBncmFuZHBhcmVudCB0aGVyZS4gVGhlIGZyYW1lIHRoZW5cbiAgICAgKiBhbm5vdW5jZWQgZm9yIGl0cyBmdWxsIDEwcyBidWRnZXQgaW50byBhIHBhcmVudCB0aGF0IG5ldmVyIGFuc3dlcnMgYW5kIHJlamVjdGVkIHdpdGhcbiAgICAgKiB0aW1lb3V0XzEwMDAwIGhhdmluZyByZWdpc3RlcmVkIG5vdGhpbmcuIFJlcHJvZHVjZWQgbGl2ZSBvbiBQaWMtVGltZSdzIFFBIHBhZ2VcbiAgICAgKiAyMDI2LTEwLTE3OiAxNSBJbml0UmVxdWVzdHMsIDAgSW5pdFJlc3BvbnNlcywgYElmcmFtZVNESy5jb21wb25lbnRzYCBlbXB0eS5cbiAgICAgKiAwLjMuMzYgaGFkIG5vIGd1YXJkIGF0IGFsbCwgd2hpY2ggaXMgd2h5IGl0IHdvcmtlZC5cbiAgICAgKlxuICAgICAqIFdhbGtpbmcgdGhlIGFuY2VzdG9yIGNoYWluIGtlZXBzIHRoZSBzZWN1cml0eSBwcm9wZXJ0eSAtLSBhbiBvcGVuZXIgb3IgYSBzaWJsaW5nIGlzXG4gICAgICogbm90IGFuIGFuY2VzdG9yIC0tIHdoaWxlIGFsbG93aW5nIGEgaG9zdCBhbnkgbnVtYmVyIG9mIGZyYW1lcyB1cC4gVGhlIHdhbGsgaXNcbiAgICAgKiBib3VuZGVkLCBhbmQgcmVhZGluZyBgLnBhcmVudGAgYWNyb3NzIG9yaWdpbnMgaXMgYWxsb3dlZCAob25seSB0aGUgcmVmZXJlbmNlIGlzXG4gICAgICogY29tcGFyZWQsIG5ldmVyIHRvdWNoZWQpLlxuICAgICAqL1xuICAgIHByaXZhdGUgaXNGcm9tSG9zdENoYWluID0gKHNvdXJjZTogTWVzc2FnZUV2ZW50U291cmNlIHwgbnVsbCk6IGJvb2xlYW4gPT4ge1xuICAgICAgICBpZiAoIXNvdXJjZSkgcmV0dXJuIHRydWU7ICAgICAgICAgICAgIC8vIHN5bnRoZXRpYyBkaXNwYXRjaCBjYXJyaWVzIG5vIHNvdXJjZVxuICAgICAgICBpZiAoc291cmNlID09PSB3aW5kb3cpIHJldHVybiB0cnVlO1xuXG4gICAgICAgIGxldCBjdXJyZW50OiBXaW5kb3cgPSB3aW5kb3c7XG4gICAgICAgIGZvciAobGV0IGRlcHRoID0gMDsgZGVwdGggPCAzMjsgZGVwdGgrKykge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gY3VycmVudC5wYXJlbnQ7XG4gICAgICAgICAgICBpZiAoIXBhcmVudCB8fCBwYXJlbnQgPT09IGN1cnJlbnQpIHJldHVybiBmYWxzZTsgICAvLyByZWFjaGVkIHRoZSB0b3BcbiAgICAgICAgICAgIGlmIChzb3VyY2UgPT09IHBhcmVudCkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBjdXJyZW50ID0gcGFyZW50O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaW5pdCA9ICgpID0+IHtcbiAgICAgICAgd2luZG93Lm9ubWVzc2FnZSA9IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNGcm9tSG9zdENoYWluKGV2ZW50LnNvdXJjZSkpIHJldHVybjtcblxuICAgICAgICAgICAgLy8gQURPUFQgT05MWSBPTiBJbml0TWVzc2FnZSwgTk9UIE9OIEFOWSBBTkNFU1RPUiBNRVNTQUdFLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIEluaXRNZXNzYWdlIGlzIHRoZSBvbmUgbWVzc2FnZSB0aGF0IGVzdGFibGlzaGVzIHdobyBvd25zIHRoaXMgY29tcG9uZW50LCBzb1xuICAgICAgICAgICAgLy8gaXQgaXMgdGhlIG9ubHkgc2FmZSBzaWduYWwuIEFkb3B0aW5nIG9uIGFueSBhY2NlcHRlZCBtZXNzYWdlIGxldCBhblxuICAgICAgICAgICAgLy8gaW50ZXJtZWRpYXRlIGFuY2VzdG9yIC0tIHRoZSByZWVsIGRpYWxvZywgd2hpY2ggaXMgaXRzZWxmIGEgY29tcG9uZW50IGFuZFxuICAgICAgICAgICAgLy8gbWF5IGxlZ2l0aW1hdGVseSBwb3N0IHRvIGl0cyBvd24gc3VidHJlZSAtLSBiZWNvbWUgYGhvc3RXaW5kb3dgIGFuZCBzaWxlbnRseVxuICAgICAgICAgICAgLy8gdGFrZSBvdmVyIHRoZSByZXBseSBjaGFubmVsLCBwdXR0aW5nIHVzIGJhY2sgdG8gSW5pdFJlc3BvbnNlcyBnb2luZyB0byBhXG4gICAgICAgICAgICAvLyBmcmFtZSB0aGF0IGRyb3BzIHRoZW0uXG4gICAgICAgICAgICBpZiAoZXZlbnQuc291cmNlXG4gICAgICAgICAgICAgICAgJiYgZXZlbnQuc291cmNlICE9PSB3aW5kb3dcbiAgICAgICAgICAgICAgICAmJiBldmVudC5kYXRhPy5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluaXRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ob3N0V2luZG93ID0gZXZlbnQuc291cmNlIGFzIFdpbmRvdztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5oYW5kbGVJbmNvbWVNZXNzYWdlcyhldmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBJbml0UmVxdWVzdCgpKTtcbiAgICB9XG5cbn1cblxuZGVmaW5lRHluYW1pY0ltcG9ydCgnSWZyYW1lU0RLJywgSWZyYW1lU0RLKTtcbiIsICJpbXBvcnQgKiBhcyBhbGwgZnJvbSAnLi9pbmRleCdcbmltcG9ydCB7ZGVmaW5lRHluYW1pY0ltcG9ydH0gZnJvbSBcIi4uL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydFwiO1xuXG5jb25zdCBNeW9wTWVzc2FnZXMgPSB7XG4gICAgLi4uYWxsXG59XG5cbmRlZmluZUR5bmFtaWNJbXBvcnQoJ015b3BNZXNzYWdlcycsIE15b3BNZXNzYWdlcyk7XG4iLCAiaW1wb3J0IHtkZWZpbmVEeW5hbWljSW1wb3J0fSBmcm9tIFwiLi4vZHluYW1pY0ltcG9ydC9kZWZpbmVEeW5hbWljSW1wb3J0LnRzXCI7XG5pbXBvcnQgKiBhcyBNeW9wSGVscGVycyBmcm9tIFwiLi9pbmRleC50c1wiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi9pbmRleC50c1wiO1xuXG5kZWZpbmVEeW5hbWljSW1wb3J0KCdNeW9wSGVscGVycycsIE15b3BIZWxwZXJzKTtcbiIsICIvLyBAdHMtbm9jaGVja1xuaW1wb3J0IHttb2R1bGVJbnN0YW5jZUtleSwgb25Mb2FkS2V5fSBmcm9tIFwiLi9kZWZpbmVEeW5hbWljSW1wb3J0XCI7XG5cbmlmICghd2luZG93WydfX2ZlZGVyYXRpb25fXyddKSB7XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3Qgc2NyaXB0U3JjID0gZG9jdW1lbnQuY3VycmVudFNjcmlwdD8uc3JjO1xuICAgIGNvbnN0IF9fcHVibGljX2F1dG9fcGF0aF9fID0gc2NyaXB0U3JjID8gc2NyaXB0U3JjLnNwbGl0KCcvJykuc2xpY2UoMCwgLTEpLmpvaW4oJy8nKSA6ICcnO1xuXG4gICAgd2luZG93WydfX2ZlZGVyYXRpb25fXyddID0ge1xuICAgICAgICBfX3B1YmxpY19hdXRvX3BhdGhfXyxcbiAgICAgICAgX191c2VfcHVibGljX2F1dG9fcGF0aF9fOiB0cnVlLFxuICAgICAgICBfX3B1YmxpY19wYXRoX186IHVuZGVmaW5lZCxcbiAgICAgICAgX19sb2FkaW5nX3RpbWVvdXRfXyA6IDUgKiAxMDAwXG4gICAgfTtcbn0gZWxzZSB7XG4gICAgY29uc29sZS5sb2coJ19fZmVkZXJhdGlvbl9fIGxvYWRlZCBtb3JlIHRoYW4gb25jZS4nKTtcbn1cblxud2luZG93WydfX2ZlZGVyYXRpb25fXyddWydsb2FkX19mZWRlcmF0aW9uX18nXSA9IChzY3JpcHRGaWxlUGF0aCwgbW9kdWxlTmFtZSwgb25Mb2FkKSA9PiB7XG5cbiAgICBpZiAoIXdpbmRvd1snX19mZWRlcmF0aW9uX18nXVttb2R1bGVOYW1lXSkge1xuICAgICAgICBsZXQgc2NyaXB0VGFnO1xuXG4gICAgICAgIC8vIENhbGxlcnMgdGhhdCBhcnJpdmUgd2hpbGUgdGhlIGNodW5rIGlzIHN0aWxsIGxvYWRpbmcgd2FpdCBoZXJlLiBXaXRob3V0IHRoaXMgcXVldWUgYVxuICAgICAgICAvLyBzZWNvbmQgY29uY3VycmVudCBnZXRYTW9kdWxlKCkgcmVzb2x2ZWQgd2l0aCBgdW5kZWZpbmVkYCAodGhlIGluc3RhbmNlIGlzIG5vdCBzZXQgeWV0KS5cbiAgICAgICAgY29uc3QgcGVuZGluZyA9IFtvbkxvYWRdO1xuXG4gICAgICAgIHdpbmRvd1snX19mZWRlcmF0aW9uX18nXVttb2R1bGVOYW1lXSA9IHtwZW5kaW5nfTtcbiAgICAgICAgd2luZG93WydfX2ZlZGVyYXRpb25fXyddW21vZHVsZU5hbWVdW29uTG9hZEtleV0gPSAobW9kdWxlKSA9PiB7XG4gICAgICAgICAgICBpZiAoc2NyaXB0VGFnKSB7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5yZW1vdmVDaGlsZChzY3JpcHRUYWcpO1xuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGNoZWNrIHRoYXQ6XG4gICAgICAgICAgICAgICAgc2NyaXB0VGFnID0gbnVsbDtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnc2NyaXB0IHJlbW92ZWQuLi4gJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vY29uc29sZS5sb2cobW9kdWxlKTtcblxuICAgICAgICAgICAgd2luZG93WydfX2ZlZGVyYXRpb25fXyddW21vZHVsZU5hbWVdW21vZHVsZUluc3RhbmNlS2V5XSA9IG1vZHVsZTtcbiAgICAgICAgICAgIHBlbmRpbmcuc3BsaWNlKDApLmZvckVhY2goKGNiKSA9PiBjYihtb2R1bGUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxvYWRTY3JpcHQgPSAoc3JjKSA9PiB7XG4gICAgICAgICAgICBzY3JpcHRUYWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICAgICAgICAgIHNjcmlwdFRhZy50eXBlID0gJ21vZHVsZSc7XG4gICAgICAgICAgICBzY3JpcHRUYWcuc3JjID0gc3JjO1xuICAgICAgICAgICAgc2NyaXB0VGFnLmFzeW5jID0gdHJ1ZTtcblxuICAgICAgICAgICAgLy8gRmFsbGJhY2sgdG8gQ0ROIGlmIHRoZSBzY3JpcHQgZmFpbHMgdG8gbG9hZCAoZS5nLiBjYWNoaW5nIHByb3hpZXMgbGlrZSBMaXRlU3BlZWRcbiAgICAgICAgICAgIC8vIHJlbG9jYXRlIHRoZSByb290IFNESyBidXQgZG9uJ3QgaGF2ZSB0aGUgY2h1bmsgZmlsZXMpXG4gICAgICAgICAgICBzY3JpcHRUYWcub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjZG5CYXNlID0gd2luZG93Lm15b3A/Ll9fUk9PVF9TREtfUFVCTElDX1VSTF9fPy5zcGxpdCgnLycpLnNsaWNlKDAsIC0xKS5qb2luKCcvJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2h1bmtGaWxlTmFtZSA9IHNyYy5zcGxpdCgnLycpLnBvcCgpO1xuICAgICAgICAgICAgICAgIGlmIChjZG5CYXNlICYmICFzcmMuc3RhcnRzV2l0aChjZG5CYXNlKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYFtteW9wXSBjaHVuayBsb2FkIGZhaWxlZCBmcm9tICR7c3JjfSwgcmV0cnlpbmcgZnJvbSBDRE5gKTtcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5yZW1vdmVDaGlsZChzY3JpcHRUYWcpO1xuICAgICAgICAgICAgICAgICAgICBsb2FkU2NyaXB0KGAke2NkbkJhc2V9LyR7Y2h1bmtGaWxlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdFRhZyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgbG9hZFNjcmlwdChzY3JpcHRGaWxlUGF0aCk7XG5cbiAgICAgICAgLy8gY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsaW5rXCIpO1xuICAgICAgICAvLyBsaW5rLnR5cGUgPSBcInRleHQvY3NzXCI7XG4gICAgICAgIC8vIGxpbmsucmVsID0gXCJzdHlsZXNoZWV0XCI7XG4gICAgICAgIC8vIGxpbmsuaHJlZiA9IGZpbGVOYW1lLnJlcGxhY2UoJy5qcycsICcuY3NzJyk7XG4gICAgICAgIC8vIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluayk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBlbnRyeSA9IHdpbmRvd1snX19mZWRlcmF0aW9uX18nXVttb2R1bGVOYW1lXTtcbiAgICAgICAgaWYgKGVudHJ5W21vZHVsZUluc3RhbmNlS2V5XSkge1xuICAgICAgICAgICAgb25Mb2FkKGVudHJ5W21vZHVsZUluc3RhbmNlS2V5XSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZW50cnkucGVuZGluZykge1xuICAgICAgICAgICAgZW50cnkucGVuZGluZy5wdXNoKG9uTG9hZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgX19mZWRlcmF0aW9uX18gbW9kdWxlICR7bW9kdWxlTmFtZX0gYWxyZWFkeSBsb2FkZWQuYClcbiAgICAgICAgICAgIG9uTG9hZChlbnRyeVttb2R1bGVJbnN0YW5jZUtleV0pO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCAnLi9keW5hbWljSW1wb3J0L2xvYWRfX2ZlZGVyYXRpb25fXyc7XG4vLyBAdHMtaWdub3JlIGhhbmRsZWQgYnkgY3VzdG9tIGVzYnVpbGQgcGx1Z2luXG5pbXBvcnQgdmVyc2lvbiBmcm9tIFwibXlvcC1zZGstdmVyc2lvblwiO1xuXG5jb25zb2xlLmxvZygnbXlvcCByb290IHNkayAtIGxvYWRlZCcsIGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpbik7XG5cbi8vIFRPRE8gOiByZWFkIHZhbHVlIGZyb20gd2luZG93WydfX2ZlZGVyYXRpb25fXyddID9cbi8vY29uc3QgX19ST09UX1NES19QVUJMSUNfVVJMX18gPSAnaHR0cHM6Ly9kZmRsazJwMW0xODd2LmNsb3VkZnJvbnQubmV0L215b3Bfc2RrLm1pbi5qcydcbmNvbnN0IF9fUk9PVF9TREtfUFVCTElDX1VSTF9fID0gJ2h0dHBzOi8vY2RuLm15b3AuZGV2L3Nkay9uZXh0L215b3Bfc2RrLm1pbi5qcydcblxuY29uc3QgZ2V0SG9zdE1vZHVsZSA9ICgpID0+IGltcG9ydCgnLi9ob3N0L2hvc3RTREsnKVxuY29uc3QgZ2V0SWZyYW1lTW9kdWxlID0gKCkgPT4gaW1wb3J0KCcuL0lmcmFtZS9JZnJhbWVTREsnKVxuY29uc3QgZ2V0V2ViY29tcG9uZW50TW9kdWxlID0gKCkgPT4gaW1wb3J0KCcuL3dlYmNvbXBvbmVudC9XZWJDb21wb25lbnRTREsnKVxuY29uc3QgZ2V0TXlvcE1lc3NhZ2VzID0gKCkgPT4gaW1wb3J0KCcuL21lc3NhZ2VzL015b3BNZXNzYWdlcycpXG5jb25zdCBnZXRNeW9wSGVscGVycyA9ICgpID0+IGltcG9ydCgnLi9oZWxwZXJzL015b3BIZWxwZXJzJylcblxuLy8gVGhlIHNwbGl0IGJ1aWxkIChkaXN0L2NqcykgcmVzb2x2ZXMgZWFjaCBpbXBvcnQgdG8gYSBmZWRlcmF0aW9uIHN0dWIgd2hvc2UgYGdldCgpYCBsb2FkcyB0aGVcbi8vIGNodW5rLiBUaGUgc2luZ2xlLWZpbGUgYnVpbGQgKGRpc3QvY2pzLWJ1bmRsZWQpIGlubGluZXMgdGhlIHJlYWwgbW9kdWxlLCB3aGljaCBoYXMgbm8gYGdldGAuXG5jb25zdCBleHBvc2VHbG9iYWxseSA9IChpbXBvcnRGdW5jdGlvbjogKCkgPT4gUHJvbWlzZTxhbnk+KSA9PiB7XG4gICAgcmV0dXJuIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgbW9kID0gYXdhaXQgaW1wb3J0RnVuY3Rpb24oKTtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBtb2QuZ2V0ID09PSAnZnVuY3Rpb24nID8gbW9kLmdldCgpIDogbW9kO1xuICAgIH1cbn1cblxuLy8gRm9yIHNjcmlwdC9nbG9iYWwgdXNhZ2UgOlxuY29uc3Qgcm9vdFNESyA9IHtcbiAgICB2ZXJzaW9uIDogdmVyc2lvbixcbiAgICBnZXRIb3N0TW9kdWxlOiBleHBvc2VHbG9iYWxseShnZXRIb3N0TW9kdWxlKSxcbiAgICBnZXRJZnJhbWVNb2R1bGU6IGV4cG9zZUdsb2JhbGx5KGdldElmcmFtZU1vZHVsZSksXG4gICAgZ2V0V2ViY29tcG9uZW50TW9kdWxlOiBleHBvc2VHbG9iYWxseShnZXRXZWJjb21wb25lbnRNb2R1bGUpLFxuICAgIGdldE15b3BNZXNzYWdlczogZXhwb3NlR2xvYmFsbHkoZ2V0TXlvcE1lc3NhZ2VzKSxcbiAgICBnZXRNeW9wSGVscGVyczogZXhwb3NlR2xvYmFsbHkoZ2V0TXlvcEhlbHBlcnMpXG59O1xuXG4vLyBAdHMtaWdub3JlXG5pZiAoIXdpbmRvdy5teW9wKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHdpbmRvdy5teW9wID0ge1xuICAgICAgICBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfX1xuICAgIH1cbn1cblxuLy8gQHRzLWlnbm9yZVxuaWYgKCF3aW5kb3cubXlvcC5yb290U0RLKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHdpbmRvdy5teW9wID0ge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHJvb3RTREssXG4gICAgICAgIC4uLndpbmRvdy5teW9wXG4gICAgfTtcbn0gZWxzZSB7XG4gICAgY29uc29sZS5sb2coXCJteW9wIHJvb3QgaG9zdCBsb2FkZWQgbW9yZSB0aGFuIG9uY2UuXCIpO1xufVxuXG4vLyBGb3IgYnVuZGxlcnMgdXNhZ2UgOlxuY29uc3Qgc2RrTW9kdWxlID0ge1xuICAgIGdldEhvc3RNb2R1bGUsXG4gICAgZ2V0SWZyYW1lTW9kdWxlLFxuICAgIGdldFdlYmNvbXBvbmVudE1vZHVsZSxcbiAgICBnZXRNeW9wTWVzc2FnZXMsXG4gICAgZ2V0TXlvcEhlbHBlcnNcbn1cbmV4cG9ydCB0eXBlIHJvb3RTREtUeXBlID0gdHlwZW9mIHNka01vZHVsZTtcblxuZXhwb3J0IHtcbiAgICBnZXRIb3N0TW9kdWxlLFxuICAgIGdldElmcmFtZU1vZHVsZSxcbiAgICBnZXRXZWJjb21wb25lbnRNb2R1bGUsXG4gICAgZ2V0TXlvcE1lc3NhZ2VzLFxuICAgIGdldE15b3BIZWxwZXJzXG59XG5cbi8vIGRlY2xhcmUgZ2xvYmFsIHtcbi8vICAgICBpbnRlcmZhY2UgV2luZG93IHtcbi8vICAgICAgICAgbXlvcDoge1xuLy8gICAgICAgICAgICAgcm9vdFNESzogdHlwZW9mIHJvb3RTREtcbi8vICAgICAgICAgfVxuLy8gICAgIH1cbi8vIH1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBYSxnQkFDQSxXQUNBLG1CQUVBO0FBSmI7QUFBQTtBQUFBO0FBQU8sSUFBTSxpQkFBaUI7QUFDdkIsSUFBTSxZQUFZO0FBQ2xCLElBQU0sb0JBQW9CO0FBRTFCLElBQU0sc0JBQXNCLENBQUMsWUFBb0IsV0FBZ0I7QUFFcEUsVUFBSSxPQUFPLGNBQWMsS0FBSyxPQUFPLGNBQWMsRUFBRSxVQUFVLEtBQUssT0FBTyxjQUFjLEVBQUUsVUFBVSxFQUFFLFNBQVMsR0FBRztBQUUvRyxlQUFPLGNBQWMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLEVBQUMsQ0FBQyxVQUFVLEdBQUcsT0FBTSxDQUFDO0FBQUEsTUFDeEUsT0FBTztBQUFBLE1BRVA7QUFBQSxJQUNKO0FBQUE7QUFBQTs7O0FDWkEsSUFBTztBQUFQO0FBQUE7QUFBQSxJQUFPLDJCQUFRO0FBQUE7QUFBQTs7O0FDQWYsSUFJYTtBQUpiO0FBQUE7QUFBQTtBQUlPLElBQU0sZUFBZTtBQUFBO0FBQUEsTUFFeEIsZUFBZTtBQUFBLE1BQ2YsZ0JBQWdCO0FBQUEsTUFDaEIsZUFBZTtBQUFBLE1BQ2Ysa0JBQWtCO0FBQUEsTUFFbEIscUJBQXFCO0FBQUEsTUFDckIsb0JBQW9CO0FBQUEsTUFDcEIseUJBQXlCO0FBQUEsTUFFekIsd0JBQXdCO0FBQUEsTUFFeEIsMkJBQTJCO0FBQUEsTUFDM0IsdUJBQXVCO0FBQUEsTUFFdkIsNkJBQTZCO0FBQUEsTUFDN0Isb0JBQW9CO0FBQUEsTUFFcEIsMEJBQTBCO0FBQUEs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QWlCLENBQUMsbUJBQXVDO0FBQzNELFNBQU8sTUFBWTtBQUNmLFVBQU0sTUFBTSxNQUFNLGVBQWU7QUFDakMsV0FBTyxPQUFPLElBQUksUUFBUSxhQUFhLElBQUksSUFBSSxJQUFJO0FBQUEsRUFDdkQ7QUFDSjtBQUdBLElBQU0sVUFBVTtBQUFBLEVBQ1osU0FBVTtBQUFBLEVBQ1YsZUFBZSxlQUFlLGFBQWE7QUFBQSxFQUMzQyxpQkFBaUIsZUFBZSxlQUFlO0FBQUEsRUFDL0MsdUJBQXVCLGVBQWUscUJBQXFCO0FBQUEsRUFDM0QsaUJBQWlCLGVBQWUsZUFBZTtBQUFBLEVBQy9DLGdCQUFnQixlQUFlLGNBQWM7QUFDakQ7QUFHQSxJQUFJLENBQUMsT0FBTyxNQUFNO0FBRWQsU0FBTyxPQUFPO0FBQUEsSUFDVix5QkFBQUE7QUFBQSxFQUNKO0FBQ0o7QUFHQSxJQUFJLENBQUMsT0FBTyxLQUFLLFNBQVM7QUFFdEIsU0FBTyxPQUFPO0FBQUE7QUFBQSxJQUVWO0FBQUEsS0FDRyxPQUFPO0FBRWxCLE9BQU87QUFDSCxVQUFRLElBQUksdUNBQXVDO0FBQ3ZEOyIsCiAgIm5hbWVzIjogWyJSZXBsYXlNZXNzYWdlS2V5IiwgIm1hdGNoIiwgInNjcmlwdElucHV0cyIsICJzY3JpcHRJbnB1dHMiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAic2VlbiIsICJfYSIsICJ0YXJnZXQiLCAibWFrZVNlcmlhbGl6YWJsZSIsICJfYSIsICJoZWlnaHQiLCAid2lkdGgiLCAiX2EiLCAiX2EiLCAiX2EiLCAiX2EiLCAiZSIsICJfYSIsICJpbml0X2NvbnN0cyIsICJpbml0X2NvbnN0cyIsICJpbml0X2NvbnN0cyIsICJpbml0X2NvbnN0cyIsICJob3N0U0RLIiwgImluaXRfZXhlY3V0ZVNjcmlwdEhhbmRsZXIiLCAiaW5pdF9jb25zdHMiLCAiZWxlbWVudCIsICJpbml0X2V4ZWN1dGVTY3JpcHRIYW5kbGVyIiwgInNkayIsICJzZWVuIiwgImRvbUlkIiwgIl9hIiwgImluaXRfaGVscGVycyIsICJpbml0X2hlbHBlcnMiLCAic2tpbiIsICJfYSIsICJjb21wb25lbnQiLCAic2VnbWVudCIsICJleHBlcmllbmNlIiwgInNlbGVjdGVkU2tpbiIsICJEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyIiwgImluaXRfRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlciIsICJpbml0X2NvbnN0cyIsICJCaW5kT25DbGlja0hhbmRsZXIiLCAiaW5pdF9iaW5kT25DbGlja0hhbmRsZXIiLCAiQ2hhbmdlVGV4dEhhbmRsZXIiLCAiaW5pdF9jaGFuZ2VUZXh0SGFuZGxlciIsICJFeGVjdXRlU2NyaXB0SGFuZGxlciIsICJpbml0X2V4ZWN1dGVTY3JpcHRIYW5kbGVyIiwgIkFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIiwgImluaXRfYWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIiLCAic2V0QXR0cmlidXRlSGFuZGxlciIsICJpbml0X3NldEF0dHJpYnV0ZUhhbmRsZXIiLCAiQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIiLCAiaW5pdF9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciIsICJpbml0X2NvbnN0cyIsICJob3N0U0RLIiwgIk11dGF0aW9uT2JzZXJ2ZXIiLCAiZ2V0SW5wdXRWYWx1ZSIsICJHZXRFbGVtZW50VmFsdWVIYW5kbGVyIiwgImluaXRfR2V0RWxlbWVudFZhbHVlSGFuZGxlciIsICJpbml0X2NvbnN0cyIsICJlbGVtZW50IiwgIlNldElubmVySHRtbEhhbmRsZXIiLCAiaW5pdF9zZXRJbm5lckh0bWxIYW5kbGVyIiwgImluaXRfRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlciIsICJpbml0X2JpbmRPbkNsaWNrSGFuZGxlciIsICJpbml0X2NoYW5nZVRleHRIYW5kbGVyIiwgImluaXRfZXhlY3V0ZVNjcmlwdEhhbmRsZXIiLCAiaW5pdF9hZGRFdmVudExpc3RlbmVySGFuZGxlciIsICJpbml0X3NldEF0dHJpYnV0ZUhhbmRsZXIiLCAiaW5pdF9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciIsICJpbml0X0dldEVsZW1lbnRWYWx1ZUhhbmRsZXIiLCAiaW5pdF9zZXRJbm5lckh0bWxIYW5kbGVyIiwgIl9hIiwgIkNoYW5nZVRleHRIYW5kbGVyIiwgIlNldElubmVySHRtbEhhbmRsZXIiLCAiQmluZE9uQ2xpY2tIYW5kbGVyIiwgIkRldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIiLCAiRXhlY3V0ZVNjcmlwdEhhbmRsZXIiLCAiQWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIiLCAic2V0QXR0cmlidXRlSGFuZGxlciIsICJHZXRFbGVtZW50VmFsdWVIYW5kbGVyIiwgIkNyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIiwgIk15b3BNZXNzYWdlcyIsICJpbml0X015b3BNZXNzYWdlcyIsICJpbml0X2hlbHBlcnMiLCAiX2EiLCAiX19ST09UX1NES19QVUJMSUNfVVJMX18iXQp9Cg==
|
|
5851
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydC50cyIsICJ2ZXJzaW9uOm15b3Atc2RrLXZlcnNpb24iLCAiLi4vLi4vc3JjL2NvbW1vbi9NeW9wTWVzc2FnZXMudHMiLCAiLi4vLi4vc3JjL3V0aWxzL3V1aWQudHMiLCAiLi4vLi4vc3JjL3V0aWxzL3V0aWxzLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9CYXNlTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQmluZENsaWNrTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQ2hhbmdlVGV4dE1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL21lc3NhZ2VzL0V4ZWN1dGVTY3JpcHRNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9DdXN0b21SZWZNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9BZGRFdmVudExpc3RlbmVyTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvU2V0QXR0cmlidXRlTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvR2V0RWxlbWVudFZhbHVlTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvU2V0SW5uZXJIdG1sLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9Jbml0TWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvRW52ZWxvcGVkTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9HZXRBdHRyaWJ1dGVNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9FeGVjdXRlQ29tcG9uZW50TWV0aG9kLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQ2xlYW51cE1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL21lc3NhZ2VzL0Rpc3Bvc2VNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL21lc3NhZ2VzL2luZGV4LnRzIiwgIi4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvSU15b3BDb21wb25lbnQudHMiLCAiLi4vLi4vc3JjL2NvbW1vbi9NeW9wRWxlbWVudFJlZi50cyIsICIuLi8uLi9zcmMvY29tbW9uL2Jhc2VNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi9zcmMvY29tbW9uL0Jhc2VNeW9wU0RLLnRzIiwgIi4uLy4uL3NyYy9jb21tb24vaW5kZXgudHMiLCAiLi4vLi4vc3JjL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzIiwgIi4uLy4uL3NyYy9ob3N0L2xvZ01lc3NhZ2VzLnRzIiwgIi4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcFJlZkNvbXBvbmVudC50cyIsICIuLi8uLi9zcmMvaG9zdC9jb21wb25lbnRzL215b3BFeHRyYWN0ZWRXZWJDb21wb25lbnQudHMiLCAiLi4vLi4vc3JjL2hvc3QvY29tcG9uZW50Q29yZS50cyIsICIuLi8uLi9zcmMvaG9zdC9jb21wb25lbnRzL215b3BJZnJhbWVDb21wb25lbnQudHMiLCAiLi4vLi4vc3JjL2hvc3QvbG9hZGVycy9JTXlvcExvYWRlci50cyIsICIuLi8uLi9zcmMvaG9zdC9sb2FkZXJzL2lmcmFtZUxvYWRlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L2NvbnN0cy50cyIsICIuLi8uLi9zcmMvaG9zdC9jb21wb25lbnRzL215b3BXZWJjb21wb25lbnQudHMiLCAiLi4vLi4vc3JjL2hvc3QvbG9hZGVycy93ZWJjb21wb25lbnRMb2FkZXIudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvZGVsaXZlcnlTdG9yZS50cyIsICIuLi8uLi9zcmMvaGVscGVycy9DbG91ZFJlcG9zaXRvcnkudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvY2xvdWRSZXBvc2l0b3J5SGVscGVycy50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL2NvbnN0cy50cyIsICIuLi8uLi9zcmMvY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L3NoYWRvd1Jvb3RSZWYudHMiLCAiLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL0dldEVsZW1lbnRWYWx1ZUhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvc2V0SW5uZXJIdG1sSGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L1dlYkNvbXBvbmVudFNESy50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L2luZGV4LnRzIiwgIi4uLy4uL3NyYy9ob3N0L2xvYWRlcnMvSFRNTENvbXBvbmVudExvYWRlci50cyIsICIuLi8uLi9zcmMvaGVscGVycy9hcHBseVN0eWxlc2hlZXQudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvaWZyYW1lU2tpblVybFRva2VuaXplci50cyIsICIuLi8uLi9zcmMvaGVscGVycy9jbGFzc0xpc3QudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvY29uZmlnQnVpbGRlci50cyIsICIuLi8uLi9zcmMvaGVscGVycy9leGVjLnRzIiwgIi4uLy4uL3NyYy9oZWxwZXJzL2luZGV4LnRzIiwgIi4uLy4uL3NyYy9ob3N0L215b3BPdmVycmlkZS50cyIsICIuLi8uLi9zcmMvaG9zdC9ob3N0U0RLLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvYmluZE9uQ2xpY2tIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL2NoYW5nZVRleHRIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL2FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL3NldEF0dHJpYnV0ZUhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL2NvbW1vbi91dGlscy9kb21PYnNlcnZlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9TZXRNdXRhdGlvbk9ic2VydmVySGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9HZXRFbGVtZW50VmFsdWVIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL2dldEF0dHJpYnV0ZUhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvU2V0UmVzaXplT2JzZXJ2ZXJIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL3NldElubmVySHRtbEhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL0lmcmFtZS9JZnJhbWVTREsudHMiLCAiLi4vLi4vc3JjL21lc3NhZ2VzL015b3BNZXNzYWdlcy50cyIsICIuLi8uLi9zcmMvaGVscGVycy9NeW9wSGVscGVycy50cyIsICIuLi8uLi9zcmMvZHluYW1pY0ltcG9ydC9sb2FkX19mZWRlcmF0aW9uX18udHMiLCAiLi4vLi4vc3JjL1NESy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IGNvbnN0IF9fZmVkZXJhdGlvbl9fID0gXCJfX2ZlZGVyYXRpb25fX1wiXG5leHBvcnQgY29uc3Qgb25Mb2FkS2V5ID0gXCJvbkxvYWRcIlxuZXhwb3J0IGNvbnN0IG1vZHVsZUluc3RhbmNlS2V5ID0gXCJtb2R1bGVJbnN0YW5jZVwiXG5cbmV4cG9ydCBjb25zdCBkZWZpbmVEeW5hbWljSW1wb3J0ID0gKGdsb2JhbE5hbWU6IHN0cmluZywgbW9kdWxlOiBhbnkpID0+IHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKHdpbmRvd1tfX2ZlZGVyYXRpb25fX10gJiYgd2luZG93W19fZmVkZXJhdGlvbl9fXVtnbG9iYWxOYW1lXSAmJiB3aW5kb3dbX19mZWRlcmF0aW9uX19dW2dsb2JhbE5hbWVdW29uTG9hZEtleV0pIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB3aW5kb3dbX19mZWRlcmF0aW9uX19dW2dsb2JhbE5hbWVdW29uTG9hZEtleV0oe1tnbG9iYWxOYW1lXTogbW9kdWxlfSlcbiAgICB9IGVsc2Uge1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdfX2ZlZGVyYXRpb25fXyBsb2FkZXIgbm90IGRlZmluZWQgZm9yIG1vZHVsZScsIG1vZHVsZSk7XG4gICAgfVxufSIsICJleHBvcnQgZGVmYXVsdCAnMC40LjAtYmV0YS42JzsiLCAidHlwZSBTdHJpbmdXaXRoQXV0b2NvbXBsZXRlPFQ+ID0gVCB8IChzdHJpbmcgJiBSZWNvcmQ8bmV2ZXIsIG5ldmVyPik7XG5cbmV4cG9ydCB0eXBlIE15b3BNZXNzYWdlS2V5ID0gU3RyaW5nV2l0aEF1dG9jb21wbGV0ZTxrZXlvZiB0eXBlb2YgTXlvcE1lc3NhZ2VzIHwga2V5b2YgdHlwZW9mIE15b3BNZXNzYWdlcy5Jbj47XG5cbmV4cG9ydCBjb25zdCBNeW9wTWVzc2FnZXMgPSB7XG4gICAgLy9ob3N0IHRvIGNvbXBvbmVudFxuICAgICdJbml0UmVxdWVzdCc6ICdJbml0UmVxdWVzdCcsXG4gICAgJ0luaXRSZXNwb25zZSc6ICdJbml0UmVzcG9uc2UnLFxuICAgICdJbml0TWVzc2FnZSc6ICdJbml0TWVzc2FnZScsXG4gICAgJ0Rpc3Bvc2VNZXNzYWdlJzogJ0Rpc3Bvc2VNZXNzYWdlJyxcblxuICAgICdDaGFuZ2VUZXh0TWVzc2FnZSc6ICdDaGFuZ2VUZXh0TWVzc2FnZScsXG4gICAgJ0JpbmRDbGlja01lc3NhZ2UnOiAnQmluZENsaWNrTWVzc2FnZScsXG4gICAgJ0RldGVjdE15b3BSZWZzTWVzc2FnZSc6ICdEZXRlY3RNeW9wUmVmc01lc3NhZ2UnLFxuXG4gICAgJ0V4ZWN1dGVTY3JpcHRNZXNzYWdlJzogJ0V4ZWN1dGVTY3JpcHRNZXNzYWdlJyxcblxuICAgICdBZGRFdmVudExpc3RlbmVyTWVzc2FnZSc6ICdBZGRFdmVudExpc3RlbmVyTWVzc2FnZScsXG4gICAgJ1NldEF0dHJpYnV0ZU1lc3NhZ2UnOiAnU2V0QXR0cmlidXRlTWVzc2FnZScsXG5cbiAgICAnQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSc6ICdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlJyxcbiAgICAnRW52ZWxvcGVkTWVzc2FnZSc6ICdFbnZlbG9wZWRNZXNzYWdlJyxcblxuICAgICdHZXRFbGVtZW50VmFsdWVNZXNzYWdlJzogJ0dldEVsZW1lbnRWYWx1ZU1lc3NhZ2UnLFxuICAgICdHZXRBdHRyaWJ1dGVNZXNzYWdlJzogJ0dldEF0dHJpYnV0ZU1lc3NhZ2UnLFxuXG4gICAgJ1NldElubmVySHRtbCc6ICdTZXRJbm5lckh0bWwnLFxuXG4gICAgLy9jb21wb25lbnQgbWVzc2FnZXNcbiAgICAnRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCc6ICdFeGVjdXRlQ29tcG9uZW50TWV0aG9kJyxcbiAgICAnU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnOiAnU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnLFxuICAgICdTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UnOiAnU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlJyxcblxuICAgICdDbGVhbnVwTWVzc2FnZSc6ICdDbGVhbnVwTWVzc2FnZScsXG5cbiAgICAvLyBleHRlcm5hbCB0byBob3N0IDpcbiAgICBJbjoge1xuICAgICAgICAnRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UnOiAnRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UnLFxuICAgICAgICAnQ2xpY2tSZXBsYXlNZXNzYWdlJzogJ0NsaWNrUmVwbGF5TWVzc2FnZScsXG4gICAgICAgICdFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlJzogJ0V4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2UnLFxuXG4gICAgICAgICdFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlJzogJ0V2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UnLFxuICAgICAgICAnRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSc6ICdFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlJyxcblxuICAgICAgICBcIkdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2VcIjogXCJHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlXCIsXG4gICAgICAgICdSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZSc6ICdSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZScsXG4gICAgICAgICdFbnZlbG9wZWRNZXNzYWdlJzogJ0VudmVsb3BlZE1lc3NhZ2UnLFxuXG4gICAgICAgICdNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc6ICdNdXRhdGlvbk9ic2VydmVyTWVzc2FnZScsXG4gICAgICAgICdDbGVhbnVwUmVwbGF5TWVzc2FnZSc6ICdDbGVhbnVwUmVwbGF5TWVzc2FnZScsXG4gICAgICAgICdSZXNpemVPYnNlcnZlck1lc3NhZ2UnOiAnUmVzaXplT2JzZXJ2ZXJNZXNzYWdlJ1xuICAgIH1cbn1cbiIsICIvL1RPRE8gOiByZXVzZSBmcm9tIG9uZSBwbGFjZS5cbi8vIG5lZWRzIHRvIGJlIHVzZWQgaW4gbXlvcC1zZGssIG15b3AtZGFzaGJhb3JkLCBteW9wLXNlcnZlciwgbXlvcC1jbGkgLi5cblxuZXhwb3J0IGNvbnN0IHV1aWR2NCA9ICgpID0+IHtcbiAgICByZXR1cm4gXCIxMDAwMDAwMC0xMDAwLTQwMDAtODAwMC0xMDAwMDAwMDAwMDBcIi5yZXBsYWNlKC9bMDE4XS9nLCBjID0+XG4gICAgICAgICgrYyBeIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoMSkpWzBdICYgMTUgPj4gK2MgLyA0KS50b1N0cmluZygxNilcbiAgICApO1xufVxuXG4vLyBDb252ZXJ0IFVVSUQgc3RyaW5nIHRvIGJ5dGVzXG5leHBvcnQgY29uc3QgdXVpZFRvQnl0ZXMgPSAodXVpZDogc3RyaW5nKTogVWludDhBcnJheSA9PiB7XG4gICAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShcbiAgICAgICAgdXVpZC5yZXBsYWNlKC8tL2csICcnKS5tYXRjaCgvLnsxLDJ9L2cpIS5tYXAoYnl0ZSA9PiBwYXJzZUludChieXRlLCAxNikpXG4gICAgKTtcbn07XG5cbi8vIENvbnZlcnQgYnl0ZXMgdG8gVVVJRCBzdHJpbmdcbmV4cG9ydCBjb25zdCBieXRlc1RvVXVpZCA9IChieXRlczogVWludDhBcnJheSk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgaGV4ID0gWy4uLmJ5dGVzXS5tYXAoYiA9PiBiLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpKS5qb2luKCcnKTtcbiAgICByZXR1cm4gW1xuICAgICAgICBoZXguc2xpY2UoMCwgOCksXG4gICAgICAgIGhleC5zbGljZSg4LCAxMiksXG4gICAgICAgIGhleC5zbGljZSgxMiwgMTYpLFxuICAgICAgICBoZXguc2xpY2UoMTYsIDIwKSxcbiAgICAgICAgaGV4LnNsaWNlKDIwKVxuICAgIF0uam9pbignLScpO1xufTtcblxuLy8gQmFzZTY0IFVSTC1zYWZlIGVuY29kZVxuZXhwb3J0IGNvbnN0IGJhc2U2NFVybEVuY29kZSA9IChieXRlczogVWludDhBcnJheSk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgYmFzZTY0ID0gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLmJ5dGVzKSk7XG4gICAgcmV0dXJuIGJhc2U2NC5yZXBsYWNlKC9cXCsvZywgJy0nKS5yZXBsYWNlKC9cXC8vZywgJ18nKS5yZXBsYWNlKC89KyQvLCAnJyk7XG59O1xuXG4vLyBCYXNlNjQgVVJMLXNhZmUgZGVjb2RlXG5leHBvcnQgY29uc3QgYmFzZTY0VXJsRGVjb2RlID0gKHN0cjogc3RyaW5nKTogVWludDhBcnJheSA9PiB7XG4gICAgbGV0IGJhc2U2NCA9IHN0ci5yZXBsYWNlKC8tL2csICcrJykucmVwbGFjZSgvXy9nLCAnLycpO1xuICAgIHdoaWxlIChiYXNlNjQubGVuZ3RoICUgNCkgYmFzZTY0ICs9ICc9JztcbiAgICBjb25zdCBiaW5hcnkgPSBhdG9iKGJhc2U2NCk7XG4gICAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShiaW5hcnksIGNoYXIgPT4gY2hhci5jaGFyQ29kZUF0KDApKTtcbn07XG5cbi8vIENvbXByZXNzIGFuIGFycmF5IG9mIFVVSURzIGludG8gYSBzaG9ydCBVUkwtc2FmZSBzdHJpbmdcbmV4cG9ydCBjb25zdCBjb21wcmVzc1VVSURzID0gKHV1aWRzOiBzdHJpbmdbXSk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgYWxsQnl0ZXMgPSB1dWlkcy5mbGF0TWFwKHV1aWQgPT4gQXJyYXkuZnJvbSh1dWlkVG9CeXRlcyh1dWlkKSkpO1xuICAgIHJldHVybiBiYXNlNjRVcmxFbmNvZGUobmV3IFVpbnQ4QXJyYXkoYWxsQnl0ZXMpKTtcbn07XG5cbi8vIERlY29tcHJlc3MgZnJvbSBVUkwtc2FmZSBzdHJpbmcgYmFjayB0byBhbiBhcnJheSBvZiBVVUlEc1xuZXhwb3J0IGNvbnN0IGRlY29tcHJlc3NVVUlEcyA9IChlbmNvZGVkOiBzdHJpbmcpOiBzdHJpbmdbXSA9PiB7XG4gICAgY29uc3QgYnl0ZXMgPSBiYXNlNjRVcmxEZWNvZGUoZW5jb2RlZCk7XG4gICAgaWYgKGJ5dGVzLmxlbmd0aCAlIDE2ICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaW5wdXQgbGVuZ3RoJyk7XG5cbiAgICBjb25zdCB1dWlkczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAxNikge1xuICAgICAgICB1dWlkcy5wdXNoKGJ5dGVzVG9VdWlkKGJ5dGVzLnNsaWNlKGksIGkgKyAxNikpKTtcbiAgICB9XG4gICAgcmV0dXJuIHV1aWRzO1xufTtcbiIsICJleHBvcnQgKiBmcm9tICcuL3V1aWQudHMnXG5cbmV4cG9ydCBjb25zdCB3YWl0ID0gKG1zOiBudW1iZXIpID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59IiwgImltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge3V1aWR2NH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vaG9zdFwiO1xuaW1wb3J0IHtJUmVmQ29uZmlnfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBNZXNzYWdlRGlyZWN0aW9uIHtcbiAgICBzdGF0aWMgZG93biA9ICdkb3duJyBhcyBjb25zdFxuICAgIHN0YXRpYyB1cCA9ICd1cCcgYXMgY29uc3Rcbn1cblxuZXhwb3J0IHR5cGUgTWVzc2FnZURpcmVjdGlvbk9wdGlvbiA9ICd1cCcgfCAnZG93bic7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTXlvcE1lc3NhZ2U8VCA9IGFueT4ge1xuICAgIGlkID0gdXVpZHY0KClcblxuICAgIHN0YXRpYyBjcmVhdGU8VCwgVSBleHRlbmRzIG5ldyAoLi4uYXJnczogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFU+KSA9PiBUID0gdHlwZW9mIHRoaXM+KFxuICAgICAgICB0aGlzOiBVLFxuICAgICAgICAuLi5hcmdzOiBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8VT5cbiAgICApOiBJbnN0YW5jZVR5cGU8dHlwZW9mIHRoaXM+IHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gbmV3IHRoaXMoLi4uYXJncyk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vY29uc29sZS5sb2coJ21lZXNhZ2UgaWQgY3JlYXRlZCcsIHRoaXMuaWQsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO1xuICAgIH1cblxuICAgIG15b3AgPSB0cnVlXG5cbiAgICBhYnN0cmFjdCBtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXkgfCBzdHJpbmc7XG5cbiAgICBjb250ZW50PzogVFxuXG4gICAgLy8gVE9ETyA6IGNhbnQgYmUgb3B0aW9uYWwgXG4gICAgc291cmNlPzogc3RyaW5nXG4gICAgZGVzdGluYXRpb24/OiBzdHJpbmdcblxuICAgIHJvdXRlPzogc3RyaW5nW11cblxuICAgIHJlZj86IFJlZlxuXG4gICAgZGlyZWN0aW9uPzogTWVzc2FnZURpcmVjdGlvbk9wdGlvblxuXG4gICAgY2xlYW5hYmxlOiBib29sZWFuID0gZmFsc2VcblxuICAgIGlzVHlwZW9mKG1zZzogQmFzZU15b3BNZXNzYWdlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBtc2cubWVzc2FnZVR5cGUgPT09IHRoaXMubWVzc2FnZVR5cGVcbiAgICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNeW9wRWxlbWVudE1lc3NhZ2U8VCA9IGFueT4gZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8VD4ge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZikge1xuICAgICAgICBzdXBlcigpXG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTXlvcEJpbmRSZXBsYXlNZXNzYWdlPFQgPSBhbnk+IGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyPzogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTXlvcEJpbmRNZXNzYWdlPFQgPSBhbnksIFIgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2UgPSBhbnk+IGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPFQ+IHtcblxuICAgIHB1YmxpYyBhYnN0cmFjdCByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5O1xuXG4gICAgcHVibGljIGhhbmRsZXJVbmlxdWVJZCA9IHV1aWR2NCgpXG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgaGFuZGxlcjogKG1lc3NhZ2U6IFIpID0+IHZvaWQpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlZiB7XG4gICAgcHVibGljIG15b3AgPSB0cnVlO1xuXG4gICAgcHVibGljIF9fbm9uUHJveGllZD86IFJlZjtcblxuICAgIHN0YXRpYyBjcmVhdGUoc2VsZWN0b3I6IHN0cmluZywgcmVmQ29uZmlnPzogSVJlZkNvbmZpZywgY29tcG9uZW50PzogSU15b3BDb21wb25lbnQpIHtcbiAgICAgICAgbGV0IF9yZWZDb25maWcgPSByZWZDb25maWc7XG4gICAgICAgIGlmICghX3JlZkNvbmZpZykge1xuICAgICAgICAgICAgX3JlZkNvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICBpZDogJycsXG4gICAgICAgICAgICAgICAgbmFtZTogJycsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yVHlwZTogJ2lkLWF0dHJpYnV0ZScsXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6IHNlbGVjdG9yLFxuICAgICAgICAgICAgICAgIGJlaGF2aW9yOiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjb2RlJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gYXMgSVJlZkNvbmZpZ1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUmVmKF9yZWZDb25maWcsIGNvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZkNvbmZpZzogSVJlZkNvbmZpZywgcHVibGljIGNvbXBvbmVudD86IElNeW9wQ29tcG9uZW50KSB7XG4gICAgICAgIHRoaXMuX19ub25Qcm94aWVkID0ge1xuICAgICAgICAgICAgLi4udGhpcyxcbiAgICAgICAgICAgIGNvbXBvbmVudDogbnVsbCAvLyBpbiBvcmRlciB0byBiZSBzZXJpYWxpemFibGVcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0NsaWNrUmVwbGF5TWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIEJpbmRDbGlja01lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgQ2xpY2tSZXBsYXlNZXNzYWdlPiB7XG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXlcbiAgICBtZXNzYWdlVHlwZSA9ICdCaW5kQ2xpY2tNZXNzYWdlJztcbiAgICBjbGVhbmFibGUgPSB0cnVlO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBoYW5kbGVyOiAobWVzc2FnZTogQ2xpY2tSZXBsYXlNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENsaWNrUmVwbGF5TWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG59XG5cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlVGV4dE1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8c3RyaW5nPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9ICdDaGFuZ2VUZXh0TWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIHRleHQ6IHN0cmluZykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSB0ZXh0XG4gICAgfVxufSIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7Um9vdFJlZn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlJ1xuXG5jb25zdCBmdW5jdGlvbkJvZHlSZWdleCA9IC8oPzpmdW5jdGlvblxccypcXHcqXFxzKlxcKFteKV0qXFwpXFxzKlxceyhbXFxzXFxTXSo/KVxcfXwoXFwoW14pXSpcXClcXHMqPT5cXHMqXFx7KFtcXHNcXFNdKj8pXFx9KSlcXHMqJC87XG5jb25zdCBleHByZXNzaW9uQm9keVJlZ2V4ID0gL1xcKFxccypbXildK1xccypcXClcXHMqPT5cXHMqKC4rKS87XG5cbmV4cG9ydCBjb25zdCBzdHJpcEZ1bmN0aW9uID0gKGNvbnRlbnQ6IHN0cmluZykgPT4ge1xuICAgIGxldCBtYXRjaCA9IGNvbnRlbnQubWF0Y2goZnVuY3Rpb25Cb2R5UmVnZXgpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgICByZXR1cm4gbWF0Y2hbMV0gfHwgbWF0Y2hbM107XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IG1hdGNoID0gY29udGVudC5tYXRjaChleHByZXNzaW9uQm9keVJlZ2V4KTtcbiAgICAgICAgaWYgKG1hdGNoKVxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdLnRyaW0oKTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIHNjcmlwdElucHV0cyA9IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuXG59IHwge307XG5cbmV4cG9ydCB0eXBlIHNjcmlwdFZhcnM8VD4gPSB7XG4gICAgc2VuZDogKGRhdGE6IFQpID0+IHZvaWQ7XG4gICAgLy8gY29tcGxldGVTdHJlYW06ICgpID0+IHZvaWQ7XG4gICAgcm9vdFJlZjogUm9vdFJlZjtcbiAgICBtYWtlU2VyaWFsaXphYmxlOiB0eXBlb2YgbWFrZVNlcmlhbGl6YWJsZVxufVxuXG5leHBvcnQgdHlwZSBleHRlbmRlZFNjcmlwdFZhcnM8VCwgST4gPSB7XG4gICAgW0sgaW4ga2V5b2YgSV06IElbS107XG59ICYgc2NyaXB0VmFyczxUPlxuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZVNjcmlwdE1lc3NhZ2U8VCA9IGFueSwgSSBleHRlbmRzIHNjcmlwdElucHV0cyA9IGFueT4gZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8c3RyaW5nLCBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQ+PiB7XG5cbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleTtcbiAgICBtZXNzYWdlVHlwZSA9ICdFeGVjdXRlU2NyaXB0TWVzc2FnZSc7XG4gICAgc2NyaXB0OiBzdHJpbmcgPSAnJ1xuXG4gICAgc3RhdGljIHJlcGxpZXJLZXkgPSAnc2VuZCc7XG4gICAgc3RhdGljIGNvbXBsZXRlU3RyZWFtS2V5ID0gJ2NvbXBsZXRlU3RyZWFtJztcblxuICAgIGNvbnN0cnVjdG9yKHNjcmlwdDogKHZhcnM6IGV4dGVuZGVkU2NyaXB0VmFyczxULCBJPikgPT4gVCwgaGFuZGxlcjogKG1lc3NhZ2U6IEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2U8VD4pID0+IHZvaWQgPSAoKSA9PiB7XG4gICAgfSwgcHVibGljIHNjcmlwdElucHV0cz86IEkpIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG4gICAgICAgIHRoaXMuc2NyaXB0ID0gc2NyaXB0LnRvU3RyaW5nKCk7XG5cbiAgICAgICAgLy9UT0RPOiBjYW4gYmUgcmVtb3ZlXG4gICAgICAgIHRoaXMuY29udGVudCA9IHNjcmlwdC50b1N0cmluZygpXG4gICAgICAgIHRoaXMuY29udGVudCA9IHN0cmlwRnVuY3Rpb24odGhpcy5jb250ZW50KTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQgPSBhbnk+IGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlPFQ+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI6IHN0cmluZywgcHVibGljIGNvbnRlbnQ6IFQpIHtcbiAgICAgICAgc3VwZXIocmVwbGF5VG9IYW5kbGVyKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgICBFeGVjdXRlU2NyaXB0TWVzc2FnZSxcbiAgICBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlLFxuICAgIGV4dGVuZGVkU2NyaXB0VmFycyxcbiAgICBzY3JpcHRJbnB1dHMsIHN0cmlwRnVuY3Rpb25cbn0gZnJvbSBcIi4vRXhlY3V0ZVNjcmlwdE1lc3NhZ2UudHNcIjtcblxuZXhwb3J0IHR5cGUgY3VzdG9tUmVmU2NyaXB0SW5wdXRzID0ge1xuICAgIGVsZW1lbnRJZDogc3RyaW5nLFxuICAgIHJlZj86IEhUTUxFbGVtZW50LFxuICAgIF9zY3JpcHQ/OiBzdHJpbmcsXG4gICAgX19zY3JpcHRJbnB1dHM/OiBPYmplY3Rcbn07XG5cbmV4cG9ydCBjbGFzcyBDdXN0b21SZWZNZXNzYWdlPFQgPSBhbnksIEkgZXh0ZW5kcyBzY3JpcHRJbnB1dHMgPSBjdXN0b21SZWZTY3JpcHRJbnB1dHM+IGV4dGVuZHMgRXhlY3V0ZVNjcmlwdE1lc3NhZ2U8VCwgSSAmIGN1c3RvbVJlZlNjcmlwdElucHV0cz4ge1xuXG4gICAgY29uc3RydWN0b3Ioc2NyaXB0OiAodmFyczogZXh0ZW5kZWRTY3JpcHRWYXJzPFQsIEkgJiBjdXN0b21SZWZTY3JpcHRJbnB1dHM+KSA9PiBULFxuICAgICAgICAgICAgICAgIHB1YmxpYyBzY3JpcHRJbnB1dHM6IEkgJiBjdXN0b21SZWZTY3JpcHRJbnB1dHMsXG4gICAgICAgICAgICAgICAgaGFuZGxlcjogKG1lc3NhZ2U6IEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2U8VD4pID0+IHZvaWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgfSkge1xuXG4gICAgICAgIC8vbW9jayB2YXJzXG4gICAgICAgIC8vIGxldCByb290UmVmLCBlbGVtZW50SWQsIF9zY3JpcHQsIF9fc2NyaXB0SW5wdXRzO1xuICAgICAgICBzdXBlcigoe3Jvb3RSZWYsIGVsZW1lbnRJZCwgX3NjcmlwdCwgX19zY3JpcHRJbnB1dHN9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWZzID0gKHJvb3RSZWYuc2hhZG93Um9vdCB8fCByb290UmVmLmNvbnRhaW5lcikucXVlcnlTZWxlY3RvckFsbChgWyR7J215b3AtaWQnfT0nJHtlbGVtZW50SWR9J11gKTtcbiAgICAgICAgICAgIGlmIChyZWZzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIC8vICBjb25zdCByZWYgPSByZWZzWzBdO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogdGhpbmsgYWJvdXQgZXhwb3NpbmcgXCJyZWZzXCIgYW5kIG5vdCBvbmx5IFwicmVmXCJcbiAgICAgICAgICAgICAgICAvL2ZvciBjYXNlcyB3aGVyZSB0aGUgUmVmIGhhcyBtdWx0aXBsYXRlIGltcGxlbWVudGF0aW9uc1xuXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIF9fc2NyaXB0SW5wdXRzLnJlZiA9IHJlZnNbMF07XG5cbiAgICAgICAgICAgICAgICBjb25zdCBkeW5hbWljRnVuY3Rpb24gPSBuZXcgRnVuY3Rpb24oYHJldHVybiAoJHtfc2NyaXB0fSkoLi4uYXJndW1lbnRzKWApO1xuICAgICAgICAgICAgICAgIHJldHVybiBkeW5hbWljRnVuY3Rpb24oX19zY3JpcHRJbnB1dHMpO1xuXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIC8vcmV0dXJuIEZ1bmN0aW9uKCdyZWYnLCAncm9vdFJlZicsIC4uLk9iamVjdC5rZXlzKF9fc2NyaXB0SW5wdXRzKSwgX3NjcmlwdCEpKHJlZiwgcm9vdFJlZiwgLi4uT2JqZWN0LnZhbHVlcyhfX3NjcmlwdElucHV0cykpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbCBhcyBUO1xuICAgICAgICB9LCBoYW5kbGVyKTtcblxuICAgICAgICB0aGlzLnNjcmlwdElucHV0cyA9IHtcbiAgICAgICAgICAgIC4uLnNjcmlwdElucHV0cyxcbiAgICAgICAgICAgIC8vX3NjcmlwdDogc3RyaXBGdW5jdGlvbihzY3JpcHQudG9TdHJpbmcoKSksXG4gICAgICAgICAgICBfc2NyaXB0OiBzY3JpcHQudG9TdHJpbmcoKVxuICAgICAgICB9O1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXJpYWxpemFibGUsIFNlcmlhbGl6YWJsZVNrZWxldG9ufSBmcm9tIFwiLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2U8VCBleHRlbmRzIGtleW9mIEhUTUxFbGVtZW50RXZlbnRNYXAgPSBrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwPiBleHRlbmRzIE15b3BCaW5kTWVzc2FnZSB7XG5cbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleTtcbiAgICBtZXNzYWdlVHlwZSA9ICdBZGRFdmVudExpc3RlbmVyTWVzc2FnZSc7XG4gICAgY2xlYW5hYmxlID0gdHJ1ZTtcbiAgICBzZXJpYWxpemFibGVTa2VsZXRvbjogU2VyaWFsaXphYmxlU2tlbGV0b248SFRNTEVsZW1lbnRFdmVudE1hcFtUXT4gPSBmYWxzZSAvLyB7fSAvLyBlbXB0eVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBwdWJsaWMgdHlwZTogVCwgcHVibGljIGhhbmRsZXI6IChtZXNzYWdlOiBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpXG4gICAgfVxuXG4gICAgd2l0aFNlcmlhbGl6YWJsZVNrZWxldG9uKHNlcmlhbGl6YWJsZVNrZWxldG9uOiBTZXJpYWxpemFibGVTa2VsZXRvbjxIVE1MRWxlbWVudEV2ZW50TWFwW1RdPikge1xuICAgICAgICB0aGlzLnNlcmlhbGl6YWJsZVNrZWxldG9uID0gc2VyaWFsaXphYmxlU2tlbGV0b247XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI6IHN0cmluZywgcHVibGljIGU6IFNlcmlhbGl6YWJsZTxFdmVudD4pIHtcbiAgICAgICAgc3VwZXIocmVwbGF5VG9IYW5kbGVyKTtcbiAgICAgICAgdGhpcy5jb250ZW50ID0ge1xuICAgICAgICAgICAgZVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBSZWYsfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuXG5cbmV4cG9ydCBjbGFzcyBTZXRBdHRyaWJ1dGVNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcblxuICAgIG1lc3NhZ2VUeXBlID0gJ1NldEF0dHJpYnV0ZU1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBwdWJsaWMgbmFtZTogc3RyaW5nLCBwdWJsaWMgdmFsdWU6IHN0cmluZykge1xuICAgICAgICBzdXBlcigpXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NlcmlhbGl6YWJsZX0gZnJvbSBcIi4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZT4ge1xuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5XG4gICAgbWVzc2FnZVR5cGUgPSAnR2V0RWxlbWVudFZhbHVlTWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIGhhbmRsZXI6IChtZXNzYWdlOiBFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgRm9ybURhdGFFbnRyeSA9IHtcbiAgICBpZD86IHN0cmluZyxcbiAgICBuYW1lPzogc3RyaW5nLFxuICAgIHZhbHVlPzogSW5wdXRFbGVtZW50VmFsdWUsXG4gICAgcmVxdWlyZWQ/OiBib29sZWFuLFxuICAgIHZhbGlkaXR5PzogU2VyaWFsaXphYmxlPFZhbGlkaXR5U3RhdGU+LFxuICAgIG15b3BJZD86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBJbnB1dEVsZW1lbnRGb3JtVmFsdWUgPSB7XG4gICAgZm9ybURhdGE/OiB7IFtrZXk6IHN0cmluZ106IEZvcm1EYXRhRW50cnkgfVxuICAgIHVubWFwcGVkRGF0YT86IEZvcm1EYXRhRW50cnlbXVxufTtcblxuZXhwb3J0IHR5cGUgSW5wdXRFbGVtZW50VmFsdWUgPSBzdHJpbmcgfCBJbnB1dEVsZW1lbnRGb3JtVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkXG5cbmV4cG9ydCBjbGFzcyBFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250ZW50OiBJbnB1dEVsZW1lbnRWYWx1ZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn1cblxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRJbm5lckh0bWwgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8c3RyaW5nPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9ICdTZXRJbm5lckh0bWwnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBpbm5lckh0bWw6IHN0cmluZykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSBpbm5lckh0bWxcbiAgICB9XG59IiwgImltcG9ydCB7IEJhc2VNeW9wTWVzc2FnZSB9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5cbi8vIHNlbnQgYnkgaG9zdCB0byBjb21wb25lbnRzLCBjb250YWlucyB0aGllciBpZCBcbmV4cG9ydCBjbGFzcyBJbml0TWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTx7IGlkOiBzdHJpbmcgfT4ge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0luaXRNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSB7IGlkIH1cbiAgICB9XG5cbiAgICBpc1R5cGVvZihtc2c6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gbXNnLm1lc3NhZ2VUeXBlID09PSB0aGlzLm1lc3NhZ2VUeXBlXG4gICAgfVxufVxuXG4vLyBjb21wb25lbnQgbm90aWZ5IGhvc3QgdGhlIGl0IHdhcyBpbml0YXRlZCBcbmV4cG9ydCBjbGFzcyBJbml0UmVzcG9uc2UgZXh0ZW5kcyBJbml0TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnSW5pdFJlc3BvbnNlJztcbn1cblxuLy8gY29tcG9uZW50IGFzayB0byBob3N0IHRvIGdldCBpbml0YXRlZCBcbmV4cG9ydCBjbGFzcyBJbml0UmVxdWVzdCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnSW5pdFJlcXVlc3QnO1xufVxuIiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50Q29uZmlnLCBJUmVmQ29uZmlnfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0L2hvc3RTREsudHNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZkNvbmZpZzogSVJlZkNvbmZpZyxcbiAgICAgICAgICAgICAgICBwdWJsaWMgbmVzdGVkQ29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBvcHRpb25zOiBsb2FkZXJPcHRpb25zLFxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IChtZXNzYWdlOiBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZSkgPT4gdm9pZCxcbiAgICApIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG5cbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIE5lc3RlZFJlZiA9IHtcbiAgICByZWZOYW1lOiBzdHJpbmcsXG4gICAgY29tcG9uZW50RGVmaW5pdGlvbklkOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI6IHN0cmluZywgcHVibGljIG5lc3RlZFJlZnM6IE5lc3RlZFJlZltdLCBwdWJsaWMgZmFpbGVkPzogYm9vbGVhbikge1xuICAgICAgICBzdXBlcihyZXBsYXlUb0hhbmRsZXIpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIEVudmVsb3BlZE1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0VudmVsb3BlZE1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGRlc3RpbmF0aW9uOiBzdHJpbmcsIHB1YmxpYyBtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICBjb25zdCBpbm5lckVudmVsb3BlZE1lc3NhZ2UgPSAobWVzc2FnZSBhcyBFbnZlbG9wZWRNZXNzYWdlKTtcbiAgICAgICAgdGhpcy5yb3V0ZSA9IFtkZXN0aW5hdGlvbiwgLi4uaW5uZXJFbnZlbG9wZWRNZXNzYWdlLnJvdXRlID8gaW5uZXJFbnZlbG9wZWRNZXNzYWdlLnJvdXRlIDogW11dO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge0lFbGVtZW50UmVmfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBEZXRlY3RNeW9wUmVmc01lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8YW55LCBEZXRlY3RlZE15b3BSZWZzTWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0RldGVjdE15b3BSZWZzTWVzc2FnZSdcbiAgICByZXBseU1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5O1xufVxuXG5leHBvcnQgY2xhc3MgRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2U8SUVsZW1lbnRSZWZbXT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5O1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlcGxheVRvSGFuZGxlcjogc3RyaW5nLCBteW9wRWxlbWVudFJlZnM6IElFbGVtZW50UmVmW10pIHtcbiAgICAgICAgc3VwZXIocmVwbGF5VG9IYW5kbGVyKVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSBteW9wRWxlbWVudFJlZnM7XG4gICAgfVxuXG4gICAgaXNUeXBlb2YobXNnOiBCYXNlTXlvcE1lc3NhZ2U8YW55Pik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gbXNnLm1lc3NhZ2VUeXBlID09PSB0aGlzLm1lc3NhZ2VUeXBlXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIEdldEF0dHJpYnV0ZU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZT4ge1xuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5XG4gICAgbWVzc2FnZVR5cGUgPSAnR2V0QXR0cmlidXRlTWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIHB1YmxpYyBuYW1lOiBzdHJpbmcsIGhhbmRsZXI6IChtZXNzYWdlOiBHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbnRlbnQ6IHN0cmluZyB8IG51bGwpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG5cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4uL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vaG9zdFwiO1xuXG50eXBlIE1ldGhvZE5hbWVzPFQ+ID0ge1xuICAgIC8vIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgPyBLIDogbmV2ZXI7XG4gICAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyAoKSA9PiB2b2lkID8gSyA6IG5ldmVyO1xufVtrZXlvZiBUXTtcblxuLy8gRGVmaW5lIGEgdHlwZSB0aGF0IGFsbG93cyBvbmx5IHN0cmluZ3MgY29ycmVzcG9uZGluZyB0byB0aGUgbWV0aG9kIG5hbWVzIG9mIFRcbnR5cGUgTWV0aG9kU3RyaW5nPFQ+ID0gTWV0aG9kTmFtZXM8VD4gZXh0ZW5kcyBpbmZlciBNID8gTSBleHRlbmRzIHN0cmluZyA/IE0gOiBuZXZlciA6IG5ldmVyO1xuXG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdFeGVjdXRlQ29tcG9uZW50TWV0aG9kJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBtZXRob2Q6IE1ldGhvZFN0cmluZzxJTXlvcENvbXBvbmVudD4pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi9CYXNlTWVzc2FnZVwiO1xuXG5leHBvcnQgY2xhc3MgU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ1NldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJztcbn1cblxuZXhwb3J0IGNsYXNzIE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc7XG59IiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0NsZWFudXBSZXBsYXlNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgQ2xlYW51cE1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgQ2xlYW51cFJlcGxheU1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0NsZWFudXBNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjbGVhbnVwRm9yTWVzc2FnZUlkOiBzdHJpbmcsIGhhbmRsZXI6IChtZXNzYWdlOiBDbGVhbnVwUmVwbGF5TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDbGVhbnVwUmVwbGF5TWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY3VzdG9tQ2xlYW51cDogYm9vbGVhbikge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIERpc3Bvc2VNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdEaXNwb3NlTWVzc2FnZSc7XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi9CYXNlTWVzc2FnZVwiO1xuXG5leHBvcnQgY2xhc3MgU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBjbGVhbmFibGUgPSB0cnVlO1xuICAgIG1lc3NhZ2VUeXBlID0gJ1NldFJlc2l6ZU9ic2VydmVyTWVzc2FnZSc7XG59XG5cbmV4cG9ydCBjbGFzcyBSZXNpemVPYnNlcnZlck1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ1Jlc2l6ZU9ic2VydmVyTWVzc2FnZSc7XG59IiwgImV4cG9ydCAqIGZyb20gJy4vQmFzZU1lc3NhZ2UnO1xuXG4vL3VzZXIncyBtZXNzYWdlc1xuZXhwb3J0ICogZnJvbSAnLi9CaW5kQ2xpY2tNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQ2hhbmdlVGV4dE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9FeGVjdXRlU2NyaXB0TWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0N1c3RvbVJlZk1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9BZGRFdmVudExpc3RlbmVyTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL1NldEF0dHJpYnV0ZU1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9HZXRFbGVtZW50VmFsdWVNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vU2V0SW5uZXJIdG1sJztcblxuLy9zeXN0ZW0gbWVzc2FnZXNcbmV4cG9ydCAqIGZyb20gJy4vSW5pdE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vRW52ZWxvcGVkTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0RldGVjdE15b3BSZWZzTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0dldEVsZW1lbnRWYWx1ZU1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAgJy4vR2V0QXR0cmlidXRlTWVzc2FnZSc7XG5cbmV4cG9ydCAqIGZyb20gJy4vY29tcG9uZW50TWVzc2FnZXMvRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCc7XG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudE1lc3NhZ2VzL1NldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQ2xlYW51cE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9EaXNwb3NlTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudE1lc3NhZ2VzL1NldFJlc2l6ZU9ic2VydmVyTWVzc2FnZSc7IiwgImltcG9ydCB7TXlvcE1lc3NhZ2VLZXksIE15b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7XG4gICAgQmFzZU15b3BNZXNzYWdlLFxuICAgIERpc3Bvc2VNZXNzYWdlLCBFeGVjdXRlQ29tcG9uZW50TWV0aG9kLCBNZXNzYWdlRGlyZWN0aW9uLFxuICAgIENsZWFudXBNZXNzYWdlLCBDbGVhbnVwUmVwbGF5TWVzc2FnZSxcbiAgICBNeW9wQmluZE1lc3NhZ2UsXG4gICAgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZcbn0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyLCBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtIb3N0U0RLLCBsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuXG4vKipcbiAqIFJlc3VsdCByZXR1cm5lZCBieSBvYnNlcnZlQXV0b1NpemUgY2FsbGJhY2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRvU2l6ZVJlc3VsdCB7XG4gICAgLyoqIEN1cnJlbnQgd2lkdGggKGZyb20gY29udGVudCkgKi9cbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIC8qKiBDdXJyZW50IGhlaWdodCAoZnJvbSBjb250ZW50KSAqL1xuICAgIGhlaWdodDogbnVtYmVyO1xuICAgIC8qKiBXaGV0aGVyIHdpZHRoIGlzIGJlaW5nIGF1dG8tc2l6ZWQgKi9cbiAgICBhdXRvU2l6aW5nV2lkdGg6IGJvb2xlYW47XG4gICAgLyoqIFdoZXRoZXIgaGVpZ2h0IGlzIGJlaW5nIGF1dG8tc2l6ZWQgKi9cbiAgICBhdXRvU2l6aW5nSGVpZ2h0OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIG9ic2VydmVBdXRvU2l6ZSBtZXRob2RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRvU2l6ZU9wdGlvbnMge1xuICAgIC8qKiBDYWxsYmFjayBjYWxsZWQgd2l0aCBzaXplIGluZm8gd2hlbmV2ZXIgc2l6ZSBjaGFuZ2VzICovXG4gICAgb25TaXplQ2hhbmdlPzogKHJlc3VsdDogQXV0b1NpemVSZXN1bHQpID0+IHZvaWQ7XG4gICAgLyoqIE1pbmltdW0gd2lkdGggY29uc3RyYWludCAqL1xuICAgIG1pbldpZHRoPzogbnVtYmVyIHwgc3RyaW5nO1xuICAgIC8qKiBNYXhpbXVtIHdpZHRoIGNvbnN0cmFpbnQgKi9cbiAgICBtYXhXaWR0aD86IG51bWJlciB8IHN0cmluZztcbiAgICAvKiogTWluaW11bSBoZWlnaHQgY29uc3RyYWludCAqL1xuICAgIG1pbkhlaWdodD86IG51bWJlciB8IHN0cmluZztcbiAgICAvKiogTWF4aW11bSBoZWlnaHQgY29uc3RyYWludCAqL1xuICAgIG1heEhlaWdodD86IG51bWJlciB8IHN0cmluZztcbiAgICAvKiogRXhwbGljaXQgd2lkdGggc2V0IGJ5IGhvc3QgLSBpZiBkZWZpbmVkLCBkb24ndCBhdXRvLXNpemUgd2lkdGggKi9cbiAgICBleHBsaWNpdFdpZHRoPzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIC8qKiBFeHBsaWNpdCBoZWlnaHQgc2V0IGJ5IGhvc3QgLSBpZiBkZWZpbmVkLCBkb24ndCBhdXRvLXNpemUgaGVpZ2h0ICovXG4gICAgZXhwbGljaXRIZWlnaHQ/OiBzdHJpbmcgfCBudW1iZXI7XG4gICAgLyoqIEZvcmNlIGF1dG8tc2l6ZSBldmVuIGlmIGNvbnRhaW5lciBoYXMgZGltZW5zaW9ucyAqL1xuICAgIGZvcmNlQXV0b1NpemU/OiBib29sZWFuO1xuICAgIC8qKiBNaW4gaGVpZ2h0IHVzZWQgYnkgbG9hZGVyIHRvIGRldGVjdCBjb2xsYXBzZSAoZGVmYXVsdDogNTApICovXG4gICAgbG9hZGVyTWluSGVpZ2h0PzogbnVtYmVyO1xufVxuXG4vL1RPRE8gOiBjaGFuZ2UgSU15b3BDb21wb25lbnQgdG8gcmVmIHNwZWNpZmljIGltcGxcbnR5cGUgUmVmVHlwZXMgPSB7XG4gICAgW2tleTogc3RyaW5nXTogSU15b3BDb21wb25lbnQgfCBSZWZcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU15b3BDb21wb25lbnQ8UCA9IGFueSwgUiA9IGFueT4ge1xuXG4gICAgaWQ6IHN0cmluZztcblxuICAgIGlzSW5pdGlhdGVkOiBib29sZWFuO1xuXG4gICAgbWFya2VkRm9yRGlzcG9zZWQ6IGJvb2xlYW47XG5cbiAgICBzZXRJbml0aWF0ZWQ6ICgpID0+IHZvaWRcblxuICAgIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnXG5cbiAgICAvKiogUnVudGltZSB0YWdzOiBvbmx5IHRhZ3MgbmFtZWQgYHVpOi4uLmAgKGUuZy4gYHVpOmJldGFgKS4gYFtdYCB3aGVuIHRoZXJlIGFyZSBub25lLiAqL1xuICAgIHJlYWRvbmx5IHVpVGFnczogc3RyaW5nW11cblxuICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnRcblxuICAgIC8vcmVmIGNvbXBvbmVudHMgY2FuIGJlIGVsZW1lbnQtbGVzc1xuICAgIGVsZW1lbnQ/OiBIVE1MRWxlbWVudFxuXG4gICAgc2VuZDogKG1zZzogQmFzZU15b3BNZXNzYWdlKSA9PiBDbGVhbnVwSGFuZGxlclxuXG4gICAgYmluZChtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXksIGhhbmRsZXI6ICgpID0+IGJvb2xlYW4pOiB2b2lkO1xuXG4gICAgYmluZDxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPihtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXksIGhhbmRsZXI6IChtZXNzYWdlOiBUKSA9PiBib29sZWFuKTogdm9pZDtcblxuICAgIC8vIGJvb2xlYW4gcmV0dXJuZWQgdmFsdWUgPSBoYW5kbGVkIG9yIG5vdFxuICAgIG9uTWVzc2FnZVJlY2VpdmVkOiAobXNnOiBCYXNlTXlvcE1lc3NhZ2UpID0+IGJvb2xlYW5cblxuICAgIGluaXRpYXRlZDogKCkgPT4gUHJvbWlzZTxhbnk+O1xuXG4gICAgZGlzcG9zZTogKCkgPT4gdm9pZFxuXG4gICAgaGlkZSgpOiB2b2lkO1xuXG4gICAgc2hvdygpOiB2b2lkO1xuXG4gICAgaW5zcGVjdCgpOiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogT2JzZXJ2ZXMgdGhlIGlmcmFtZSBjb250ZW50IHNpemUgYW5kIGF1dG9tYXRpY2FsbHkgc3luY3MgaXQgdG8gdGhlIGlmcmFtZSBlbGVtZW50LlxuICAgICAqIE9ubHkgYXZhaWxhYmxlIGZvciBpZnJhbWUtYmFzZWQgY29tcG9uZW50cy4gVXNlcyBkaXJlY3QgY29udGVudERvY3VtZW50IGFjY2Vzcy5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbmNsdWRpbmcgc2l6ZSBjaGFuZ2UgY2FsbGJhY2sgYW5kIG1pbi9tYXggY29uc3RyYWludHNcbiAgICAgKiBAcmV0dXJucyBDbGVhbnVwIGZ1bmN0aW9uIHRvIHN0b3Agb2JzZXJ2aW5nXG4gICAgICovXG4gICAgb2JzZXJ2ZUF1dG9TaXplPzogKG9wdGlvbnM/OiBBdXRvU2l6ZU9wdGlvbnMpID0+IENsZWFudXBIYW5kbGVyO1xuXG4gICAgLyoqXG4gICAgICogUGFyc2VkIG15b3A6c2l6ZSBtZXRhIHRhZyBmcm9tIHRoZSBjb21wb25lbnQgSFRNTC5cbiAgICAgKiBTZXQgYnkgSFRNTENvbXBvbmVudExvYWRlciBiZWZvcmUgaWZyYW1lIGNyZWF0aW9uLlxuICAgICAqIFVzZWQgYnkgdGhlIFJlYWN0IGhvc3QgdG8gZGV0ZXJtaW5lIHNpemluZyBtb2RlIChmaWxsIHZzIGNvbnRlbnQpLlxuICAgICAqL1xuICAgIHNpemVNZXRhPzogeyB3aWR0aD86IHN0cmluZyB8IG51bWJlcjsgaGVpZ2h0Pzogc3RyaW5nIHwgbnVtYmVyOyBtaW5XaWR0aD86IG51bWJlcjsgbWF4V2lkdGg/OiBudW1iZXI7IG1pbkhlaWdodD86IG51bWJlcjsgbWF4SGVpZ2h0PzogbnVtYmVyIH0gfCBudWxsO1xuXG4gICAgcGFyZW50PzogSU15b3BDb21wb25lbnQ7XG5cbiAgICBwcm9wczogUFxuXG4gICAgcmVmczogUlxufVxuXG5mdW5jdGlvbiBpc0luaGVyaXRGcm9tKG9iajogYW55LCBiYXNlQ2xhc3M6IGFueSkge1xuICAgIGlmICghb2JqKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopO1xuXG4gICAgaWYgKCFwcm90bykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHByb3RvLmNvbnN0cnVjdG9yLm5hbWUgPT09IGJhc2VDbGFzcy5uYW1lKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gaXNJbmhlcml0RnJvbShwcm90bywgYmFzZUNsYXNzKTtcbn1cblxuLy8gVE9ETyA6IG1vdmUgOiBcbnR5cGUgbWVzc2FnZUhhbmRsZXI8VD4gPSAobWVzc2FnZTogVCkgPT4gYm9vbGVhbjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNeW9wQ29tcG9uZW50PFAgPSBhbnksIFIgZXh0ZW5kcyBSZWZUeXBlcyA9IFJlZlR5cGVzPiBpbXBsZW1lbnRzIElNeW9wQ29tcG9uZW50PFA+IHtcbiAgICBpZDogc3RyaW5nID0gJydcblxuICAgIG1lc3NhZ2VIYW5kbGVyczogUmVjb3JkPHN0cmluZywgbWVzc2FnZUhhbmRsZXI8YW55PltdPiA9IHt9O1xuXG4gICAgZWxlbWVudD86IEhUTUxFbGVtZW50XG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IocHVibGljIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5pZCA9IG9wdGlvbnM/LmlkIHx8IEhvc3RTREsuSW5zdGFuY2UoKS5hc3NpZ25JZChjb21wb25lbnREZWZpbml0aW9uKTtcbiAgICAgICAgY29uc3QgdGltZW91dCA9IG9wdGlvbnM/LnRpbWVvdXQgPyBvcHRpb25zPy50aW1lb3V0IDogNSAqIDEwMDA7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzSW5pdGlhdGVkICYmIHRoaXMuX3doZW5Jbml0aWF0ZWRSZWplY3QgJiYgIXRoaXMuX21hcmtlZEZvckRpc3Bvc2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd2hlbkluaXRpYXRlZFJlamVjdChgdGltZW91dF8ke3RpbWVvdXR9ICR7dGhpcy5pZH1gKTtcblxuICAgICAgICAgICAgICAgIC8vIEEgVElNRUQtT1VUIENPTVBPTkVOVCBNVVNUIFVOUkVHSVNURVIgSVRTRUxGIC0tIE5PQk9EWSBFTFNFIENBTi5cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vIGhvc3RTREsubG9hZENvbXBvbmVudCByZWplY3RzIHdpdGggdGhpcyBzYW1lIGVycm9yLCBzbyB0aGUgY2FsbGVyIG5ldmVyXG4gICAgICAgICAgICAgICAgLy8gcmVjZWl2ZXMgdGhlIGNvbXBvbmVudCBhbmQgaGFzIG5vIGhhbmRsZSB0byBkaXNwb3NlLiBXaXRob3V0IHRoaXMgdGhlXG4gICAgICAgICAgICAgICAgLy8gaG9zdCBrZWVwcyBpdCBpbiBgY29tcG9uZW50c2AgQU5EIGBjb21wb25lbnRzMmluaXRgIGZvciB0aGUgbGlmZSBvZiB0aGVcbiAgICAgICAgICAgICAgICAvLyBwYWdlLCBhbmQgdGhhdCBjb3N0IGNvbXBvdW5kczogYGNvbXBvbmVudHMyaW5pdGAgaXMgd2Fsa2VkIG9uIGV2ZXJ5XG4gICAgICAgICAgICAgICAgLy8gSW5pdFJlcXVlc3QsIGBpc1RydXN0ZWRTb3VyY2VgIHdhbGtzIGJvdGggYXJyYXlzIG9uIGV2ZXJ5IG1lc3NhZ2UsIGFuZCBhXG4gICAgICAgICAgICAgICAgLy8gVUkgdGhhdCByZXRyaWVzIC0tIGEgcmVlbCBwaWNrZXIsIGEgZGlhbG9nIHJlb3BlbmVkIHBlciB0ZW1wbGF0ZSAtLSBhZGRzXG4gICAgICAgICAgICAgICAgLy8gYSBkZWFkIGVudHJ5IGVhY2ggYXR0ZW1wdC5cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vIGRpc3Bvc2UoKSBpcyB0aGUgY29oZXJlbnQgZW5kIHN0YXRlOiBpdCB1bnJlZ2lzdGVycyB0aHJvdWdoIHRoZSBob3N0J3NcbiAgICAgICAgICAgICAgICAvLyAnb25EaXNwb3NlJyBoYW5kbGVyIGFuZCBkcm9wcyB0aGUgZnJhbWUgdGhhdCBuZXZlciBhbnN3ZXJlZC5cbiAgICAgICAgICAgICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgdGltZW91dCk7XG5cbiAgICAgICAgLy8gVE9ETyA6IGF1dG8gaW5zcGVjdCwgY29udHJvbCBmcm9tIGNvbmZpZ1xuICAgICAgICB0aGlzLmluaXRpYXRlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgaWYgKHdpbmRvdy5teW9wLmhvc3RTREsuaW5zcGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnNwZWN0KClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0IHVpVGFncygpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudERlZmluaXRpb24/LnVpVGFncyB8fCBbXTtcbiAgICB9XG5cbiAgICBfbWFya2VkRm9yRGlzcG9zZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGdldCBtYXJrZWRGb3JEaXNwb3NlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hcmtlZEZvckRpc3Bvc2VkO1xuICAgIH1cblxuICAgIHNldCBtYXJrZWRGb3JEaXNwb3NlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5fbWFya2VkRm9yRGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbjogVGhlIGNvbXBvbmVudCBpcyBhbHJlYWR5IGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGRpc3Bvc2VkLiBEaXNwb3NlIG9wZXJhdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkIGFnYWluIHVudGlsIHRoZSBjdXJyZW50IGRpc3Bvc2FsIHByb2Nlc3MgaXMgY29tcGxldGUuJylcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXJrZWRGb3JEaXNwb3NlZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIGFic3RyYWN0IGhpZGUoKTogdm9pZDtcblxuICAgIGFic3RyYWN0IHNob3coKTogdm9pZDtcblxuICAgIGFic3RyYWN0IGluc3BlY3QoKTogQ2xlYW51cEhhbmRsZXI7XG5cbiAgICAvL1RPRE86IHVzZSBiaW5kV2hlbiB3aXRoIHJldHVybiB0cnVlIHByZWRpY2F0ZSAuLi5cbiAgICBiaW5kID0gPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U+KG1lc3NhZ2VUeXBlOiBzdHJpbmcsIGhhbmRsZXI6IChtZXNzYWdlOiBUKSA9PiBib29sZWFuKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0gPSBbXVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaGFuZGxlIGR1cGxpY2F0ZSByZWdpc3RyYXRpb25cbiAgICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0uaW5jbHVkZXMoaGFuZGxlcikpIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXS5wdXNoKGhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYmluZFdoZW4gPSA8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4obWVzc2FnZVR5cGU6IHN0cmluZywgcHJlZGljYXRlOiAobWVzc2FnZTogVCkgPT4gYm9vbGVhbiwgaGFuZGxlcjogKG1lc3NhZ2U6IFQpID0+IHZvaWQpOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5cXCd0IHVzZSBjb21wb25lbnQuYmluZFdoZW4gd2l0aG91dCBhbiBoYW5kbGVyJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXSkge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdID0gW11cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdO1xuXG4gICAgICAgIGNvbnN0IHByZWRpY2F0ZVdyYXBwZWRIYW5kbGVyID0gKGU6IFQpID0+IHtcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoZSkpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyKGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vVE9ETyA6IGhhbmRsZSBkdXBsaWNhdGUgcmVnaXN0cmF0aW9uID9cbiAgICAgICAgaGFuZGxlcnMucHVzaChwcmVkaWNhdGVXcmFwcGVkSGFuZGxlcik7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaGFuZGxlcnMuaW5kZXhPZihwcmVkaWNhdGVXcmFwcGVkSGFuZGxlcik7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnb25NZXNzYWdlUmVjZWl2ZWQnLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmLCBpbmNvbWVNZXNzYWdlLCB0aGlzKTtcbiAgICAgICAgLy9UT0RPIDogaGFuZGVsIHNwZWNpYWwgZXZldHMgPyBsaWtlIGluaXRSZXMgP1xuICAgICAgICBpZiAoaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkV4ZWN1dGVDb21wb25lbnRNZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IChpbmNvbWVNZXNzYWdlIGFzIEV4ZWN1dGVDb21wb25lbnRNZXRob2QpO1xuXG4gICAgICAgICAgICAvL2tlZXBpbmcgdGhpcy5tZXRob2QoKSBzbyB0aGF0IGNvbnRleHQgd2lsbCBzYXZlZFxuICAgICAgICAgICAgaWYgKCh0aGlzIGFzIGFueSlbdHlwZWRNZXNzYWdlLm1ldGhvZF0pIHtcbiAgICAgICAgICAgICAgICAodGhpcyBhcyBhbnkpW3R5cGVkTWVzc2FnZS5tZXRob2RdKHR5cGVkTWVzc2FnZS5jb250ZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYG1ldGhvZCBub3QgZm91bmQgJHt0eXBlZE1lc3NhZ2UubWV0aG9kfSBvbiBjb21wb25lbnRgLCB0aGlzKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5tZXNzYWdlSGFuZGxlcnNbaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZV07XG4gICAgICAgIGlmIChoYW5kbGVycyAmJiBoYW5kbGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBoYW5kbGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGhhbmRsZXJzLmZvckVhY2goaGFuZGxlciA9PiB7XG4gICAgICAgICAgICAgICAgaGFuZGxlZCA9IGhhbmRsZWQgfHwgaGFuZGxlcihpbmNvbWVNZXNzYWdlKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy9UT0RPIDogY29uc29sZSBvbmx5IHdoZW4gZGVidWcgY29uZmlnXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdubyBoYW5kbGVycyBmb3VuZCBmb3IgJywgaW5jb21lTWVzc2FnZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc2V0SW5pdGlhdGVkID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmlzSW5pdGlhdGVkID0gdHJ1ZTtcblxuICAgICAgICBpZiAodGhpcy5fd2hlbkluaXRpYXRlZFJlc29sdmUpXG4gICAgICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIGlzSW5pdGlhdGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBfd2hlbkluaXRpYXRlZFJlc29sdmU/OiAodmFsdWU/OiBhbnkpID0+IGFueTtcbiAgICBfd2hlbkluaXRpYXRlZFJlamVjdD86ICh2YWx1ZT86IGFueSkgPT4gYW55O1xuXG4gICAgX3doZW5Jbml0aWF0ZWQ6IFByb21pc2U8YW55PiA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdGhpcy5fd2hlbkluaXRpYXRlZFJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0ID0gcmVqZWN0O1xuICAgIH0pO1xuXG4gICAgaW5pdGlhdGVkID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2hlbkluaXRpYXRlZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNlbmRDbGVhbnVwTWVzc2FnZShtZXNzYWdlOiBDbGVhbnVwTWVzc2FnZSk6IHZvaWQge1xuICAgICAgICBtZXNzYWdlLnNvdXJjZSA9IHRoaXMuaWQ7XG4gICAgICAgIG1lc3NhZ2UuZGVzdGluYXRpb24gPSB0aGlzLmlkO1xuICAgICAgICBtZXNzYWdlLmRpcmVjdGlvbiA9IE1lc3NhZ2VEaXJlY3Rpb24uZG93bjtcblxuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuYmluZFdoZW4obWVzc2FnZS5yZXBseU1lc3NhZ2VLZXksIChtc2c6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG1zZy5yZXBsYXlUb0hhbmRsZXIgPT09IG1lc3NhZ2UuaGFuZGxlclVuaXF1ZUlkXG4gICAgICAgIH0sIChtOiBDbGVhbnVwUmVwbGF5TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZS5oYW5kbGVyKG0pO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgaGFuZGxlciA9IG1lc3NhZ2UuaGFuZGxlcjtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBkZWxldGUgbWVzc2FnZS5oYW5kbGVyXG5cbiAgICAgICAgdGhpcy5zZW5kKG1lc3NhZ2UpO1xuXG4gICAgICAgIG1lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXI7XG4gICAgfVxuXG4gICAgc2VuZChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBDbGVhbnVwSGFuZGxlciB7XG4gICAgICAgIC8vbWVzc2FnZXMgdGhhdCBleGV0cmFjdGVkIGZyb20gZW52ZWxvcGUgYWxyZWFkeSBoYXZlIHNvdXJjZSBpbiB0aGVtXG4gICAgICAgIGlmICghbWVzc2FnZS5zb3VyY2UpXG4gICAgICAgICAgICBtZXNzYWdlLnNvdXJjZSA9IHRoaXMuaWQ7XG5cbiAgICAgICAgaWYgKCFtZXNzYWdlLmRlc3RpbmF0aW9uKVxuICAgICAgICAgICAgbWVzc2FnZS5kZXN0aW5hdGlvbiA9IHRoaXMuaWQ7XG5cbiAgICAgICAgbWVzc2FnZS5kaXJlY3Rpb24gPSBNZXNzYWdlRGlyZWN0aW9uLmRvd247XG5cbiAgICAgICAgbGV0IGNsZWFudXBIYW5kbGVyO1xuICAgICAgICAvLyBUT0RPIDogZml4IGhlYXZ5IG9wLi5cbiAgICAgICAgLy8gIGlmIChpc0luaGVyaXRGcm9tKG1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZSkpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAobWVzc2FnZS5oYW5kbGVyKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgPSAobWVzc2FnZSBhcyBNeW9wQmluZE1lc3NhZ2UpO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIgPSB0aGlzLmJpbmRXaGVuKHR5cGVkTWVzc2FnZS5yZXBseU1lc3NhZ2VLZXksIChtc2c6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBtc2cucmVwbGF5VG9IYW5kbGVyID09PSB0eXBlZE1lc3NhZ2UuaGFuZGxlclVuaXF1ZUlkXG4gICAgICAgICAgICB9LCB0eXBlZE1lc3NhZ2UuaGFuZGxlcik7XG5cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGRlbGV0ZSBtZXNzYWdlLmhhbmRsZXJcbiAgICAgICAgfVxuXG4gICAgICAgIC8vVE9ETzogdGhpbmsgYWJvdXQgdGhhdFxuICAgICAgICBpZiAobWVzc2FnZS5yZWYpIHtcbiAgICAgICAgICAgIC8vIHNlcmlhbGl6YWJsZVxuICAgICAgICAgICAgbWVzc2FnZS5yZWYgPSBtZXNzYWdlLnJlZi5fX25vblByb3hpZWQgfHwgbWVzc2FnZS5yZWY7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWVzc2FnZS5jbGVhbmFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZW5kQ2xlYW51cE1lc3NhZ2UobmV3IENsZWFudXBNZXNzYWdlKG1lc3NhZ2UuaWQsIChyZXBsYXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogbG9nIHJlcGxheT9cbiAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY2xlYW51cEhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIFJ1bnMgdGhlICdvbkRpc3Bvc2UnIGhhbmRsZXJzIG9uY2UuIGhvc3RTREsgcmVnaXN0ZXJzIHRoZSBvbmUgdGhhdCB1bnJlZ2lzdGVyc1xuICAgICAqICB0aGlzIGNvbXBvbmVudCwgc28gaXQgaGFzIHRvIHJ1biBvbiBFVkVSWSBkaXNwb3NlIHBhdGgsIGluaXRpYXRlZCBvciBub3QuICovXG4gICAgcHJpdmF0ZSBydW5EaXNwb3NlSGFuZGxlcnMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG9uRGlzcG9zZUhhbmRsZXJzID0gdGhpcy5tZXNzYWdlSGFuZGxlcnNbJ29uRGlzcG9zZSddO1xuICAgICAgICBpZiAob25EaXNwb3NlSGFuZGxlcnMpIHtcbiAgICAgICAgICAgIG9uRGlzcG9zZUhhbmRsZXJzLmZvckVhY2goZGlzcG9zZUhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHNlbmQgbnVsbCBvciBmaXggdGhlIHR5cGUgP1xuICAgICAgICAgICAgICAgIGRpc3Bvc2VIYW5kbGVyKG51bGwpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWFya2VkRm9yRGlzcG9zZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmICghdGhpcy5pc0luaXRpYXRlZCkge1xuICAgICAgICAgICAgLy8gQSBDT01QT05FTlQgVEhBVCBORVZFUiBJTklUSUFURUQgU1RJTEwgSEFTIFRPIEJFIFVOUkVHSVNURVJFRC5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBUaGlzIHVzZWQgdG8gYHJldHVybmAgaGVyZSwgd2hpY2ggbGVha2VkOiBob3N0U0RLIHRyYWNrcyBldmVyeSBjb21wb25lbnQgYnlcbiAgICAgICAgICAgIC8vIGJpbmRpbmcgYW4gJ29uRGlzcG9zZScgaGFuZGxlciB0aGF0IHJlbW92ZXMgaXQgZnJvbSBgY29tcG9uZW50c2AgYW5kXG4gICAgICAgICAgICAvLyBgY29tcG9uZW50czJpbml0YCwgYW5kIHRob3NlIGhhbmRsZXJzIGxpdmUgYmVsb3cgdGhpcyBsaW5lLiBTbyBhIGNvbXBvbmVudFxuICAgICAgICAgICAgLy8gdGhhdCB0aW1lZCBvdXQgYW5kIHdhcyB0aGVuIGRpc3Bvc2VkIGhhZCBpdHMgaWZyYW1lIHB1bGxlZCBmcm9tIHRoZSBET01cbiAgICAgICAgICAgIC8vIChteW9wSWZyYW1lQ29tcG9uZW50LmRpc3Bvc2UgZG9lcyB0aGF0IGFmdGVyIHN1cGVyLmRpc3Bvc2UpIHdoaWxlIHN0YXlpbmcgaW5cbiAgICAgICAgICAgIC8vIGJvdGggaG9zdCBhcnJheXMgZm9yZXZlci5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBUaGF0IGlzIG5vdCBhIHNsb3cgbGVhaywgaXQgY29tcG91bmRzOiBgY29tcG9uZW50czJpbml0YCBpcyB3YWxrZWQgb24gZXZlcnlcbiAgICAgICAgICAgIC8vIEluaXRSZXF1ZXN0IGFuZCBgaXNUcnVzdGVkU291cmNlYCB3YWxrcyBib3RoIGFycmF5cyBvbiBldmVyeSBtZXNzYWdlLCBzbyBlYWNoXG4gICAgICAgICAgICAvLyBkZWFkIGVudHJ5IGNvc3RzIGEgYHNlbmQoKWAgaW50byBhIHJlbW92ZWQgZnJhbWUgb24gZXZlcnkgZnV0dXJlIGhhbmRzaGFrZS5cbiAgICAgICAgICAgIC8vIFJlLW9wZW5pbmcgYSBkaWFsb2cgdGhhdCBtb3VudHMgY29tcG9uZW50cyAtLSBQaWMtVGltZSdzIHJlZWwgcGlja2VyIC0tIGFkZHNcbiAgICAgICAgICAgIC8vIG9uZSBkZWFkIGVudHJ5IHBlciBhdHRlbXB0LlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIE9ubHkgdGhlIERpc3Bvc2VNZXNzYWdlIGlzIGdlbnVpbmVseSBjb25kaXRpb25hbDogdGhlcmUgaXMgbm8gbGl2ZSBmcmFtZSB0b1xuICAgICAgICAgICAgLy8gdGVsbC4gRXZlcnl0aGluZyBlbHNlIG11c3QgcnVuLlxuICAgICAgICAgICAgdGhpcy5ydW5EaXNwb3NlSGFuZGxlcnMoKTtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXJzID0ge307XG4gICAgICAgICAgICB0aGlzLmlkICs9ICdfZGlzcG9zZWQnO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKCdkaXNwb3NpbmcgY29tcG9uZW50JywgdGhpcy5pZCk7XG5cbiAgICAgICAgLy8gLy9UT0RPIDogaW1wbGVtZW50IGRpc3Bvc2UgZmxvd1xuICAgICAgICAvLyBPYmplY3Qua2V5cyh0aGlzLnJlZnMpLmZvckVhY2gocmVmS2V5PT57XG4gICAgICAgIC8vICAgICB0aGlzLnJlZnNbcmVmS2V5XS5kaXNwb3NlKCk7XG4gICAgICAgIC8vIH0pO1xuXG4gICAgICAgIC8vVE9ETyA6IGNoZWNrIGlmIHRoZXJlIGlzIGFueSB0aW1lIGZvciB0aGUgb1xuICAgICAgICAvLyB0aGVyIHNpZGUgdG8gcHJvY2Nlc3MgdG8gbWVzc2FnZSBiZWZvcmUgZGllID9cbiAgICAgICAgLy9ub3RpZnkgdGhlIG90aGVyIHNpZGUgU0RLXG4gICAgICAgIHRoaXMuc2VuZChuZXcgRGlzcG9zZU1lc3NhZ2UoKSlcblxuICAgICAgICB0aGlzLnJ1bkRpc3Bvc2VIYW5kbGVycygpO1xuXG4gICAgICAgIC8vY29uc29sZS5sb2codGhpcy5jb250YWluZXIpO1xuICAgICAgICAvL3RoaXMuY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVycyA9IHt9XG4gICAgICAgIHRoaXMuaWQgKz0gJ19kaXNwb3NlZCc7XG4gICAgICAgIHRoaXMuaXNJbml0aWF0ZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcm9wczogUCA9IHt9IGFzIHVua25vd24gYXMgUDtcbiAgICByZWZzOiBSID0ge30gYXMgdW5rbm93biBhcyBSO1xufVxuIiwgImV4cG9ydCBpbnRlcmZhY2UgSUVsZW1lbnRSZWYge1xuICAgIG15b3BJZD86IHN0cmluZ1xuICAgIGh0bWxUYWdOYW1lOiBzdHJpbmdcbiAgICBCb3VuZGluZ1JlY3Q/OiBET01SZWN0XG4gICAgb2Zmc2V0VG9wPzogbnVtYmVyXG4gICAgb2Zmc2V0TGVmdD86IG51bWJlclxuXG4gICAgdHlwZTogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBYUGF0aEVsZW1lbnRSZWYgaW1wbGVtZW50cyBJRWxlbWVudFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHhQYXRoOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcHVibGljIGh0bWxUYWdOYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcHVibGljIEJvdW5kaW5nUmVjdD86IERPTVJlY3QsXG4gICAgICAgICAgICAgICAgcHVibGljIG9mZnNldFRvcD86IG51bWJlcixcbiAgICAgICAgICAgICAgICBwdWJsaWMgb2Zmc2V0TGVmdD86IG51bWJlcikge1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBzdHJpbmcgPSAnWFBhdGhFbGVtZW50UmVmJ1xufVxuXG5leHBvcnQgY2xhc3MgTXlvcEVsZW1lbnRSZWYgaW1wbGVtZW50cyBJRWxlbWVudFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIG15b3BJZDogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBodG1sVGFnTmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBCb3VuZGluZ1JlY3Q/OiBET01SZWN0LFxuICAgICAgICAgICAgICAgIHB1YmxpYyBvZmZzZXRUb3A/OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgcHVibGljIG9mZnNldExlZnQ/OiBudW1iZXIpIHtcblxuICAgIH1cblxuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBzdHJpbmcgPSAnTXlvcEVsZW1lbnRSZWYnXG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlcn0gZnJvbSBcIi4vaW5kZXgudHNcIjtcblxuZXhwb3J0IHR5cGUgSU1lc3NhZ2VFeGVjdXRvckNsZWFudXAgPSBDbGVhbnVwSGFuZGxlciB8IFByb21pc2U8Q2xlYW51cEhhbmRsZXI+IHwgUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5cbmV4cG9ydCBjb25zdCBydW5FeGVjdXRvckNsZWFudXAgPSBhc3luYyAodGFzazogSU1lc3NhZ2VFeGVjdXRvckNsZWFudXApID0+IHtcbiAgICBpZiAodHlwZW9mIHRhc2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gSXQncyBhIGZ1bmN0aW9uLCBjYWxsIGl0XG4gICAgICAgIHRhc2soKTtcbiAgICB9IGVsc2UgaWYgKHRhc2sgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgIC8vIEl0J3MgYSBQcm9taXNlLCBhd2FpdCBpdFxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0YXNrO1xuXG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgcmVzdWx0IGlzIGEgZnVuY3Rpb24sIGNhbGwgaXRcbiAgICAgICAgICAgIHJlc3VsdCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIElmIHRhc2sgaXMgdm9pZCwgZG8gbm90aGluZ1xufVxuXG50eXBlIElNZXNzYWdlRXhlY3V0b3I8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4gPSAobWVzc2FnZTogVCkgPT4gSU1lc3NhZ2VFeGVjdXRvckNsZWFudXA7XG5cbmludGVyZmFjZSBJTWVzc2FnZUhhbmRsZXI8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxuXG4gICAgZXhlY3V0b3I6IElNZXNzYWdlRXhlY3V0b3I8VD47XG5cbiAgICBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNZXNzYWdlSGFuZGxlcjxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlID0gYW55PiBpbXBsZW1lbnRzIElNZXNzYWdlSGFuZGxlcjxUPiB7XG5cbiAgICAvL1RPRE8gOiBhZGQgZGlzcG9zZSBtZXRob2RcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZCkge1xuXG4gICAgfVxuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5XG4gICAgYWJzdHJhY3QgZXhlY3V0b3I6IElNZXNzYWdlRXhlY3V0b3I8VD47XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlQ29udGV4dE1lc3NhZ2VIYW5kbGVyPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2UgPSBhbnksIEUgPSBhbnk+IGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbWVzc2FnZVRvSG9zdDogKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHZvaWQsIHB1YmxpYyBjb250ZXh0PzogRSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlVG9Ib3N0KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgcnVuRXhlY3V0b3JDbGVhbnVwfSBmcm9tIFwiLi9pbmRleC50c1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL2Jhc2VNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsIENsZWFudXBNZXNzYWdlLCBDbGVhbnVwUmVwbGF5TWVzc2FnZSwgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSwgRW52ZWxvcGVkTWVzc2FnZSxcbiAgICBJbml0TWVzc2FnZSxcbiAgICBJbml0UmVzcG9uc2UsXG4gICAgTWVzc2FnZURpcmVjdGlvbixcbiAgICBNeW9wQmluZE1lc3NhZ2UsXG4gICAgTXlvcEJpbmRSZXBsYXlNZXNzYWdlXG59IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuXG5leHBvcnQgY2xhc3MgSG9zdGVkQ29tcG9uZW50PFQgPSBhbnk+IHtcbiAgICBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4ge1xuICAgICAgICAvL2RlYnVnZ2VyO1xuICAgIH1cblxuICAgIC8vb25NZXNzYWdlUmVjZWl2ZWQ6IChtc2c6IElNeW9wTWVzc2FnZSkgPT4gdm9pZDtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBpZDogc3RyaW5nLCBwdWJsaWMgY29udGV4dD86IFQpIHtcblxuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTXlvcFNESyB7XG4gICAgaW5pdDogKCkgPT4gdm9pZDtcblxuICAgIG1lc3NhZ2VUb0hvc3Q6IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB2b2lkXG5cbiAgICBzdXBwb3J0ZWRIYW5kbGVyczogQmFzZU1lc3NhZ2VIYW5kbGVyW107XG5cbiAgICBoYW5kbGVJbmNvbWVNZXNzYWdlczogKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4gdm9pZFxuXG4gICAgY29tcG9uZW50czogUmVjb3JkPHN0cmluZywgSG9zdGVkQ29tcG9uZW50Pjtcbn1cblxuLy8gY29uc3QgbG9jYWxIb3N0SGFuZGxlZE1lc3NhZ2VzID0gW1xuLy8gICAgIE15b3BNZXNzYWdlcy5Jbml0UmVxdWVzdCxcbi8vICAgICBNeW9wTWVzc2FnZXMuSW5pdFJlc3BvbnNlLFxuLy8gICAgIC8vTXlvcE1lc3NhZ2VzLkVudmVsb3BlZE1lc3NhZ2UsXG4vLyBdXG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTXlvcFNESyBpbXBsZW1lbnRzIElNeW9wU0RLIHtcblxuICAgIGFic3RyYWN0IG1lc3NhZ2VUb0hvc3Q6IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB2b2lkO1xuXG4gICAgYWJzdHJhY3Qgc3VwcG9ydGVkSGFuZGxlcnM6IEJhc2VNZXNzYWdlSGFuZGxlcltdO1xuXG4gICAgbWVzc2FnZVRvSGFuZGxlQWZ0ZXJJbml0OiBCYXNlTXlvcE1lc3NhZ2VbXSA9IFtdO1xuXG4gICAgY29tcG9uZW50czogUmVjb3JkPHN0cmluZywgSG9zdGVkQ29tcG9uZW50PiA9IHt9O1xuXG4gICAgYWx3YXlzUGFzc0VudmVsb3Blc1RvSG9zdDogYm9vbGVhbiA9IGZhbHNlXG5cbiAgICBtZXNzYWdlQ2xlYW51cENhY2hlOiBSZWNvcmQ8c3RyaW5nLCBDbGVhbnVwSGFuZGxlciB8IFByb21pc2U8Q2xlYW51cEhhbmRsZXI+PiB8IFByb21pc2U8dm9pZD4gPSB7fTtcblxuICAgIGhhbmRsZUluY29tZU1lc3NhZ2VzKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgY29uc3QgZXZlbnRDb250ZW50ID0gZXZlbnQuZGF0YSA/IGV2ZW50LmRhdGEgOiBldmVudC5kZXRhaWw7XG5cbiAgICAgICAgaWYgKCFldmVudENvbnRlbnQgfHwgIWV2ZW50Q29udGVudC5teW9wKSB7XG4gICAgICAgICAgICAvLyBub3QgbXlvcCBtYXJrZWQgZXZlbnQgXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGV2ZW50Q29udGVudCBhcyBCYXNlTXlvcE1lc3NhZ2U7XG5cbiAgICAgICAgICAgIGlmIChtZXNzYWdlLmRpcmVjdGlvbiAhPT0gTWVzc2FnZURpcmVjdGlvbi5kb3duKSB7XG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnbWVzc2FnZSBkcm9wcGVkIGluIGJhc2VTREssIGRpcmVjdGlvbiB3YXMgJywgZXZlbnQuZGF0YS5kaXJlY3Rpb24pXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZiAobG9jYWxIb3N0SGFuZGxlZE1lc3NhZ2VzLmluY2x1ZGVzKG1lc3NhZ2UubWVzc2FnZVR5cGUpKSB7XG4gICAgICAgICAgICAvLyAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICAvLyAgICAgLy9UT0RPIDogZml4IGRpcmVjdGlvbiA/IG1lc3NhZ2Ugd2lsbCBub3QgcHJvY2Nlc3Mgb3RoZXJ3aXNlXG4gICAgICAgICAgICAvLyAgICAgd2luZG93Lm15b3AuaG9zdFNESy5zZW5kKG1lc3NhZ2UpXG4gICAgICAgICAgICAvLyAgICAgcmV0dXJuO1xuICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkRpc3Bvc2VNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHNob3VsZCBub3QgYmUgb3B0aW9uYWwsIGZpeCBhbmQgcmVtb3ZlICdpZidcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5kZXN0aW5hdGlvbilcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY29tcG9uZW50c1ttZXNzYWdlLmRlc3RpbmF0aW9uXVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gV2UgZ290IG91ciBpZCBmcm9tIG91ciBob3N0U0RLXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluaXRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgLy9UT0RPIDogU0RLIG1heSBzZXJ2ZSBtb3JlIHRoYW4gMSBjb21wb25lbnQgLi4gdGhpbmsgYWJvdXQgdGhhdFxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdDb21wb25lbnRJZCA9IChtZXNzYWdlIGFzIEluaXRNZXNzYWdlKS5jb250ZW50LmlkO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29tcG9uZW50c1tuZXdDb21wb25lbnRJZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICAgICAgLy90aHJvdyBuZXcgRXJyb3IoXCJyZWNoaXZlZCBpbml0IG1lc3NhZ2UgZm9yIGFuIGV4c2lzaW5nIGNvbXBvbmVudC5cIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c1tuZXdDb21wb25lbnRJZF0gPSBuZXcgSG9zdGVkQ29tcG9uZW50KG5ld0NvbXBvbmVudElkKVxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgSW5pdFJlc3BvbnNlKG5ld0NvbXBvbmVudElkKSk7XG5cbiAgICAgICAgICAgICAgICAvLyBUT0RPIDogaXMgaXQgdHJ1ZSB0byBub3QgcGFzcyBmdXJ0aGVyICggdG8gdGhlIGNvbXBvbmVudCApXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBmb3Igc2FtZSBIb3N0U0RLIGNhc2VzXG4gICAgICAgICAgICAvLyB3aGVuIGJvdGggUmVmQ29tcG9uZW50IGFuZCByZWFsQ29tcG9uZW50IGhvc3RlZCBpbiB0aGUgc2FtZSBIb3N0U0RLXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkVudmVsb3BlZE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnZlbG9wZWRNZXNzYWdlID0gKG1lc3NhZ2UgYXMgRW52ZWxvcGVkTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5uZXJNZXNzYWdlID0gZW52ZWxvcGVkTWVzc2FnZS5tZXNzYWdlO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBpbm5lck1lc3NhZ2U7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hbHdheXNQYXNzRW52ZWxvcGVzVG9Ib3N0IHx8IHRoaXMuY29tcG9uZW50c1ttZXNzYWdlLmRlc3RpbmF0aW9uIV0pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbkNvbXBvbmVudCA9IG15b3AuaG9zdFNESy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09PSBpbm5lck1lc3NhZ2UuZGVzdGluYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVzdGluYXRpb25Db21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uQ29tcG9uZW50LnNlbmQoaW5uZXJNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW52ZWxvcGVkRGVzdGluYXRpb25Db21wb25lbnQgPSBteW9wLmhvc3RTREsuY29tcG9uZW50cy5maW5kKGMgPT4gYy5pZCA9PT0gZW52ZWxvcGVkTWVzc2FnZS5kZXN0aW5hdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbnZlbG9wZWREZXN0aW5hdGlvbkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGVkRGVzdGluYXRpb25Db21wb25lbnQuc2VuZChpbm5lck1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkNyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2Upe1xuICAgICAgICAgICAgLy8gICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA6IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UgPSBtZXNzYWdlIGFzIENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2U7XG4gICAgICAgICAgICAvLyAvLyAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkNsZWFudXBNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IG1lc3NhZ2UgYXMgQ2xlYW51cE1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFudXAgPSB0aGlzLm1lc3NhZ2VDbGVhbnVwQ2FjaGVbdHlwZWRNZXNzYWdlLmNsZWFudXBGb3JNZXNzYWdlSWRdO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFudXBNZXNzYWdlID0gbmV3IENsZWFudXBSZXBsYXlNZXNzYWdlKCEhY2xlYW51cCk7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFudXBNZXNzYWdlLmRlc3RpbmF0aW9uID0gbWVzc2FnZS5kZXN0aW5hdGlvbjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoISFjbGVhbnVwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5tZXNzYWdlQ2xlYW51cENhY2hlW3R5cGVkTWVzc2FnZS5jbGVhbnVwRm9yTWVzc2FnZUlkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkV4ZWN1dG9yQ2xlYW51cChjbGVhbnVwKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QoY2xlYW51cE1lc3NhZ2UsIHR5cGVkTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogaGFuZGVsIGVycm9yP1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChjbGVhbnVwTWVzc2FnZSwgdHlwZWRNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGFjdGlvbkhhbmRsZXJGb3VuZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5zdXBwb3J0ZWRIYW5kbGVycy5mb3JFYWNoKGhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlci5tZXNzYWdlVHlwZSA9PT0gbWVzc2FnZS5tZXNzYWdlVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uSGFuZGxlckZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFudXAgPSBoYW5kbGVyLmV4ZWN1dG9yKG1lc3NhZ2UpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5jbGVhbmFibGUgJiYgY2xlYW51cCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZUNsZWFudXBDYWNoZVttZXNzYWdlLmlkXSA9IGNsZWFudXA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGVhbnVwICYmICFtZXNzYWdlLmNsZWFuYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2xlYW51cCBoYW5kbGVyIGdlbmVyYXRlZCBmb3Igbm9uLWNsZWFuYWJsZSBtZXNzYWdlLiBcbm1lc3NhZ2VUeXBlIC0gJHttZXNzYWdlLm1lc3NhZ2VUeXBlfSwgaGFuZGxlciBleGVjdXRvciB3YXMgLSAke2hhbmRsZXIuZXhlY3V0b3J9XG5cblBsZWFzZSByZXZpZXcgdGhlIG1lc3NhZ2UgZGVmaW5pdGlvbiBvYmplY3QgJiBtZXNzYWdlIGhhbmRsZXIuXG5UbyBlbnN1cmUgY2xlYW51cCBwcm9wZXJseSBzZXQgJ2NsZWFuYWJsZScgdHJ1ZSBhdCBtZXNzYWdlIGRlZmluaXRpb24gYW5kIHJldHVybiBJTWVzc2FnZUV4ZWN1dG9yQ2xlYW51cCBmcm9tIHlvdXIgaGFuZGxlcnMuYClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjbGVhbnVwICYmIG1lc3NhZ2UuY2xlYW5hYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjbGVhbnVwIGhhbmRsZXIgZ2VuZXJhdGVkIGZvciBhIGNsZWFuYWJsZSBtZXNzYWdlLiBcbm1lc3NhZ2VUeXBlIC0gJHttZXNzYWdlLm1lc3NhZ2VUeXBlfSwgaGFuZGxlciBleGVjdXRvciB3YXMgLSAke2hhbmRsZXIuZXhlY3V0b3J9XG5cblBsZWFzZSByZXZpZXcgdGhlIG1lc3NhZ2UgZGVmaW5pdGlvbiBvYmplY3QgJiBtZXNzYWdlIGhhbmRsZXIuXG5UbyBlbnN1cmUgY2xlYW51cCBwcm9wZXJseSBzZXQgJ2NsZWFuYWJsZScgdHJ1ZSBhdCBtZXNzYWdlIGRlZmluaXRpb24gYW5kIHJldHVybiBJTWVzc2FnZUV4ZWN1dG9yQ2xlYW51cCBmcm9tIHlvdXIgaGFuZGxlcnMuYClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBpZiAoIWFjdGlvbkhhbmRsZXJGb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBwcmludCB3aXRoIGRlYnVnIGNvbmZpZyBvbmx5XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ25vIG1lc3NhZ2UgaGFuZGxlciB3YXMgZm91bmQgZm9yICcsIG1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygndW5zdXBwb3J0ZWQgbWVzc2FnZSB0eXBlJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFic3RyYWN0IGluaXQ6ICgpID0+IHZvaWQ7XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4vTXlvcE1lc3NhZ2VzXCI7XG5cbmV4cG9ydCAqIGZyb20gJy4vTXlvcEVsZW1lbnRSZWYnO1xuZXhwb3J0ICogZnJvbSAnLi9iYXNlTWVzc2FnZUhhbmRsZXInO1xuZXhwb3J0ICogZnJvbSAnLi9CYXNlTXlvcFNESyc7XG5cbmV4cG9ydCB0eXBlIENsZWFudXBIYW5kbGVyID0gKCkgPT4gdm9pZFxuXG5leHBvcnQgdHlwZSBEaWN0aW9uYXJ5PFQ+ID0geyBba2V5OiBzdHJpbmddOiBUOyB9O1xuXG4vL2V4cG9ydCB0eXBlIFNraW5Mb2FkZXJUeXBlID0gJ0lmcmFtZUxvYWRlcicgfCAnV2ViQ29tcG9uZW50TG9hZGVyJyB8ICdIVE1MTG9hZGVyJyB8IHN0cmluZztcblxuZXhwb3J0IGNvbnN0IFNraW5Mb2FkZXJzID0ge1xuICAgIFwiSWZyYW1lTG9hZGVyXCI6IFwiSWZyYW1lTG9hZGVyXCIsXG4gICAgXCJXZWJDb21wb25lbnRMb2FkZXJcIjogXCJXZWJDb21wb25lbnRMb2FkZXJcIixcbiAgICBcIkhUTUxMb2FkZXJcIjogXCJIVE1MTG9hZGVyXCIsXG4gICAgXCJNaW5pbWl6ZWRMb2FkZXJcIjogXCJNaW5pbWl6ZWRMb2FkZXJcIlxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFNraW5Mb2FkZXJUeXBlID0ga2V5b2YgdHlwZW9mIFNraW5Mb2FkZXJzO1xuXG5leHBvcnQgdHlwZSBQcm9wVHlwZSA9ICdhbnknIHwgJ3N0cmluZycgfCAnbnVtYmVyJyB8IHN0cmluZzsgLy8gVE9ETyA6IDxcbmV4cG9ydCB0eXBlIFJlZlNlbGVjdG9yVHlwZSA9ICdpZC1hdHRyaWJ1dGUnIHwgJ2Nzcy1zZWxlY3RvcicgfCAneHBhdGgnIHwgc3RyaW5nO1xuXG5leHBvcnQgY29uc3QgTG9hZGVyRnJhbWV3b3JrcyA9IHtcbiAgICBcInJlYWN0XCI6IFwicmVhY3RcIixcbiAgICBcInZ1ZVwiOiBcInZ1ZVwiLFxuICAgIFwiYW5ndWxhclwiOiBcImFuZ3VsYXJcIixcbn0gYXMgY29uc3RcbmV4cG9ydCB0eXBlIExvYWRlckZyYW1ld29ya1R5cGUgPSBrZXlvZiB0eXBlb2YgTG9hZGVyRnJhbWV3b3JrcztcblxuZXhwb3J0IGludGVyZmFjZSBJV2ViQ29tcG9uZW50TG9hZGVyQ29uZmlnIGV4dGVuZHMgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFwiV2ViQ29tcG9uZW50TG9hZGVyXCI7XG4gICAgdXJsOiBzdHJpbmcsXG4gICAgdGFnOiBzdHJpbmcsXG4gICAgZnJhbWV3b3JrPzogTG9hZGVyRnJhbWV3b3JrVHlwZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElJZnJhbWVMb2FkZXJDb25maWcgZXh0ZW5kcyBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogXCJJZnJhbWVMb2FkZXJcIjtcbiAgICB1cmw6IHN0cmluZ1xuICAgIGF1dG9IZWlnaHQ6IGJvb2xlYW5cbiAgICBoZWlnaHQ/OiBzdHJpbmdcbiAgICB3aWR0aD86IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgU2hhZG93Um9vdE1vZGVUeXBlID0ge1xuICAgIFwib3BlblwiOiBcIm9wZW5cIixcbiAgICBcImNsb3NlZFwiOiBcImNsb3NlZFwiLFxuICAgIFwibm9uZVwiOiBcIm5vbmVcIixcbiAgICBcImxvY2FsRnJhbWVcIjogXCJsb2NhbEZyYW1lXCJcbn0gYXMgY29uc3Q7XG5cblxuZXhwb3J0IGludGVyZmFjZSBJSFRNTExvYWRlckNvbmZpZyBleHRlbmRzIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBcIkhUTUxMb2FkZXJcIjtcbiAgICBIVE1MOiBzdHJpbmc7XG4gICAgLy9UT0RPOiByZW5hbWUocm9vdE1vZGUvY3VzdG9tRWxlbWVudE1vZGUpICsgZGIgbWlncmF0aW9uXG4gICAgc2hhZG93Um9vdE1vZGU/OiBrZXlvZiB0eXBlb2YgU2hhZG93Um9vdE1vZGVUeXBlO1xuICAgIGF1dG9IZWlnaHQ/OiBib29sZWFuO1xuICAgIGhlaWdodD86IHN0cmluZztcbiAgICB3aWR0aD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIHRydWUsIGFuIGlubGluZS1IVE1MIChsb2NhbEZyYW1lKSBjb21wb25lbnQgaXMgcmVuZGVyZWQgaW4gYSBzYW5kYm94ZWQsXG4gICAgICogY3Jvc3Mtb3JpZ2luIGlmcmFtZSB3aXRoIE5PIGFjY2VzcyB0byB0aGUgaG9zdCBkb2N1bWVudCAodW50cnVzdGVkIGNvZGUpLlxuICAgICAqIFRoZSBob3N0IHJlbmRlciBwb2xpY3kgY2FuIGFsc28gZm9yY2UgdGhpcyByZWdhcmRsZXNzIG9mIHRoZSBjb25maWcgdmFsdWUuXG4gICAgICovXG4gICAgaXNvbGF0aW9uPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBIb3cgYSBjb21wb25lbnQgaXMgcmVuZGVyZWQgb24gdGhlIGhvc3QgcGFnZSwgaW4gYXNjZW5kaW5nIGlzb2xhdGlvbjpcbiAqICAtICd3ZWJDb21wb25lbnQnICAgXHUyMDE0IGN1c3RvbSBlbGVtZW50IG9uIHRoZSBob3N0IGRvY3VtZW50IChtb3N0IHByaXZpbGVnZWQpXG4gKiAgLSAnaWZyYW1lJyAgICAgICAgIFx1MjAxNCBzYW1lLW9yaWdpbiBpbmxpbmUtSFRNTCBpZnJhbWUgKHRvZGF5J3MgZGVmYXVsdClcbiAqICAtICdpc29sYXRlZElmcmFtZScgXHUyMDE0IHNhbmRib3hlZCwgY3Jvc3Mtb3JpZ2luIGlmcmFtZSAodW50cnVzdGVkIGNvZGUpXG4gKi9cbmV4cG9ydCB0eXBlIFJlbmRlck1vZGUgPSAnd2ViQ29tcG9uZW50JyB8ICdpZnJhbWUnIHwgJ2lzb2xhdGVkSWZyYW1lJztcblxuZXhwb3J0IGludGVyZmFjZSBSZW5kZXJQb2xpY3lDb250ZXh0IHtcbiAgICBjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZztcbiAgICBza2luOiBJU2tpbkNvbmZpZztcbiAgICAvKiogV2hhdCB0aGUgY29tcG9uZW50IGFza2VkIGZvciAobWFya2VyIFx1MjFEMiAnd2ViQ29tcG9uZW50JywgY29uZmlnLmlzb2xhdGlvbiBcdTIxRDIgJ2lzb2xhdGVkSWZyYW1lJykuICovXG4gICAgcmVxdWVzdGVkTW9kZTogUmVuZGVyTW9kZTtcbiAgICAvKiogV2hldGhlciB0aGUgSFRNTCBjYXJyaWVzIHRoZSBgPCEtLSBteW9wLXdlYi1jb21wb25lbnQgLS0+YCBtYXJrZXIuICovXG4gICAgaXNXZWJDb21wb25lbnQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogSG9zdC1zdXBwbGllZCBnYXRlIGRlY2lkaW5nIGhvdyAob3Igd2hldGhlcikgYSBjb21wb25lbnQgcmVuZGVycy4gUmV0dXJuIGFcbiAqIFJlbmRlck1vZGUgdG8gdXNlLCBvciBgZmFsc2VgIHRvIGJsb2NrIHJlbmRlcmluZyBlbnRpcmVseS5cbiAqL1xuZXhwb3J0IHR5cGUgUmVuZGVyUG9saWN5ID1cbiAgICAoY3R4OiBSZW5kZXJQb2xpY3lDb250ZXh0KSA9PiBSZW5kZXJNb2RlIHwgZmFsc2UgfCBQcm9taXNlPFJlbmRlck1vZGUgfCBmYWxzZT47XG5cbi8vZm9yIGludGVybmFsIGRhc2hib2FyZCB1c2FnZVxuZXhwb3J0IGludGVyZmFjZSBJTWluaW1pemVkTG9hZGVyQ29uZmlnIGV4dGVuZHMgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFwiTWluaW1pemVkTG9hZGVyXCI7XG59XG5cbmludGVyZmFjZSBEYXNoYm9hcmRPYmplY3Qge1xuICAgIF90ZW1wX2NsaWVudF9pZD86IHN0cmluZyxcbn1cblxudHlwZSBFeHRlbmQ8VCwgVT4gPSBUICYgVTtcblxudHlwZSBFeHRlbmRSZWN1cnNpdmVseTxULCBFPiA9IHtcbiAgICBbSyBpbiBrZXlvZiBFXTogRVtLXTtcbn0gJiB7XG4gICAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBvYmplY3RcbiAgICAgICAgPyBFeHRlbmRSZWN1cnNpdmVseTxUW0tdLCBFPlxuICAgICAgICA6IFRbS107XG59O1xuXG5leHBvcnQgdHlwZSBJRGFzaGJvYXJkPFQ+ID0gRXh0ZW5kUmVjdXJzaXZlbHk8VCwgRGFzaGJvYXJkT2JqZWN0PjtcblxuZXhwb3J0IGludGVyZmFjZSBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogU2tpbkxvYWRlclR5cGVcblxuICAgIFtrZXk6IHN0cmluZ106IGFueTsgLy8gQWxsb3dzIGFueSBhZGRpdGlvbmFsIHByb3BlcnRpZXNcbn1cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JUmVsZWFzZU1ldGFkYXRhIHtcbiAgICBlbnZpcm9ubWVudElkOiBzdHJpbmc7XG4gICAgZW52aXJvbm1lbnRJZGVudGlmaWVyOiBzdHJpbmc7XG4gICAgcmVsZWFzZWRPbj86IHN0cmluZztcbiAgICByZWxlYXNlZEJ5Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lWYXJpYW50Q29uZmlnIGV4dGVuZHMgdjJfSU15b3BTdG9yZWRPYmplY3Qge1xuICAgIGxvYWRlcjogSVNraW5Mb2FkZXJDb25maWdcbiAgICBjb21wb25lbnRJZDogc3RyaW5nO1xuXG4gICAgcmVsZWFzZXM/OiB2Ml9JUmVsZWFzZU1ldGFkYXRhW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2tpbkNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICBsb2FkZXI6IElTa2luTG9hZGVyQ29uZmlnXG4gICAgY3JlYXRlZEJ5Pzogc3RyaW5nXG4gICAgY3JlYXRlZE9uPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSVNraW5Db25maWcgZXh0ZW5kcyBJU2tpbkNvbmZpZyB7XG4gICAgY29tcG9uZW50SWQ6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNZXNzYWdlUHJvcENvbmZpZyBleHRlbmRzIElQcm9wQ29uZmlnIHtcbiAgICB0eXBlOiBQcm9wVHlwZVxuICAgIG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElCaW5kTWVzc2FnZVByb3BDb25maWcgZXh0ZW5kcyBJUHJvcENvbmZpZyB7XG4gICAgdHlwZTogUHJvcFR5cGVcbiAgICBtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXlcbn1cblxuZXhwb3J0IGNvbnN0IFByb3BNZXNzYWdlTW9kZXMgPSB7XG4gICAgXCJpbnB1dFwiOiBcImlucHV0XCIsXG4gICAgXCJvdXRwdXRcIjogXCJvdXRwdXRcIlxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFByb3BDb25maWdCZWhhdmlvclR5cGVzID0ge1xuICAgIFwibWVzc2FnZVwiOiBcIm1lc3NhZ2VcIixcbiAgICBcImNvZGVcIjogXCJjb2RlXCJcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BNZXNzYWdlQmVoYXZpb3JQYXJhbSB7XG4gICAgdmFsdWU6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wQmVoYXZpb3Ige1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wQ29kZUJlaGF2aW9yIGV4dGVuZHMgSVByb3BCZWhhdmlvciB7XG4gICAgdHlwZTogXCJjb2RlXCJcbiAgICByZW1hcD86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wTWVzc2FnZUJlaGF2aW9yIGV4dGVuZHMgSVByb3BCZWhhdmlvciB7XG4gICAgdHlwZTogXCJtZXNzYWdlXCJcbiAgICBtZXNzYWdlOiBNeW9wTWVzc2FnZUtleVxuICAgIHJlZjogc3RyaW5nLCAvL1RPRE8gbWFrZSBpdCBpZFxuICAgIHBhcmFtczogSVByb3BNZXNzYWdlQmVoYXZpb3JQYXJhbVtdXG4gICAgbW9kZToga2V5b2YgdHlwZW9mIFByb3BNZXNzYWdlTW9kZXNcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUHJvcENvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICB0eXBlOiBQcm9wVHlwZVxuICAgIGJlaGF2aW9yOiBJUHJvcEJlaGF2aW9yXG59XG5cblxuZXhwb3J0IGNsYXNzIFJlZkJlaGF2aW9yVHlwZSB7XG4gICAgc3RhdGljIGNvZGUgPSAnY29kZScgYXMgY29uc3RcbiAgICBzdGF0aWMgY29tcG9uZW50ID0gJ2NvbXBvbmVudCcgYXMgY29uc3Rcbn1cblxuZXhwb3J0IHR5cGUgSVJlZkJlaGF2aW9yVHlwZSA9ICdjb2RlJyB8ICdjb21wb25lbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElSZWZCZWhhdmlvciB7XG4gICAgdHlwZTogSVJlZkJlaGF2aW9yVHlwZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wb25lbnRSZWZCZWhhdmlvciBleHRlbmRzIElSZWZCZWhhdmlvciB7XG4gICAgdHlwZTogJ2NvbXBvbmVudCdcbiAgICBjb21wb25lbnRJZDogc3RyaW5nXG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqIFByb3BlcnR5IGluc3RhbmNlIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuXG4gICAgICovXG4gICAgaW5zdGFuY2U6IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb2RlUmVmQmVoYXZpb3IgZXh0ZW5kcyBJUmVmQmVoYXZpb3Ige1xuICAgIHR5cGU6ICdjb2RlJ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElSZWZDb25maWcge1xuICAgIGlkOiBzdHJpbmdcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgc2VsZWN0b3JUeXBlOiBSZWZTZWxlY3RvclR5cGVcbiAgICBzZWxlY3Rvcjogc3RyaW5nXG4gICAgYmVoYXZpb3I6IElSZWZCZWhhdmlvclxufVxuXG4vKipcbiAqIEV4cGVyaWVuY2Ugc2VnbWVudCBydWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2VTZWdtZW50UnVsZSB7XG4gICAgcHJvcGVydHk6IHN0cmluZztcbiAgICBvcGVyYXRvcjogc3RyaW5nO1xuICAgIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBBL0Igc3BsaXQgdmVyc2lvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlQUJTcGxpdFZlcnNpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgcGVyY2VudGFnZTogbnVtYmVyO1xufVxuXG4vKipcbiAqIEV4cGVyaWVuY2UgQS9CIHNwbGl0IGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZUFCU3BsaXQge1xuICAgIHZlcnNpb25zOiBJRXhwZXJpZW5jZUFCU3BsaXRWZXJzaW9uW107XG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBzZWdtZW50IGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZVNlZ21lbnQge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgcnVsZXM6IElFeHBlcmllbmNlU2VnbWVudFJ1bGVbXTtcbiAgICB1c2VBYjogYm9vbGVhbjtcbiAgICBjb21wb25lbnRWYXJpYW50czogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG4gICAgYWJTcGxpdD86IElFeHBlcmllbmNlQUJTcGxpdDtcbiAgICBzdGlja3lQcm9wZXJ0aWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBkZWZpbml0aW9uIGNvbmZpZyAodjIpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2VEZWZpbml0aW9uQ29uZmlnIGV4dGVuZHMgdjJfSU15b3BTdG9yZWRPYmplY3Qge1xuICAgIC8qKiBTZWxlY3RlZCBjb21wb25lbnQgSURzICovXG4gICAgY29tcG9uZW50czogc3RyaW5nW107XG4gICAgLyoqIFNlZ21lbnQgY29uZmlndXJhdGlvbnMgKi9cbiAgICBzZWdtZW50czogSUV4cGVyaWVuY2VTZWdtZW50W107XG4gICAgLyoqIEZhbGxiYWNrIHZhcmlhbnQgcGVyIGNvbXBvbmVudCAqL1xuICAgIGZhbGxiYWNrOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIC8qKiBUYWdzICovXG4gICAgdGFnczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgLyoqXG4gICAgICogVGhlIGNvbXBvbmVudCdzIHJ1bnRpbWUgdGFnczogb25seSB0YWdzIG5hbWVkIGB1aTouLi5gIChlLmcuIGB1aTpiZXRhYCksIGFzIHNldCBpbiB0aGVcbiAgICAgKiBkYXNoYm9hcmQuIEV2ZXJ5IG90aGVyIHRhZyBzdGF5cyBwcml2YXRlIG9uIHRoZSBzZXJ2ZXIuIEVtcHR5IHdoZW4gdGhlcmUgYXJlIG5vbmUuXG4gICAgICovXG4gICAgdWlUYWdzPzogc3RyaW5nW10sXG4gICAgLy8gcHJvcHM6IFJlY29yZDxzdHJpbmcsIElQcm9wQ29uZmlnPiAvL2lkIC0gdHlwZVxuICAgIC8vIHJlZnM6IFJlY29yZDxzdHJpbmcsIElSZWZDb25maWc+LFxuICAgIC8vIHNraW5zOiBSZWNvcmQ8c3RyaW5nLCBJU2tpbkNvbmZpZz5cbiAgICBwcm9wczogSVByb3BDb25maWdbXSxcbiAgICByZWZzOiBJUmVmQ29uZmlnW10sXG4gICAgc2tpbnM6IElTa2luQ29uZmlnW10sXG4gICAgZGVmYXVsdFNraW46IG51bWJlcjtcblxuICAgIC8vVE9ETyA6IHRoaW5rIGFib3V0IHRoYXRcbiAgICAvL3Jlc29sdmVkRGVmaW5pdGlvbnM/OiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1tdXG4gICAgLy9UT0RPIDogbW92ZSB0byBiYXNlIGNsYXNzICggSVN0b3JhYmxlSXRlbSBvciBzby4uLilcblxuICAgIGNyZWF0ZWRPbj86IHN0cmluZ1xuICAgIGNyZWF0ZWRCeT86IHN0cmluZ1xuICAgIHVwZGF0ZWRCeT86IHN0cmluZ1xufVxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSUJhc2VNeW9wT2JqZWN0IHtcbiAgICBpZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lNeW9wU3RvcmVkT2JqZWN0IGV4dGVuZHMgdjJfSUJhc2VNeW9wT2JqZWN0IHtcbiAgICB1cGRhdGVkT24/OiBzdHJpbmdcbiAgICB1cGRhdGVkQnk/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21wb25lbnRBY2Nlc3Mge1xuICAgIHZpc2liaWxpdHk6ICdwcml2YXRlJyB8ICd1bmxpc3RlZCcgfCAncHVibGljJztcbiAgICB1bmxpc3RlZD86IHtcbiAgICAgICAgc2x1Zzogc3RyaW5nO1xuICAgIH07XG4gICAgbWFya2V0cGxhY2U/OiB7XG4gICAgICAgIHN0YXR1czogJ2RyYWZ0JyB8ICdzdWJtaXR0ZWQnIHwgJ2NsYWltZWQnIHwgJ2Nsb3NlZCc7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgICAgIGNvbnRhY3RFbWFpbDogc3RyaW5nO1xuICAgICAgICBkZWFkbGluZTogc3RyaW5nO1xuICAgIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSUNvbXBvbmVudERlZmluaXRpb25Db25maWcgZXh0ZW5kcyB2Ml9JTXlvcFN0b3JlZE9iamVjdCB7XG4gICAgdmFyaWFudHNfaWRzOiBzdHJpbmdbXSxcbiAgICBEVE9zOiB2Ml9JRFRPW10sXG4gICAgdGFnczogc3RyaW5nW10sXG4gICAgYWNjZXNzPzogQ29tcG9uZW50QWNjZXNzLFxuXG4gICAgLy9cbiAgICB2YXJpYW50c19uYW1lczogc3RyaW5nW10sXG4gICAgdmFyaWFudHNfZGF0YToge1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIGlkOiBzdHJpbmdcbiAgICAgICAgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgICAgICAgdXBkYXRlZE9uPzogc3RyaW5nXG4gICAgICAgIHVwZGF0ZWRCeT86IHN0cmluZ1xuICAgICAgICBoYXNfcmVsZWFzZXM/OiBib29sZWFuXG4gICAgfVtdLFxuXG4gICAgcHJldmlld192YXJpYW50OiB2Ml9JVmFyaWFudENvbmZpZztcbiAgICBleHRyYT86IHtcbiAgICAgICAgZmlyc3RWYXJpYW50OiB2Ml9JVmFyaWFudENvbmZpZzsgLy93aGVuIG5ldyBjb21wb25lbnQgY3JlYXRlcyBhdCB0aGUgY2xpZW50XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lEVE8gZXh0ZW5kcyB2Ml9JTXlvcFN0b3JlZE9iamVjdCB7XG4gICAgZGF0YTogb2JqZWN0XG4gICAgbWV0aG9kTmFtZTogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNraW5JbnN0YW5jZUNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTa2luU2VsZWN0b3JDb25maWcge1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBTa2luU2VsZWN0b3JUeXBlcyxcbiAgICAvL3NraW5zOiBJU2tpbkluc3RhbmNlQ29uZmlnW11cbn1cblxuZXhwb3J0IGNvbnN0IFNlZ21lbnRUeXBlID0ge1xuICAgIFwiRnVuY3Rpb25SZXN1bHRcIjogXCJGdW5jdGlvblJlc3VsdFwiLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudEluc3RhbmNlIHtcbiAgICBzZWdtZW50SWQ6IHN0cmluZztcbiAgICBza2luU2VsZWN0b3I6IElTa2luU2VsZWN0b3JDb25maWdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudERlZmluaXRpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdHlwZToga2V5b2YgdHlwZW9mIFNlZ21lbnRUeXBlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUZ1bmN0aW9uUmVzdWx0c1NlZ21lbnQgZXh0ZW5kcyBJU2VnbWVudERlZmluaXRpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdHlwZTogdHlwZW9mIFNlZ21lbnRUeXBlLkZ1bmN0aW9uUmVzdWx0XG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIGZ1bmN0aW9uOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IFNraW5TZWxlY3RvclR5cGVzID0ge1xuICAgIFwiU2VnbWVudGVkXCI6IFwiU2VnbWVudGVkXCIsXG4gICAgXCJEZWRpY2F0ZWRcIjogXCJEZWRpY2F0ZWRcIixcblxuICAgIC8qKlxuICAgICAqIFRoaXMgU2VsZWN0b3IgVHlwZSBpcyBub3QgeWV0IHN1cHBvcnRlZCBidXQgd2lsbCBiZSBhZGRlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLlxuICAgICAqIFBsZWFzZSBjaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdXBkYXRlcy5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgXCJEZWZhdWx0XCI6IFwiRGVmYXVsdFwiXG59IGFzIGNvbnN0O1xuXG5cbi8qKlxuICogVGhpcyBTa2luIENvbmZpZyBUeXBlIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGJ1dCB3aWxsIGJlIGFkZGVkIGluIGEgZnV0dXJlIHJlbGVhc2UuXG4gKiBQbGVhc2UgY2hlY2sgdGhlIGRvY3VtZW50YXRpb24gZm9yIHVwZGF0ZXMuXG4gKlxuICogQHR5cGUge0lEZWZhdWx0U2tpbkNvbmZpZ31cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRGVmYXVsdFNraW5Db25maWcgZXh0ZW5kcyBJU2tpblNlbGVjdG9yQ29uZmlnIHtcbiAgICB0eXBlOiB0eXBlb2YgU2tpblNlbGVjdG9yVHlwZXMuRGVmYXVsdCxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudGVkU2tpbkNvbmZpZyBleHRlbmRzIElTa2luU2VsZWN0b3JDb25maWcge1xuICAgIHR5cGU6IHR5cGVvZiBTa2luU2VsZWN0b3JUeXBlcy5TZWdtZW50ZWQsXG4gICAgc2VnbWVudHM6IElTZWdtZW50SW5zdGFuY2VbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEZWRpY2F0ZWRTa2luQ29uZmlnIGV4dGVuZHMgSVNraW5TZWxlY3RvckNvbmZpZyB7XG4gICAgdHlwZTogdHlwZW9mIFNraW5TZWxlY3RvclR5cGVzLkRlZGljYXRlZCxcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgc2tpbn0gaW5zdGVhZC5cbiAgICAgKiBQcm9wZXJ0eSBza2lucyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb25zLlxuICAgICAqIFBsZWFzZSB1cGRhdGUgeW91ciBjb2RlIHRvIHVzZSB7QGxpbmsgc2tpbn0gZm9yIGJldHRlciBjb21wYXRpYmlsaXR5LlxuICAgICAqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBza2lucz86IElTa2luSW5zdGFuY2VDb25maWdbXSAvLyBkZXByZWNhdGVkXG4gICAgc2tpbjogSVNraW5JbnN0YW5jZUNvbmZpZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wb25lbnRJbnN0YW5jZUNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBjb21wb25lbnRJZDogc3RyaW5nO1xuXG4gICAgLy9UT0RPIDpcbiAgICAvLyBSZWZJRCA/IHRvIHN1cHBvcnQgbW9yZSB0aGFuIDEgY29tcG9uZW50IGZyb20gdGhlIHNhbWUgdHlwZSBpbiBjb21wb3NpdGVzID9cblxuICAgIC8vVE9ETyA6IHJlbW92ZVxuICAgIGNvbXBvbmVudE5hbWU6IHN0cmluZzsgLy8gPDwgY2hlY2tcblxuICAgIHNraW5TZWxlY3RvcjogSVNraW5TZWxlY3RvckNvbmZpZ1xuXG4gICAgLy8gc3RvcmluZyB0aGUgbmVzdGVkIGNvbmZpZyBmb3IgcmVmIGNvbXBvbmVudHNcbiAgICBuZXN0ZWRDb21wb25lbnRzPzogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnW11cblxuICAgIC8vb25seSBvbiBHRVQ/XG4gICAgLy9UT0RPIDogdGhpbmsgYWJvdXQgdGhhdFxuICAgIHJlc29sdmVkRXhwZXJpZW5jZXM/OiBJRXhwZXJpZW5jZVtdXG4gICAgLy8gd2lsbCBpbmNsdWRlIGluc3RhbmNlIGFuZCBkZWYgY29uZmlnIGluIG9yZGVyIHRvIHJlbmRlciBpbiBwcm9kdWN0aW9uXG4gICAgcmVzb2x2ZWROZXN0ZWRDb21wb25lbnRzPzogSUNvbXBvbmVudENvbmZpZ1tdXG59XG5cbmV4cG9ydCBjb25zdCBFeHBlcmllbmNlVHlwZXMgPSB7XG4gICAgXCJTZWdtZW50XCI6IFwiU2VnbWVudFwiLFxuICAgIFwiUHJvbW9cIjogXCJQcm9tb1wiLFxuICAgIFwiQUJcIjogXCJBQlwiXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlIHtcbiAgICBpZDogc3RyaW5nXG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBFeHBlcmllbmNlVHlwZXNcbiAgICBleHBlcmllbmNlczogSUV4cGVyaWVuY2VbXVxuICAgIC8vc3RpY2tpbmVzc0ZhY3RvclxuICAgIC8vRW5kRGF0ZVxufVxuXG4vLyBleHBvcnQgaW50ZXJmYWNlIElBQkV4cGVyaWVuY2VHcm91cCB7XG4vLyAgICAgaWQ6IHN0cmluZ1xuLy8gICAgIG5hbWU6IHN0cmluZ1xuLy8gICAgIHBlcmNlbnRhZ2U6IG51bWJlclxuLy8gfVxuXG5leHBvcnQgaW50ZXJmYWNlIElBQkV4cGVyaWVuY2UgZXh0ZW5kcyBJRXhwZXJpZW5jZSB7XG4gICAgdHlwZTogdHlwZW9mIEV4cGVyaWVuY2VUeXBlcy5BQlxuICAgIC8vIGdyb3VwczogSUFCRXhwZXJpZW5jZUdyb3VwW11cbiAgICBleHBlcmllbmNlczogSUV4cGVyaWVuY2VbXVxuICAgIHBlcmNlbnRhZ2U6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEYXRlUmFuZ2Uge1xuICAgIGlkOiBzdHJpbmdcbiAgICBzdGFydDogRGF0ZVxuICAgIGVuZDogRGF0ZVxuICAgIHRpbWV6b25lOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudEV4cGVyaWVuY2UgZXh0ZW5kcyBJRXhwZXJpZW5jZSB7XG4gICAgdHlwZToga2V5b2YgdHlwZW9mIEV4cGVyaWVuY2VUeXBlc1xuICAgIHNlZ21lbnQ6IElTZWdtZW50RGVmaW5pdGlvblxuICAgIGRhdGVSYW5nZT86IElEYXRlUmFuZ2Vcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVXNlckZsb3dEZWZpbml0aW9uIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIGNvbXBvbmVudHM6IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1tdO1xuICAgIG9yaWdpbnM6IHN0cmluZ1tdLFxuICAgIGV4cGVyaWVuY2VzOiBJRXhwZXJpZW5jZVtdXG4gICAgYnJhbmNoPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudENvbmZpZyB7XG4gICAgaW5zdGFuY2U6IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1xuICAgIHR5cGU6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnXG5cbiAgICAvLyBUT0RPIDogdmVyaWZ5IHVuaXF1ZW5lc3MgKGRhc2hib2FyZCAmIHNlcnZlcilcbiAgICBuYW1lOiBzdHJpbmdcbn1cblxuaW50ZXJmYWNlIElCcmFuY2hhYmxlIHtcbiAgICBicmFuY2g/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVXNlckZsb3cgZXh0ZW5kcyBPbWl0PElVc2VyRmxvd0RlZmluaXRpb24sICdjb21wb25lbnRzJz4sIElCcmFuY2hhYmxlIHtcbiAgICBjb21wb25lbnRzOiBJQ29tcG9uZW50Q29uZmlnW11cbn1cblxuZXhwb3J0IGNsYXNzIFJvb3RSZWYge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBwdWJsaWMgc2hhZG93Um9vdD86IFNoYWRvd1Jvb3QpIHtcblxuICAgIH1cblxuICAgIGdldFJvb3REaXYgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiAodGhpcy5zaGFkb3dSb290IHx8IHRoaXMuY29udGFpbmVyKS5xdWVyeVNlbGVjdG9yKCdkaXYnKVxuICAgIH1cblxuICAgIGdldFJvb3QgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiAodGhpcy5zaGFkb3dSb290IHx8IHRoaXMuY29udGFpbmVyKTtcbiAgICB9XG59XG4iLCAiZXhwb3J0IHR5cGUgU2VyaWFsaXphYmxlPFQ+ID1cbiAgICBUIGV4dGVuZHMgRnVuY3Rpb24gPyBuZXZlciA6IC8vIEV4Y2x1ZGUgZnVuY3Rpb25zXG4gICAgICAgIFQgZXh0ZW5kcyBBcnJheTxpbmZlciBVPiA/IFNlcmlhbGl6YWJsZTxVPltdIDogLy8gSGFuZGxlIGFycmF5c1xuICAgICAgICAgICAgVCBleHRlbmRzIG9iamVjdCA/IHtcbiAgICAgICAgICAgICAgICBbSyBpbiBrZXlvZiBUIGFzIFRbS10gZXh0ZW5kcyBGdW5jdGlvbiA/IG5ldmVyIDogS106IFNlcmlhbGl6YWJsZTxUW0tdPlxuICAgICAgICAgICAgfSA6IFQ7IC8vIEhhbmRsZSBvYmplY3RzXG5cbmNvbnN0IGlzUHJpbWl0aXZlID0gKHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSBPYmplY3QodmFsdWUpO1xufVxuXG5jb25zdCBpc0Z1bmN0aW9uID0gKHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZXhwb3J0IGNvbnN0IGNvbnRhaW5zUHJpbWl0aXZlc09ubHkgPSAob2JqKSA9PiB7XG4gICAgaWYgKGlzUHJpbWl0aXZlKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGlzRnVuY3Rpb24ob2JqKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBjaGVjayBpZiBpdCdzIGEgbmVzdGVkIG9iamVjdFxuICAgICAgICAgICAgaWYgKCFjb250YWluc1ByaW1pdGl2ZXNPbmx5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc1ByaW1pdGl2ZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBJdCdzIGEgcHJpbWl0aXZlLCBzbyB3ZSBjYW4gc2tpcCBpdFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBGb3VuZCBhIG5vbi1wcmltaXRpdmUgdmFsdWVcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlOyAvLyBBbGwgdmFsdWVzIGFyZSBwcmltaXRpdmVzIG9yIG5lc3RlZCBvYmplY3RzIHdpdGggcHJpbWl0aXZlc1xufVxuXG4vLyBjdXJyZW50bHkgc3VwcG9ydCByb290IGxldmVsIG9ubHlcbi8vIHt4OiAxLCB5IDogJ2EnLCB6IDogKCk9PnsuLi59LCBpbm5lciA6IHsgeDogMSAsIHkgOiAnYSd9IH1cbi8vIHt4OiAxLCB5IDogJ2EnfVxuLy9odHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0dsb3NzYXJ5L0ZhbHN5XG5leHBvcnQgdHlwZSBTZXJpYWxpemFibGVTa2VsZXRvbjxUPiA9IFBhcnRpYWw8UmVjb3JkPGtleW9mIFQsIGJvb2xlYW4gfCBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+Pj4+IHwgYm9vbGVhbjtcblxuZXhwb3J0IGNvbnN0IG1ha2VTZXJpYWxpemFibGUgPSA8VD4oXG4gICAgb2JqOiBULFxuICAgIHNrZWxldG9uOiBTZXJpYWxpemFibGVTa2VsZXRvbjxUPiA9IHt9LFxuICAgIGluY2x1ZGVGYWxzeUtleXM6IGJvb2xlYW4gPSB0cnVlLCAvLyBUT0RPIDogdXNlIHRoYXQgYXJnXG4gICAgc2VlbjogV2Vha01hcDxvYmplY3QsIFNlcmlhbGl6YWJsZTxhbnk+PiA9IG5ldyBXZWFrTWFwKClcbik6IFNlcmlhbGl6YWJsZTxUPiA9PiB7XG5cbiAgICBpZiAoaXNQcmltaXRpdmUob2JqKSkge1xuICAgICAgICByZXR1cm4gb2JqIGFzIFNlcmlhbGl6YWJsZTxUPjsgLy8gRGlyZWN0bHkgcmV0dXJuIHByaW1pdGl2ZSB2YWx1ZXNcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgIGlmIChzZWVuLmhhcyhvYmopKSB7XG4gICAgICAgICAgICByZXR1cm4gc2Vlbi5nZXQob2JqKSE7IC8vIFJldHVybiB0aGUgYWxyZWFkeSBwcm9jZXNzZWQgb2JqZWN0XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgYXJyYXkgc2VyaWFsaXphdGlvblxuICAgICAgICBjb25zdCBzZXJpYWxpemFibGVBcnJheTogU2VyaWFsaXphYmxlPGFueT5bXSA9IFtdO1xuICAgICAgICBzZWVuLnNldChvYmosIHNlcmlhbGl6YWJsZUFycmF5KTsgLy8gU3RvcmUgdGhlIGFycmF5IGluIHNlZW5cblxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgb2JqLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IG9ialtpbmRleF07XG4gICAgICAgICAgICBzZXJpYWxpemFibGVBcnJheVtpbmRleF0gPSBtYWtlU2VyaWFsaXphYmxlKGVsZW1lbnQsIHNrZWxldG9uLCBpbmNsdWRlRmFsc3lLZXlzLCBzZWVuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VyaWFsaXphYmxlQXJyYXkgYXMgU2VyaWFsaXphYmxlPFQ+O1xuICAgIH1cblxuICAgIGlmIChvYmogIT09IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGN5Y2xpYyByZWZlcmVuY2VzXG4gICAgICAgIGlmIChzZWVuLmhhcyhvYmopKSB7XG4gICAgICAgICAgICByZXR1cm4gc2Vlbi5nZXQob2JqKSE7IC8vIFJldHVybiB0aGUgYWxyZWFkeSBwcm9jZXNzZWQgb2JqZWN0XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VyaWFsaXphYmxlT2JqZWN0OiBQYXJ0aWFsPFNlcmlhbGl6YWJsZTxUPj4gPSB7fTtcbiAgICAgICAgc2Vlbi5zZXQob2JqLCBzZXJpYWxpemFibGVPYmplY3QpOyAvLyBTdG9yZSB0aGUgb2JqZWN0IGluIHNlZW5cblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBrZXkgaXMgaW4gdGhlIHNrZWxldG9uIGFuZCBpZiBpdCdzIGEgdmFsaWQga2V5IHRvIHNlcmlhbGl6ZVxuXG4gICAgICAgICAgICBjb25zdCBrZXlJblNrZWxldG9uID0gdHlwZW9mIHNrZWxldG9uID09IFwiYm9vbGVhblwiID8gc2tlbGV0b24gOiBza2VsZXRvbltrZXldO1xuXG4gICAgICAgICAgICBpZiAoa2V5SW5Ta2VsZXRvbikge1xuICAgICAgICAgICAgICAgIGlmIChrZXlJblNrZWxldG9uID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBza2VsZXRvbiBpbmRpY2F0ZXMgdG8gc2VyaWFsaXplIHRoaXMga2V5XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmNsdWRlRmFsc3lLZXlzID8gb2JqW2tleV0gIT09IHVuZGVmaW5lZCA6IG9ialtrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemFibGVPYmplY3Rba2V5XSA9IG1ha2VTZXJpYWxpemFibGUob2JqW2tleV0sIHRydWUsIGluY2x1ZGVGYWxzeUtleXMsIHNlZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Yga2V5SW5Ta2VsZXRvbiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNrZWxldG9uIGluZGljYXRlcyBuZXN0ZWQga2V5cyB0byBzZXJpYWxpemVcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemFibGVPYmplY3Rba2V5XSA9IG1ha2VTZXJpYWxpemFibGUob2JqW2tleV0sIGtleUluU2tlbGV0b24sIGluY2x1ZGVGYWxzeUtleXMsIHNlZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VyaWFsaXphYmxlT2JqZWN0IGFzIFNlcmlhbGl6YWJsZTxUPjtcbiAgICB9XG5cbiAgICByZXR1cm4ge30gYXMgYW55OyAvLyBSZXR1cm4gYW4gZW1wdHkgb2JqZWN0IGZvciBvdGhlciBjYXNlc1xufVxuIiwgImV4cG9ydCBjb25zdCBFcnJvcnMgPSB7XG4gICAgbm90U2VyaWFsaXphYmxlUmVmQ2FsbDogKHByb3AsIGFyZykgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFxuVGhlIGlucHV0IHByb3ZpZGVkIHRvICcke3Byb3AudG9TdHJpbmcoKX0nIGlzIG5vdCBzZXJpYWxpemFibGUuIFNlcmlhbGl6YXRpb24gaXMgcmVxdWlyZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGRhdGEgY2FuIGJlIHNhZmVseSB0cmFuc2ZlcnJlZCB0byB0aGUgc2tpbiBpbXBsZW1lbnRhdGlvbi4gXG5UaGUgZm9sbG93aW5nIHR5cGVzIG9mIGRhdGEgYXJlIGNvbnNpZGVyZWQgbm9uLXNlcmlhbGl6YWJsZSBhbmQgY2Fubm90IGJlIHByb2Nlc3NlZDpcblxuLSBGdW5jdGlvbnNcbi0gRE9NIGVsZW1lbnRzXG4tIENsYXNzIGluc3RhbmNlc1xuLSBDaXJjdWxhciByZWZlcmVuY2VzXG4tIFN5bWJvbHNcbi0gQmlnSW50IHZhbHVlc1xuXG5JbiB0aGUgZm9sbG93aW5nIGV4ZWN1dGlvbiB3ZSBkZXRlY3RlZCA6XG5+fn5+fn5+flxuJHthcmd9IFxufn5+fn5+fn5cbmFzIG5vdCBzZXJpYWxpemFibGUuXG5cblRvIHJlc29sdmUgdGhpcyBpc3N1ZSwgcGxlYXNlIGVuc3VyZSB0aGF0IGFsbCBpbnB1dHMgcGFzc2VkIHRvICcke3Byb3AudG9TdHJpbmcoKX0nIGFyZSBpbiBhIHNlcmlhbGl6YWJsZSBmb3JtYXQuXG5UaGlzIHR5cGljYWxseSBpbmNsdWRlcyBwcmltaXRpdmUgdHlwZXMgKHN0cmluZ3MsIG51bWJlcnMsIGJvb2xlYW5zKSwgYXJyYXlzLCBhbmQgcGxhaW4gb2JqZWN0cy4gXG5JZiB5b3UgbmVlZCB0byBpbmNsdWRlIGNvbXBsZXggZGF0YSB0eXBlcywgY29uc2lkZXIgY29udmVydGluZyB0aGVtIHRvIGEgc2VyaWFsaXphYmxlIHN0cnVjdHVyZSBiZWZvcmUgcGFzc2luZyB0aGVtIHRvIHRoZSBmdW5jdGlvbi5cbk9yIHVzZSBNeW9wIG1lc3NhZ2UgdGhhdCBzdXBwb3J0IGl0OiBDdXN0b21SZWZNZXNzYWdlLCBBZGRFdmVudExpc3RlbmVyTWVzc2FnZSBvciBFeGVjdXRlU2NyaXB0TWVzc2FnZS5cblxuU3VnZ2VzdGVkIEZpeDpcbjEuIFJlbW92ZSBvciByZXBsYWNlIG5vbi1zZXJpYWxpemFibGUgdmFsdWVzIGZyb20geW91ciBpbnB1dC5cbjIuIElmIHVzaW5nIG9iamVjdHMsIGVuc3VyZSB0aGV5IGRvIG5vdCBjb250YWluIGFueSBmdW5jdGlvbnMgb3IgY2lyY3VsYXIgcmVmZXJlbmNlcy5cbjMuIENvbnZlcnQgYW55IGNsYXNzIGluc3RhbmNlcyB0byBwbGFpbiBvYmplY3RzIG9yIEpTT04tY29tcGF0aWJsZSBmb3JtYXRzLlxuNC4gVXNlIGRlZGljYXRlZCBNeW9wIG1lc3NhZ2UuXG5cbkZvciBtb3JlIGRldGFpbHMgb24gc2VyaWFsaXphdGlvbiBhbmQgTXlvcCBtZXNzYWdlIGV4YW1wbGVzLCByZWZlciB0byBodHRwczovL2RvY3MubXlvcC5kZXZcXC5cblxuYCk7XG4gICAgfVxufVxuXG4iLCAiaW1wb3J0IHtCYXNlTXlvcENvbXBvbmVudCwgSU15b3BDb21wb25lbnR9IGZyb20gXCIuL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZH0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0lDb21wb25lbnREZWZpbml0aW9uQ29uZmlnfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0VudmVsb3BlZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlcy9FbnZlbG9wZWRNZXNzYWdlXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBNeW9wUmVmQ29tcG9uZW50IGV4dGVuZHMgQmFzZU15b3BDb21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBwdWJsaWMgcGFyZW50OiBJTXlvcENvbXBvbmVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpIHtcbiAgICAgICAgLy9UT0RPIDogY2hlY2sgcGFyZW50Q29tcG9uZW50LmNvbnRhaW5lci4uLlxuICAgICAgICBzdXBlcihjb21wb25lbnREZWZpbml0aW9uLCBwYXJlbnQuY29udGFpbmVyLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBoaWRlKCkge1xuICAgICAgICAvL3RoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZChhcmd1bWVudHMuY2FsbGVlLm5hbWUpKTtcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdoaWRlJykpO1xuICAgIH1cblxuICAgIHNob3coKSB7XG4gICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnc2hvdycpKTtcbiAgICB9XG5cbiAgICBpbnNwZWN0KCkge1xuICAgICAgICAvL1RPRE8gOiBzdXBwb3J0IHJlYWwgY2xlYW51cFxuICAgICAgICAvL2NvbnNvbGUubG9nKCdyZWYgaW5zcGVjdCBjYWxsZWQsIGNyZWF0aW5nIEV4ZWN1dGVDb21wb25lbnRNZXRob2QgaW5zcGVjdCcsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYsIHRoaXMuaWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdpbnNwZWN0JykpO1xuICAgIH1cblxuICAgIHNldEhlaWdodEJhc2VkT25Eb2N1bWVudEVsZW1lbnQoKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdzZXRIZWlnaHRCYXNlZE9uRG9jdW1lbnRFbGVtZW50JykpO1xuICAgIH1cblxuICAgIHNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQoKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdzZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0JykpO1xuICAgIH1cblxuICAgIG9uTWVzc2FnZVJlY2VpdmVkKGluY29tZU1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICAvLyBpZiAoaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gJ011dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJykge1xuICAgICAgICAvLyAgZGVidWdnZXI7XG4gICAgICAgIC8vICAgICB0aGlzLnNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQoKTtcbiAgICAgICAgLy8gICAgIHJldHVybiB0cnVlO1xuICAgICAgICAvLyB9XG4gICAgICAgIHJldHVybiBzdXBlci5vbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlKTtcbiAgICB9XG5cblxuICAgIHNlbmQgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coJ3JlZiBtZXNzYWdlIHNlbmRpbmcgJywgbWVzc2FnZSk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IG1lc3NhZ2UuaGFuZGxlclxuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHN1cGVyLnNlbmQobWVzc2FnZSk7XG5cbiAgICAgICAgLy8gdGhpcy5pZCB3aWxsIGJlIGF2YWlsYWJsZSBvbiB0aGUgbmVzdGVkIGNvbXBvbmVudFxuICAgICAgICB0aGlzLnBhcmVudC5zZW5kKG5ldyBFbnZlbG9wZWRNZXNzYWdlKHRoaXMuaWQsIG1lc3NhZ2UpKTtcblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIG1lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXJcbiAgICAgICAgcmV0dXJuIGNsZWFudXBIYW5kbGVyO1xuICAgIH07XG5cbiAgICBkaXNwb3NlID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc0luaXRpYXRlZClcbiAgICAgICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnZGlzcG9zZScpKTtcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0F1dG9TaXplT3B0aW9ucywgQmFzZU15b3BDb21wb25lbnR9IGZyb20gXCIuL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyLCBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSVNraW5Db25maWd9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7c2V0RGVidWdTdHlsZX0gZnJvbSBcIi4uL2NvbXBvbmVudENvcmVcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREtcIjtcblxuLyoqXG4gKiBDb21wb25lbnQgd3JhcHBlciBmb3IgTXlvcCBXZWIgQ29tcG9uZW50cyB0aGF0IGFyZSBleHRyYWN0ZWQgZnJvbSBIVE1MXG4gKiBhbmQgcnVuIGRpcmVjdGx5IG9uIHRoZSBob3N0IGRvY3VtZW50IChub3QgaW4gYW4gaWZyYW1lKS5cbiAqXG4gKiBUaGVzZSBjb21wb25lbnRzIHVzZSB0aGUgbmF0aXZlIFdlYiBDb21wb25lbnRzIEFQSSAoQ3VzdG9tIEVsZW1lbnRzICsgU2hhZG93IERPTSlcbiAqIGFuZCBjb21tdW5pY2F0ZSB2aWEgZGlyZWN0IG1ldGhvZCBjYWxscyBhbmQgQ3VzdG9tRXZlbnRzIGluc3RlYWQgb2YgcG9zdE1lc3NhZ2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50IGV4dGVuZHMgQmFzZU15b3BDb21wb25lbnQge1xuICAgIHByaXZhdGUgY3RhQ2xlYW51cD86ICgpID0+IHZvaWQ7XG4gICAgcHJpdmF0ZSBfY3RhSGFuZGxlcj86IChhY3Rpb246IHN0cmluZywgcGF5bG9hZDogdW5rbm93bikgPT4gdm9pZDtcbiAgICBwcml2YXRlIF9jdGFRdWV1ZTogQXJyYXk8e2FjdGlvbjogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3dufT4gPSBbXTtcblxuICAgIC8vIEEgc2luZ2xlICdteW9wLWN0YScgbGlzdGVuZXIsIGF0dGFjaGVkIGF0IGNvbnN0cnVjdGlvbiBzbyBDVEFzIGEgY29tcG9uZW50XG4gICAgLy8gZGlzcGF0Y2hlcyBkdXJpbmcgaXRzIGZpcnN0IGluaXRXaXRoRGF0YSgpIHJlbmRlciBcdTIwMTQgYmVmb3JlIHRoZSBob3N0IGF0dGFjaGVzXG4gICAgLy8gYSBoYW5kbGVyIFx1MjAxNCBhcmUgYnVmZmVyZWQgKGFuZCBmbHVzaGVkIG9uIHNldEN0YUhhbmRsZXIpLCBtYXRjaGluZyB0aGUgaWZyYW1lXG4gICAgLy8gcGF0aCdzIHByZS1oYW5kbGVyIENUQSBxdWV1ZS5cbiAgICBwcml2YXRlIF9jdGFMaXN0ZW5lciA9IChlOiBFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCBkZXRhaWwgPSAoZSBhcyBDdXN0b21FdmVudCkuZGV0YWlsO1xuICAgICAgICBpZiAoIWRldGFpbD8uYWN0aW9uKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLl9jdGFIYW5kbGVyICYmICF0aGlzLm1hcmtlZEZvckRpc3Bvc2VkKSB7XG4gICAgICAgICAgICB0aGlzLl9jdGFIYW5kbGVyKGRldGFpbC5hY3Rpb24sIGRldGFpbC5wYXlsb2FkKTtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5fY3RhSGFuZGxlcikge1xuICAgICAgICAgICAgdGhpcy5fY3RhUXVldWUucHVzaCh7IGFjdGlvbjogZGV0YWlsLmFjdGlvbiwgcGF5bG9hZDogZGV0YWlsLnBheWxvYWQgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgICAgICBza2luOiBJU2tpbkNvbmZpZyxcbiAgICAgICAgcHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXG4gICAgICAgIHByaXZhdGUgY3VzdG9tRWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgICAgIHByaXZhdGUgdGFnTmFtZTogc3RyaW5nLFxuICAgICAgICBvcHRpb25zPzogbG9hZGVyT3B0aW9uc1xuICAgICkge1xuICAgICAgICBzdXBlcihjb21wb25lbnREZWZpbml0aW9uLCBjb250YWluZXIsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBjdXN0b21FbGVtZW50O1xuXG4gICAgICAgIC8vIExpc3RlbiBCRUZPUkUgYW55IGluaXRXaXRoRGF0YSByZW5kZXIgc28gaW5pdC10aW1lIENUQXMgYXJlbid0IGxvc3QuXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdteW9wLWN0YScsIHRoaXMuX2N0YUxpc3RlbmVyKTtcbiAgICAgICAgdGhpcy5jdGFDbGVhbnVwID0gKCkgPT4gdGhpcy5jdXN0b21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ215b3AtY3RhJywgdGhpcy5fY3RhTGlzdGVuZXIpO1xuXG4gICAgICAgIC8vIFdlYiBjb21wb25lbnRzIGFyZSBpbml0aWF0ZWQgaW1tZWRpYXRlbHkgKG5vIHBvc3RNZXNzYWdlIGhhbmRzaGFrZSBuZWVkZWQpXG4gICAgICAgIHRoaXMuc2V0SW5pdGlhdGVkKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYXV0b1NpemVPcHRpb25zPzogQXV0b1NpemVPcHRpb25zO1xuXG4gICAgLyoqXG4gICAgICogRGF0YS1vdXQgZm9yIHNpemUgXHUyMDE0IHRoZSBleHRyYWN0ZWQgY291bnRlcnBhcnQgb2YgdGhlIGlmcmFtZSBpbXBsZW1lbnRhdGlvbi5cbiAgICAgKlxuICAgICAqIFRISVMgRVhJU1RFRCBPTkxZIE9OIE15b3BJZnJhbWVDb21wb25lbnQsIGFuZCB0aGF0IHdhcyBpbnZpc2libGUgZm9yIGFzIGxvbmcgYXNcbiAgICAgKiBtaW5pZmljYXRpb24gd2FzIHNlbmRpbmcgZXZlcnkgdjIgY29tcG9uZW50IGRvd24gdGhlIGlmcmFtZSBwYXRoLiBSZXN0b3JpbmcgdjJcbiAgICAgKiBkZXRlY3Rpb24gbW92ZXMgdGhlbSB0byB0aGlzIGNsYXNzLCBhbmQgYEBteW9wL3JlYWN0YCBkcml2ZXMgYm90aCB0aHJvdWdoIG9uZVxuICAgICAqIHdyYXBwZXI6IGluIGNvbnRlbnQgbW9kZSBpdCBoaWRlcyBpdHMgbG9hZGVyIGZyb20gdGhlIEZJUlNUIG9uU2l6ZUNoYW5nZSwgc28gYVxuICAgICAqIGNvbXBvbmVudCB3aG9zZSBjbGFzcyBoYXMgbm8gb2JzZXJ2ZUF1dG9TaXplIGxlYXZlcyBhIFJlYWN0IGhvc3Qgb24gYSBsb2FkZXJcbiAgICAgKiBmb3JldmVyLiBQaWMtVGltZSdzIHNpemVNZXRhIGlzIHdpZHRoOjEwMCUgd2l0aCBubyBoZWlnaHQsIHdoaWNoIGlzIGV4YWN0bHkgY29udGVudFxuICAgICAqIG1vZGUuIENhdWdodCBieSB2Mi1kYXRhLWNvbnRyYWN0IEQ4IChBUEkgcGFyaXR5KS5cbiAgICAgKlxuICAgICAqIEl0IFJFUE9SVFMgcmF0aGVyIHRoYW4gaW1wb3Nlcy4gQW4gaWZyYW1lIGhhcyBubyBpbnRyaW5zaWMgc2l6ZSBhbmQgbXVzdCBiZVxuICAgICAqIG1lYXN1cmVkIGluc2lkZSBhbmQgdGhlbiBzZXQgZnJvbSBvdXRzaWRlOyBhIGN1c3RvbSBlbGVtZW50IHNpemVzIGl0c2VsZiBmcm9tIGl0c1xuICAgICAqIG93biBjb250ZW50LCBzbyB0aGUgaG9uZXN0IHRoaW5nIGlzIHRvIG1lYXN1cmUgaXQgYW5kIHRlbGwgdGhlIGhvc3QsIGFuZCBsZXQgdGhlXG4gICAgICogaG9zdCBkZWNpZGUuIFJlYWN0IHRoZW4gdXNlcyB3aWR0aDoxMDAlIGFuZCB0aGUgbWVhc3VyZWQgaGVpZ2h0LlxuICAgICAqXG4gICAgICogVGhlIG9uZSB0aGluZyBpdCBkb2VzIGltcG9zZSBpcyBgZGlzcGxheTogYmxvY2tgIHdoZW4gdGhlIGVsZW1lbnQgY29tcHV0ZXMgdG9cbiAgICAgKiBgaW5saW5lYCwgd2hpY2ggaXMgdGhlIGRlZmF1bHQgZm9yIGEgY3VzdG9tIGVsZW1lbnQgYW5kIG1lYXN1cmVzIGFzIHplcm8gaGVpZ2h0IG5vXG4gICAgICogbWF0dGVyIHdoYXQgaXQgY29udGFpbnMuIFRoZSBpZnJhbWUgcGF0aCBmb3JjZXMgd2lkdGg6MTAwJSBmb3IgdGhlIHNhbWUgcmVhc29uIFx1MjAxNFxuICAgICAqIHdpdGhvdXQgaXQgdGhlIGZpcnN0IG1lYXN1cmVtZW50IGlzIDAgYW5kIHRoZSBob3N0IHNpemVzIHRoZSBjb21wb25lbnQgdG8gbm90aGluZy5cbiAgICAgKi9cbiAgICBvYnNlcnZlQXV0b1NpemUgPSAob3B0aW9ucz86IEF1dG9TaXplT3B0aW9ucyk6IENsZWFudXBIYW5kbGVyID0+IHtcbiAgICAgICAgdGhpcy5fYXV0b1NpemVPcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgZWwgPSB0aGlzLmN1c3RvbUVsZW1lbnQ7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChnZXRDb21wdXRlZFN0eWxlKGVsKS5kaXNwbGF5ID09PSAnaW5saW5lJykgZWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIH0gY2F0Y2ggeyAvKiBkZXRhY2hlZCBvciBubyBsYXlvdXQgeWV0OyB0aGUgb2JzZXJ2ZXIgd2lsbCByZXBvcnQgb25jZSBpdCBoYXMgb25lICovIH1cblxuICAgICAgICBjb25zdCBwYXJzZSA9ICh2OiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQpOiBudW1iZXIgfCB1bmRlZmluZWQgPT4ge1xuICAgICAgICAgICAgaWYgKHYgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ251bWJlcicpIHJldHVybiB2O1xuICAgICAgICAgICAgY29uc3QgbiA9IHBhcnNlRmxvYXQodik7XG4gICAgICAgICAgICByZXR1cm4gaXNOYU4obikgPyB1bmRlZmluZWQgOiBuO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBjbGFtcCA9ICh2OiBudW1iZXIsIG1pbj86IG51bWJlciwgbWF4PzogbnVtYmVyKSA9PlxuICAgICAgICAgICAgbWluICE9PSB1bmRlZmluZWQgJiYgdiA8IG1pbiA/IG1pbiA6IChtYXggIT09IHVuZGVmaW5lZCAmJiB2ID4gbWF4ID8gbWF4IDogdik7XG5cbiAgICAgICAgY29uc3QgcmVwb3J0ID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMuX2F1dG9TaXplT3B0aW9ucztcbiAgICAgICAgICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGNvbnN0IGF1dG9IZWlnaHQgPSBvcHRzPy5leHBsaWNpdEhlaWdodCA9PT0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgb3B0cz8ub25TaXplQ2hhbmdlPy4oe1xuICAgICAgICAgICAgICAgIHdpZHRoOiByZWN0LndpZHRoLFxuICAgICAgICAgICAgICAgIGhlaWdodDogYXV0b0hlaWdodFxuICAgICAgICAgICAgICAgICAgICA/IGNsYW1wKHJlY3QuaGVpZ2h0LCBwYXJzZShvcHRzPy5taW5IZWlnaHQpLCBwYXJzZShvcHRzPy5tYXhIZWlnaHQpKVxuICAgICAgICAgICAgICAgICAgICA6IHJlY3QuaGVpZ2h0LFxuICAgICAgICAgICAgICAgIGF1dG9TaXppbmdXaWR0aDogZmFsc2UsICAgLy8gYSB3ZWIgY29tcG9uZW50IGZpbGxzIGl0cyBjb250YWluZXIncyB3aWR0aFxuICAgICAgICAgICAgICAgIGF1dG9TaXppbmdIZWlnaHQ6IGF1dG9IZWlnaHQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgcm86IFJlc2l6ZU9ic2VydmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcm8gPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gcmVwb3J0KCkpO1xuICAgICAgICAgICAgcm8ub2JzZXJ2ZShlbCk7XG4gICAgICAgIH0gY2F0Y2ggeyAvKiBubyBSZXNpemVPYnNlcnZlcjogdGhlIG9uZS1zaG90IHJlcG9ydCBiZWxvdyBzdGlsbCB1bmJsb2NrcyB0aGUgaG9zdCAqLyB9XG5cbiAgICAgICAgLy8gRmlyZSBvbmNlIGltbWVkaWF0ZWx5LiBIb3N0cyBnYXRlIHRoZWlyIGxvYWRlciBvbiB0aGUgRklSU1QgbWVhc3VyZW1lbnQsIHNvIGFcbiAgICAgICAgLy8gY29tcG9uZW50IHRoYXQgbmV2ZXIgcmVzaXplcyBtdXN0IHN0aWxsIHByb2R1Y2Ugb25lLlxuICAgICAgICByZXBvcnQoKTtcblxuICAgICAgICByZXR1cm4gKCkgPT4geyBybz8uZGlzY29ubmVjdCgpOyB0aGlzLl9hdXRvU2l6ZU9wdGlvbnMgPSB1bmRlZmluZWQ7IH07XG4gICAgfVxuXG4gICAgY2xlYW51cEluc3BlY3Q6IENsZWFudXBIYW5kbGVyID0gKCkgPT4ge307XG5cbiAgICBpbnNwZWN0KCkge1xuICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0ID0gc2V0RGVidWdTdHlsZSh0aGlzLmlkLCAnTXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudCcsIDAsIHRoaXMuY29udGFpbmVyLCB0aGlzLmN1c3RvbUVsZW1lbnQsIHRoaXMuY29tcG9uZW50RGVmaW5pdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzLmNsZWFudXBJbnNwZWN0O1xuICAgIH1cblxuICAgIGhpZGUoKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLmhlaWdodCA9ICcwJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLndpZHRoID0gJzAnO1xuICAgIH1cblxuICAgIHNob3coKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzEnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAndW5zZXQnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhbGwnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLmhlaWdodCA9ICcnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUud2lkdGggPSAnJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIHRoZSBjb21wb25lbnQgd2l0aCBkYXRhIGJ5IGNhbGxpbmcgbXlvcF9pbml0X2ludGVyZmFjZSBkaXJlY3RseVxuICAgICAqL1xuICAgIGluaXRXaXRoRGF0YShkYXRhOiB1bmtub3duKTogdm9pZCB7XG4gICAgICAgIGlmICh0eXBlb2YgKHRoaXMuY3VzdG9tRWxlbWVudCBhcyBhbnkpLm15b3BfaW5pdF9pbnRlcmZhY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICh0aGlzLmN1c3RvbUVsZW1lbnQgYXMgYW55KS5teW9wX2luaXRfaW50ZXJmYWNlKGRhdGEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGN1cnJlbnQgZGF0YSBmcm9tIHRoZSBjb21wb25lbnRcbiAgICAgKi9cbiAgICBnZXREYXRhKCk6IHVua25vd24ge1xuICAgICAgICBpZiAodHlwZW9mICh0aGlzLmN1c3RvbUVsZW1lbnQgYXMgYW55KS5teW9wX2luaXRfaW50ZXJmYWNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gKHRoaXMuY3VzdG9tRWxlbWVudCBhcyBhbnkpLm15b3BfaW5pdF9pbnRlcmZhY2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBDVEEgaGFuZGxlciAtIHVuaWZpZWQgQVBJIHdpdGggaWZyYW1lIGNvbXBvbmVudHMuXG4gICAgICogQ2FsbGVkIHZpYSBwcm9wcy5teW9wX2N0YV9oYW5kbGVyID0gaGFuZGxlclxuICAgICAqL1xuICAgIHNldEN0YUhhbmRsZXIoaGFuZGxlcjogKGFjdGlvbjogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIC8vIFRoZSAnbXlvcC1jdGEnIGxpc3RlbmVyIGlzIGF0dGFjaGVkIGluIHRoZSBjb25zdHJ1Y3Rvciwgc28gd2Ugb25seSBzZXQgdGhlXG4gICAgICAgIC8vIGhhbmRsZXIgYW5kIGZsdXNoIGFueXRoaW5nIHRoZSBjb21wb25lbnQgZW1pdHRlZCBiZWZvcmUgbm93IChlLmcuIGR1cmluZyB0aGVcbiAgICAgICAgLy8gZmlyc3QgaW5pdFdpdGhEYXRhIHJlbmRlcikuXG4gICAgICAgIHRoaXMuX2N0YUhhbmRsZXIgPSBoYW5kbGVyO1xuXG4gICAgICAgIGlmICh0aGlzLl9jdGFRdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBxdWV1ZSA9IFsuLi50aGlzLl9jdGFRdWV1ZV07XG4gICAgICAgICAgICB0aGlzLl9jdGFRdWV1ZSA9IFtdO1xuICAgICAgICAgICAgcXVldWUuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubWFya2VkRm9yRGlzcG9zZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlcihpdGVtLmFjdGlvbiwgaXRlbS5wYXlsb2FkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvciBjb21wYXRpYmlsaXR5IHdpdGggbWVzc2FnZS1iYXNlZCBjb21wb25lbnRzLlxuICAgICAqIFdlYiBjb21wb25lbnRzIGRvbid0IHVzZSBwb3N0TWVzc2FnZSwgc28gdGhpcyBpcyBhIG5vLW9wIGZvciBtb3N0IG1lc3NhZ2VzLlxuICAgICAqL1xuICAgIHNlbmQgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlPGFueT4pID0+IHtcbiAgICAgICAgLy8gV2ViIGNvbXBvbmVudHMgZG9uJ3QgdXNlIHRoZSBwb3N0TWVzc2FnZSBzeXN0ZW1cbiAgICAgICAgLy8gSW5zdGVhZCwgaW50ZXJhY3QgZGlyZWN0bHkgdmlhIHByb3BzLm15b3BfaW5pdF9pbnRlcmZhY2UgYW5kIHByb3BzLm15b3BfY3RhX2hhbmRsZXJcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSBzdXBlci5zZW5kKG1lc3NhZ2UpO1xuXG4gICAgICAgIC8vIExvZyBmb3IgZGVidWdnaW5nXG4gICAgICAgIGNvbnNvbGUuZGVidWcoJ1tNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50XSBzZW5kKCkgY2FsbGVkIC0gd2ViIGNvbXBvbmVudHMgdXNlIGRpcmVjdCBBUEkgaW5zdGVhZCcsIG1lc3NhZ2UpO1xuXG4gICAgICAgIHJldHVybiBjbGVhbnVwSGFuZGxlcjtcbiAgICB9XG5cbiAgICBkaXNwb3NlID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jdGFDbGVhbnVwKSB7XG4gICAgICAgICAgICB0aGlzLmN0YUNsZWFudXAoKTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5wYXJlbnROb2RlPy5yZW1vdmVDaGlsZCh0aGlzLmN1c3RvbUVsZW1lbnQpO1xuICAgIH1cbn1cbiIsICIvL3R5cGUgQUNvbnN0cnVjdG9yVHlwZU9mPFQ+ID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuL2NvbXBvbmVudHMvSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSwgQ3VzdG9tUmVmTWVzc2FnZSwgUmVmfSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCAqIGFzIG1lc3NhZ2VzIGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtcbiAgICBDbGVhbnVwSGFuZGxlciwgSUNvbXBvbmVudENvbmZpZyxcbiAgICB0eXBlIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgIElDb21wb25lbnRSZWZCZWhhdmlvciwgSUhUTUxMb2FkZXJDb25maWcsIElQcm9wQ29kZUJlaGF2aW9yLFxuICAgIElQcm9wQ29uZmlnLCBJU2tpbkNvbmZpZywgUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMsXG4gICAgUmVmQmVoYXZpb3JUeXBlLCBTaGFkb3dSb290TW9kZVR5cGUsIFNraW5Mb2FkZXJzLCBTa2luTG9hZGVyVHlwZVxufSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge2NvbnRhaW5zUHJpbWl0aXZlc09ubHl9IGZyb20gXCIuLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvblwiO1xuaW1wb3J0IHtFcnJvcnN9IGZyb20gXCIuL2xvZ01lc3NhZ2VzXCI7XG5pbXBvcnQge015b3BSZWZDb21wb25lbnR9IGZyb20gXCIuL2NvbXBvbmVudHMvbXlvcFJlZkNvbXBvbmVudFwiO1xuaW1wb3J0IHtNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRzL215b3BFeHRyYWN0ZWRXZWJDb21wb25lbnRcIjtcbmltcG9ydCB7TXlvcElmcmFtZUNvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50cy9teW9wSWZyYW1lQ29tcG9uZW50XCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuL2hvc3RTREtcIjtcblxudHlwZSBjb21wb25lbnREZWZpbml0aW9uUHJvcHMgPSBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1sncHJvcHMnXVxuXG5jb25zdCBjcmVhdGVEZWJ1Z1RpdGxlID0gKHRleHQ6IHN0cmluZywgdG9wOiBudW1iZXIsIGNvbXBvbmVudERlZmluaXRpb25Db25maWc6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnKSA9PiB7XG4gICAgY29uc3QgdGl0bGVFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICB0aXRsZUVsLnRleHRDb250ZW50ID0gdGV4dDtcbiAgICB0aXRsZUVsLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICB0aXRsZUVsLnN0eWxlLnBhZGRpbmcgPSAnMCA1cHgnO1xuICAgIHRpdGxlRWwuc3R5bGUuZm9udFNpemUgPSAnMTRweCc7XG4gICAgdGl0bGVFbC5zdHlsZVsndG9wJ10gPSAnMCc7XG4gICAgdGl0bGVFbC5zdHlsZS50b3AgPSBgJHt0b3B9cHhgO1xuICAgIC8vdGl0bGVFbC5zdHlsZS5sZWZ0ID0gJzUwJSc7XG4gICAgdGl0bGVFbC5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlWCgtNTAlKSc7XG4gICAgdGl0bGVFbC50YXJnZXQgPSAnX2JsYW5rJztcbiAgICB0aXRsZUVsLmhyZWYgPSBgaHR0cHM6Ly9kYXNoYm9hcmQubXlvcC5kZXYvZGFzaGJvYXJkL2NvbXBvbmVudC8ke2NvbXBvbmVudERlZmluaXRpb25Db25maWcuaWR9YFxuXG4gICAgcmV0dXJuIHRpdGxlRWw7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0RGVidWdTdHlsZSA9IChpZDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXI6IEhUTUxFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1xuKTogQ2xlYW51cEhhbmRsZXIgPT4ge1xuICAgIC8vIzAwN0JGRiAoYmx1ZSkgb3IgI0ZGNTcyMiAob3JhbmdlKVxuICAgIC8vIzRDQUY1MCAoZ3JlZW4pIG9yICNGRkMxMDcgKGFtYmVyKVxuICAgIC8vIGNvbnN0IHRvcFRleHQgPSBjcmVhdGVEZWJ1Z1RpdGxlKGAke2lkfSA6ICR7dHlwZX1gLCB0b3AsIGNvbXBvbmVudERlZmluaXRpb25Db25maWcpO1xuICAgIGNvbnN0IHRvcFRleHQgPSBjcmVhdGVEZWJ1Z1RpdGxlKGAke2NvbXBvbmVudERlZmluaXRpb25Db25maWcubmFtZX0gOiAke3R5cGV9YCwgdG9wLCBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnKTtcbiAgICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKHRvcFRleHQsIGNvbXBvbmVudEVsZW1lbnQpO1xuICAgIGNvbXBvbmVudEVsZW1lbnQuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCAjMDA3QkZGJztcbiAgICBjb21wb25lbnRFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgY29tcG9uZW50RWxlbWVudC5zdHlsZS5ib3JkZXIgPSAndW5zZXQnO1xuICAgICAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQodG9wVGV4dCk7XG4gICAgfVxufVxuXG5jb25zdCByZXBvcnRFcnJvciA9IChwcm9wQ29uZmlnOiBJUHJvcENvbmZpZywgcHJvcE5hbWU6IHN0cmluZywgY29tcG9uZW50OiBJTXlvcENvbXBvbmVudDxhbnksIGFueT4pID0+IHtcbiAgICBpZiAoIXByb3BDb25maWcpIHtcblxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgLy8gdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEVycm9yOiBVbmRlZmluZWQgUHJvcFxcblxcbmAgK1xuICAgICAgICAgICAgYEl0IGxvb2tzIGxpa2UgeW91J3ZlIHRyaWVkIHRvIHVzZSBhIHByb3AgdGhhdCBoYXNuJ3QgYmVlbiBkZWZpbmVkLlxcbmAgK1xuICAgICAgICAgICAgYFBsZWFzZSBjaGVjayB0aGUgcHJvcCBuYW1lIGZvciBhbnkgdHlwb3Mgb3IgZW5zdXJlIHRoYXQgaXQgaXMgcHJvcGVybHkgZGVmaW5lZCBpbiB0aGUgY29tcG9uZW50J3MgcHJvcCBsaXN0LlxcblxcbmAgK1xuICAgICAgICAgICAgYFByb3AgTmFtZTogJHtwcm9wTmFtZX1cXG5gICtcbiAgICAgICAgICAgIGBDb21wb25lbnQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ubmFtZX0sIElEOiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfVxcblxcbmAgK1xuICAgICAgICAgICAgYEZvciBtb3JlIGluZm9ybWF0aW9uLCByZWZlciB0byB0aGUgY29tcG9uZW50IHBhZ2UgaHR0cHM6Ly9kYXNoYm9hcmQubXlvcC5kZXYvZGFzaGJvYXJkL2NvbXBvbmVudC8ke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfSBvciBjb25zdWx0IHRoZSBkZXZlbG9wZXIgZ3VpZGUuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2Vcbn1cblxuY29uc3QgcmVwb3J0VW5zdXBwb3J0ZWQgPSAocHJvcENvbmZpZzogSVByb3BDb25maWcsIHByb3BOYW1lOiBzdHJpbmcsIGNvbXBvbmVudDogSU15b3BDb21wb25lbnQ8YW55LCBhbnk+KSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYEVycm9yOiBDb2RlIFByb3AgTm90IFN1cHBvcnRlZFxcblxcbmAgK1xuICAgICAgICBgQ3VycmVudGx5LCBjb2RlIHByb3BzIGFyZSBvbmx5IHN1cHBvcnRlZCBpbiBsb2NhbCBmcmFtZSBjb21wb25lbnRzLlxcbmAgK1xuICAgICAgICBgXHUyNkEwXHVGRTBGIFRoaXMgaXMgYSB3b3JrIGluIHByb2dyZXNzIGZlYXR1cmUgXHUyMDE0IGNvZGUgcHJvcHMgd2lsbCBiZSBzdXBwb3J0ZWQgaW4gdXBjb21pbmcgdmVyc2lvbnMuXFxuXFxuYCArXG4gICAgICAgIGBJbiB0aGUgbWVhbnRpbWUsIHlvdSBjYW4gdXNlIG1lc3NhZ2UgcHJvcHMuXFxuXFxuYCArXG4gICAgICAgIGBQcm9wIE5hbWU6ICR7cHJvcE5hbWV9XFxuYCArXG4gICAgICAgIGBDb21wb25lbnQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ubmFtZX0sIElEOiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfVxcblxcbmAgK1xuICAgICAgICBgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlZmVyIHRvIHRoZSBjb21wb25lbnQgcGFnZSBodHRwczovL2Rhc2hib2FyZC5teW9wLmRldi9kYXNoYm9hcmQvY29tcG9uZW50LyR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9IG9yIGNvbnN1bHQgdGhlIGRldmVsb3BlciBndWlkZS5gXG4gICAgKTtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbm5lY3RQcm9wcyA9IDxUIGV4dGVuZHMgY29tcG9uZW50RGVmaW5pdGlvblByb3BzPihjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBwcm9wc0NvbmZpZzogSVByb3BDb25maWdbXSwgc2VsZWN0ZWRTa2luOiBJU2tpbkNvbmZpZykgPT4ge1xuXG4gICAgY29uc3QgcHJvcHNNYXAgPSBwcm9wc0NvbmZpZy5yZWR1Y2UoKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRWYWx1ZSkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ucHJldmlvdXNWYWx1ZSxcbiAgICAgICAgICAgIFtjdXJyZW50VmFsdWUubmFtZV06IHsuLi5jdXJyZW50VmFsdWV9XG4gICAgICAgIH1cbiAgICB9LCB7fSk7XG5cbiAgICBjb25zdCBwcm9wc0hhbmRsZXIgPSB7XG4gICAgICAgIGdldDogKF86IElNeW9wQ29tcG9uZW50LCBwcm9wOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IHByb3BDb25maWcgPSBwcm9wc01hcFtwcm9wXTtcblxuICAgICAgICAgICAgaWYgKHJlcG9ydEVycm9yKHByb3BDb25maWcsIHByb3AsIGNvbXBvbmVudCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnR5cGUgPT09IFByb3BDb25maWdCZWhhdmlvclR5cGVzLmNvZGUpIHtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgZXh0cmFjdGVkIHdlYiBjb21wb25lbnRzIEZJUlNUXG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIE15b3BFeHRyYWN0ZWRXZWJDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRQcm9wQmVoYXZpb3IgPSBwcm9wQ29uZmlnLmJlaGF2aW9yIGFzIElQcm9wQ29kZUJlaGF2aW9yO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wTmFtZSA9IHR5cGVkUHJvcEJlaGF2aW9yLnJlbWFwIHx8IHByb3A7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BOYW1lID09PSAnbXlvcF9pbml0X2ludGVyZmFjZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldHVybiBhIGZ1bmN0aW9uIHRoYXQgZ2V0cy9zZXRzIGRhdGEgKG1hdGNoZXMgaWZyYW1lIGJlaGF2aW9yKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkYXRhPzogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5nZXREYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbml0V2l0aERhdGEoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIG15b3BfY3RhX2hhbmRsZXIsIHJldHVybiB1bmRlZmluZWQgKGl0J3Mgd3JpdGUtb25seSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBJc29sYXRlZCBpZnJhbWU6IG5vIHNhbWUtb3JpZ2luIGFjY2VzcyBcdTIwMTQgdXNlIHRoZSBwb3N0TWVzc2FnZSBicmlkZ2VcbiAgICAgICAgICAgICAgICAvLyAoc2FtZSBtZXRob2Qgc3VyZmFjZSBhcyB0aGUgZXh0cmFjdGVkLVdDIGJyYW5jaCBhYm92ZSkuXG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIE15b3BJZnJhbWVDb21wb25lbnQgJiYgY29tcG9uZW50Lmlzb2xhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUHJvcEJlaGF2aW9yID0gcHJvcENvbmZpZy5iZWhhdmlvciBhcyBJUHJvcENvZGVCZWhhdmlvcjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcE5hbWUgPSB0eXBlZFByb3BCZWhhdmlvci5yZW1hcCB8fCBwcm9wO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcE5hbWUgPT09ICdteW9wX2luaXRfaW50ZXJmYWNlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkYXRhPzogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHJldHVybiBjb21wb25lbnQuZ2V0RGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbml0V2l0aERhdGEoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIG15b3BfY3RhX2hhbmRsZXIgaXMgd3JpdGUtb25seVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEZvciBpZnJhbWUgKGxvY2FsRnJhbWUpIGNvbXBvbmVudHNcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRTa2luLmxvYWRlci50eXBlID09PSBTa2luTG9hZGVycy5IVE1MTG9hZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkTG9hZGVyID0gc2VsZWN0ZWRTa2luLmxvYWRlciBhcyBJSFRNTExvYWRlckNvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVkTG9hZGVyLnNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUubG9jYWxGcmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRQcm9wQmVoYXZpb3IgPSBwcm9wQ29uZmlnLmJlaGF2aW9yIGFzIElQcm9wQ29kZUJlaGF2aW9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5lbGVtZW50LmNvbnRlbnRXaW5kb3dbdHlwZWRQcm9wQmVoYXZpb3IucmVtYXAgfHwgcHJvcF1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlcG9ydFVuc3VwcG9ydGVkKHByb3BDb25maWcsIHByb3AsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocHJvcENvbmZpZy5tb2RlID09PSAnb3V0cHV0Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlUGFyYW1zOiBhbnlbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiB0dXJuIGl0IGludG8gY29uZmlnXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnJlZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKFJlZi5jcmVhdGUocHJvcENvbmZpZy5iZWhhdmlvci5yZWYpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaCgoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci5wYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaCguLi5wcm9wQ29uZmlnLmJlaGF2aW9yLnBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VDdG9yID0gbWVzc2FnZXNbcHJvcENvbmZpZy5iZWhhdmlvci5tZXNzYWdlXTtcblxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgbWVzc2FnZUN0b3IoLi4ubWVzc2FnZVBhcmFtcykpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9LFxuICAgICAgICBzZXQ6IChfOiBJTXlvcENvbXBvbmVudCwgcHJvcDogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBwcm9wQ29uZmlnID0gcHJvcHNNYXBbcHJvcF07XG5cbiAgICAgICAgICAgIGlmIChyZXBvcnRFcnJvcihwcm9wQ29uZmlnLCBwcm9wLCBjb21wb25lbnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci50eXBlID09PSBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcy5jb2RlKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGV4dHJhY3RlZCB3ZWIgY29tcG9uZW50cyBGSVJTVCAoYmVmb3JlIGxvY2FsRnJhbWUgY2hlY2spXG4gICAgICAgICAgICAgICAgLy8gYmVjYXVzZSBleHRyYWN0ZWQgd2ViIGNvbXBvbmVudHMgbWF5IGhhdmUgc2hhZG93Um9vdE1vZGU6IGxvY2FsRnJhbWUgaW4gdGhlaXIgY29uZmlnXG4gICAgICAgICAgICAgICAgLy8gYnV0IHRoZXkgcnVuIGRpcmVjdGx5IG9uIHRoZSBob3N0IGRvY3VtZW50LCBub3QgaW4gYW4gaWZyYW1lXG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIE15b3BFeHRyYWN0ZWRXZWJDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRQcm9wQmVoYXZpb3IgPSBwcm9wQ29uZmlnLmJlaGF2aW9yIGFzIElQcm9wQ29kZUJlaGF2aW9yO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wTmFtZSA9IHR5cGVkUHJvcEJlaGF2aW9yLnJlbWFwIHx8IHByb3A7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BOYW1lID09PSAnbXlvcF9jdGFfaGFuZGxlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZXRDdGFIYW5kbGVyKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BOYW1lID09PSAnbXlvcF9pbml0X2ludGVyZmFjZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbml0V2l0aERhdGEodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBJc29sYXRlZCBpZnJhbWU6IHJvdXRlIHZpYSB0aGUgcG9zdE1lc3NhZ2UgYnJpZGdlIChubyBzYW1lLW9yaWdpbiBhY2Nlc3MpLlxuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBNeW9wSWZyYW1lQ29tcG9uZW50ICYmIGNvbXBvbmVudC5pc29sYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFByb3BCZWhhdmlvciA9IHByb3BDb25maWcuYmVoYXZpb3IgYXMgSVByb3BDb2RlQmVoYXZpb3I7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BOYW1lID0gdHlwZWRQcm9wQmVoYXZpb3IucmVtYXAgfHwgcHJvcDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BOYW1lID09PSAnbXlvcF9jdGFfaGFuZGxlcicpIHsgY29tcG9uZW50LnNldEN0YUhhbmRsZXIodmFsdWUpOyByZXR1cm4gdHJ1ZTsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcE5hbWUgPT09ICdteW9wX2luaXRfaW50ZXJmYWNlJykgeyBjb21wb25lbnQuaW5pdFdpdGhEYXRhKHZhbHVlKTsgcmV0dXJuIHRydWU7IH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBGb3IgaWZyYW1lIChsb2NhbEZyYW1lKSBjb21wb25lbnRzXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkU2tpbi5sb2FkZXIudHlwZSA9PT0gU2tpbkxvYWRlcnMuSFRNTExvYWRlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZExvYWRlciA9IHNlbGVjdGVkU2tpbi5sb2FkZXIgYXMgSUhUTUxMb2FkZXJDb25maWc7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZExvYWRlci5zaGFkb3dSb290TW9kZSA9PT0gU2hhZG93Um9vdE1vZGVUeXBlLmxvY2FsRnJhbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUHJvcEJlaGF2aW9yID0gcHJvcENvbmZpZy5iZWhhdmlvciBhcyBJUHJvcENvZGVCZWhhdmlvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRXaW5kb3cgPSAoY29tcG9uZW50LmVsZW1lbnQgYXMgSFRNTElGcmFtZUVsZW1lbnQpLmNvbnRlbnRXaW5kb3cgYXMgYW55O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcE5hbWUgPSB0eXBlZFByb3BCZWhhdmlvci5yZW1hcCB8fCBwcm9wO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIHJlYWwgaGFuZGxlclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFdpbmRvd1twcm9wTmFtZV0gPSB2YWx1ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmx1c2ggQ1RBIHF1ZXVlIGlmIHRoaXMgaXMgbXlvcF9jdGFfaGFuZGxlciBhbmQgcXVldWUgZXhpc3RzXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcE5hbWUgPT09ICdteW9wX2N0YV9oYW5kbGVyJyAmJiBjb250ZW50V2luZG93Ll9fbXlvcF9jdGFfcXVldWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBxdWV1ZSA9IGNvbnRlbnRXaW5kb3cuX19teW9wX2N0YV9xdWV1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50V2luZG93Ll9fbXlvcF9jdGFfcXVldWUgPSBudWxsOyAvLyBDbGVhciB0byBwcmV2ZW50IGRvdWJsZS1mbHVzaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLmZvckVhY2goKGl0ZW06IHthY3Rpb246IHN0cmluZywgcGF5bG9hZDogYW55fSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGlmIGNvbXBvbmVudCB3YXMgZGlzcG9zZWQgZHVyaW5nIGZsdXNoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQubWFya2VkRm9yRGlzcG9zZWQpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUoaXRlbS5hY3Rpb24sIGl0ZW0ucGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXBvcnRVbnN1cHBvcnRlZChwcm9wQ29uZmlnLCBwcm9wLCBjb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy9pZihwcm9wQ29uZmlnLmJlaGF2aW9yID09PSBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcy5tZXNzYWdlKVxuICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLm1vZGUgPT09ICdpbnB1dCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogc3VwcG9ydCBtdWx0aSBiZWhhdmlvcnNcblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci50eXBlID09PSAnbWVzc2FnZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VQYXJhbXM6IGFueVtdID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiB0dXJuIGl0IGludG8gY29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci5yZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2goUmVmLmNyZWF0ZShwcm9wQ29uZmlnLmJlaGF2aW9yLnJlZikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaCguLi5wcm9wQ29uZmlnLmJlaGF2aW9yLnBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VDdG9yID0gbWVzc2FnZXNbcHJvcENvbmZpZy5iZWhhdmlvci5tZXNzYWdlXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBtZXNzYWdlQ3RvciguLi5tZXNzYWdlUGFyYW1zKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBFcnJvcjogVW5zdXBwb3J0ZWQgQmVoYXZpb3JcXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVGhlICdiZWhhdmlvcicgZmllbGQgcHJvdmlkZWQgaXMgbm90IHN1cHBvcnRlZC5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgQ29tcG9uZW50OiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLm5hbWV9LCBJRDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5pZH1cXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgUHJvcCBOYW1lOiAke3Byb3B9XFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEJlaGF2aW9yIEZpZWxkOiAke3Byb3BDb25maWcuYmVoYXZpb3IudHlwZX1cXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgQ2hlY2sgdGhlIGRvY3VtZW50YXRpb24gZm9yIHZhbGlkIGJlaGF2aW9yIG9wdGlvbnMuYFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBvbmVudC5wcm9wcyA9IHt9O1xuICAgIGNvbXBvbmVudC5wcm9wcyA9IG5ldyBQcm94eShjb21wb25lbnQucHJvcHMsIHByb3BzSGFuZGxlcik7XG5cbiAgICByZXR1cm4gY29tcG9uZW50IGFzIChPbWl0PElNeW9wQ29tcG9uZW50LCAncHJvcHMnPiAmIHtcbiAgICAgICAgcHJvcHM6IHByb3BUeXBlczxUPlxuICAgIH0pXG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVSZWZQcm94eSA9ICh0YXJnZXQ6IFJlZiwgY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCkgPT4ge1xuICAgIHJldHVybiBuZXcgUHJveHkodGFyZ2V0LCB7XG4gICAgICAgIGdldCh0YXJnZXQsIHByb3ApIHtcblxuICAgICAgICAgICAgLy8gaWYgKHByb3AgPT09ICdfX25vblByb3hpZWQnKSB7XG4gICAgICAgICAgICAvLyAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgaWYgKHRhcmdldFtwcm9wXSkge1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0W3Byb3BdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBnZXR0ZXJGdW5jdGlvbiA9ICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3MuZm9yRWFjaChhcmcgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb250YWluc1ByaW1pdGl2ZXNPbmx5KGFyZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvcnMubm90U2VyaWFsaXphYmxlUmVmQ2FsbChwcm9wLCBhcmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IEN1c3RvbVJlZk1lc3NhZ2UoKHtyZWYsIHByb3BOYW1lLCBmdW5jdGlvbkFyZ3MsIG1ha2VTZXJpYWxpemFibGV9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcmVmW3Byb3BOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ha2VTZXJpYWxpemFibGUocmVmW3Byb3BOYW1lXSguLi5mdW5jdGlvbkFyZ3MpLCB0cnVlKSAvLyBJbnZva2UgdGhlIGZ1bmN0aW9uIGFuZCByZXR1cm4gaXRzIHJlc3VsdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ha2VTZXJpYWxpemFibGUodmFsdWUsIHRydWUpOyAvLyBSZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IHR1cm4gaXQgdG8gY29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudElkOiB0YXJnZXQucmVmQ29uZmlnLnNlbGVjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BOYW1lOiBwcm9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uQXJnczogYXJnc1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIChtc2cpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG1zZy5jb250ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy9UT0RPOiB3ZSBjYW4gaW1wbGVtZW50IHRoaW5ncyBsaWtlIGF1dG8gc2VyaWFsaXphdGlvbiBhbmQgYmluZGluZyBmdW5jdGlvbnMgaGVyZVxuICAgICAgICAgICAgLy9nZXR0ZXJGdW5jdGlvbi50ZXN0ID0gJzEyMyc7XG5cbiAgICAgICAgICAgIHJldHVybiBnZXR0ZXJGdW5jdGlvbjtcblxuICAgICAgICAgICAgLy9yZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0KHRhcmdldCwgcHJvcDogc3RyaW5nLCB2YWx1ZSkge1xuICAgICAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IEN1c3RvbVJlZk1lc3NhZ2UoKHtyZWYsIHByb3BOYW1lLCBwcm9wVmFsdWV9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWYpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZbcHJvcE5hbWVdID0gcHJvcFZhbHVlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBmaXggdGhhdFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50SWQ6IHRhcmdldC5yZWZDb25maWcuc2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgIHByb3BWYWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHByb3BOYW1lOiBwcm9wXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAobXNnKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IGxvZz9cbiAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgIH0pO1xufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlUmVmQ29tcG9uZW50ID0gYXN5bmMgPFQgZXh0ZW5kcyBJTXlvcENvbXBvbmVudCA9IElNeW9wQ29tcG9uZW50PihyZWY6IFJlZiwgY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBjb21wb25lbnRzOiBJTXlvcENvbXBvbmVudFtdLCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucyk6IFByb21pc2U8VD4gPT4ge1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IHJlZi5jb21wb25lbnQ7XG4gICAgaWYgKCFjb21wb25lbnQpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2FudCBjcmVhdGVSZWZDb21wb25lbnQgd2l0aCBkZXRhY2hlZCByZWYnKTtcblxuICAgIC8vY29uc29sZS5sb2coJ2NyZWF0ZVJlZkNvbXBvbmVudCBjYWxsZWQnLCByZWYsIGNvbXBvbmVudENvbmZpZyk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCByZWZDb21wb25lbnQgPSBuZXcgTXlvcFJlZkNvbXBvbmVudChjb21wb25lbnRDb25maWcudHlwZSwgY29tcG9uZW50LCBvcHRpb25zKTtcbiAgICAgICAgY29tcG9uZW50cy5wdXNoKHJlZkNvbXBvbmVudCk7XG5cbiAgICAgICAgLy8gQSBGQUlMRUQgUkVGIE1VU1QgTk9UIEtFRVAgSVRTIFBMQUNFSE9MREVSLlxuICAgICAgICAvL1xuICAgICAgICAvLyBUaGUgcGxhY2Vob2xkZXIgaXMgcmVnaXN0ZXJlZCBhYm92ZSwgYmVmb3JlIHdlIGtub3cgd2hldGhlciB0aGUgZnJhbWUgY2FuXG4gICAgICAgIC8vIGFjdHVhbGx5IGNyZWF0ZSB0aGUgY29tcG9uZW50LCBhbmQgYm90aCBmYWlsdXJlIHBhdGhzIGJlbG93IHVzZWQgdG8gcmVqZWN0XG4gICAgICAgIC8vIHdpdGhvdXQgcmVtb3ZpbmcgaXQuIFRoZSBjYWxsZXIgZ2V0cyBhIHJlamVjdGlvbiBhbmQgbm8gaGFuZGxlLCBzbyBub2JvZHkgZWxzZVxuICAgICAgICAvLyBjYW4gY2xlYW4gaXQgdXAgZWl0aGVyIC0tIGV4YWN0bHkgdGhlIHNoYXBlIG9mIHRoZSB0aW1lb3V0IGxlYWsgaW5cbiAgICAgICAgLy8gQmFzZU15b3BDb21wb25lbnQuIEl0IGlzIHBlcm1hbmVudCBhbmQgaXQgY29tcG91bmRzOiBldmVyeSByZXRyeSBvZiBhIHJlZiB0aGF0XG4gICAgICAgIC8vIGNhbm5vdCBiZSBjcmVhdGVkIChhIHNlbGVjdG9yIHRoYXQgbWF0Y2hlcyBub3RoaW5nLCBhIGZyYW1lIHRoYXQgbmV2ZXIgYW5zd2VycylcbiAgICAgICAgLy8gYWRkcyBhbm90aGVyIGRlYWQgZW50cnkgdG8gdGhlIGFycmF5IHRoYXQgaXNUcnVzdGVkU291cmNlIHdhbGtzIG9uIGV2ZXJ5XG4gICAgICAgIC8vIG1lc3NhZ2UuIENhdWdodCBieSB0ZXN0L2NvbXBvc2l0ZS1yZWYuZTJlLm1qcyBjYXNlIFIzLlxuICAgICAgICBjb25zdCB1bnJlZ2lzdGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYXQgPSBjb21wb25lbnRzLmluZGV4T2YocmVmQ29tcG9uZW50KTtcbiAgICAgICAgICAgIGlmIChhdCAhPT0gLTEpIGNvbXBvbmVudHMuc3BsaWNlKGF0LCAxKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvL2ZvciBjYXNlcyB3aGVyZSByZWYgY29tcG9uZW50cyBkZWZpbmUgaW4gdGhlIGNvbXBvbmVudCBjb25maWdcbiAgICAgICAgLy8gd2UgbmVlZCB0byB3YWl0IGZvciB0aGUgcm9vdCBjb21wb25lbnQgdGhlIGJlIGluaXRpYXRlZCBiZWZvcmUgaW50ZXJhY3Rpbmcgd2l0aCBpdFxuICAgICAgICBhd2FpdCBjb21wb25lbnQuaW5pdGlhdGVkKCk7XG5cblxuICAgICAgICAvL1RPRE8gOlxuICAgICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAvL3JlamVjdCgndGltZW91dD8nKTtcbiAgICAgICAgICAgIHVucmVnaXN0ZXIoKTtcbiAgICAgICAgICAgIHJlamVjdCgndGltZW91dCcpO1xuICAgICAgICB9LCA1MDAwKTtcblxuICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZShyZWYucmVmQ29uZmlnLFxuICAgICAgICAgICAgY29tcG9uZW50Q29uZmlnLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnMgPyBvcHRpb25zIDoge30sXG4gICAgICAgICAgICAgICAgaWQ6IHJlZkNvbXBvbmVudC5pZCxcbiAgICAgICAgICAgICAgICBfaGFzUGFyZW50OiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXN5bmMgKG1lc3NhZ2UpID0+IHtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGNoZWNrIGlmIHRpbWVvdXQgYWxyZWFkeSBwYXNzZWRcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG5cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5mYWlsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDpcbiAgICAgICAgICAgICAgICAgICAgdW5yZWdpc3RlcigpO1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UgZmFpbGVkJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudCA9IGNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT0gcmVmQ29tcG9uZW50LmlkKTtcblxuICAgICAgICAgICAgICAgIC8vc2FtZSBtZW1vcnkgZW52LCBzYW1lIEhvc3RTREtcbiAgICAgICAgICAgICAgICBpZiAoaW1wbGVtZW50YXRpb25Db21wb25lbnQgJiYgaW1wbGVtZW50YXRpb25Db21wb25lbnQgIT09IHJlZkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBUSEUgUExBQ0VIT0xERVIgSVMgUkVEVU5EQU5UIEhFUkUsIFNPIERST1AgSVQuXG4gICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgYnJhbmNoIG1lYW5zIHRoZSBmcmFtZSBtb3VudGVkIGludG8gT1VSIHJlZ2lzdHJ5IHJhdGhlciB0aGFuXG4gICAgICAgICAgICAgICAgICAgIC8vIGl0cyBvd24gLS0gdGhlIHNhbWUtd2luZG93IGNhc2UgdGhlIHdlYmNvbXBvbmVudCBoYW5kbGVyIGNhbGxzXG4gICAgICAgICAgICAgICAgICAgIC8vIFwic2FtZSBtZW1vcnkgd2hlbiB1c2luZyB3ZWJjb21wb25lbnRcIi4gQm90aCB0aGUgcGxhY2Vob2xkZXIgYW5kIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyByZWFsIGNvbXBvbmVudCB3ZXJlIHRoZW4gcmVnaXN0ZXJlZCB1bmRlciB0aGUgU0FNRSBpZCwgYW5kIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBwbGFjZWhvbGRlciB3YXMgbGVmdCBiZWhpbmQgKHRoZSBgVE9ETyA6IGNsZWFuIHJlZkNvbXBvbmVudCA/YCB0aGF0XG4gICAgICAgICAgICAgICAgICAgIC8vIHVzZWQgdG8gc2l0IGhlcmUpLiBUd28gZW50cmllcywgb25lIGlkLCBvbmUgb2YgdGhlbSBkZWFkLlxuICAgICAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSA9IGltcGxlbWVudGF0aW9uQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGltcGxlbWVudGF0aW9uQ29tcG9uZW50IGFzIHVua25vd24gYXMgVCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBgZmluZGAgQ0FOIENPTUUgQkFDSyBFTVBUWSwgQU5EIHVuZGVmaW5lZCAhPT0gcmVmQ29tcG9uZW50IElTIFRSVUUuXG4gICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgIC8vIFdpdGhvdXQgdGhlIGd1YXJkIGFib3ZlLCB0aGF0IHJlc29sdmVkIHRoZSBjYWxsZXIncyBwcm9taXNlIHdpdGhcbiAgICAgICAgICAgICAgICAgICAgLy8gYHVuZGVmaW5lZGA6IG5vIGVycm9yLCBubyBjb21wb25lbnQsIGFuZCB0aGUgcGxhY2Vob2xkZXIgbGVmdCBpblxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVnaXN0cnkuIFJlcHJvZHVjZWQgYnkgY3JlYXRpbmcgYSByZWYgZnJvbSBhIHdlYiBjb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgLy8gcGFyZW50IChjb21wb3NpdGUtcmVmIGNhc2UgUjUpLCB3aGVyZSB0aGUgcmVhbCBjb21wb25lbnQgaXMgcHVzaGVkXG4gICAgICAgICAgICAgICAgICAgIC8vIGludG8gYSByZWdpc3RyeSB0aGUgY2FwdHVyZWQgYXJyYXkgbm8gbG9uZ2VyIHJlZmxlY3RzLiBGYWxsaW5nXG4gICAgICAgICAgICAgICAgICAgIC8vIHRocm91Z2ggdG8gdGhlIHBsYWNlaG9sZGVyIGdpdmVzIHRoZSBjYWxsZXIgYSB1c2FibGUgY29tcG9uZW50XG4gICAgICAgICAgICAgICAgICAgIC8vIGluc3RlYWQgb2Ygc2lsZW5jZS5cbiAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50LnNldEluaXRpYXRlZCgpXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gPSByZWZDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogaGVyZSA+XG4gICAgICAgICAgICAgICAgLy9UT0RPIDogd2hhdCBhYm91dCByZWFwdGVycyA/ISBkeW5hbWljID8hXG4gICAgICAgICAgICAgICAgLy8gY29uc3QgZXhzaXN0aW5nUmVmQ29tcG9uZW50ID0gY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSBhcyBNeW9wUmVmQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIC8vIGlmIChleHNpc3RpbmdSZWZDb21wb25lbnQuaWQgJiYgZXhzaXN0aW5nUmVmQ29tcG9uZW50LnBhcmVudCkge1xuICAgICAgICAgICAgICAgIC8vICAgICBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdID0gW2NvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0sIHJlZkNvbXBvbmVudF07XG4gICAgICAgICAgICAgICAgLy8gfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0pKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0ucHVzaChyZWZDb21wb25lbnQpXG4gICAgICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gPSByZWZDb21wb25lbnQ7IC8vaG9zdFNESy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09PSByZWZDb21wb25lbnQuaWQpITtcbiAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBpbiB3ZWJjb21wb25lbnQgY2FzZSB0aGUgc2FtZSBpZCB3aWxsIGFscmVkYXkgYmUgaGVyZSwgd2hpY2ggaXMgZ29vZCAhXG4gICAgICAgICAgICAgICAgLy8gbmFtZTpcbiAgICAgICAgICAgICAgICAvLyAgICAgaWRcbiAgICAgICAgICAgICAgICAvLyAgICAgY29tcG9uZW50RGVmaW5pdGlvbklkXG5cbiAgICAgICAgICAgICAgICAvLyBmb3IgaW5uZXIgY29tcG9uZW50cyBpbnNpZGUgcmVmIGNvbXBvbmVudCA6XG4gICAgICAgICAgICAgICAgbWVzc2FnZS5uZXN0ZWRSZWZzLmZvckVhY2gobmVzdGVkUmVmQ29uZmlnID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkQ29tcG9uZW50RGVmaW5pdGlvbiA9IGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5yZXNvbHZlZE5lc3RlZENvbXBvbmVudHMhLmZpbmQoYyA9PiBjLnR5cGUuaWQgPT09IG5lc3RlZFJlZkNvbmZpZy5jb21wb25lbnREZWZpbml0aW9uSWQpIS50eXBlO1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnN0IG5lc3RlZENvbXBvbmVudERlZmluaXRpb24gPSBjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZXNvbHZlZERlZmluaXRpb25zPy5maW5kKGRlZiA9PiBkZWYuaWQgPT09IG5lc3RlZFJlZkNvbmZpZy5jb21wb25lbnREZWZpbml0aW9uSWQpITtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc3QgcmVmQ29uZmlnID0gY29tcG9uZW50Q29uZmlnLnR5cGUucmVmcy5maW5kKHIgPT4gci5uYW1lID09PSBuZXN0ZWRSZWZDb25maWcucmVmTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmICghcmVmQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIHJlZkNvbmZpZyBmb3VuZCBmb3IgbmVzdGVkIHJlZicpO1xuICAgICAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRDb21wb25lbnQgPSBuZXcgTXlvcFJlZkNvbXBvbmVudChuZXN0ZWRDb21wb25lbnREZWZpbml0aW9uLCByZWZDb21wb25lbnQpO1xuICAgICAgICAgICAgICAgICAgICBuZXN0ZWRDb21wb25lbnQuc2V0SW5pdGlhdGVkKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5yZWZzW25lc3RlZFJlZkNvbmZpZy5yZWZOYW1lXSA9IG5lc3RlZENvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5wdXNoKG5lc3RlZENvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgfSk7XG5cblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbm5lY3RSZWZzKHJlZkNvbXBvbmVudCwgY29tcG9uZW50Q29uZmlnLCBjb21wb25lbnRzLCB0cnVlKTtcblxuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOnVzZSBjb25maWcgY2hlY2sgZm9yIGF1dG8taGlnaHQgYW5kIGNvbnZlcnQgdHlwZSBwcm9wZXJseVxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQuc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodClcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZWZDb21wb25lbnQgYXMgdW5rbm93biBhcyBUKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vZGVidWdnZXJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICAvLyB0aHJvdyBlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgIH0pXG59XG5cbmV4cG9ydCBjb25zdCBjb25uZWN0UmVmcyA9IGFzeW5jIChjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBjb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsIGNvbXBvbmVudHM6IElNeW9wQ29tcG9uZW50W10sIHdpdGhvdXRSZWZDb21wb25lbnRzOiBib29sZWFuID0gZmFsc2UpID0+IHtcblxuICAgIGlmICghY29tcG9uZW50LnJlZnMpXG4gICAgICAgIGNvbXBvbmVudC5yZWZzID0ge307XG5cbiAgICBjb25zdCB3YWl0Rm9yID0gT2JqZWN0LnZhbHVlcyhjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZWZzKS5tYXAocmVmID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGlmIChyZWYuYmVoYXZpb3IudHlwZSA9PSBSZWZCZWhhdmlvclR5cGUuY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gY29tcG9uZW50LnJlZnNbcmVmLm5hbWVdID1cblxuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0UmVmQ29tcG9uZW50cykge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBjb21wb25lbnQuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogY2hhbmdlIHRvIGdldCBpdCBmcm9tIHRoZSBmbG93XG4gICAgICAgICAgICAgICAgbGV0IHJlZkNvbXBvbmVudElkID0gKHJlZi5iZWhhdmlvciBhcyBJQ29tcG9uZW50UmVmQmVoYXZpb3IpLmNvbXBvbmVudElkO1xuICAgICAgICAgICAgICAgIGlmICghcmVmQ29tcG9uZW50SWQpXG4gICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudElkID0gKHJlZi5iZWhhdmlvciBhcyBJQ29tcG9uZW50UmVmQmVoYXZpb3IpLmluc3RhbmNlLmNvbXBvbmVudElkXG5cbiAgICAgICAgICAgICAgICAvLyBpZiAoIWNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlc29sdmVkRGVmaW5pdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgcmVqZWN0KG5ldyBFcnJvcignY29tcG9uZW50Q29uZmlnIHByb3ZpZGVkIHdpdGhvdXQgcmVzb2x2ZWREZWZpbml0aW9ucyBjaGVjayB0aGUgY29uZmlnIG9iamVjdCcpKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgLy90aHJvdyBuZXcgRXJyb3IoJ2NvbXBvbmVudENvbmZpZyBwcm92aWRlZCB3aXRob3V0IHJlc29sdmVkRGVmaW5pdGlvbnMgY2hlY2sgdGhlIGNvbmZpZyBvYmplY3QnKTtcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgLy8gY29uc3QgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyA9IGNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlc29sdmVkRGVmaW5pdGlvbnMhLmZpbmQoY29tcGRlZiA9PiBjb21wZGVmLmlkID09PSByZWZDb21wb25lbnRJZCkhO1xuICAgICAgICAgICAgICAgIC8vIC8vY29uc3QgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyA9IGF3YWl0IGdldENvbXBvbmVudERlZmluaXRpb25Db25maWcoY29tcG9uZW50SW5zdGFuY2VDb25maWcuY29tcG9uZW50SWQpO1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gaWYgKCFjb21wb25lbnREZWZpbml0aW9uQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIHJlamVjdChuZXcgRXJyb3IoJ2NvbXBvbmVudENvbmZpZyBwcm92aWRlZCB3aXRob3V0IHJlc29sdmVkRGVmaW5pdGlvbnMgY2hlY2sgdGhlIGNvbmZpZyBvYmplY3QnKSk7XG4gICAgICAgICAgICAgICAgLy8gICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAvL1RPRE86IGlmIHdlIGhhdmUgdGhlIHNhbWUgY29tcG9uZW50IG1vcmUgdGhhbiBvbmNlIHdlIHdpbGwgbmVlZCBpbnN0YW5jZSBpZCBoZXJlIC4uLlxuICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZENvbXBvbmVudENvbmZpZyA9IGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5yZXNvbHZlZE5lc3RlZENvbXBvbmVudHM/LmZpbmQobmVzdGVkQ29tcG9uZW50ID0+IG5lc3RlZENvbXBvbmVudC50eXBlLmlkID09PSByZWZDb21wb25lbnRJZCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIW5lc3RlZENvbXBvbmVudENvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvbXBvbmVudENvbmZpZyBwcm92aWRlZCB3aXRob3V0IG5lc3RlZENvbXBvbmVudENvbmZpZyBjaGVjayB0aGUgY29uZmlnIG9iamVjdCcpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9jb25zdCBjb21wb25lbnRJbnN0YW5jZUNvbmZpZyA9IGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5uZXN0ZWRDb21wb25lbnRzPy5maW5kKGNvbXBvbmVudEluc3RhY2UgPT4gY29tcG9uZW50SW5zdGFjZS5jb21wb25lbnRJZCA9PT0gY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZy5pZCk7XG4gICAgICAgICAgICAgICAgLy8gaWYoIWNvbXBvbmVudERlZmluaXRpb25Db25maWcpe1xuICAgICAgICAgICAgICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RPRE8gVE9ETyBUT0RPICcpO1xuICAgICAgICAgICAgICAgIC8vICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDp0aGluayBhYm91dCB0aGF0IDpcbiAgICAgICAgICAgICAgICAvLyAgIGNvbXBvbmVudERlZmluaXRpb25Db25maWcucmVzb2x2ZWREZWZpbml0aW9ucyA9IGNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlc29sdmVkRGVmaW5pdGlvbnM7XG4gICAgICAgICAgICAgICAgLy8gICBjb25zdCBuZXN0ZWRDb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgaW5zdGFuY2U6IG5lc3RlZENvbXBvbmVudENvbmZpZy5pbnN0YW5jZSEsXG4gICAgICAgICAgICAgICAgLy8gICAgICAgdHlwZTogbmVzdGVkQ29tcG9uZW50Q29uZmlnLnR5cGUsXG4gICAgICAgICAgICAgICAgLy8gICAgICAgbmFtZTogbmVzdGVkQ29tcG9uZW50Q29uZmlnLm5hbWVcbiAgICAgICAgICAgICAgICAvLyAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IF9yZWYgPSBSZWYuY3JlYXRlKCcnLCByZWYsIGNvbXBvbmVudCk7XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCduZXN0ZWQgISEgY3JlYXRlUmVmQ29tcG9uZW50IGNhbGxlZCcpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRDb21wb25lbnQgPSBhd2FpdCBjcmVhdGVSZWZDb21wb25lbnQoX3JlZiwgbmVzdGVkQ29tcG9uZW50Q29uZmlnISwgY29tcG9uZW50cylcbiAgICAgICAgICAgICAgICAgICAgLy9URE9PIDogcHV0IHRoYXQgcmVmIGNvbXBvbmVudCBzb21ld2hlcmU/XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWZzW3JlZi5uYW1lXSA9IG5lc3RlZENvbXBvbmVudDtcblxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBfX25vblByb3hpZWQgPSBSZWYuY3JlYXRlKCcnLCByZWYsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWZzW3JlZi5uYW1lXSA9IGNyZWF0ZVJlZlByb3h5KF9fbm9uUHJveGllZCwgY29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9hbGVydCgnPycpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH0pXG4gICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwod2FpdEZvcik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvL2RlYnVnZ2VyXG4gICAgICAgIHRocm93IGU7XG4gICAgfVxuXG59XG5cbmV4cG9ydCB0eXBlIHByb3BUeXBlczxUIGV4dGVuZHMgY29tcG9uZW50RGVmaW5pdGlvblByb3BzPiA9IHtcbiAgICBbUHJvcGVydHkgaW4ga2V5b2YgVF06XG4gICAgVFtQcm9wZXJ0eV0gZXh0ZW5kcyB7IG1vZGU6ICdpbnB1dCcgfSA/XG4gICAgICAgIFRbUHJvcGVydHldWyd0eXBlJ10gOlxuICAgICAgICBQcm9taXNlPFRbUHJvcGVydHldWyd0eXBlJ10+XG59XG5cbmV4cG9ydCBjb25zdCBleGVjID0gYXN5bmMgKGdldHRlcjogYW55KSA9PiB7XG4gICAgcmV0dXJuIGF3YWl0IGdldHRlcigpXG59XG5cbmV4cG9ydCBjb25zdCBhY3RBcyA9IDxUPihyZWY6IFJlZikgPT4ge1xuICAgIHJldHVybiByZWYgYXMgdW5rbm93biBhcyBGdW5jdGlvbmlmeVJlZjxUPlxufVxuXG5leHBvcnQgdHlwZSBGdW5jdGlvbmlmeVJlZjxUID0gYW55PiA9IHtcbiAgICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzICguLi5hcmdzOiBpbmZlciBBKSA9PiBpbmZlciBSIC8vIElmIGl0J3MgYSBmdW5jdGlvblxuICAgICAgICA/ICguLi5hcmdzOiBBKSA9PiBQcm9taXNlPFI+IC8vIENvbnZlcnQgaXQgdG8gYSBwcm9taXNlZCBmdW5jdGlvblxuICAgICAgICA6IFRbS11cbn07XG4iLCAiaW1wb3J0IHtBdXRvU2l6ZU9wdGlvbnMsIEJhc2VNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsXG4gICAgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCxcbiAgICBFeGVjdXRlU2NyaXB0TWVzc2FnZSwgTWVzc2FnZURpcmVjdGlvbiwgU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlXG59IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElTa2luQ29uZmlnfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge3NldERlYnVnU3R5bGV9IGZyb20gXCIuLi9jb21wb25lbnRDb3JlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXMudHNcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREsudHNcIjtcblxuZXhwb3J0IGNsYXNzIE15b3BJZnJhbWVDb21wb25lbnQgZXh0ZW5kcyBCYXNlTXlvcENvbXBvbmVudCB7XG5cbiAgICBwcml2YXRlIF9hdXRvU2l6ZUNsZWFudXA/OiBDbGVhbnVwSGFuZGxlcjtcbiAgICBwcml2YXRlIF9hdXRvU2l6ZU9wdGlvbnM/OiBBdXRvU2l6ZU9wdGlvbnM7XG4gICAgcHJpdmF0ZSBfYXV0b1NpemVVcGRhdGU/OiAoKSA9PiB2b2lkO1xuXG4gICAgLy8gXHUyNTAwXHUyNTAwIElzb2xhdGlvbiAoc2FuZGJveGVkIGNyb3NzLW9yaWdpbiBmcmFtZSkgXHUyMDE0IHBvc3RNZXNzYWdlIGJyaWRnZSwgaG9zdCBzaWRlIFx1MjUwMFx1MjUwMFxuICAgIHB1YmxpYyBpc29sYXRlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2xhc3REYXRhPzogdW5rbm93bjsgICAgICAgICAgICAgICAvLyBjYWNoZWQgbGFzdC1zZW50IGRhdGEgKHN5bmMgZ2V0RGF0YSlcbiAgICBwcml2YXRlIF9jdGFIYW5kbGVyPzogKGFjdGlvbjogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duKSA9PiB2b2lkO1xuICAgIHByaXZhdGUgX2N0YVF1ZXVlOiBBcnJheTx7IGFjdGlvbjogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duIH0+ID0gW107XG4gICAgcHJpdmF0ZSBfaXNvTXNnSGFuZGxlcj86IChlOiBNZXNzYWdlRXZlbnQpID0+IHZvaWQ7XG4gICAgcHJpdmF0ZSBfaXNvU2l6ZU9wdHM/OiBBdXRvU2l6ZU9wdGlvbnM7XG4gICAgcHJpdmF0ZSBfaXNvQXV0b1NpemUgPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnJpZGdlIHNpemluZyBvbmx5IHdoZW4gYXV0by1zaXplIGlzIG9uXG4gICAgcHJpdmF0ZSBfaXNvTGFzdFNpemU/OiB7IGhlaWdodDogbnVtYmVyLCB3aWR0aD86IG51bWJlciB9OyAgLy8gbGFzdCByZXBvcnRlZCBzaXplIChmb3IgdGhlIGVuYWJsZSByYWNlKVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgcHJpdmF0ZSBJZnJhbWVFbGVtZW50OiBIVE1MSUZyYW1lRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoY29tcG9uZW50Q29uZmlnLCBjb250YWluZXIsIG9wdGlvbnMpXG5cbiAgICAgICAgdGhpcy5lbGVtZW50ID0gdGhpcy5JZnJhbWVFbGVtZW50O1xuICAgICAgICB0aGlzLl9sYXN0RGF0YSA9IG9wdGlvbnM/LmRhdGE7XG4gICAgICAgIC8vIHRoaXMuSWZyYW1lRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsICgpID0+IHtcbiAgICAgICAgLy8gICAgIGlmICh0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0KVxuICAgICAgICAvLyAgICAgICAgIHRoaXMuX3doZW5Jbml0aWF0ZWRSZWplY3QoYElmcmFtZUVsZW1lbnQgZXJyb3JgKTtcbiAgICAgICAgLy8gfSk7XG4gICAgfVxuXG4gICAgc2l6ZU1ldGE/OiB7IHdpZHRoPzogc3RyaW5nIHwgbnVtYmVyOyBoZWlnaHQ/OiBzdHJpbmcgfCBudW1iZXI7IG1pbldpZHRoPzogbnVtYmVyOyBtYXhXaWR0aD86IG51bWJlcjsgbWluSGVpZ2h0PzogbnVtYmVyOyBtYXhIZWlnaHQ/OiBudW1iZXIgfSB8IG51bGw7XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgSXNvbGF0aW9uIGJyaWRnZSAoaG9zdCBzaWRlKSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICAvKiogQXR0YWNoIHRoZSBob3N0LXNpZGUgcG9zdE1lc3NhZ2UgbGlzdGVuZXIgZm9yIGEgc2FuZGJveGVkIGZyYW1lLiAqL1xuICAgIGVuYWJsZUlzb2xhdGlvbigpIHtcbiAgICAgICAgdGhpcy5pc29sYXRlZCA9IHRydWU7XG4gICAgICAgIC8vIElzb2xhdGVkIGZyYW1lcyBkb24ndCBydW4gdGhlIElmcmFtZVNESyBoYW5kc2hha2UgKG5vIHNhbWUtb3JpZ2luIGluaXQpLFxuICAgICAgICAvLyBzbyBtYXJrIGluaXRpYXRlZCBpbW1lZGlhdGVseSBcdTIwMTQgbGlrZSB0aGUgZXh0cmFjdGVkIHdlYiBjb21wb25lbnQgZG9lcy5cbiAgICAgICAgdGhpcy5zZXRJbml0aWF0ZWQoKTtcbiAgICAgICAgdGhpcy5faXNvTXNnSGFuZGxlciA9IChlOiBNZXNzYWdlRXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChlLnNvdXJjZSAhPT0gdGhpcy5JZnJhbWVFbGVtZW50LmNvbnRlbnRXaW5kb3cpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IGQ6IGFueSA9IGUuZGF0YTtcbiAgICAgICAgICAgIGlmICghZCB8fCBkLl9fbXlvcCAhPT0gdHJ1ZSkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKGQudHlwZSA9PT0gJ215b3A6Y3RhJykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jdGFIYW5kbGVyICYmICF0aGlzLm1hcmtlZEZvckRpc3Bvc2VkKSB0aGlzLl9jdGFIYW5kbGVyKGQuYWN0aW9uLCBkLnBheWxvYWQpO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLl9jdGFIYW5kbGVyKSB0aGlzLl9jdGFRdWV1ZS5wdXNoKHsgYWN0aW9uOiBkLmFjdGlvbiwgcGF5bG9hZDogZC5wYXlsb2FkIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkLnR5cGUgPT09ICdteW9wOnNpemUnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYXBwbHlJc29TaXplKGQuaGVpZ2h0LCBkLndpZHRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLl9pc29Nc2dIYW5kbGVyKTtcbiAgICB9XG5cbiAgICAvKiogRGF0YS1pbiBcdTIwMTQgdW5pZmllZCB3aXRoIHRoZSBleHRyYWN0ZWQtV0MgQVBJLiBQb3N0cyBpbml0IG92ZXIgdGhlIGJyaWRnZS4gKi9cbiAgICBpbml0V2l0aERhdGEoZGF0YTogdW5rbm93bik6IHZvaWQge1xuICAgICAgICB0aGlzLl9sYXN0RGF0YSA9IGRhdGE7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudD8uY29udGVudFdpbmRvdz8ucG9zdE1lc3NhZ2UoeyBfX215b3A6IHRydWUsIHR5cGU6ICdteW9wOmluaXQnLCBkYXRhIH0sICcqJyk7XG4gICAgfVxuXG4gICAgLyoqIERhdGEtaW4gZ2V0dGVyIFx1MjAxNCByZXR1cm5zIHRoZSBsYXN0IGRhdGEgdGhlIGhvc3Qgc2VudCAoY2FjaGVkLCBzeW5jaHJvbm91cykuICovXG4gICAgZ2V0RGF0YSgpOiB1bmtub3duIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhc3REYXRhO1xuICAgIH1cblxuICAgIC8qKiBEYXRhLW91dCBcdTIwMTQgdW5pZmllZCB3aXRoIHRoZSBleHRyYWN0ZWQtV0MgQVBJLiBGbHVzaGVzIENUQXMgcXVldWVkIHByZS1oYW5kbGVyLiAqL1xuICAgIHNldEN0YUhhbmRsZXIoaGFuZGxlcjogKGFjdGlvbjogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2N0YUhhbmRsZXIgPSBoYW5kbGVyO1xuICAgICAgICBpZiAodGhpcy5fY3RhUXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgcXVldWUgPSBbLi4udGhpcy5fY3RhUXVldWVdO1xuICAgICAgICAgICAgdGhpcy5fY3RhUXVldWUgPSBbXTtcbiAgICAgICAgICAgIHF1ZXVlLmZvckVhY2goaXRlbSA9PiB7IGlmICghdGhpcy5tYXJrZWRGb3JEaXNwb3NlZCkgaGFuZGxlcihpdGVtLmFjdGlvbiwgaXRlbS5wYXlsb2FkKTsgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9hcHBseUlzb1NpemUoaGVpZ2h0OiBudW1iZXIsIHdpZHRoPzogbnVtYmVyKSB7XG4gICAgICAgIGlmICghaGVpZ2h0IHx8IE51bWJlci5pc05hTihoZWlnaHQpKSByZXR1cm47XG4gICAgICAgIC8vIEFsd2F5cyByZW1lbWJlciB0aGUgbGF0ZXN0IHJlcG9ydGVkIHNpemUgc28gaXQgY2FuIGJlIGFwcGxpZWQgaWYvd2hlblxuICAgICAgICAvLyBhdXRvLXNpemluZyBpcyBlbmFibGVkIGFmdGVyIHRoZSBmaXJzdCBtZXNzYWdlIGFycml2ZXMuXG4gICAgICAgIHRoaXMuX2lzb0xhc3RTaXplID0geyBoZWlnaHQsIHdpZHRoIH07XG4gICAgICAgIC8vIFJlc3BlY3QgYXV0b1NpemU6ZmFsc2UgXHUyMDE0IHRoZSBob3N0IG93bnMgZGltZW5zaW9ucywgc28gZG9uJ3QgdG91Y2ggdGhlbS5cbiAgICAgICAgaWYgKCF0aGlzLl9pc29BdXRvU2l6ZSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBvcHRzID0gdGhpcy5faXNvU2l6ZU9wdHM7XG4gICAgICAgIGNvbnN0IHRvTnVtID0gKHY6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCk6IG51bWJlciB8IHVuZGVmaW5lZCA9PlxuICAgICAgICAgICAgdiA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogKHR5cGVvZiB2ID09PSAnbnVtYmVyJyA/IHYgOiAoaXNOYU4ocGFyc2VGbG9hdCh2KSkgPyB1bmRlZmluZWQgOiBwYXJzZUZsb2F0KHYpKSk7XG4gICAgICAgIGNvbnN0IG1pbiA9IHRvTnVtKG9wdHM/Lm1pbkhlaWdodCksIG1heCA9IHRvTnVtKG9wdHM/Lm1heEhlaWdodCk7XG4gICAgICAgIGxldCBoID0gaGVpZ2h0O1xuICAgICAgICBpZiAobWluICE9PSB1bmRlZmluZWQgJiYgaCA8IG1pbikgaCA9IG1pbjtcbiAgICAgICAgaWYgKG1heCAhPT0gdW5kZWZpbmVkICYmIGggPiBtYXgpIGggPSBtYXg7XG4gICAgICAgIC8vIFRyYW5zaXRpb24gZnJvbSBhYnNvbHV0ZSBvdmVybGF5IHRvIGRvY3VtZW50IGZsb3cgYXQgdGhlIG1lYXN1cmVkIGhlaWdodC5cbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmluc2V0ID0gJ2F1dG8nO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gaCArICdweCc7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICAgICAgb3B0cz8ub25TaXplQ2hhbmdlPy4oeyB3aWR0aDogd2lkdGggPz8gdGhpcy5JZnJhbWVFbGVtZW50LmNsaWVudFdpZHRoLCBoZWlnaHQ6IGgsIGF1dG9TaXppbmdXaWR0aDogZmFsc2UsIGF1dG9TaXppbmdIZWlnaHQ6IHRydWUgfSBhcyBhbnkpO1xuICAgIH1cblxuICAgIGNsZWFudXBJbnNwZWN0PzogQ2xlYW51cEhhbmRsZXI7XG5cbiAgICBpbnNwZWN0KCkge1xuICAgICAgICAvLyBUT0RPIDogdXNlIGJldHRlciBjaGVjayBmb3IgaW5zcGVjdCBtb2RlXG4gICAgICAgIGlmICh0aGlzLmNsZWFudXBJbnNwZWN0KSB7XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdpbnNwZWN0IGNhbGwgbW9yZSB0aGFuIG9uY2UnKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNsZWFudXBJbnNwZWN0XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCA9IHNldERlYnVnU3R5bGUodGhpcy5pZCwgJ015b3BJZnJhbWVDb21wb25lbnQnLCAxMCwgdGhpcy5jb250YWluZXIsIHRoaXMuSWZyYW1lRWxlbWVudCwgdGhpcy5jb21wb25lbnREZWZpbml0aW9uKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QhKCk7XG4gICAgICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0ID0gdW5kZWZpbmVkO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGhpZGUoKSB7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnXG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnXG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgfVxuXG4gICAgc2hvdygpIHtcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMSc7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICd1bnNldCdcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYWxsJ1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcbiAgICB9XG5cbiAgICBzZXRIZWlnaHRCYXNlZE9uRG9jdW1lbnRFbGVtZW50ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICB9LCAocmV0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7cmV0LmNvbnRlbnR9cHhgO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIG9ic2VydmVTaXplQmFzZWRPbkRvY3VtZW50RWxlbWVudCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSB0aGlzLnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCh7c2VuZH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHtoZWlnaHQsIHdpZHRofSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHtoZWlnaHQsIHdpZHRofSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICBzZW5kKHtoZWlnaHQsIHdpZHRofSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtcbiAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSk7XG5cbiAgICAgICAgICAgIHJldHVybiB7aGVpZ2h0LCB3aWR0aH1cbiAgICAgICAgfSwgKHJldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7cmV0LmNvbnRlbnQud2lkdGh9cHhgO1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke3JldC5jb250ZW50LmhlaWdodH1weGA7XG4gICAgICAgIH0pKTtcblxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT2JzZXJ2ZXMgdGhlIGlmcmFtZSBjb250ZW50IHNpemUgYW5kIGF1dG9tYXRpY2FsbHkgc3luY3MgaXQgdG8gdGhlIGlmcmFtZSBlbGVtZW50LlxuICAgICAqIFVzZXMgZGlyZWN0IGNvbnRlbnREb2N1bWVudCBhY2Nlc3MgKHNhbWUtb3JpZ2luIG9ubHkpIGZvciBhY2N1cmF0ZSBtZWFzdXJlbWVudHMuXG4gICAgICpcbiAgICAgKiBSZWVudHJhbnQ6IHdoZW4gY2FsbGVkIGFnYWluIHdoaWxlIG9ic2VydmVycyBhbHJlYWR5IGV4aXN0LCB1cGRhdGVzIG9wdGlvbnMgYW5kXG4gICAgICogcmUtZXZhbHVhdGVzIHNpemluZyB3aXRob3V0IHJlY3JlYXRpbmcgb2JzZXJ2ZXJzLiBDbGVhbnVwICsgcmUtY2FsbCAoZS5nLiBSZWFjdFxuICAgICAqIHJlLXJlbmRlcikgY3JlYXRlcyBmcmVzaCBvYnNlcnZlcnMgc2luY2UgY2xlYW51cCBjbGVhcnMgdGhlIGV4aXN0aW5nIG9uZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbmNsdWRpbmcgc2l6ZSBjaGFuZ2UgY2FsbGJhY2sgYW5kIG1pbi9tYXggY29uc3RyYWludHNcbiAgICAgKiBAcmV0dXJucyBDbGVhbnVwIGZ1bmN0aW9uIHRvIHN0b3Agb2JzZXJ2aW5nXG4gICAgICovXG4gICAgb2JzZXJ2ZUF1dG9TaXplID0gKG9wdGlvbnM/OiBBdXRvU2l6ZU9wdGlvbnMpOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgICAgIC8vIFN0b3JlIG9wdGlvbnMgc28gdXBkYXRlU2l6ZSBhbHdheXMgcmVhZHMgdGhlIGxhdGVzdFxuICAgICAgICB0aGlzLl9hdXRvU2l6ZU9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgICAgIC8vIElzb2xhdGVkIGZyYW1lcyBjYW4ndCBiZSBtZWFzdXJlZCBjcm9zcy1vcmlnaW4gXHUyMDE0IHNpemluZyBpcyBkcml2ZW4gYnlcbiAgICAgICAgLy8gJ215b3A6c2l6ZScgcG9zdE1lc3NhZ2VzIGZyb20gdGhlIGJyaWRnZSAoc2VlIF9hcHBseUlzb1NpemUpLlxuICAgICAgICBpZiAodGhpcy5pc29sYXRlZCkge1xuICAgICAgICAgICAgdGhpcy5faXNvU2l6ZU9wdHMgPSBvcHRpb25zO1xuICAgICAgICAgICAgdGhpcy5faXNvQXV0b1NpemUgPSB0cnVlO1xuICAgICAgICAgICAgLy8gQXBwbHkgdGhlIG1vc3QgcmVjZW50IGJyaWRnZS1yZXBvcnRlZCBzaXplIChpdCBtYXkgaGF2ZSBhcnJpdmVkIGJlZm9yZVxuICAgICAgICAgICAgLy8gYXV0by1zaXppbmcgd2FzIHR1cm5lZCBvbikuXG4gICAgICAgICAgICBpZiAodGhpcy5faXNvTGFzdFNpemUpIHRoaXMuX2FwcGx5SXNvU2l6ZSh0aGlzLl9pc29MYXN0U2l6ZS5oZWlnaHQsIHRoaXMuX2lzb0xhc3RTaXplLndpZHRoKTtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7IHRoaXMuX2lzb0F1dG9TaXplID0gZmFsc2U7IHRoaXMuX2lzb1NpemVPcHRzID0gdW5kZWZpbmVkOyB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgb2JzZXJ2ZXJzIGFscmVhZHkgZXhpc3QsIHJlLWV2YWx1YXRlIHdpdGggbmV3IG9wdGlvbnMgYW5kIHJldXNlIHRoZW1cbiAgICAgICAgaWYgKHRoaXMuX2F1dG9TaXplQ2xlYW51cCAmJiB0aGlzLl9hdXRvU2l6ZVVwZGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5fYXV0b1NpemVVcGRhdGUoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hdXRvU2l6ZUNsZWFudXA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpZnJhbWUgPSB0aGlzLklmcmFtZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGRvYyA9IGlmcmFtZS5jb250ZW50RG9jdW1lbnQ7XG5cbiAgICAgICAgaWYgKCFkb2MpIHtcbiAgICAgICAgICAgIC8vIENyb3NzLW9yaWdpbiAodjEgY29tcG9uZW50cyBvbiB0aGUgY3VzdG9tZXIncyBkb21haW4pOiBtZWFzdXJlIGluc2lkZSB0aGUgZnJhbWUuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5vYnNlcnZlSGVpZ2h0VmlhQnJpZGdlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbGFtcCA9ICh2YWx1ZTogbnVtYmVyLCBtaW4/OiBudW1iZXIsIG1heD86IG51bWJlcik6IG51bWJlciA9PiB7XG4gICAgICAgICAgICBpZiAobWluICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgPCBtaW4pIHJldHVybiBtaW47XG4gICAgICAgICAgICBpZiAobWF4ICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgPiBtYXgpIHJldHVybiBtYXg7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gUGFyc2UgQ1NTIHNpemUgdmFsdWVzIHRvIG51bWJlcnNcbiAgICAgICAgY29uc3QgcGFyc2VTaXplID0gKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQpOiBudW1iZXIgfCB1bmRlZmluZWQgPT4ge1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBpc05hTihwYXJzZWQpID8gdW5kZWZpbmVkIDogcGFyc2VkO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHVwZGF0ZVNpemUgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50RG9jID0gaWZyYW1lLmNvbnRlbnREb2N1bWVudDtcbiAgICAgICAgICAgIGlmICghY29udGVudERvYykgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCBvcHRzID0gdGhpcy5fYXV0b1NpemVPcHRpb25zO1xuXG4gICAgICAgICAgICBjb25zdCBtaW5XaWR0aCA9IHBhcnNlU2l6ZShvcHRzPy5taW5XaWR0aCk7XG4gICAgICAgICAgICBjb25zdCBtYXhXaWR0aCA9IHBhcnNlU2l6ZShvcHRzPy5tYXhXaWR0aCk7XG4gICAgICAgICAgICBjb25zdCBtaW5IZWlnaHQgPSBwYXJzZVNpemUob3B0cz8ubWluSGVpZ2h0KTtcbiAgICAgICAgICAgIGNvbnN0IG1heEhlaWdodCA9IHBhcnNlU2l6ZShvcHRzPy5tYXhIZWlnaHQpO1xuICAgICAgICAgICAgY29uc3QgbG9hZGVyTWluSGVpZ2h0ID0gb3B0cz8ubG9hZGVyTWluSGVpZ2h0ID8/IDUwO1xuXG4gICAgICAgICAgICAvLyBSZXNvbHZlIGV4cGxpY2l0IGRpbWVuc2lvbnM6IGhvc3Qgb3B0aW9ucyBcdTIxOTIgc2l6ZU1ldGEgZmlsbCBtb2RlIFx1MjE5MiB3aWR0aCBkZWZhdWx0cyB0byBcIjEwMCVcIlxuICAgICAgICAgICAgLy8gV2lkdGggZGVmYXVsdHMgdG8gXCIxMDAlXCIgKGJsb2NrIGVsZW1lbnQgYmVoYXZpb3IpIHRvIHByZXZlbnQgdGhlIHNocmluay10by0wIG1lYXN1cmVtZW50IGJ1Zy5cbiAgICAgICAgICAgIC8vIEhlaWdodCBoYXMgbm8gZGVmYXVsdCBzbyBpdCBhdXRvLXNpemVzIHRvIGNvbnRlbnQuXG4gICAgICAgICAgICAvLyBPbmx5IHNpemVNZXRhIFwiMTAwJVwiIChmaWxsIG1vZGUpIGlzIHRyZWF0ZWQgYXMgZXhwbGljaXQgYW5kIGRpc2FibGVzIGF1dG8tc2l6aW5nLlxuICAgICAgICAgICAgLy8gUGl4ZWwgc2l6ZU1ldGEgdmFsdWVzIChlLmcuLCBoZWlnaHQ6IDIwMCkgYXJlIGluaXRpYWwgaGludHMsIE5PVCBleHBsaWNpdCBjb25zdHJhaW50cy5cbiAgICAgICAgICAgIGNvbnN0IHNpemVNZXRhRmlsbFdpZHRoID0gdGhpcy5zaXplTWV0YT8ud2lkdGggPT09IFwiMTAwJVwiID8gXCIxMDAlXCIgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBzaXplTWV0YUZpbGxIZWlnaHQgPSB0aGlzLnNpemVNZXRhPy5oZWlnaHQgPT09IFwiMTAwJVwiID8gXCIxMDAlXCIgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZEV4cGxpY2l0V2lkdGggPSBvcHRzPy5leHBsaWNpdFdpZHRoID8/IHNpemVNZXRhRmlsbFdpZHRoID8/IFwiMTAwJVwiO1xuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRFeHBsaWNpdEhlaWdodCA9IG9wdHM/LmV4cGxpY2l0SGVpZ2h0ID8/IHNpemVNZXRhRmlsbEhlaWdodDtcbiAgICAgICAgICAgIGNvbnN0IGhhc0V4cGxpY2l0V2lkdGggPSByZXNvbHZlZEV4cGxpY2l0V2lkdGggIT09IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGhhc0V4cGxpY2l0SGVpZ2h0ID0gcmVzb2x2ZWRFeHBsaWNpdEhlaWdodCAhPT0gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICAvLyBEZXRlY3QgY29sbGFwc2VkIGRpbWVuc2lvbnMgZnJvbSBjb250YWluZXIgKHRoaXMuY29udGFpbmVyKVxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IHRoaXMuY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgY29uc3QgY29sbGFwc2VkV2lkdGggPSBjb250YWluZXJSZWN0LndpZHRoID09PSAwO1xuICAgICAgICAgICAgLy8gQ29uc2lkZXIgY29sbGFwc2VkIGlmIGhlaWdodCBpcyAwIE9SIGVxdWFscyB0aGUgbG9hZGVyIG1pbkhlaWdodFxuICAgICAgICAgICAgY29uc3QgY29sbGFwc2VkSGVpZ2h0ID0gY29udGFpbmVyUmVjdC5oZWlnaHQgPT09IDAgfHwgY29udGFpbmVyUmVjdC5oZWlnaHQgPT09IGxvYWRlck1pbkhlaWdodDtcblxuICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHdoaWNoIGRpbWVuc2lvbnMgdG8gYXV0by1zaXplOlxuICAgICAgICAgICAgLy8gLSBJZiBmb3JjZUF1dG9TaXplIGlzIHRydWUsIGF1dG8tc2l6ZSB1bmxlc3MgZXhwbGljaXQgZGltZW5zaW9uIGlzIHNldFxuICAgICAgICAgICAgLy8gLSBPdGhlcndpc2UsIGF1dG8tc2l6ZSBvbmx5IGlmIGNvbGxhcHNlZFxuICAgICAgICAgICAgY29uc3Qgc2hvdWxkQXV0b1dpZHRoID0gb3B0cz8uZm9yY2VBdXRvU2l6ZVxuICAgICAgICAgICAgICAgID8gIWhhc0V4cGxpY2l0V2lkdGhcbiAgICAgICAgICAgICAgICA6IChjb2xsYXBzZWRXaWR0aCAmJiAhaGFzRXhwbGljaXRXaWR0aCk7XG4gICAgICAgICAgICBjb25zdCBzaG91bGRBdXRvSGVpZ2h0ID0gb3B0cz8uZm9yY2VBdXRvU2l6ZVxuICAgICAgICAgICAgICAgID8gIWhhc0V4cGxpY2l0SGVpZ2h0XG4gICAgICAgICAgICAgICAgOiAoY29sbGFwc2VkSGVpZ2h0ICYmICFoYXNFeHBsaWNpdEhlaWdodCk7XG5cbiAgICAgICAgICAgIC8vIElmIG5vdGhpbmcgbmVlZHMgYXV0by1zaXppbmcsIGFwcGx5IGV4cGxpY2l0L3BlcmNlbnRhZ2UgZGltZW5zaW9uc1xuICAgICAgICAgICAgaWYgKCFzaG91bGRBdXRvV2lkdGggJiYgIXNob3VsZEF1dG9IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBpZnJhbWUuc3R5bGUud2lkdGggPSB0eXBlb2YgcmVzb2x2ZWRFeHBsaWNpdFdpZHRoID09PSAnbnVtYmVyJyA/IGAke3Jlc29sdmVkRXhwbGljaXRXaWR0aH1weGAgOiAnMTAwJSc7XG4gICAgICAgICAgICAgICAgaWZyYW1lLnN0eWxlLmhlaWdodCA9IHR5cGVvZiByZXNvbHZlZEV4cGxpY2l0SGVpZ2h0ID09PSAnbnVtYmVyJyA/IGAke3Jlc29sdmVkRXhwbGljaXRIZWlnaHR9cHhgIDogJzEwMCUnO1xuXG4gICAgICAgICAgICAgICAgb3B0cz8ub25TaXplQ2hhbmdlPy4oe1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogdHlwZW9mIHJlc29sdmVkRXhwbGljaXRXaWR0aCA9PT0gJ251bWJlcicgPyByZXNvbHZlZEV4cGxpY2l0V2lkdGggOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogdHlwZW9mIHJlc29sdmVkRXhwbGljaXRIZWlnaHQgPT09ICdudW1iZXInID8gcmVzb2x2ZWRFeHBsaWNpdEhlaWdodCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgYXV0b1NpemluZ1dpZHRoOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgYXV0b1NpemluZ0hlaWdodDogZmFsc2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBEaXNhYmxlIENTUyB0cmFuc2l0aW9ucyBvbiBpZnJhbWUgYW5kIGNvbnRhaW5lciBmb3IgdGhlIGVudGlyZVxuICAgICAgICAgICAgLy8gbWVhc3VyZW1lbnQgKyBoZWlnaHQtc2V0dGluZyBjeWNsZS4gSG9zdCBhcHBzIG1heSBzZXQgYHRyYW5zaXRpb246IGFsbGBcbiAgICAgICAgICAgIC8vIHdoaWNoIHdvdWxkIGFuaW1hdGUgdGhlIDBweCBjb2xsYXBzZSBhbmQgZmluYWwgaGVpZ2h0IGNoYW5nZSwgY2F1c2luZ1xuICAgICAgICAgICAgLy8gdmlzaWJsZSBqdW1wcyBkdXJpbmcgc2Nyb2xsLlxuICAgICAgICAgICAgY29uc3QgcHJldlRyYW5zaXRpb24gPSBpZnJhbWUuc3R5bGUudHJhbnNpdGlvbjtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyO1xuICAgICAgICAgICAgY29uc3QgcHJldkNvbnRhaW5lclRyYW5zaXRpb24gPSBjb250YWluZXIuc3R5bGUudHJhbnNpdGlvbjtcbiAgICAgICAgICAgIGlmcmFtZS5zdHlsZS50cmFuc2l0aW9uID0gJ25vbmUnO1xuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLnRyYW5zaXRpb24gPSAnbm9uZSc7XG5cbiAgICAgICAgICAgIC8vIFF1aWNrIHByZS1jaGVjazogcmVhZCBzY3JvbGxIZWlnaHQvV2lkdGggQkVGT1JFIGNvbGxhcHNpbmcgdGhlIGlmcmFtZS5cbiAgICAgICAgICAgIC8vIElmIGNvbnRlbnQgb25seSBncmV3IChzY3JvbGxIZWlnaHQgPiBpZnJhbWUgaGVpZ2h0KSwgd2UgY2FuIHNraXAgdGhlXG4gICAgICAgICAgICAvLyAwcHggY29sbGFwc2UgXHUyMDE0IHNjcm9sbEhlaWdodCBuYXR1cmFsbHkgZXhwYW5kcyBiZXlvbmQgdGhlIGlmcmFtZS5cbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRJZnJhbWVIZWlnaHQgPSBpZnJhbWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgICAgICAgICAgY29uc3QgY3VycmVudElmcmFtZVdpZHRoID0gaWZyYW1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgICAgICAgICAgY29uc3QgcHJlU2Nyb2xsSGVpZ2h0ID0gTWF0aC5jZWlsKE1hdGgubWF4KGNvbnRlbnREb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCwgY29udGVudERvYy5ib2R5LnNjcm9sbEhlaWdodCwgY29udGVudERvYy5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCkpO1xuICAgICAgICAgICAgY29uc3QgcHJlU2Nyb2xsV2lkdGggPSBNYXRoLmNlaWwoTWF0aC5tYXgoY29udGVudERvYy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsV2lkdGgsIGNvbnRlbnREb2MuYm9keS5zY3JvbGxXaWR0aCwgY29udGVudERvYy5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKSk7XG5cbiAgICAgICAgICAgIGxldCBjb250ZW50V2lkdGggPSBwcmVTY3JvbGxXaWR0aDtcbiAgICAgICAgICAgIGxldCBjb250ZW50SGVpZ2h0ID0gcHJlU2Nyb2xsSGVpZ2h0O1xuXG4gICAgICAgICAgICBjb25zdCBoZWlnaHRHcmV3ID0gc2hvdWxkQXV0b0hlaWdodCAmJiBwcmVTY3JvbGxIZWlnaHQgPiBjdXJyZW50SWZyYW1lSGVpZ2h0ICsgMTtcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoR3JldyA9IHNob3VsZEF1dG9XaWR0aCAmJiBwcmVTY3JvbGxXaWR0aCA+IGN1cnJlbnRJZnJhbWVXaWR0aCArIDE7XG5cbiAgICAgICAgICAgIC8vIEZvciBub24tZ3JvdyBjYXNlcyAoc2hyaW5rIG9yIG5vLWNoYW5nZSksIHdlIG11c3QgY29sbGFwc2UgdG8gMHB4IHRvXG4gICAgICAgICAgICAvLyBtZWFzdXJlIHRoZSB0cnVlIGNvbnRlbnQgaGVpZ2h0LiBzY3JvbGxIZWlnaHQgY2FuIG5ldmVyIGRlY3JlYXNlIGJlbG93XG4gICAgICAgICAgICAvLyB0aGUgaWZyYW1lJ3MgY2xpZW50SGVpZ2h0LCBzbyBzaHJpbmsgaXMgdW5kZXRlY3RhYmxlIHdpdGhvdXQgY29sbGFwc2luZy5cbiAgICAgICAgICAgIC8vIFdpdGggdHJhbnNpdGlvbnMgZGlzYWJsZWQgKyBjb250YWluZXIgbWluLWhlaWdodCBoZWxkLCB0aGUgY29sbGFwc2VcbiAgICAgICAgICAgIC8vIGlzIGludmlzaWJsZSAobm8gbGF5b3V0IHNoaWZ0LCBubyBhbmltYXRpb24pLlxuICAgICAgICAgICAgY29uc3QgbmVlZHNIZWlnaHRDb2xsYXBzZSA9IHNob3VsZEF1dG9IZWlnaHQgJiYgIWhlaWdodEdyZXc7XG4gICAgICAgICAgICBjb25zdCBuZWVkc1dpZHRoQ29sbGFwc2UgPSBzaG91bGRBdXRvV2lkdGggJiYgIXdpZHRoR3JldztcblxuICAgICAgICAgICAgaWYgKG5lZWRzSGVpZ2h0Q29sbGFwc2UgfHwgbmVlZHNXaWR0aENvbGxhcHNlKSB7XG4gICAgICAgICAgICAgICAgLy8gSG9sZCB0aGUgY29udGFpbmVyJ3MgbWluLWhlaWdodC93aWR0aCBkdXJpbmcgbWVhc3VyZW1lbnQgdG8gcHJldmVudFxuICAgICAgICAgICAgICAgIC8vIGxheW91dCBzaGlmdCAoZWxlbWVudHMgYmVsb3cgdGhlIGlmcmFtZSB3b24ndCBqdW1wKS5cbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2TWluSGVpZ2h0ID0gY29udGFpbmVyLnN0eWxlLm1pbkhlaWdodDtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2TWluV2lkdGggPSBjb250YWluZXIuc3R5bGUubWluV2lkdGg7XG4gICAgICAgICAgICAgICAgaWYgKG5lZWRzSGVpZ2h0Q29sbGFwc2UpIGNvbnRhaW5lci5zdHlsZS5taW5IZWlnaHQgPSBgJHtjdXJyZW50SWZyYW1lSGVpZ2h0fXB4YDtcbiAgICAgICAgICAgICAgICBpZiAobmVlZHNXaWR0aENvbGxhcHNlKSBjb250YWluZXIuc3R5bGUubWluV2lkdGggPSBgJHtjdXJyZW50SWZyYW1lV2lkdGh9cHhgO1xuXG4gICAgICAgICAgICAgICAgaWYgKG5lZWRzSGVpZ2h0Q29sbGFwc2UpIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSAnMHB4JztcbiAgICAgICAgICAgICAgICBpZiAobmVlZHNXaWR0aENvbGxhcHNlKSBpZnJhbWUuc3R5bGUud2lkdGggPSAnMHB4JztcblxuICAgICAgICAgICAgICAgIGNvbnRlbnRXaWR0aCA9IE1hdGguY2VpbChNYXRoLm1heChjb250ZW50RG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxXaWR0aCwgY29udGVudERvYy5ib2R5LnNjcm9sbFdpZHRoLCBjb250ZW50RG9jLmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgpKTtcbiAgICAgICAgICAgICAgICBjb250ZW50SGVpZ2h0ID0gTWF0aC5jZWlsKE1hdGgubWF4KGNvbnRlbnREb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCwgY29udGVudERvYy5ib2R5LnNjcm9sbEhlaWdodCwgY29udGVudERvYy5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCkpO1xuXG4gICAgICAgICAgICAgICAgLy8gRmFsbGJhY2s6IGlmIGNvbGxhcHNpbmcgdG8gMHB4IGdhdmUgYSBuZWFyLXplcm8gbWVhc3VyZW1lbnQsIHRoZSBjb21wb25lbnRcbiAgICAgICAgICAgICAgICAvLyBsaWtlbHkgaGFzIGBoZWlnaHQ6IDEwMCVgIGNoYWlucyAoaHRtbCA+IGJvZHkgPiAuYXBwLWNvbnRhaW5lcikgdGhhdCBjYXNjYWRlZFxuICAgICAgICAgICAgICAgIC8vIHRoZSBjb2xsYXBzZSBpbnRvIGFsbCBjaGlsZHJlbi4gUmV0cnkgd2l0aCBhIG51Y2xlYXIgb3ZlcnJpZGUgdGhhdCBmb3JjZXMgYWxsXG4gICAgICAgICAgICAgICAgLy8gZWxlbWVudHMgdG8gaW50cmluc2ljIHNpemluZy4gVGhpcyBpcyBvbmx5IGEgZmFsbGJhY2sgYmVjYXVzZSB0aGUgb3ZlcnJpZGVcbiAgICAgICAgICAgICAgICAvLyBicmVha3MgZXhwbGljaXQgcGl4ZWwgaGVpZ2h0cyAoZS5nLiA4cHggaW5kaWNhdG9yIGRvdHMgXHUyMTkyIDBweCkuXG4gICAgICAgICAgICAgICAgY29uc3QgbmVlZHNOdWNsZWFySGVpZ2h0ID0gbmVlZHNIZWlnaHRDb2xsYXBzZSAmJiBjb250ZW50SGVpZ2h0IDwgMjtcbiAgICAgICAgICAgICAgICBjb25zdCBuZWVkc051Y2xlYXJXaWR0aCA9IG5lZWRzV2lkdGhDb2xsYXBzZSAmJiBjb250ZW50V2lkdGggPCAyO1xuICAgICAgICAgICAgICAgIGlmIChuZWVkc051Y2xlYXJIZWlnaHQgfHwgbmVlZHNOdWNsZWFyV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVhc3VyZVN0eWxlID0gY29udGVudERvYy5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgICAgICAgICAgICAgICBtZWFzdXJlU3R5bGUuaWQgPSAnX19teW9wX21lYXN1cmUnO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBydWxlczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5lZWRzTnVjbGVhckhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVsZXMucHVzaCgnaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQnLCAnbWluLWhlaWdodDogMCAhaW1wb3J0YW50JywgJ21heC1oZWlnaHQ6IG5vbmUgIWltcG9ydGFudCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZWVkc051Y2xlYXJXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVsZXMucHVzaCgnd2lkdGg6IGF1dG8gIWltcG9ydGFudCcsICdtaW4td2lkdGg6IDAgIWltcG9ydGFudCcsICdtYXgtd2lkdGg6IG5vbmUgIWltcG9ydGFudCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lYXN1cmVTdHlsZS50ZXh0Q29udGVudCA9IGAqLCAqOjpiZWZvcmUsICo6OmFmdGVyIHsgJHtydWxlcy5qb2luKCc7ICcpfTsgZmxleC1iYXNpczogYXV0byAhaW1wb3J0YW50OyBmbGV4LWdyb3c6IDAgIWltcG9ydGFudDsgfWA7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnREb2MuaGVhZC5hcHBlbmRDaGlsZChtZWFzdXJlU3R5bGUpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRXaWR0aCA9IE1hdGguY2VpbChNYXRoLm1heChjb250ZW50RG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxXaWR0aCwgY29udGVudERvYy5ib2R5LnNjcm9sbFdpZHRoLCBjb250ZW50RG9jLmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgpKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudEhlaWdodCA9IE1hdGguY2VpbChNYXRoLm1heChjb250ZW50RG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQsIGNvbnRlbnREb2MuYm9keS5zY3JvbGxIZWlnaHQsIGNvbnRlbnREb2MuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpKTtcblxuICAgICAgICAgICAgICAgICAgICBtZWFzdXJlU3R5bGUucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gUmVzdG9yZSBjb250YWluZXIgY29uc3RyYWludHMgaW1tZWRpYXRlbHkgKHNhbWUgZnJhbWUsIGJlZm9yZSBwYWludClcbiAgICAgICAgICAgICAgICBjb250YWluZXIuc3R5bGUubWluSGVpZ2h0ID0gcHJldk1pbkhlaWdodDtcbiAgICAgICAgICAgICAgICBjb250YWluZXIuc3R5bGUubWluV2lkdGggPSBwcmV2TWluV2lkdGg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gY2xhbXAoY29udGVudFdpZHRoLCBtaW5XaWR0aCwgbWF4V2lkdGgpO1xuICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gY2xhbXAoY29udGVudEhlaWdodCwgbWluSGVpZ2h0LCBtYXhIZWlnaHQpO1xuXG4gICAgICAgICAgICAvLyBTZXQgYXV0by1zaXplZCBkaW1lbnNpb25zIHRvIG1lYXN1cmVkIHZhbHVlcywgbm9uLWF1dG8gdG8gZXhwbGljaXQvMTAwJVxuICAgICAgICAgICAgaWYgKHNob3VsZEF1dG9XaWR0aCkge1xuICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWZyYW1lLnN0eWxlLndpZHRoID0gdHlwZW9mIHJlc29sdmVkRXhwbGljaXRXaWR0aCA9PT0gJ251bWJlcicgPyBgJHtyZXNvbHZlZEV4cGxpY2l0V2lkdGh9cHhgIDogJzEwMCUnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNob3VsZEF1dG9IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBpZnJhbWUuc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWZyYW1lLnN0eWxlLmhlaWdodCA9IHR5cGVvZiByZXNvbHZlZEV4cGxpY2l0SGVpZ2h0ID09PSAnbnVtYmVyJyA/IGAke3Jlc29sdmVkRXhwbGljaXRIZWlnaHR9cHhgIDogJzEwMCUnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGb3JjZSByZWZsb3cgc28gdGhlIGZpbmFsIGRpbWVuc2lvbnMgYXJlIGFwcGxpZWQgd2l0aG91dCB0cmFuc2l0aW9uLFxuICAgICAgICAgICAgLy8gdGhlbiByZXN0b3JlIHRoZSBvcmlnaW5hbCB0cmFuc2l0aW9ucy5cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgIGlmcmFtZS5vZmZzZXRIZWlnaHQ7XG4gICAgICAgICAgICBpZnJhbWUuc3R5bGUudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uO1xuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLnRyYW5zaXRpb24gPSBwcmV2Q29udGFpbmVyVHJhbnNpdGlvbjtcblxuICAgICAgICAgICAgLy8gRG9uJ3QgZm9yY2Ugb3ZlcmZsb3cgXHUyMDE0IGxldCB0aGUgY29tcG9uZW50L3BhcmVudCBjb250cm9sIHNjcm9sbGluZy5cbiAgICAgICAgICAgIC8vIE9ubHkgc2V0IG92ZXJmbG93OiBhdXRvIHdoZW4gY29udGVudCBleGNlZWRzIG1heCBjb25zdHJhaW50cy5cbiAgICAgICAgICAgIGNvbnN0IGlzV2lkdGhDb25zdHJhaW5lZCA9IHNob3VsZEF1dG9XaWR0aCAmJiBtYXhXaWR0aCAhPT0gdW5kZWZpbmVkICYmIGNvbnRlbnRXaWR0aCA+IG1heFdpZHRoO1xuICAgICAgICAgICAgY29uc3QgaXNIZWlnaHRDb25zdHJhaW5lZCA9IHNob3VsZEF1dG9IZWlnaHQgJiYgbWF4SGVpZ2h0ICE9PSB1bmRlZmluZWQgJiYgY29udGVudEhlaWdodCA+IG1heEhlaWdodDtcbiAgICAgICAgICAgIGNvbnRlbnREb2MuZG9jdW1lbnRFbGVtZW50LnN0eWxlLm92ZXJmbG93WCA9IGlzV2lkdGhDb25zdHJhaW5lZCA/ICdhdXRvJyA6ICcnO1xuICAgICAgICAgICAgY29udGVudERvYy5kb2N1bWVudEVsZW1lbnQuc3R5bGUub3ZlcmZsb3dZID0gaXNIZWlnaHRDb25zdHJhaW5lZCA/ICdhdXRvJyA6ICcnO1xuXG4gICAgICAgICAgICBvcHRzPy5vblNpemVDaGFuZ2U/Lih7XG4gICAgICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgICAgICAgIGF1dG9TaXppbmdXaWR0aDogc2hvdWxkQXV0b1dpZHRoLFxuICAgICAgICAgICAgICAgIGF1dG9TaXppbmdIZWlnaHQ6IHNob3VsZEF1dG9IZWlnaHRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIEluaXRpYWwgc2l6ZSAocnVuIHN5bmNocm9ub3VzbHksIG5vdCBkZWJvdW5jZWQpXG4gICAgICAgIHVwZGF0ZVNpemUoKTtcblxuICAgICAgICAvLyBTdG9yZSB1cGRhdGVTaXplIGZvciByZWVudHJhbnQgY2FsbHNcbiAgICAgICAgdGhpcy5fYXV0b1NpemVVcGRhdGUgPSB1cGRhdGVTaXplO1xuXG4gICAgICAgIC8vIERlYm91bmNlIG9ic2VydmVyIGNhbGxiYWNrcyB2aWEgckFGIFx1MjAxNCBhdCBtb3N0IG9uZSB1cGRhdGVTaXplIHBlciBmcmFtZS5cbiAgICAgICAgLy8gUHJldmVudHMgbGF5b3V0IHRocmFzaGluZyBmcm9tIGhpZ2gtZnJlcXVlbmN5IG11dGF0aW9ucyAoZS5nLiBDU1MgYW5pbWF0aW9ucykuXG4gICAgICAgIGxldCByYWZJZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBzY2hlZHVsZVVwZGF0ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChyYWZJZCAhPT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgICAgICByYWZJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmFmSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdXBkYXRlU2l6ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gT2JzZXJ2ZSBmb3IgY2hhbmdlc1xuICAgICAgICBjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiBzY2hlZHVsZVVwZGF0ZSgpKTtcbiAgICAgICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShkb2MuYm9keSk7XG4gICAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZG9jLmRvY3VtZW50RWxlbWVudCk7XG5cbiAgICAgICAgLy8gTXV0YXRpb25PYnNlcnZlciBjYXRjaGVzIERPTSBjb250ZW50IGNoYW5nZXMgKGUuZy4gcmVtb3ZpbmcgbGlzdCBpdGVtcywgdG9nZ2xpbmcgdmlld3MpXG4gICAgICAgIC8vIHRoYXQgZG9uJ3QgdHJpZ2dlciBSZXNpemVPYnNlcnZlciBiZWNhdXNlIHRoZSBib2R5IGJveC1zaXplIHN0YXlzIHRoZSBzYW1lXG4gICAgICAgIC8vIChib2R5IGZpbGxzIGlmcmFtZSwgaWZyYW1lIGhhc24ndCBzaHJ1bmsgeWV0KS5cbiAgICAgICAgLy8gYGF0dHJpYnV0ZXM6IHRydWVgIGNhdGNoZXMgQ1NTIGNsYXNzL3N0eWxlIGNoYW5nZXMgKGUuZy4gZGlzcGxheTpub25lIHRvZ2dsaW5nIHZpZXdzKS5cbiAgICAgICAgY29uc3QgbXV0YXRpb25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHNjaGVkdWxlVXBkYXRlKCkpO1xuICAgICAgICBtdXRhdGlvbk9ic2VydmVyLm9ic2VydmUoZG9jLmJvZHksIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlLCBjaGFyYWN0ZXJEYXRhOiB0cnVlLCBhdHRyaWJ1dGVzOiB0cnVlIH0pO1xuXG4gICAgICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgICAgICByZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICBtdXRhdGlvbk9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIGlmIChyYWZJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmSWQpO1xuICAgICAgICAgICAgICAgIHJhZklkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fYXV0b1NpemVVcGRhdGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLl9hdXRvU2l6ZUNsZWFudXAgPSB1bmRlZmluZWQ7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2F1dG9TaXplQ2xlYW51cCA9IGNsZWFudXA7XG4gICAgICAgIHJldHVybiBjbGVhbnVwO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2JyaWRnZVNpemVDbGVhbnVwPzogQ2xlYW51cEhhbmRsZXI7XG5cbiAgICAvKipcbiAgICAgKiBBdXRvLWhlaWdodCBmb3IgYSBmcmFtZSB0aGUgaG9zdCBjYW4ndCByZWFkIChjcm9zcy1vcmlnaW4pLiBSdW5zIGFmdGVyIHRoZSBJZnJhbWVTREtcbiAgICAgKiBoYW5kc2hha2U6IHRoZSBmcmFtZSByZXBvcnRzIGJvZHkgcmVzaXplcyBhbmQgdGhlIGhvc3QgcmUtcmVhZHMgdGhlIHNjcm9sbCBoZWlnaHQuXG4gICAgICovXG4gICAgb2JzZXJ2ZUhlaWdodFZpYUJyaWRnZSA9ICgpOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9icmlkZ2VTaXplQ2xlYW51cCkgcmV0dXJuIHRoaXMuX2JyaWRnZVNpemVDbGVhbnVwO1xuXG4gICAgICAgIGxldCBvYnNlcnZlckNsZWFudXA6IENsZWFudXBIYW5kbGVyIHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgc3RvcHBlZCA9IGZhbHNlO1xuICAgICAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICAgICAgc3RvcHBlZCA9IHRydWU7XG4gICAgICAgICAgICBvYnNlcnZlckNsZWFudXA/LigpO1xuICAgICAgICAgICAgdGhpcy5fYnJpZGdlU2l6ZUNsZWFudXAgPSB1bmRlZmluZWQ7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2JyaWRnZVNpemVDbGVhbnVwID0gY2xlYW51cDtcblxuICAgICAgICB0aGlzLmluaXRpYXRlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHN0b3BwZWQgfHwgdGhpcy5tYXJrZWRGb3JEaXNwb3NlZCkgcmV0dXJuO1xuICAgICAgICAgICAgLy8gTGVhdmUgdGhlIGFic29sdXRlIDEwMCUgb3ZlcmxheSBhbmQgdGFrZSBwYXJ0IGluIHRoZSBjb250YWluZXIncyBsYXlvdXQuXG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmluc2V0ID0gJ2F1dG8nO1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgICAgICAgICAgdGhpcy5zZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KCk7XG4gICAgICAgICAgICBvYnNlcnZlckNsZWFudXAgPSB0aGlzLnNlbmQobmV3IFNldFJlc2l6ZU9ic2VydmVyTWVzc2FnZSgpKTtcbiAgICAgICAgfSkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgIC8vIE5vdCBmYXRhbDogdGhlIGNvbXBvbmVudCBzdGlsbCByZW5kZXJzLCBpdCBqdXN0IG5ldmVyIGdldHMgYSBoZWlnaHQgYW5kIHNpdHNcbiAgICAgICAgICAgIC8vIGF0IHRoZSBpZnJhbWUgZGVmYXVsdC4gV2l0aG91dCB0aGlzIGxpbmUgdGhhdCBpcyBjb21wbGV0ZWx5IGludmlzaWJsZSAtLVxuICAgICAgICAgICAgLy8gbm90aGluZyB0aHJvd3MsIG5vdGhpbmcgbG9ncywgYW5kIHRoZSBvbmx5IHN5bXB0b20gaXMgYSAxNTBweCBmcmFtZS4gQVxuICAgICAgICAgICAgLy8gc2lsZW50IHNpemluZyBmYWlsdXJlIG9mIGV4YWN0bHkgdGhpcyBzaGFwZSBpcyB3aGF0IG1hZGUgdGhlIGluaXQgcmFjZVxuICAgICAgICAgICAgLy8gKDIwMjYtMTAtMTcsIHNlZSBJTklULUhBTkRTSEFLRS5tZCkgdGFrZSBmb3VyIGRheXMgdG8gZmluZDogaW5pdGlhdGVkKClcbiAgICAgICAgICAgIC8vIHJlamVjdGVkLCB0aGlzIGNhdGNoIHN3YWxsb3dlZCBpdCwgYW5kIGF1dG8taGVpZ2h0IHNpbXBseSBuZXZlciBoYXBwZW5lZC5cbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgW015b3BJZnJhbWVDb21wb25lbnRdIGF1dG8taGVpZ2h0IHNraXBwZWQgZm9yICR7dGhpcy5pZH06ICR7ZX1gKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGNsZWFudXA7XG4gICAgfVxuXG4gICAgc2V0U2l6ZUJhc2VkT25Eb2N1bWVudEVsZW1lbnQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gdGhpcy5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7aGVpZ2h0LCB3aWR0aH0gPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICByZXR1cm4ge2hlaWdodCwgd2lkdGh9XG4gICAgICAgIH0sIChyZXQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3JldC5jb250ZW50LndpZHRofXB4YDtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtyZXQuY29udGVudC5oZWlnaHR9cHhgO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gdGhpcy5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAvLyByZXR1cm4gd2luZG93LmRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0ICsgJ3B4JztcblxuXG4gICAgICAgICAgICAvL1RPRE86IGZpeCB0aGF0IGhhY2ssIGtlZXAgdGhlIGZ1bmN0aW9uIGluIHJpZ2h0IGZvcm1hdCB3aGlsZSBtaW5pZmllZCA6KFxuICAgICAgICAgICAgY29uc3Qgbm9PcCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBObyBvcGVyYXRpb24gcGVyZm9ybWVkXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUbyBlbnN1cmUgaXQncyBub3Qgb3B0aW1pemVkIGF3YXksIHlvdSBjYW4gY2FsbCBpdCBhdCBsZWFzdCBvbmNlXG4gICAgICAgICAgICBsZXQgeCA9IG5vT3AoKTtcbiAgICAgICAgICAgIHgrKztcbiAgICAgICAgICAgIHgtLTtcblxuICAgICAgICAgICAgLy9yZXR1cm4gYCR7d2luZG93LmRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0fXB4YDtcblxuICAgICAgICAgICAgLy9UT0RPIDogY2hlY2sgdGhhdCArMSA/XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgoTWF0aC5tYXgoXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0KVxuICAgICAgICAgICAgICAgICwgd2luZG93LmRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0KSArIHggKyAncHgnXG5cbiAgICAgICAgfSwgKHJldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmhlaWdodCA9IHJldC5jb250ZW50O1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHNlbmQgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKTogQ2xlYW51cEhhbmRsZXIgPT4ge1xuICAgICAgICBsZXQgbWVzc2FnZV8gPSB7Li4ubWVzc2FnZX0gYXMgQmFzZU15b3BNZXNzYWdlO1xuICAgICAgICAvL1RPRE8gOiA/IT8hIHNob3VsZCBpdCBiZSBoZXJlID9cbiAgICAgICAgaWYgKG1lc3NhZ2VfLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCkge1xuICAgICAgICAgICAgY29uc3QgdHlwZWRNZXNzYWdlID0gKG1lc3NhZ2VfIGFzIEV4ZWN1dGVDb21wb25lbnRNZXRob2QpXG4gICAgICAgICAgICB0aGlzW3R5cGVkTWVzc2FnZS5tZXRob2RdKCk7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy9UT0RPIDogZml4IHRoYXQgaGFjayA6KFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIC8vY29uc3QgaGFuZGxlciA9IG1lc3NhZ2UuaGFuZGxlclxuXG4gICAgICAgIG1lc3NhZ2VfLmRpcmVjdGlvbiA9IE1lc3NhZ2VEaXJlY3Rpb24uZG93bjtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSBzdXBlci5zZW5kKG1lc3NhZ2VfKTtcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50Py5jb250ZW50V2luZG93Py5wb3N0TWVzc2FnZShtZXNzYWdlXywgJyonKTtcblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIC8vbWVzc2FnZS5oYW5kbGVyID0gaGFuZGxlclxuXG4gICAgICAgIHJldHVybiBjbGVhbnVwSGFuZGxlcjtcbiAgICB9O1xuXG4gICAgb25NZXNzYWdlUmVjZWl2ZWQoaW5jb21lTWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChpbmNvbWVNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW4uTXV0YXRpb25PYnNlcnZlck1lc3NhZ2VcbiAgICAgICAgICAgIHx8IGluY29tZU1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbi5SZXNpemVPYnNlcnZlck1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCgpO1xuICAgICAgICAgICAgLy9kZWJ1Z2dlclxuICAgICAgICAgICAgLy90aGlzLnNldEhlaWdodEJhc2VkT25Eb2N1bWVudEVsZW1lbnQoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN1cGVyLm9uTWVzc2FnZVJlY2VpdmVkKGluY29tZU1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGRpc3Bvc2UgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuX2JyaWRnZVNpemVDbGVhbnVwPy4oKTtcbiAgICAgICAgaWYgKHRoaXMuX2F1dG9TaXplQ2xlYW51cCkge1xuICAgICAgICAgICAgdGhpcy5fYXV0b1NpemVDbGVhbnVwKCk7XG4gICAgICAgICAgICB0aGlzLl9hdXRvU2l6ZUNsZWFudXAgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2lzb01zZ0hhbmRsZXIpIHtcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5faXNvTXNnSGFuZGxlcik7XG4gICAgICAgICAgICB0aGlzLl9pc29Nc2dIYW5kbGVyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNsZWFudXBJbnNwZWN0KVxuICAgICAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCgpO1xuXG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgLy8gT3B0aW9uYWwtY2hhaW5lZDogZGlzcG9zZSBub3cgYWxzbyBydW5zIGZvciBjb21wb25lbnRzIHRoYXQgbmV2ZXIgaW5pdGlhdGVkLCBhbmRcbiAgICAgICAgLy8gZm9yIHRob3NlIHRoZSBmcmFtZSBtYXkgYWxyZWFkeSBiZSBnb25lIC0tIHRoZSBkaWFsb2cgdGhhdCBjb250YWluZWQgaXQgd2FzIHRvcm5cbiAgICAgICAgLy8gZG93biwgb3IgaXQgd2FzIG5ldmVyIGF0dGFjaGVkLiBBIHRocm93IGhlcmUgd291bGQgYWJvcnQgdGhlIHJlc3Qgb2YgdGhlIGNsZWFudXAuXG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5wYXJlbnROb2RlPy5yZW1vdmVDaGlsZCh0aGlzLklmcmFtZUVsZW1lbnQpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNES1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSVNraW5Db25maWcsIFNraW5Mb2FkZXJUeXBlfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU15b3BMb2FkZXIge1xuICAgIHR5cGU6IFNraW5Mb2FkZXJUeXBlO1xuICAgIGxvYWQ6IChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSA9PiBQcm9taXNlPElNeW9wQ29tcG9uZW50Pjtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNeW9wTG9hZGVyIGltcGxlbWVudHMgSU15b3BMb2FkZXIge1xuICAgIGFic3RyYWN0IHR5cGU6IFNraW5Mb2FkZXJUeXBlO1xuICAgIGFic3RyYWN0IGxvYWQ6IChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSA9PiBQcm9taXNlPElNeW9wQ29tcG9uZW50PjtcblxuICAgIGFwcGVuZENoaWxkID0gKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucywpID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbnM/LnJlbGF0aXZlKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5yZWxhdGl2ZS5kaXJlY3Rpb24gPT09ICdiZWZvcmUnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUoZWxlbWVudCwgb3B0aW9ucy5yZWxhdGl2ZS5jaGlsZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLnJlbGF0aXZlLmRpcmVjdGlvbiA9PT0gJ2FmdGVyJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5leHRTaWJsaW5nID0gb3B0aW9ucy5yZWxhdGl2ZS5jaGlsZD8ubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUoZWxlbWVudCwgbmV4dFNpYmxpbmcgPyBuZXh0U2libGluZyA6IG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BJZnJhbWVDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL215b3BJZnJhbWVDb21wb25lbnRcIjtcbmltcG9ydCB7QmFzZU15b3BMb2FkZXJ9IGZyb20gXCIuL0lNeW9wTG9hZGVyXCI7XG5pbXBvcnQge3V1aWR2NH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLXCI7XG5pbXBvcnQge0lDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJSWZyYW1lTG9hZGVyQ29uZmlnLCBJU2tpbkNvbmZpZywgU2tpbkxvYWRlcnN9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcblxuY29uc3QgYWRkUXVlcnlQYXJhbSA9ICh1cmw6IHN0cmluZywgcGFyYW06IHN0cmluZywgdmFsdWU6IHN0cmluZykgPT4ge1xuICAgIC8vIENyZWF0ZSBhIFVSTCBvYmplY3RcbiAgICBjb25zdCB1cmxPYmogPSBuZXcgVVJMKHVybCk7XG5cbiAgICAvLyBBZGQgdGhlIHF1ZXJ5IHBhcmFtZXRlclxuICAgIHVybE9iai5zZWFyY2hQYXJhbXMuYXBwZW5kKHBhcmFtLCB2YWx1ZSk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIHVwZGF0ZWQgVVJMXG4gICAgcmV0dXJuIHVybE9iai50b1N0cmluZygpO1xufVxuXG4vKipcbiAqIERvZXMgYGZyYW1lYCBhbHJlYWR5IHBvaW50IGF0IGB1cmxgPyBDb21wYXJlZCBhcyBhYnNvbHV0ZSBVUkxzLCBpZ25vcmluZyB0aGUgZnJhZ21lbnQgYW5kXG4gKiBhIHRyYWlsaW5nIHNsYXNoIG9uIHRoZSBwYXRoOiBgL3BhZ2VgIGFuZCBgL3BhZ2UvYCBhcmUgdGhlIHNhbWUgZG9jdW1lbnQgKGEgc2l0ZSB0aGF0XG4gKiBwcmVmZXJzIG9uZSAzMDFzIHRoZSBvdGhlciksIGFuZCB0aGUgc2VydmVyIG1heSBoYW5kIG91dCBlaXRoZXIgZm9ybSAtLSBzZWUgdGhlXG4gKiB0cmFpbGluZy1zbGFzaCBmaXggaW4gbXlvcC1zZXJ2ZXIncyB2MVVybE5vcm1hbGl6ZS50cy4gQW4gZW1wdHkgYHNyY2AgaXMgbmV2ZXIgYSBtYXRjaC5cbiAqL1xuY29uc3Qgc2hvd3NTYW1lUGFnZSA9IChmcmFtZTogSFRNTElGcmFtZUVsZW1lbnQsIHVybDogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgY29uc3QgY3VycmVudCA9IGZyYW1lLmdldEF0dHJpYnV0ZSgnc3JjJyk7XG4gICAgaWYgKCFjdXJyZW50IHx8ICF1cmwpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBub3JtID0gKHU6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCB4ID0gbmV3IFVSTCh1LCBkb2N1bWVudC5iYXNlVVJJKTtcbiAgICAgICAgeC5oYXNoID0gJyc7XG4gICAgICAgIGlmICh4LnBhdGhuYW1lLmxlbmd0aCA+IDEpIHgucGF0aG5hbWUgPSB4LnBhdGhuYW1lLnJlcGxhY2UoL1xcLyQvLCAnJyk7XG4gICAgICAgIHJldHVybiB4LmhyZWY7XG4gICAgfTtcbiAgICB0cnkgeyByZXR1cm4gbm9ybShjdXJyZW50KSA9PT0gbm9ybSh1cmwpOyB9IGNhdGNoIHsgcmV0dXJuIGZhbHNlOyB9XG59O1xuXG5leHBvcnQgY2xhc3MgTXlvcElmcmFtZUxvYWRlciBleHRlbmRzIEJhc2VNeW9wTG9hZGVyIHtcbiAgICB0eXBlID0gU2tpbkxvYWRlcnMuSWZyYW1lTG9hZGVyXG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgbG9hZCA9IGFzeW5jIChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSA9PiB7XG4gICAgICAgIGxldCBJZnJhbWVFbGVtZW50OiBIVE1MSUZyYW1lRWxlbWVudDtcblxuICAgICAgICBjb25zdCB0eXBlZExvYWRlckNvbmZpZyA9IChza2luLmxvYWRlciBhcyBJSWZyYW1lTG9hZGVyQ29uZmlnKTtcblxuICAgICAgICBpZiAoY29udGFpbmVyPy5ub2RlTmFtZSA9PT0gXCJJRlJBTUVcIikge1xuICAgICAgICAgICAgSWZyYW1lRWxlbWVudCA9IChjb250YWluZXIgYXMgSFRNTElGcmFtZUVsZW1lbnQpXG5cbiAgICAgICAgICAgIC8vIEFET1BUIEEgRlJBTUUgVEhBVCBJUyBBTFJFQURZIFNIT1dJTkcgVEhJUyBQQUdFIC0tIERPIE5PVCBSRUxPQUQgSVQuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gQXNzaWduaW5nIGBzcmNgIGFsd2F5cyBuYXZpZ2F0ZXMsIGV2ZW4gdG8gdGhlIGlkZW50aWNhbCBVUkwuIFNvIGEgZnJhbWUgdGhlXG4gICAgICAgICAgICAvLyBzZXJ2ZXIgcmVuZGVyZWQgaW50byB0aGUgSFRNTCAtLSB3aGljaCBzdGFydGVkIGxvYWRpbmcgaW4gdGhlIGZpcnN0IGJ5dGVzLFxuICAgICAgICAgICAgLy8gbG9uZyBiZWZvcmUgYW55IHNjcmlwdCByYW4gLS0gd2FzIHRocm93biBhd2F5IGFuZCBsb2FkZWQgYSBzZWNvbmQgdGltZSB0aGVcbiAgICAgICAgICAgIC8vIG1vbWVudCB0aGUgU0RLIHRvb2sgaXQgb3Zlci4gVGhhdCBpcyB0aGUgd2hvbGUgZ2FpbiBvZiBzZXJ2ZXItcmVuZGVyaW5nIHRoZVxuICAgICAgICAgICAgLy8gaWZyYW1lIChcdTIyMTI2OCUgdG8gXHUyMjEyODAlIGluIHRoZSAyMDI2LTEwLTExIGxhYiwgSDgpLCBsb3N0LlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIFRoZSBoYW5kc2hha2UgZG9lcyBub3QgbmVlZCBhIGZyZXNoIGxvYWQ6IHRoZSBob3N0IHNlbmRzIEluaXRNZXNzYWdlIHdoZW4gaXRcbiAgICAgICAgICAgIC8vIHJlZ2lzdGVycyB0aGUgY29tcG9uZW50LCBhbmQgYSBmcmFtZSB0aGF0IGJvb3RlZCBlYXJsaWVyIGFuc3dlcnMgaXQ7IGEgZnJhbWVcbiAgICAgICAgICAgIC8vIHRoYXQgYm9vdHMgbGF0ZXIgYW5ub3VuY2VzIGl0c2VsZiBhbmQgaXMgYW5zd2VyZWQgdGhlbi5cbiAgICAgICAgICAgIGlmICghc2hvd3NTYW1lUGFnZShJZnJhbWVFbGVtZW50LCB0eXBlZExvYWRlckNvbmZpZy51cmwpKSB7XG4gICAgICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zcmMgPSB0eXBlZExvYWRlckNvbmZpZy51cmxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHVuaXFJZCA9IHV1aWR2NCgpO1xuICAgICAgICAgICAgY29uc3QgZG9tSWQgPSBgbXlvcC1jb21wLSR7dW5pcUlkfWBcblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5pZCA9IGRvbUlkO1xuXG4gICAgICAgICAgICAvLyBTZXQgYWxsIHN0eWxlcyBCRUZPUkUgYXBwZW5kaW5nIHRvIHByZXZlbnQgZmxhc2ggYXQgd3JvbmcgcG9zaXRpb25cbiAgICAgICAgICAgIGNvbnN0IGlmcmFtZVN0eWxlcyA9IGBcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgICAgICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgICAgICAgaW5zZXQ6IDA7XG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAke3R5cGVkTG9hZGVyQ29uZmlnLmF1dG9IZWlnaHQgfHwgIXR5cGVkTG9hZGVyQ29uZmlnLmhlaWdodCA/ICcxMDAlJyA6IHR5cGVkTG9hZGVyQ29uZmlnLmhlaWdodH07XG4gICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgICAgICAgICAgb3BhY2l0eTogJHtvcHRpb25zPy5oaWRkZW4gPyAnMCcgOiAnMSd9O1xuICAgICAgICAgICAgICAgIHBvaW50ZXItZXZlbnRzOiAke29wdGlvbnM/LmhpZGRlbiA/ICdub25lJyA6ICdhbGwnfTtcbiAgICAgICAgICAgIGA7XG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LnN0eWxlLmNzc1RleHQgPSBpZnJhbWVTdHlsZXM7XG5cbiAgICAgICAgICAgIC8vIFNldCBlbGVtZW50IGF0dHJpYnV0ZXMgaWYgcHJvdmlkZWRcbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5lbGVtZW50QXR0cmlidXRlcykge1xuICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKG9wdGlvbnMuZWxlbWVudEF0dHJpYnV0ZXMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgJycpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCBTdHJpbmcodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpbiBvcmRlciB0byBoYW5kbGUgaXNzdWUgdG8gbG9hZCBpZnJhbWUgaW5zaWRlIGFuIGlmcmFtZSB3aXRoIHRoZSBzYW1lIHVybFxuICAgICAgICAgICAgbGV0IHVybDJsb2FkID0gKHNraW4ubG9hZGVyIGFzIElJZnJhbWVMb2FkZXJDb25maWcpLnVybDtcbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5faGFzUGFyZW50KVxuICAgICAgICAgICAgICAgIHVybDJsb2FkID0gYWRkUXVlcnlQYXJhbSh1cmwybG9hZCwgXCJfbXlvcC1jb21wXCIsIHVuaXFJZCk7XG5cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc3JjID0gdXJsMmxvYWQ7XG5cbiAgICAgICAgICAgIC8vIFRPRE8gOiBkbyBpdCBvbmx5IHdpdGggZmxhZyA/XG4gICAgICAgICAgICBpZiAoIWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbaWRePVwibXlvcC1jb21wLVwiXScpKVxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudCA9IHRoaXMuYXBwZW5kQ2hpbGQoY29udGFpbmVyLCBJZnJhbWVFbGVtZW50LCBvcHRpb25zKSBhcyBIVE1MSUZyYW1lRWxlbWVudDtcbiAgICAgICAgICAgIC8vICAgSWZyYW1lRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRvbUlkKSBhcyBIVE1MSUZyYW1lRWxlbWVudDtcbiAgICAgICAgICAgIC8vTk8gOiBJZnJhbWVFbGVtZW50ID0gY29udGFpbmVyLmxhc3RFbGVtZW50Q2hpbGQgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgTXlvcElmcmFtZUNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIGBhdXRvSGVpZ2h0YCBpbiB0aGUgdjEgY29uZmlnIHVzZWQgdG8gb25seSBzZXQgaGVpZ2h0OjEwMCUgb24gYW4gYWJzb2x1dGUgZnJhbWUsIHNvIGluIGFuXG4gICAgICAgIC8vIHVuc2l6ZWQgY29udGFpbmVyIHRoZSBmcmFtZSBzdGF5ZWQgYXQgdGhlIDE1MHB4IENTUyBkZWZhdWx0LlxuICAgICAgICBpZiAodHlwZWRMb2FkZXJDb25maWcuYXV0b0hlaWdodCAmJiBvcHRpb25zPy5hdXRvU2l6ZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5vYnNlcnZlSGVpZ2h0VmlhQnJpZGdlKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgIH1cbn1cbiIsICJleHBvcnQgY29uc3QgbXlvcFdlYmNvbXBvbmVudENvbnN0cyA9IHtcbiAgICB3ZWJjb21wb25lbnRfbWVzc2FnZV9rZXk6ICdteW9wX3dlYmNvbXBvbmVudF9tZXNzYWdlJ1xufVxuIiwgImltcG9ydCB7bXlvcFdlYmNvbXBvbmVudENvbnN0c30gZnJvbSBcIi4uLy4uL3dlYmNvbXBvbmVudC9jb25zdHNcIjtcbmltcG9ydCB7QmFzZU15b3BDb21wb25lbnR9IGZyb20gXCIuL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyLCBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSVNraW5Db25maWd9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7c2V0RGVidWdTdHlsZX0gZnJvbSBcIi4uL2NvbXBvbmVudENvcmVcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREtcIjtcblxuZXhwb3J0IGNsYXNzIE15b3BXZWJDb21wb25lbnQgZXh0ZW5kcyBCYXNlTXlvcENvbXBvbmVudCB7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBwcml2YXRlIGN1c3RvbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykge1xuICAgICAgICBzdXBlcihjb21wb25lbnREZWZpbml0aW9uLCBjb250YWluZXIgLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gY3VzdG9tRWxlbWVudDtcbiAgICB9XG5cbiAgICBjbGVhbnVwSW5zcGVjdDogQ2xlYW51cEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgfVxuXG4gICAgaW5zcGVjdCgpIHtcbiAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCA9IHNldERlYnVnU3R5bGUodGhpcy5pZCwgJ015b3BXZWJDb21wb25lbnQnLCAwLCB0aGlzLmNvbnRhaW5lciwgdGhpcy5jdXN0b21FbGVtZW50LCB0aGlzLmNvbXBvbmVudERlZmluaXRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGVhbnVwSW5zcGVjdDtcbiAgICB9XG5cbiAgICBoaWRlKCkge1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJ1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS53aWR0aCA9ICcwJ1xuICAgIH1cblxuICAgIHNob3coKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzEnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAndW5zZXQnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2FsbCdcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLndpZHRoID0gJyc7XG4gICAgfVxuXG4gICAgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2U8YW55PikgPT4ge1xuICAgICAgICBsZXQgbWVzc2FnZV8gPSB7Li4ubWVzc2FnZX0gYXMgQmFzZU15b3BNZXNzYWdlO1xuXG4gICAgICAgIC8vVE9ETyA6IGNhbiBiZSBkb25lIHdpdGhvdXQgY2xvbmluZz9cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvL2NvbnN0IGhhbmRsZXIgPSBtZXNzYWdlXy5oYW5kbGVyXG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gc3VwZXIuc2VuZChtZXNzYWdlXyk7XG5cbiAgICAgICAgY29uc3QgbXNnID0gbmV3IEN1c3RvbUV2ZW50PEJhc2VNeW9wTWVzc2FnZT4obXlvcFdlYmNvbXBvbmVudENvbnN0cy53ZWJjb21wb25lbnRfbWVzc2FnZV9rZXksIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGRldGFpbDogbWVzc2FnZV8sXG4gICAgICAgICAgICAvLyBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgLy8gY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAvLyBjb21wb3NlZDogdHJ1ZVxuICAgICAgICB9KVxuXG4gICAgICAgIC8vdGhpcy5jb250YWluZXIuZGlzcGF0Y2hFdmVudChtc2cpXG5cbiAgICAgICAgLy9zZW5kaW5nIGRhdGEgZnJvbSBob3N0IHRvIHRoZSBjb21wb25lbnRcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5kaXNwYXRjaEV2ZW50KG1zZylcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLmN1c3RvbUVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgIC8vICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuY2hpbGRyZW5bMF0uZGlzcGF0Y2hFdmVudChtc2cpXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdlcnJvciB3aGlsZSB0cnlpbmcgdG8gZGlzcGF0Y2hFdmVudCcsIGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvL21lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXJcblxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfVxuXG4gICAgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQucGFyZW50Tm9kZT8ucmVtb3ZlQ2hpbGQodGhpcy5jdXN0b21FbGVtZW50KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wV2ViQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wV2ViY29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTG9hZGVyfSBmcm9tIFwiLi9JTXlvcExvYWRlclwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuaW1wb3J0IHt1dWlkdjQsIHdhaXR9IGZyb20gXCIuLi8uLi91dGlscy91dGlscy50c1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSVNraW5Db25maWcsIElXZWJDb21wb25lbnRMb2FkZXJDb25maWcsIFNraW5Mb2FkZXJzfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5cbmNvbnN0IHNlZW46IFJlY29yZDxzdHJpbmcsIFByb21pc2U8dm9pZD4+ID0ge307XG5cbmV4cG9ydCBjbGFzcyBXZWJjb21wb25lbnRMb2FkZXIgZXh0ZW5kcyBCYXNlTXlvcExvYWRlciB7XG5cbiAgICB0eXBlID0gU2tpbkxvYWRlcnMuV2ViQ29tcG9uZW50TG9hZGVyXG5cbiAgICBsb2FkID0gYXN5bmMgKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IHtcblxuICAgICAgICBjb25zdCBsb2FkZXJDb25maWcgPSAoc2tpbi5sb2FkZXIgYXMgSVdlYkNvbXBvbmVudExvYWRlckNvbmZpZyk7XG5cbiAgICAgICAgaWYgKCFzZWVuW2xvYWRlckNvbmZpZy51cmxdKSB7XG4gICAgICAgICAgICAvLyBhd2FpdCBpbXBvcnQoIC8qIEB2aXRlLWlnbm9yZSAqLyB3ZWJDb21wb25lbnRMb2FkVXJsKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdtb2R1bGUgbG9hZGVkJyk7XG4gICAgICAgICAgICBzZWVuW2xvYWRlckNvbmZpZy51cmxdID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdlYkNvbXBvbmVudExvYWRVcmwgPSBsb2FkZXJDb25maWcudXJsXG4gICAgICAgICAgICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgICAgICAgICAgc2NyaXB0LnR5cGUgPSAnbW9kdWxlJztcbiAgICAgICAgICAgICAgICBzY3JpcHQuc3JjID0gd2ViQ29tcG9uZW50TG9hZFVybDtcbiAgICAgICAgICAgICAgICBzY3JpcHQub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc2NyaXB0Lm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ01vZHVsZSBhbHJlZGF5IGxvYWRlZCBvciBpbiBsb2FkaW5nIHByb2Nlc3MnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHNlZW5bbG9hZGVyQ29uZmlnLnVybF07XG5cbiAgICAgICAgLy9UT0RPIDogYWRkIHJldHJ5IG1lY2hhbmlzbSBpbiBmYWlsIGNhc2UuXG5cbiAgICAgICAgLy9UT0RPIDogZml4IHRoYXQgaGFjaywgc2hvdWxkIGZpeCB0aGUgcmFjZSBjb25kaXRpb24gZm9yIGxvYWRlZCBtb2R1bGVzXG4gICAgICAgIGF3YWl0IHdhaXQoMSk7XG5cbiAgICAgICAgbGV0IGRvbUlkID0gYG15b3AtY29tcC0ke3V1aWR2NCgpfWBcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobG9hZGVyQ29uZmlnLnRhZyk7XG5cbiAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcignW2lkXj1cIm15b3AtY29tcC1cIl0nKSlcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAvL2VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICBlbGVtZW50LmlkID0gZG9tSWQ7XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmhpZGRlbikge1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgKGNvbnRhaW5lci5pZC5zdGFydHNXaXRoKCdteW9wLWNvbXAtJykpIHtcbiAgICAgICAgLy8gICAgIC8vIGluIHBsYWNlIHJlcGxhY2VtZW50XG4gICAgICAgIC8vICAgICBjb250YWluZXIucmVwbGFjZVdpdGgoZWxlbWVudCk7XG4gICAgICAgIC8vICAgICAvL2NvbnRhaW5lciA9IGVsZW1lbnQucGFyZW50RWxlbWVudCE7XG4gICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgIC8vIH1cblxuICAgICAgICBpZihvcHRpb25zPy5fZW52aXJvbm1lbnQpe1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZWxlbWVudC5fbXlvcEVudmlyb25tZW50ID0gb3B0aW9ucz8uX2Vudmlyb25tZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgICAgICAvL2VsZW1lbnQuaW5uZXJIVE1MID0gYDwke2xvYWRlckNvbmZpZy50YWd9IC8+YDtcbiAgICAgICAgcmV0dXJuIG5ldyBNeW9wV2ViQ29tcG9uZW50KGNvbXBvbmVudERlZmluaXRpb24sIHNraW4sIGNvbnRhaW5lciwgZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgfVxuXG59XG4iLCAiLyoqXG4gKiBUaGUgY2xpZW50IHdpbmRvdzogd2hhdCBhIHJldHVybmluZyB2aXNpdG9yIGRvZXMgTk9UIGFzayBmb3IuXG4gKlxuICogQSBjb21wb25lbnQgdGhlIGJyb3dzZXIgYWxyZWFkeSBob2xkcywgc3RpbGwgaW5zaWRlIGl0cyBmcmVzaG5lc3Mgd2luZG93LCBpcyByZW5kZXJlZFxuICogd2l0aCBubyBuZXR3b3JrIGF0IGFsbC4gT25jZSB0aGUgd2luZG93IGVuZHMgdGhlIGJyb3dzZXIgZG9lcyBub3QgcmUtZG93bmxvYWQgaXQgZWl0aGVyXG4gKiBcdTIwMTQgaXQgc2VuZHMgYmFjayB0aGUgdmVyc2lvbiBpdCBob2xkcyBhbmQgaXMgdXN1YWxseSB0b2xkIFwidW5jaGFuZ2VkXCIgaW4gYSBmZXcgaHVuZHJlZFxuICogYnl0ZXMuXG4gKlxuICogVEhFIFdJTkRPVyBJUyBUSEUgU0VSVkVSJ1MsIE5PVCBPVVJTLiBJdCBjb21lcyBmcm9tIHRoZSByZXNwb25zZTogYHMtbWF4YWdlYCBpcyB0aGVcbiAqIGZyZXNobmVzcyB0aGUgc2VydmVyIHByb21pc2VkLCBhbmQgYEFnZWAgaXMgaG93IG11Y2ggb2YgaXQgYSBDRE4gYWxyZWFkeSBzcGVudCBiZWZvcmVcbiAqIHRoZSBieXRlcyByZWFjaGVkIHVzLiBUaGUgd2luZG93IHdlIG1heSBrZWVwIGlzIHRoZXJlZm9yZSBgcy1tYXhhZ2UgLSBBZ2VgLCBuZXZlclxuICogYHMtbWF4YWdlYCBcdTIwMTQgb3RoZXJ3aXNlIGEgY29weSB0aGF0IHNhdCBhdCB0aGUgZWRnZSBmb3IgNTUgb2YgaXRzIDYwIHNlY29uZHMgd291bGQgYmVcbiAqIGhlbGQgZm9yIGFub3RoZXIgNjAgaGVyZSwgYW5kIGEgcHVibGlzaCB3b3VsZCB0YWtlIHR3aWNlIGFzIGxvbmcgdG8gYmUgc2VlbiBhcyBwcm9taXNlZC5cbiAqIFRoaXMgaXMgdGhlIHNpbmdsZSBlYXNpZXN0IHRoaW5nIHRvIGdldCB3cm9uZyBpbiBhIGNsaWVudCBjYWNoZSwgYW5kIGl0IGlzIGludmlzaWJsZSBpblxuICogdGVzdGluZyBiZWNhdXNlIGl0IG9ubHkgc2hvd3MgdXAgYXMgXCJzb21ldGltZXMgc3RhbGVcIi5cbiAqXG4gKiBJbmRleGVkREIsIG5vdCBsb2NhbFN0b3JhZ2U6IGNvbXBvbmVudHMgcnVuIHRvIGh1bmRyZWRzIG9mIEtCLCBsb2NhbFN0b3JhZ2UgY2FwcyBhcm91bmRcbiAqIDUgTUIgYW5kIGJsb2NrcyB0aGUgbWFpbiB0aHJlYWQuIEV2ZXJ5IHBhdGggZGVncmFkZXMgdG8gdGhlIG5ldHdvcmsgXHUyMDE0IGEgYnJvd3NlciBpblxuICogcHJpdmF0ZSBtb2RlLCB3aXRoIHN0b3JhZ2UgZGlzYWJsZWQgb3Igb3ZlciBxdW90YSwgbXVzdCByZW5kZXIgdGhlIHBhZ2UsIG5vdCBmYWlsIGl0LlxuICovXG5cbmNvbnN0IERCX05BTUUgPSAnbXlvcC1kZWxpdmVyeSc7XG5jb25zdCBTVE9SRSA9ICdjb21wb25lbnRzJztcbmNvbnN0IERCX1ZFUlNJT04gPSAxO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0b3JlZEVudHJ5IHtcbiAgICBrZXk6IHN0cmluZztcbiAgICAvKiogdGhlIHJlc29sdmVkIGNvbXBvbmVudCBjb25maWcsIGV4YWN0bHkgYXMgdGhlIG5ldHdvcmsgcGF0aCBwcm9kdWNlcyBpdCAqL1xuICAgIGNvbmZpZzogYW55O1xuICAgIC8qKiB0aGUgc2VydmVyJ3MgdmVyc2lvbiB0b2tlbiBmb3IgdGhlc2UgYnl0ZXM6IGA8cmV2Pn48b3B0PmAgKi9cbiAgICB0YWc6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIHdoZW4gdGhpcyBicm93c2VyIHN0b3JlZCBpdCAqL1xuICAgIHN0b3JlZEF0OiBudW1iZXI7XG4gICAgLyoqIGhvdyBsb25nIGl0IG1heSBiZSB1c2VkIHdpdGhvdXQgYXNraW5nLCBpbiBtcyAoYWxyZWFkeSBBZ2UtYWRqdXN0ZWQpICovXG4gICAgd2luZG93TXM6IG51bWJlcjtcbiAgICAvKiogd2hpY2ggaG9zdCBwcm9kdWNlZCBpdCBcdTIwMTQgYSBrZXkgZnJvbSBhbm90aGVyIGhvc3QgaXMgbmV2ZXIgcmV1c2VkICovXG4gICAgaG9zdDogc3RyaW5nO1xuICAgIC8qKiB3aXJlIHNpemUgb2YgdGhlIHJlc3BvbnNlIGl0IGNhbWUgZnJvbSwgc28gc3RhdHMgY2FuIHNheSB3aGF0IHRoZSB3aW5kb3cgc2F2ZWQgKi9cbiAgICBieXRlcz86IG51bWJlcjtcbn1cblxubGV0IGRiUHJvbWlzZTogUHJvbWlzZTxJREJEYXRhYmFzZSB8IG51bGw+IHwgbnVsbCA9IG51bGw7XG5cbmZ1bmN0aW9uIG9wZW5EYigpOiBQcm9taXNlPElEQkRhdGFiYXNlIHwgbnVsbD4ge1xuICAgIGlmIChkYlByb21pc2UpIHJldHVybiBkYlByb21pc2U7XG4gICAgZGJQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaW5kZXhlZERCID09PSAndW5kZWZpbmVkJykgcmV0dXJuIHJlc29sdmUobnVsbCk7XG4gICAgICAgICAgICBjb25zdCByZXEgPSBpbmRleGVkREIub3BlbihEQl9OQU1FLCBEQl9WRVJTSU9OKTtcbiAgICAgICAgICAgIHJlcS5vbnVwZ3JhZGVuZWVkZWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGIgPSByZXEucmVzdWx0O1xuICAgICAgICAgICAgICAgIGlmICghZGIub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhTVE9SRSkpIGRiLmNyZWF0ZU9iamVjdFN0b3JlKFNUT1JFLCB7IGtleVBhdGg6ICdrZXknIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlcS5vbnN1Y2Nlc3MgPSAoKSA9PiByZXNvbHZlKHJlcS5yZXN1bHQpO1xuICAgICAgICAgICAgcmVxLm9uZXJyb3IgPSAoKSA9PiByZXNvbHZlKG51bGwpO1xuICAgICAgICAgICAgLy8gQSBibG9ja2VkIHVwZ3JhZGUgbXVzdCBub3QgaGFuZyB0aGUgcGFnZSBsb2FkLlxuICAgICAgICAgICAgcmVxLm9uYmxvY2tlZCA9ICgpID0+IHJlc29sdmUobnVsbCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBkYlByb21pc2U7XG59XG5cbmZ1bmN0aW9uIHR4PFQ+KG1vZGU6IElEQlRyYW5zYWN0aW9uTW9kZSwgZm46IChzdG9yZTogSURCT2JqZWN0U3RvcmUpID0+IElEQlJlcXVlc3QpOiBQcm9taXNlPFQgfCBudWxsPiB7XG4gICAgcmV0dXJuIG9wZW5EYigpLnRoZW4oZGIgPT4gbmV3IFByb21pc2U8VCB8IG51bGw+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGlmICghZGIpIHJldHVybiByZXNvbHZlKG51bGwpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdCA9IGRiLnRyYW5zYWN0aW9uKFNUT1JFLCBtb2RlKTtcbiAgICAgICAgICAgIGNvbnN0IHJlcSA9IGZuKHQub2JqZWN0U3RvcmUoU1RPUkUpKTtcbiAgICAgICAgICAgIHJlcS5vbnN1Y2Nlc3MgPSAoKSA9PiByZXNvbHZlKHJlcS5yZXN1bHQgYXMgVCk7XG4gICAgICAgICAgICByZXEub25lcnJvciA9ICgpID0+IHJlc29sdmUobnVsbCk7XG4gICAgICAgICAgICB0Lm9uYWJvcnQgPSAoKSA9PiByZXNvbHZlKG51bGwpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICAgIH1cbiAgICB9KSk7XG59XG5cbi8qKlxuICogQSBTWU5DSFJPTk9VUyBzaGFkb3cgb2Ygd2hhdCB3ZSBob2xkLCBmb3IgY29kZSB0aGF0IHJ1bnMgYmVmb3JlIEluZGV4ZWREQiBjYW4gYW5zd2VyLlxuICpcbiAqIFRoZSBwYWdlJ3MgSFRNTCBjYW4gc3RhcnQgdGhlIGNvbXBvbmVudCByZXF1ZXN0IHdoaWxlIHRoZSBKUyBidW5kbGUgaXMgc3RpbGwgZG93bmxvYWRpbmdcbiAqIFx1MjAxNCBidXQgb25seSBpZiBpdCBrbm93cywgYXQgcGFyc2UgdGltZSwgd2hldGhlciBhIHJlcXVlc3QgaXMgbmVlZGVkIGF0IGFsbCBhbmQgd2hpY2ggb25lLlxuICogSW5kZXhlZERCIGlzIGFzeW5jLCBzbyBhbiBpbmxpbmUgc2NyaXB0IGNhbm5vdCBhc2sgaXQuIGxvY2FsU3RvcmFnZSBjYW4gYmUgcmVhZFxuICogc3luY2hyb25vdXNseSwgc28gZWFjaCBlbnRyeSBtaXJyb3JzIHR3byB0aW55IGZhY3RzIGhlcmU6IHRoZSB2ZXJzaW9uIHRhZyBhbmQgd2hlbiB0aGVcbiAqIHdpbmRvdyBlbmRzLiBOb3RoaW5nIGVsc2UgXHUyMDE0IHRoZSBjb21wb25lbnQgaXRzZWxmIHN0YXlzIGluIEluZGV4ZWREQiB3aGVyZSBpdCBiZWxvbmdzLlxuICpcbiAqIFdpdGhvdXQgdGhpcyB0aGUgcHJlbG9hZCBoaW50IGlzIGFjdGl2ZWx5IGhhcm1mdWw6IGl0IGRvd25sb2FkcyB0aGUgd2hvbGUgY29tcG9uZW50XG4gKiBldmVyeSB0aW1lLCBpbmNsdWRpbmcgb24gdGhlIHZpc2l0cyB3aGVyZSB0aGUgc3RvcmVkIGNvcHkgd2FzIGdvaW5nIHRvIGFuc3dlciBmb3IgZnJlZS5cbiAqIE1lYXN1cmVkIG9uIG15b3AuZGV2IGJlZm9yZSBpdCBleGlzdGVkIFx1MjAxNCA5OCBLQiBmZXRjaGVkLCB0aGVuIGRpc2NhcmRlZCwgb24gZXZlcnkgcmVsb2FkLlxuICovXG5jb25zdCBISU5UX1BSRUZJWCA9ICdteW9wLmQuJztcblxuZnVuY3Rpb24gd3JpdGVIaW50KGtleTogc3RyaW5nLCB0YWc6IHN0cmluZyB8IG51bGwsIGV4cGlyZXNBdDogbnVtYmVyKSB7XG4gICAgdHJ5IHsgbG9jYWxTdG9yYWdlLnNldEl0ZW0oSElOVF9QUkVGSVggKyBrZXksIEpTT04uc3RyaW5naWZ5KHsgdDogdGFnLCBlOiBleHBpcmVzQXQgfSkpOyB9XG4gICAgY2F0Y2ggeyAvKiBwcml2YXRlIG1vZGUsIHF1b3RhLCBkaXNhYmxlZCBcdTIwMTQgdGhlIGhpbnQgaXMgYW4gb3B0aW1pc2F0aW9uLCBuZXZlciBhIHJlcXVpcmVtZW50ICovIH1cbn1cblxuZnVuY3Rpb24gY2xlYXJIaW50KGtleTogc3RyaW5nKSB7XG4gICAgdHJ5IHsgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oSElOVF9QUkVGSVggKyBrZXkpOyB9IGNhdGNoIHsgLyogYXMgYWJvdmUgKi8gfVxufVxuXG4vKiogQSBtZW1vcnkgbGF5ZXIgaW4gZnJvbnQgb2Ygc3RvcmFnZTogYSBzZWNvbmQgY29tcG9uZW50IG9uIHRoZSBzYW1lIHBhZ2UgbXVzdCBub3Qgd2FpdCBvbiBJTy4gKi9cbmNvbnN0IG1lbW9yeSA9IG5ldyBNYXA8c3RyaW5nLCBTdG9yZWRFbnRyeT4oKTtcblxuZXhwb3J0IGNvbnN0IGRlbGl2ZXJ5U3RvcmUgPSB7XG4gICAga2V5KGhvc3Q6IHN0cmluZywgY29tcG9uZW50SWQ6IHN0cmluZywgZW52OiBzdHJpbmcsIHByZXZpZXc6IGJvb2xlYW4sIG9wdDogc3RyaW5nKSB7XG4gICAgICAgIC8vIFRoZSBIT1NUIGlzIHBhcnQgb2YgdGhlIGtleS4gVHdvIHN0YWNrcyBjYW4gc2VydmUgdGhlIHNhbWUgY29tcG9uZW50IHdpdGhcbiAgICAgICAgLy8gZGlmZmVyZW50IGZyZXNobmVzcywgYW5kIGVudHJpZXMgZnJvbSBvbmUgbXVzdCBuZXZlciBiZSByZWFkIGFzIHRoZSBvdGhlcidzLlxuICAgICAgICByZXR1cm4gYCR7aG9zdH18JHtjb21wb25lbnRJZH18JHtlbnZ9fCR7cHJldmlldyA/ICdwcmV2aWV3JyA6ICdsaXZlJ318JHtvcHQgfHwgJ3Jhdyd9YDtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTxTdG9yZWRFbnRyeSB8IG51bGw+IHtcbiAgICAgICAgY29uc3QgbSA9IG1lbW9yeS5nZXQoa2V5KTtcbiAgICAgICAgaWYgKG0pIHJldHVybiBtO1xuICAgICAgICBjb25zdCBlID0gYXdhaXQgdHg8U3RvcmVkRW50cnk+KCdyZWFkb25seScsIHMgPT4gcy5nZXQoa2V5KSk7XG4gICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICBtZW1vcnkuc2V0KGtleSwgZSk7XG4gICAgICAgICAgICAvLyBTRUxGLUhFQUwuIFRoZSB0d28gc3RvcmVzIGNhbiBkaXNhZ3JlZTogYW4gZW50cnkgd3JpdHRlbiBiZWZvcmUgdGhlIGhpbnRcbiAgICAgICAgICAgIC8vIGV4aXN0ZWQsIGEgYnJvd3NlciB0aGF0IGV2aWN0ZWQgbG9jYWxTdG9yYWdlIGJ1dCBub3QgSW5kZXhlZERCLCBhIHVzZXIgd2hvXG4gICAgICAgICAgICAvLyBjbGVhcmVkIG9uZS4gQSBtaXNzaW5nIGhpbnQgbWFrZXMgdGhlIHByZWxvYWQgZmFsbCBiYWNrIHRvIHRoZSBGVUxMIGNvbXBvbmVudFxuICAgICAgICAgICAgLy8gd2hpbGUgdGhlIFNESywgd2hpY2ggY2FuIHNlZSBJbmRleGVkREIsIG9ubHkgd2FudHMgdGhlIHZlcnNpb24gY2hlY2sgLS0gdHdvXG4gICAgICAgICAgICAvLyByZXF1ZXN0cyB3aGVyZSB0aGVyZSBzaG91bGQgYmUgb25lLiBTZWVuIGluIHRoZSB3aWxkIG9uIHRoZSBmaXJzdCBsb2FkIGFmdGVyXG4gICAgICAgICAgICAvLyB0aGUgaGludCBzaGlwcGVkLiBSZXdyaXRpbmcgaXQgaGVyZSBjb3N0cyBub3RoaW5nIGFuZCBjbG9zZXMgdGhlIGdhcCBmb3IgZ29vZC5cbiAgICAgICAgICAgIHdyaXRlSGludChrZXksIGUudGFnLCBlLnN0b3JlZEF0ICsgZS53aW5kb3dNcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgfSxcblxuICAgIGFzeW5jIHB1dChlbnRyeTogU3RvcmVkRW50cnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbWVtb3J5LnNldChlbnRyeS5rZXksIGVudHJ5KTtcbiAgICAgICAgd3JpdGVIaW50KGVudHJ5LmtleSwgZW50cnkudGFnLCBlbnRyeS5zdG9yZWRBdCArIGVudHJ5LndpbmRvd01zKTtcbiAgICAgICAgYXdhaXQgdHgoJ3JlYWR3cml0ZScsIHMgPT4gcy5wdXQoZW50cnkpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZHJvcChrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBtZW1vcnkuZGVsZXRlKGtleSk7XG4gICAgICAgIGNsZWFySGludChrZXkpO1xuICAgICAgICBhd2FpdCB0eCgncmVhZHdyaXRlJywgcyA9PiBzLmRlbGV0ZShrZXkpKTtcbiAgICB9LFxuXG4gICAgLyoqIFN0aWxsIHVzYWJsZSB3aXRob3V0IGFza2luZyB0aGUgc2VydmVyPyAqL1xuICAgIGZyZXNoKGU6IFN0b3JlZEVudHJ5IHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISFlICYmIChEYXRlLm5vdygpIC0gZS5zdG9yZWRBdCkgPCBlLndpbmRvd01zO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUaGUgd2luZG93IHRoaXMgcmVzcG9uc2UgbGljZW5zZXM6IHRoZSBzZXJ2ZXIncyBmcmVzaG5lc3MgbWludXMgd2hhdCBhIENETiBhbHJlYWR5XG4gICAgICogc3BlbnQuIFJldHVybnMgMCB3aGVuIHRoZSBzZXJ2ZXIgc2FpZCBub3RoaW5nIGFib3V0IGNhY2hpbmcsIHdoaWNoIG1lYW5zIFwiZG8gbm90XG4gICAgICogaG9sZCB0aGlzXCIgXHUyMDE0IHRoZSBzYWZlIHJlYWRpbmcsIGFuZCB3aGF0IHByb2R1Y3Rpb24gc2VuZHMgdG9kYXkuXG4gICAgICovXG4gICAgd2luZG93RnJvbShoZWFkZXJzOiBIZWFkZXJzKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgY2MgPSBoZWFkZXJzLmdldCgnY2FjaGUtY29udHJvbCcpIHx8ICcnO1xuICAgICAgICBpZiAoL25vLXN0b3JlfG5vLWNhY2hlL2kudGVzdChjYykpIHJldHVybiAwO1xuICAgICAgICBjb25zdCBtID0gL3MtbWF4YWdlXFxzKj1cXHMqKFxcZCspL2kuZXhlYyhjYykgfHwgL21heC1hZ2VcXHMqPVxccyooXFxkKykvaS5leGVjKGNjKTtcbiAgICAgICAgaWYgKCFtKSByZXR1cm4gMDtcbiAgICAgICAgY29uc3QgdG90YWwgPSBOdW1iZXIobVsxXSk7XG4gICAgICAgIGNvbnN0IGFnZSA9IE51bWJlcihoZWFkZXJzLmdldCgnYWdlJykgfHwgMCk7XG4gICAgICAgIHJldHVybiBNYXRoLm1heCgwLCAodG90YWwgLSAoaXNOYU4oYWdlKSA/IDAgOiBhZ2UpKSkgKiAxMDAwO1xuICAgIH0sXG5cbiAgICAvKiogRm9yIHRlc3RzIGFuZCBmb3IgYHJlZnJlc2goKWA6IGZvcmdldCBldmVyeXRoaW5nIHRoaXMgYnJvd3NlciBob2xkcy4gKi9cbiAgICBhc3luYyBjbGVhcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbWVtb3J5LmNsZWFyKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gbG9jYWxTdG9yYWdlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgayA9IGxvY2FsU3RvcmFnZS5rZXkoaSk7XG4gICAgICAgICAgICAgICAgaWYgKGsgJiYgay5zdGFydHNXaXRoKEhJTlRfUFJFRklYKSkgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggeyAvKiBub3RoaW5nIHRvIGNsZWFuIHVwIGlmIGl0IHdhcyBuZXZlciB3cml0YWJsZSAqLyB9XG4gICAgICAgIGF3YWl0IHR4KCdyZWFkd3JpdGUnLCBzID0+IHMuY2xlYXIoKSk7XG4gICAgfSxcbn07XG4iLCAiaW1wb3J0IHtcbiAgICBJQ29tcG9uZW50Q29uZmlnLFxuICAgIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgIElDb21wb25lbnRJbnN0YW5jZUNvbmZpZyxcbiAgICBJRGVkaWNhdGVkU2tpbkNvbmZpZyxcbiAgICBJUHJvcENvbmZpZyxcbiAgICBJU2tpbkNvbmZpZyxcbiAgICBJVXNlckZsb3csXG4gICAgUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMsXG4gICAgdjJfSVZhcmlhbnRDb25maWdcbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHsgZGVsaXZlcnlTdG9yZSB9IGZyb20gXCIuL2RlbGl2ZXJ5U3RvcmVcIjtcblxuY29uc3QgY29udmVydFYyVmFyaWFudFRvQ29tcG9uZW50Q29uZmlnID0gKGNvbmZpZzogdjJfSVZhcmlhbnRDb25maWcpOiBJQ29tcG9uZW50Q29uZmlnID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgICBpbnN0YW5jZToge1xuICAgICAgICAgICAgaWQ6ICdhdXRvJyxcbiAgICAgICAgICAgIGNvbXBvbmVudElkOiBjb25maWcuY29tcG9uZW50SWQsXG4gICAgICAgICAgICBjb21wb25lbnROYW1lOiBjb25maWcubmFtZSxcblxuICAgICAgICAgICAgc2tpblNlbGVjdG9yOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0RlZGljYXRlZCcsXG4gICAgICAgICAgICAgICAgc2tpbjoge1xuICAgICAgICAgICAgICAgICAgICBpZDogJ3NraW5fYXV0b192Ml9jb252ZXJ0ZWQnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZ1xuXG4gICAgICAgIH0gYXMgSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBpZDogY29uZmlnLmlkLFxuICAgICAgICAgICAgbmFtZTogY29uZmlnLm5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogY29uZmlnLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgcHJvcHM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiAnaW5fYXV0b192Ml9jb252ZXJ0ZWQnLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnbXlvcF9pbml0X2ludGVyZmFjZScsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdhbnknLFxuICAgICAgICAgICAgICAgICAgICBiZWhhdmlvcjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMuY29kZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBhcyBJUHJvcENvbmZpZyxcblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdvdXRfYXV0b192Ml9jb252ZXJ0ZWQnLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnbXlvcF9jdGFfaGFuZGxlcicsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdhbnknLFxuICAgICAgICAgICAgICAgICAgICBiZWhhdmlvcjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMuY29kZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBhcyBJUHJvcENvbmZpZ1xuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHJlZnM6IFtdLFxuICAgICAgICAgICAgc2tpbnM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiAnc2tpbl9hdXRvX3YyX2NvbnZlcnRlZCcsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdhdXRvX3YyX2NvbnZlcnRlZCcsXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogaGFuZGxlIGVtcHR5IDpcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBsb2FkZXI6IGNvbmZpZy5jb25zdW1lX3ZhcmlhbnRbMF0ubG9hZGVyXG4gICAgICAgICAgICAgICAgfSBhcyBJU2tpbkNvbmZpZ1xuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGRlZmF1bHRTa2luOiAwLFxuICAgICAgICAgICAgLy8gT25seSBgdWk6YCB0YWdzIGV2ZXIgcmVhY2ggdGhlIGNsaWVudDsgdGhlIHNlcnZlciBmaWx0ZXJzLCBhYnNlbnQgPSBub25lLlxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgdWlUYWdzOiBBcnJheS5pc0FycmF5KGNvbmZpZy51aVRhZ3MpID8gY29uZmlnLnVpVGFncyA6IFtdXG4gICAgICAgIH0gYXMgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgICAgIG5hbWU6IGNvbmZpZy5uYW1lXG4gICAgfSBhcyBJQ29tcG9uZW50Q29uZmlnO1xufTtcblxuLyoqXG4gKiBDbG91ZFJlcG9zaXRvcnkgLSBVbmlmaWVkIGNsb3VkIGRhdGEgYWNjZXNzIGxheWVyIGZvciBNeW9wIGNvbXBvbmVudHNcbiAqXG4gKiBTdXBwb3J0cyBib3RoIHYyIChkZWZhdWx0KSBhbmQgdjEgbW9kZXM6XG4gKiAtIHYyOiBVc2VzIC9jb25zdW1lIGVuZHBvaW50IGZvciBmZXRjaGluZyB2YXJpYW50c1xuICogLSB2MTogVXNlcyAvZmxvdyBlbmRwb2ludCBmb3IgZmV0Y2hpbmcgdXNlciBmbG93c1xuICovXG4vLyBVc2UgYSBnbG9iYWwgc2luZ2xldG9uIHRvIGVuc3VyZSBvbmx5IG9uZSBDbG91ZFJlcG9zaXRvcnkuTWFpbiBleGlzdHNcbi8vIGV2ZW4gd2hlbiB0aGUgbW9kdWxlIGlzIGxvYWRlZCBtdWx0aXBsZSB0aW1lcyBieSBkaWZmZXJlbnQgYnVuZGxlcnNcbmNvbnN0IEdMT0JBTF9LRVkgPSAnX19NWU9QX0NMT1VEX1JFUE9TSVRPUllfTUFJTl9fJztcblxuY29uc3QgZ2V0R2xvYmFsTWFpbiA9ICgpOiBDbG91ZFJlcG9zaXRvcnkgfCB1bmRlZmluZWQgPT4ge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gKHdpbmRvdyBhcyBhbnkpW0dMT0JBTF9LRVldO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiAoZ2xvYmFsVGhpcyBhcyBhbnkpW0dMT0JBTF9LRVldO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufTtcblxuY29uc3Qgc2V0R2xvYmFsTWFpbiA9IChpbnN0YW5jZTogQ2xvdWRSZXBvc2l0b3J5KSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICh3aW5kb3cgYXMgYW55KVtHTE9CQUxfS0VZXSA9IGluc3RhbmNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIChnbG9iYWxUaGlzIGFzIGFueSlbR0xPQkFMX0tFWV0gPSBpbnN0YW5jZTtcbiAgICB9XG59O1xuXG5leHBvcnQgY2xhc3MgQ2xvdWRSZXBvc2l0b3J5IHtcbiAgICBwcml2YXRlIHN0YXRpYyBfbWFpbjogQ2xvdWRSZXBvc2l0b3J5IHwgbnVsbCA9IG51bGw7XG5cbiAgICBzdGF0aWMgZ2V0IE1haW4oKTogQ2xvdWRSZXBvc2l0b3J5IHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgYSBnbG9iYWwgaW5zdGFuY2UgYWxyZWFkeSBleGlzdHMgKGZyb20gYW5vdGhlciBidW5kbGUpXG4gICAgICAgIGNvbnN0IGdsb2JhbE1haW4gPSBnZXRHbG9iYWxNYWluKCk7XG4gICAgICAgIGlmIChnbG9iYWxNYWluKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2xvYmFsTWFpbjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSBuZXcgaW5zdGFuY2UgaWYgbmVlZGVkXG4gICAgICAgIGlmICghQ2xvdWRSZXBvc2l0b3J5Ll9tYWluKSB7XG4gICAgICAgICAgICBDbG91ZFJlcG9zaXRvcnkuX21haW4gPSBuZXcgQ2xvdWRSZXBvc2l0b3J5KCk7XG4gICAgICAgICAgICBzZXRHbG9iYWxNYWluKENsb3VkUmVwb3NpdG9yeS5fbWFpbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIENsb3VkUmVwb3NpdG9yeS5fbWFpbjtcbiAgICB9XG5cbiAgICAvLyB2MiBjYWNoZSAtIGtleWVkIGJ5IGNvbXBvbmVudElkOmVudjpwcmV2aWV3fGxpdmVcbiAgICAvLyBFYWNoIFByb21pc2UgaXMgdGFnZ2VkIHdpdGggYSBgcmVzb2x2ZWRgIHByb3BlcnR5IGFmdGVyIHNldHRsaW5nIChzZWUgZmV0Y2hDb21wb25lbnRWMikuXG4gICAgcHJpdmF0ZSB2YXJpYW50czogUmVjb3JkPHN0cmluZywgUHJvbWlzZTxJQ29tcG9uZW50Q29uZmlnPiAmIHsgcmVzb2x2ZWQ/OiBJQ29tcG9uZW50Q29uZmlnIH0+ID0ge307XG5cbiAgICAvLyBUcmFjayB3aGljaCBjb21wb25lbnRzIHdlcmUgcHJlbG9hZGVkIGFuZCB3aXRoIHdoYXQgcGFyYW1zXG4gICAgLy8gS2V5OiBjb21wb25lbnRJZCwgVmFsdWU6IHsgZW52LCBwcmV2aWV3IH1cbiAgICBwcml2YXRlIHByZWxvYWRlZENvbXBvbmVudHM6IFJlY29yZDxzdHJpbmcsIHsgZW52OiBzdHJpbmc7IHByZXZpZXc6IGJvb2xlYW4gfT4gPSB7fTtcblxuICAgIC8vIHYxIGNhY2hlXG4gICAgcHJpdmF0ZSB1c2VyRmxvd3M6IFJlY29yZDxzdHJpbmcsIFByb21pc2U8SVVzZXJGbG93Pj4gPSB7fTtcblxuICAgIHByaXZhdGUgX2RlZmF1bHRFbnYgPSAncHJvZHVjdGlvbic7XG4gICAgcHJpdmF0ZSBfZW52RXhwbGljaXRseVNldCA9IGZhbHNlO1xuICAgIHByaXZhdGUgX3N0YXRpY01vZGUgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9xdWVyeVBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBfYmFzZVVybCA9ICdodHRwczovL2Nsb3VkLm15b3AuZGV2Jykge1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhvdyBiaWcgdGhlIGNvbXBvbmVudCB3ZSBhcmUgTk9UIHJlLWRvd25sb2FkaW5nIGlzLiBEZWxpYmVyYXRlbHkgbWVhc3VyZWQgZnJvbSB3aGF0XG4gICAgICogd2UgaG9sZCByYXRoZXIgdGhhbiBmcm9tIENvbnRlbnQtTGVuZ3RoOiBvbmNlIGEgcmVzcG9uc2UgaXMgY29tcHJlc3NlZCB0aGUgaGVhZGVyIGlzXG4gICAgICogbm90IHJlYWRhYmxlIGNyb3NzLW9yaWdpbiwgc28gcmVhZGluZyBpdCB0aGVyZSByZXBvcnRlZCAwIGV2ZXJ5IHNpbmdsZSB0aW1lLlxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIHNpemVPZkhlbGQoZTogYW55KTogbnVtYmVyIHtcbiAgICAgICAgdHJ5IHsgcmV0dXJuIChlPy5jb25maWc/LnR5cGU/LnNraW5zPy5bMF0/LmxvYWRlcj8uSFRNTCB8fCAnJykubGVuZ3RoOyB9IGNhdGNoIHsgcmV0dXJuIDA7IH1cbiAgICB9XG5cbiAgICAvKiogVGhlIGhvc3QgZXZlcnkgcmVxdWVzdCBnb2VzIHRvIHVubGVzcyBkZWxpdmVyeSgpIG1vdmVkIGl0LiBOZXZlciBjaGFuZ2VzLiAqL1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfSE9TVCA9ICdodHRwczovL2Nsb3VkLm15b3AuZGV2JztcblxuICAgIC8qKlxuICAgICAqIE9wdC1pbiBkZWxpdmVyeSBzZXR0aW5ncywgc2V0IGJ5IG15b3AuZGVsaXZlcnkoKS4gT2ZmIG1lYW5zOiB0aGlzIGZpbGUgYmVoYXZlc1xuICAgICAqIEVYQUNUTFkgYXMgaXQgZGlkIGJlZm9yZSBcdTIwMTQgc2FtZSBob3N0LCBzYW1lIFVSTCwgc2FtZSBldmVyeXRoaW5nLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2RlbGl2ZXJ5OiB7IG1pbmlmeTogYm9vbGVhbjsgaG9zdDogc3RyaW5nIHwgbnVsbDsgY2FjaGU6IGJvb2xlYW47IGZsb3c6IGJvb2xlYW4gfSA9XG4gICAgICAgIHsgbWluaWZ5OiBmYWxzZSwgaG9zdDogbnVsbCwgY2FjaGU6IGZhbHNlLCBmbG93OiBmYWxzZSB9O1xuXG4gICAgLyoqXG4gICAgICogV2hhdCBhY3R1YWxseSBoYXBwZW5lZCwgZm9yIG15b3AuZGVsaXZlcnkuc3RhdHMoKS4gYGZlbGxCYWNrYCBpcyB0aGUgbnVtYmVyIHRoYXRcbiAgICAgKiBtYXR0ZXJzOiBpdCBpcyBob3cgeW91IGZpbmQgb3V0IHRoZSBsYW5lIGlzIHVuaGVhbHRoeSB3aXRob3V0IHdhaXRpbmcgZm9yIGFcbiAgICAgKiBidWcgcmVwb3J0LCBiZWNhdXNlIGEgZmFsbGJhY2sgaXMgSU5WSVNJQkxFIHRvIHRoZSBwYWdlIChpdCBzdGlsbCByZW5kZXJzKS5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9kZWxpdmVyeVN0YXRzID0ge1xuICAgICAgICByZXF1ZXN0czogMCwgdmlhRGVsaXZlcnk6IDAsIGZlbGxCYWNrOiAwLCBsYXN0RXJyb3I6IG51bGwgYXMgc3RyaW5nIHwgbnVsbCxcbiAgICAgICAgLyoqIHdoZXJlIHRoZSBsYXN0IGxvYWRzIHdlcmUgYW5zd2VyZWQgZnJvbSBcdTIwMTQgdGhlIG51bWJlciB0aGUgY2xpZW50IHdpbmRvdyBleGlzdHMgdG8gbW92ZSAqL1xuICAgICAgICBmcm9tTWVtb3J5OiAwLCBmcm9tU3RvcmFnZTogMCwgZnJvbU5ldHdvcms6IDAsXG4gICAgICAgIC8qKiByZS1jaGVja3MgYWZ0ZXIgdGhlIHdpbmRvdyBlbmRlZCwgYW5kIGhvdyBtYW55IHdlcmUgYW5zd2VyZWQgXCJub3RoaW5nIGNoYW5nZWRcIiAqL1xuICAgICAgICByZXZhbGlkYXRpb25zOiAwLCB1bmNoYW5nZWQ6IDAsIGJ5dGVzU2F2ZWQ6IDAsXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFR1cm4gb24gdGhlIG9wdC1pbiBkZWxpdmVyeSBwYXRoLlxuICAgICAqXG4gICAgICogT3B0aW5nIGluIElTIGNob29zaW5nIHRoZSBkZWxpdmVyeSBzdGFjazogdGhpcyBwb2ludHMgL2NvbnN1bWUgYXQgYGhvc3RgIChhIHNlY29uZCxcbiAgICAgKiBjb21wbGV0ZSBzdGFjayByZWFkaW5nIHRoZSBzYW1lIGRhdGEpIGFuZCBhc2tzIGZvciB0aGUgbWluaWZpZWQgYXJ0aWZhY3QuIExlYXZlIHRoaXNcbiAgICAgKiB1bmNhbGxlZCBhbmQgbm90aGluZyBhYm91dCB0aGUgU0RLIGNoYW5nZXMuXG4gICAgICpcbiAgICAgKiBEZWxpYmVyYXRlbHkgbXV0YXRlcyBUSElTIGluc3RhbmNlIHJhdGhlciB0aGFuIGNvbnN0cnVjdGluZyBhIG5ldyByZXBvc2l0b3J5OlxuICAgICAqIENsb3VkUmVwb3NpdG9yeS5NYWluIGlzIGEgZ2xvYmFsIHNpbmdsZXRvbiBzaGFyZWQgYWNyb3NzIGJ1bmRsZXMgKHNlZSBnZXRHbG9iYWxNYWluKSxcbiAgICAgKiBzbyBhIHNlY29uZCBpbnN0YW5jZSB3b3VsZCBiZSBpZ25vcmVkIGJ5IGV2ZXJ5IGNvbXBvbmVudCBhbHJlYWR5IHVzaW5nIHRoZSBmaXJzdC5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHNldERlbGl2ZXJ5KG9wdHM6IHsgbWluaWZ5PzogYm9vbGVhbjsgaG9zdD86IHN0cmluZyB8IG51bGw7IGNhY2hlPzogYm9vbGVhbjsgZmxvdz86IGJvb2xlYW4gfSA9IHt9KSB7XG4gICAgICAgIGlmIChvcHRzLm1pbmlmeSAhPT0gdW5kZWZpbmVkKSB0aGlzLl9kZWxpdmVyeS5taW5pZnkgPSAhIW9wdHMubWluaWZ5O1xuICAgICAgICBpZiAob3B0cy5ob3N0ICE9PSB1bmRlZmluZWQpIHRoaXMuX2RlbGl2ZXJ5Lmhvc3QgPSBvcHRzLmhvc3Q7XG4gICAgICAgIGlmIChvcHRzLmNhY2hlICE9PSB1bmRlZmluZWQpIHRoaXMuX2RlbGl2ZXJ5LmNhY2hlID0gISFvcHRzLmNhY2hlO1xuICAgICAgICBpZiAob3B0cy5mbG93ICE9PSB1bmRlZmluZWQpIHRoaXMuX2RlbGl2ZXJ5LmZsb3cgPSAhIW9wdHMuZmxvdztcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgZGVsaXZlcnlTdGF0cygpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4udGhpcy5fZGVsaXZlcnlTdGF0cywgaG9zdDogdGhpcy5fZGVsaXZlcnkuaG9zdCA/PyBDbG91ZFJlcG9zaXRvcnkuREVGQVVMVF9IT1NULFxuICAgICAgICAgICAgICAgICBtaW5pZnk6IHRoaXMuX2RlbGl2ZXJ5Lm1pbmlmeSwgY2FjaGU6IHRoaXMuX2RlbGl2ZXJ5LmNhY2hlLCBmbG93OiB0aGlzLl9kZWxpdmVyeS5mbG93IH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9yZ2V0IHdoYXQgdGhpcyBicm93c2VyIGhvbGRzLCBzbyB0aGUgbmV4dCBsb2FkIGFza3MgdGhlIHNlcnZlci5cbiAgICAgKiBgcmVmcmVzaCgpYCB3aXRoIG5vIGlkcyBkcm9wcyBldmVyeXRoaW5nOyB0aGUgY291bnRlcnBhcnQgdG8gdGhlIHdpbmRvdyBmb3IgdGhlIGNhc2VcbiAgICAgKiB3aGVyZSBhIGNoYW5nZSBoYXMgdG8gYmUgdmlzaWJsZSBvbiBUSElTIGxvYWQgXHUyMDE0IHJpZ2h0IGFmdGVyIHNvbWVvbmUgcHVibGlzaGVzLlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgYXN5bmMgcmVmcmVzaERlbGl2ZXJ5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCBkZWxpdmVyeVN0b3JlLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9jYWwgc2VydmVzIHdhaXRpbmcgdG8gYmUgcmVwb3J0ZWQ6IGNvbXBvbmVudElkIC0+IHtlbnYsIGNvdW50fS5cbiAgICAgKlxuICAgICAqIFRIRSBNRUFTVVJFTUVOVCBQUk9CTEVNIFRISVMgU09MVkVTLiBUaGUgYmV0dGVyIHRoaXMgY2FjaGUgd29ya3MsIHRoZSBtb3JlIHVzYWdlXG4gICAgICogdmFuaXNoZXM6IGEgdmlzaXRvciBpbnNpZGUgdGhlaXIgZnJlc2huZXNzIHdpbmRvdyByZW5kZXJzIHRoZSBwYWdlIHdpdGggbm8gcmVxdWVzdCxcbiAgICAgKiBzbyBuZWl0aGVyIHRoZSBzZXJ2ZXIgbm9yIHRoZSBDRE4gY2FuIHNlZSB0aGVtLiBMZWZ0IGFsb25lLCBhIHN1Y2Nlc3NmdWwgcm9sbG91dFxuICAgICAqIGxvb2tzIGluIHRoZSBsZWRnZXIgZXhhY3RseSBsaWtlIGN1c3RvbWVycyBsZWF2aW5nLlxuICAgICAqXG4gICAgICogU28gbG9jYWwgc2VydmVzIGFyZSBjb3VudGVkIGhlcmUgYW5kIHJlcG9ydGVkIGFmdGVyd2FyZHMsIGJhdGNoZWQsIG9uIGEgcGF0aCB0aGF0XG4gICAgICogbmV2ZXIgYmxvY2tzIHJlbmRlcmluZzogZmx1c2hlZCB3aGVuIHRoZSBwYWdlIGlzIGhpZGRlbiAoa2VlcGFsaXZlLCBzbyBpdCBzdXJ2aXZlc1xuICAgICAqIHRoZSB0YWIgY2xvc2luZykgYW5kIG9wcG9ydHVuaXN0aWNhbGx5IHdoZW5ldmVyIHRoZSBTREsgaXMgdGFsa2luZyB0byB0aGUgc2VydmVyXG4gICAgICogYW55d2F5LiBOb3RoaW5nIGlzIHNlbnQgd2hpbGUgdGhlIHBhZ2UgaXMgbG9hZGluZywgd2hpY2ggaXMgdGhlIHBvaW50IG9mIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfbG9jYWxTZXJ2ZXMgPSBuZXcgTWFwPHN0cmluZywge2lkOiBzdHJpbmc7IGVudjogc3RyaW5nOyBjb3VudDogbnVtYmVyOyBzb3VyY2U/OiAnaCd9PigpO1xuICAgIHByaXZhdGUgX2ZsdXNoQm91bmQgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIGBzb3VyY2U6ICdoJ2AgPSB0aGUgdmlldyB3YXMgc2VydmVkIGZyb20gYSBjb25maWcgdGhlIHBhZ2UncyBTRVJWRVIgZW1iZWRkZWRcbiAgICAgKiAoaHlkcmF0ZVYxQ29tcG9uZW50KSwgbm90IGZyb20gdGhpcyBicm93c2VyJ3MgY2FjaGUgd2luZG93LiBSZXBvcnRlZCBhcyBhIDR0aCBiYXRjaFxuICAgICAqIGZpZWxkIChgaWQ6ZW52Om46aGApIHNvIG91ciB1c2FnZSBkYXRhIGNhbiB0ZWxsIHNlcnZlci1yZW5kZXJlZCB2aWV3cyBhcGFydDsgYSBzZXJ2ZXJcbiAgICAgKiB0aGF0IHByZWRhdGVzIGl0IHJlYWRzIHRoZSBmaXJzdCB0aHJlZSBmaWVsZHMgYW5kIGNvdW50cyB0aGUgdmlldyBhbGwgdGhlIHNhbWUuXG4gICAgICovXG4gICAgcHJpdmF0ZSBub3RlTG9jYWxTZXJ2ZShjb21wb25lbnRJZDogc3RyaW5nLCBlbnY6IHN0cmluZywgc291cmNlPzogJ2gnKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IHNvdXJjZSA/IGAke2NvbXBvbmVudElkfToke3NvdXJjZX1gIDogY29tcG9uZW50SWQ7XG4gICAgICAgIGNvbnN0IGN1ciA9IHRoaXMuX2xvY2FsU2VydmVzLmdldChrZXkpO1xuICAgICAgICBpZiAoY3VyKSBjdXIuY291bnQrKztcbiAgICAgICAgZWxzZSB0aGlzLl9sb2NhbFNlcnZlcy5zZXQoa2V5LCB7aWQ6IGNvbXBvbmVudElkLCBlbnYsIGNvdW50OiAxLCBzb3VyY2V9KTtcbiAgICAgICAgdGhpcy5iaW5kRmx1c2goKTtcbiAgICB9XG5cbiAgICAvKiogUmVwb3J0IG9uIHBhZ2UtaGlkZSwgd2hpY2ggaXMgdGhlIG9ubHkgZXZlbnQgdGhhdCByZWxpYWJseSBmaXJlcyBvbiBtb2JpbGUuICovXG4gICAgcHJpdmF0ZSBiaW5kRmx1c2goKSB7XG4gICAgICAgIGlmICh0aGlzLl9mbHVzaEJvdW5kIHx8IHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcbiAgICAgICAgdGhpcy5fZmx1c2hCb3VuZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IG9uSGlkZSA9ICgpID0+IHsgaWYgKGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gJ2hpZGRlbicpIHRoaXMuZmx1c2hMb2NhbFNlcnZlcygpOyB9O1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgb25IaWRlKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3BhZ2VoaWRlJywgKCkgPT4gdGhpcy5mbHVzaExvY2FsU2VydmVzKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbmQgd2hhdCB3ZSBoYXZlLiBga2VlcGFsaXZlYCBpcyB3aGF0IG1ha2VzIHRoaXMgd29yayBhdCBwYWdlLWhpZGU6IHRoZSByZXF1ZXN0XG4gICAgICogb3V0bGl2ZXMgdGhlIGRvY3VtZW50LiBGYWlsdXJlIGlzIGlnbm9yZWQgXHUyMDE0IGEgbG9zdCB1c2FnZSByZXBvcnQgbXVzdCBuZXZlciBiZVxuICAgICAqIHZpc2libGUgdG8gYSB2aXNpdG9yLCBhbmQgdGhlIG5leHQgcGFnZSBsb2FkIHdpbGwgcmVwb3J0IGl0cyBvd24uXG4gICAgICovXG4gICAgZmx1c2hMb2NhbFNlcnZlcygpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLl9sb2NhbFNlcnZlcy5zaXplKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGJhdGNoID0gWy4uLnRoaXMuX2xvY2FsU2VydmVzLmVudHJpZXMoKV1cbiAgICAgICAgICAgIC5tYXAoKFssIHZdKSA9PiBgJHt2LmlkfToke3YuZW52fToke3YuY291bnR9JHt2LnNvdXJjZSA/ICc6JyArIHYuc291cmNlIDogJyd9YCkuam9pbignLCcpO1xuICAgICAgICB0aGlzLl9sb2NhbFNlcnZlcy5jbGVhcigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdXJsID0gYCR7dGhpcy5kZWxpdmVyeUhvc3QoKX0vY2xpZW50VXNhZ2U/Yj0ke2VuY29kZVVSSUNvbXBvbmVudChiYXRjaCl9YDtcbiAgICAgICAgICAgIGZldGNoKHVybCwge2tlZXBhbGl2ZTogdHJ1ZSwgbW9kZTogJ2NvcnMnLCBjcmVkZW50aWFsczogJ29taXQnfSkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgICB9IGNhdGNoIHsgLyogbmV2ZXIgdGhlIHZpc2l0b3IncyBwcm9ibGVtICovIH1cbiAgICB9XG5cbiAgICAvKiogV2hlcmUgL2NvbnN1bWUgc2hvdWxkIGJlIGZldGNoZWQgZnJvbSByaWdodCBub3cuICovXG4gICAgcHJpdmF0ZSBkZWxpdmVyeUhvc3QoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGl2ZXJ5Lmhvc3QgfHwgdGhpcy5fYmFzZVVybDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGZXRjaCBhIGRlbGl2ZXJ5IFVSTCB3aXRoIE9ORSBmYWxsYmFjayB0byB0aGUgZGVmYXVsdCBob3N0LlxuICAgICAqXG4gICAgICogVGhlIGZhbGxiYWNrIGlzIHRoZSBraWxsIHN3aXRjaDogYnJlYWsgb3IgZGlzYWJsZSB0aGUgbGFuZSBhbmQgZXZlcnkgY2xpZW50IGRyaWZ0c1xuICAgICAqIGJhY2sgdG8gY2xvdWQubXlvcC5kZXYgb24gaXRzIG93biwgd2l0aCBubyBjdXN0b21lciBkZXBsb3kuIEl0IG11c3QgdGhlcmVmb3JlIGJlXG4gICAgICogZ2VudWluZWx5IHNpbGVudCB0byB0aGUgcGFnZSBhbmQgZ2VudWluZWx5IExPVUQgaW4gc3RhdHMoKSBcdTIwMTQgYSBmYWxsYmFjayB0aGF0IG5vYm9keVxuICAgICAqIGNvdW50cyBpcyBhbiBvdXRhZ2Ugbm9ib2R5IG5vdGljZXMuXG4gICAgICpcbiAgICAgKiBPbmx5IHRyYW5zcG9ydCBmYWlsdXJlcyBhbmQgNXh4IGZhbGwgYmFjay4gQSA0MDQgaXMgYW4gYW5zd2VyOiB0aGUgY29tcG9uZW50IHJlYWxseVxuICAgICAqIGlzIG1pc3NpbmcsIGFuZCByZXRyeWluZyBlbHNld2hlcmUgd291bGQgb25seSBoaWRlIGl0LlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgZGVsaXZlcnlGZXRjaChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgICAgIC8vIFdlIGFyZSBhYm91dCB0byB1c2UgdGhlIG5ldHdvcmsgYW55d2F5OiBhIGdvb2QgbW9tZW50IHRvIGhhbmQgb3ZlciB3aGF0ZXZlciB0aGVcbiAgICAgICAgLy8gd2luZG93IHNlcnZlZCBvZmZsaW5lLCByYXRoZXIgdGhhbiB3YWl0aW5nIGZvciB0aGUgcGFnZSB0byBiZSBjbG9zZWQuXG4gICAgICAgIGlmICh0aGlzLl9sb2NhbFNlcnZlcy5zaXplKSB0aGlzLmZsdXNoTG9jYWxTZXJ2ZXMoKTtcbiAgICAgICAgY29uc3QgaG9zdCA9IHRoaXMuZGVsaXZlcnlIb3N0KCk7XG4gICAgICAgIGNvbnN0IHByaW1hcnkgPSBgJHtob3N0fSR7cGF0aH1gO1xuICAgICAgICB0aGlzLl9kZWxpdmVyeVN0YXRzLnJlcXVlc3RzKys7XG4gICAgICAgIGNvbnN0IHVzaW5nTGFuZSA9IGhvc3QgIT09IHRoaXMuX2Jhc2VVcmw7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChwcmltYXJ5KTtcbiAgICAgICAgICAgIGlmIChyZXMub2sgfHwgcmVzLnN0YXR1cyA8IDUwMCB8fCAhdXNpbmdMYW5lKSB7XG4gICAgICAgICAgICAgICAgaWYgKHVzaW5nTGFuZSAmJiByZXMub2spIHRoaXMuX2RlbGl2ZXJ5U3RhdHMudmlhRGVsaXZlcnkrKztcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fZGVsaXZlcnlTdGF0cy5sYXN0RXJyb3IgPSBgSFRUUCAke3Jlcy5zdGF0dXN9IGZyb20gJHtob3N0fWA7XG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgaWYgKCF1c2luZ0xhbmUpIHRocm93IGU7XG4gICAgICAgICAgICB0aGlzLl9kZWxpdmVyeVN0YXRzLmxhc3RFcnJvciA9IFN0cmluZyhlPy5tZXNzYWdlID8/IGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2RlbGl2ZXJ5U3RhdHMuZmVsbEJhY2srKztcbiAgICAgICAgY29uc29sZS53YXJuKGBbbXlvcF0gZGVsaXZlcnkgaG9zdCBmYWlsZWQgKCR7dGhpcy5fZGVsaXZlcnlTdGF0cy5sYXN0RXJyb3J9KSBcdTIwMTQgZmFsbGluZyBiYWNrIHRvICR7dGhpcy5fYmFzZVVybH1gKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGZldGNoKGAke3RoaXMuX2Jhc2VVcmx9JHtwYXRofWApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZSBzdGF0aWMgbW9kZSBmb3Igc2VsZi1ob3N0ZWQgY29tcG9uZW50IHJlZ2lzdHJpZXMuXG4gICAgICogSW4gc3RhdGljIG1vZGUsIFVSTHMgYXJlIGNvbnN0cnVjdGVkIGFzIGZpbGUgcGF0aHMgaW5zdGVhZCBvZiBxdWVyeSBwYXJhbXM6XG4gICAgICogYCR7YmFzZVVybH0vY29tcG9uZW50cy8ke2NvbXBvbmVudElkfS8ke2Vudn0uanNvbmBcbiAgICAgKi9cbiAgICBlbmFibGVTdGF0aWNNb2RlKCkge1xuICAgICAgICB0aGlzLl9zdGF0aWNNb2RlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgcXVlcnkgcGFyYW1ldGVycyB0byBhcHBlbmQgdG8gYWxsIGZldGNoIFVSTHMgKGUuZy4gZm9yIENETiBjYWNoZSBidXN0aW5nKS5cbiAgICAgKiBFeGFtcGxlOiBgc2V0UXVlcnlQYXJhbXMoeyBsYXN0dXBkYXRlOiAnMTExMTIwMjYnIH0pYFxuICAgICAqL1xuICAgIHNldFF1ZXJ5UGFyYW1zKHBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPikge1xuICAgICAgICB0aGlzLl9xdWVyeVBhcmFtcyA9IHBhcmFtcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGRlZmF1bHQgZW52aXJvbm1lbnQgZm9yIHRoaXMgQ2xvdWRSZXBvc2l0b3J5IGluc3RhbmNlXG4gICAgICovXG4gICAgc2V0RW52aXJvbm1lbnQoZW52OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fZGVmYXVsdEVudiA9IGVudjtcbiAgICAgICAgdGhpcy5fZW52RXhwbGljaXRseVNldCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjdXJyZW50IGRlZmF1bHQgZW52aXJvbm1lbnRcbiAgICAgKi9cbiAgICBnZXREZWZhdWx0RW52aXJvbm1lbnQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRFbnY7XG4gICAgfVxuXG4gICAgLy8gPT09PT09PT09PT09IFYyIE1ldGhvZHMgKERlZmF1bHQpID09PT09PT09PT09PVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgYSBjb21wb25lbnQgaXMgYWxyZWFkeSBjYWNoZWQvcHJlbG9hZGVkICh2MilcbiAgICAgKiBJZiBlbnYgYW5kIHByZXZpZXcgYXJlIG5vdCBwcm92aWRlZCwgY2hlY2tzIGlmIEFOWSB2ZXJzaW9uIGlzIHByZWxvYWRlZFxuICAgICAqL1xuICAgIGlzUHJlbG9hZGVkKGNvbXBvbmVudElkOiBzdHJpbmcsIGVudj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICAgICAgLy8gSWYgc3BlY2lmaWMgZW52L3ByZXZpZXcgcmVxdWVzdGVkLCBjaGVjayBleGFjdCBtYXRjaFxuICAgICAgICBpZiAoZW52ICE9PSB1bmRlZmluZWQgfHwgcHJldmlldyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBjYWNoZUtleSA9IGAke2NvbXBvbmVudElkfToke2VudiB8fCB0aGlzLl9kZWZhdWx0RW52fToke3ByZXZpZXcgPyAncHJldmlldycgOiAnbGl2ZSd9YDtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZUtleSBpbiB0aGlzLnZhcmlhbnRzO1xuICAgICAgICB9XG4gICAgICAgIC8vIE90aGVyd2lzZSBjaGVjayBpZiBhbnkgdmVyc2lvbiB3YXMgcHJlbG9hZGVkXG4gICAgICAgIHJldHVybiBjb21wb25lbnRJZCBpbiB0aGlzLnByZWxvYWRlZENvbXBvbmVudHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBwcmVsb2FkZWQgcGFyYW1zIGZvciBhIGNvbXBvbmVudCAoaWYgcHJlbG9hZGVkKVxuICAgICAqIFJldHVybnMgdW5kZWZpbmVkIGlmIG5vdCBwcmVsb2FkZWRcbiAgICAgKi9cbiAgICBnZXRQcmVsb2FkZWRQYXJhbXMoY29tcG9uZW50SWQ6IHN0cmluZyk6IHsgZW52OiBzdHJpbmc7IHByZXZpZXc6IGJvb2xlYW4gfSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLnByZWxvYWRlZENvbXBvbmVudHNbY29tcG9uZW50SWRdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc29sdmUgYSBjb21wb25lbnQgY29uZmlnOiBmZXRjaCBpdCBvbmNlLCB0aGVuIHNlcnZlIGl0IGZyb20gdGhpc1xuICAgICAqIHJlcG9zaXRvcnkncyBjYWNoZS5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgdGhlIG5hbWUgdG8gdXNlLiBgZmV0Y2hDb21wb25lbnRWMmAgaXMgdGhlIHNhbWUgbWV0aG9kIHVuZGVyIGl0c1xuICAgICAqIHZlcnNpb25lZCBuYW1lIGFuZCBzdGF5cyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBcdTIwMTQgbm90ZSB0aGF0IHRoZVxuICAgICAqIHVudmVyc2lvbmVkIGBmZXRjaENvbXBvbmVudGAgaXMgYSAqZGVwcmVjYXRlZCB2MSogQVBJIGFuZCBpcyBOT1QgdGhpcy5cbiAgICAgKlxuICAgICAqIENvbXBsZXRlcyB0aGUgdHJpbyB3aXRoIHtAbGluayBnZXRSZXNvbHZlZENvbmZpZ30gKHN5bmNocm9ub3VzIHJlYWQgb2YgYW5cbiAgICAgKiBhbHJlYWR5LXJlc29sdmVkIGNvbmZpZykgYW5kIHtAbGluayBoeWRyYXRlQ29tcG9uZW50fSAoc2VlZCBvbmUgeW91XG4gICAgICogYWxyZWFkeSBob2xkKS5cbiAgICAgKlxuICAgICAqIFByZWZlciB0aGUgbW9kdWxlLWxldmVsIGBwcmVsb2FkQ29tcG9uZW50cyhbaWRdKWAgaW4gYXBwIGNvZGU7IHJlYWNoIGZvclxuICAgICAqIHRoaXMgd2hlbiB5b3UgbmVlZCBhbiBpc29sYXRlZCByZXBvc2l0b3J5IGluc3RhbmNlIHdob3NlIGNhY2hlIGxpZmV0aW1lXG4gICAgICogeW91IGNvbnRyb2wgXHUyMDE0IGEgc2VydmVyIHdpdGggaXRzIG93biBUVEwsIGZvciBleGFtcGxlLlxuICAgICAqL1xuICAgIGFzeW5jIHJlc29sdmVDb21wb25lbnQoY29tcG9uZW50SWQ6IHN0cmluZywgZW52Pzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbik6IFByb21pc2U8SUNvbXBvbmVudENvbmZpZz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaENvbXBvbmVudFYyKGNvbXBvbmVudElkLCBlbnYsIHByZXZpZXcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZldGNoIGEgdjIgY29tcG9uZW50IGNvbmZpZ1xuICAgICAqIElmIGVudi9wcmV2aWV3IG5vdCBzcGVjaWZpZWQgYW5kIGNvbXBvbmVudCB3YXMgcHJlbG9hZGVkLCB1c2VzIHByZWxvYWRlZCBwYXJhbXNcbiAgICAgKlxuICAgICAqIEBzZWUgcmVzb2x2ZUNvbXBvbmVudCBcdTIwMTQgdGhlIHVudmVyc2lvbmVkIG5hbWUgZm9yIHRoaXMgbWV0aG9kXG4gICAgICovXG4gICAgYXN5bmMgZmV0Y2hDb21wb25lbnRWMihjb21wb25lbnRJZDogc3RyaW5nLCBlbnZpcm9ubWVudElkZW50aWZpZXI/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKTogUHJvbWlzZTxJQ29tcG9uZW50Q29uZmlnPiB7XG4gICAgICAgIGNvbnN0IHsgZW52LCB1c2VQcmV2aWV3LCBjYWNoZUtleSB9ID0gdGhpcy5yZXNvbHZlUGFyYW1zKGNvbXBvbmVudElkLCBlbnZpcm9ubWVudElkZW50aWZpZXIsIHByZXZpZXcpO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKCdbQ2xvdWRSZXBvc2l0b3J5XSBmZXRjaENvbXBvbmVudFYyJywge1xuICAgICAgICAgICAgY29tcG9uZW50SWQ6IGNvbXBvbmVudElkLnNsaWNlKDAsIDgpICsgJy4uLicsXG4gICAgICAgICAgICBlbnYsXG4gICAgICAgICAgICB1c2VQcmV2aWV3LFxuICAgICAgICAgICAgY2FjaGVLZXksXG4gICAgICAgICAgICBjYWNoZWQ6IGNhY2hlS2V5IGluIHRoaXMudmFyaWFudHNcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XSkge1xuICAgICAgICAgICAgLy8gVHJhY2sgdGhpcyBhcyBwcmVsb2FkZWQgKGZpcnN0IGZldGNoIGNvdW50cyBhcyBwcmVsb2FkKVxuICAgICAgICAgICAgaWYgKCF0aGlzLnByZWxvYWRlZENvbXBvbmVudHNbY29tcG9uZW50SWRdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmVsb2FkZWRDb21wb25lbnRzW2NvbXBvbmVudElkXSA9IHsgZW52LCBwcmV2aWV3OiB1c2VQcmV2aWV3IH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICAgICAgICB0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XSA9IG5ldyBQcm9taXNlKFxuICAgICAgICAgICAgICAgIGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmw6IHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0aWNNb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IHVzZVByZXZpZXcgPyAncHJldmlldycgOiBlbnY7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gYCR7dGhpcy5fYmFzZVVybH0vY29tcG9uZW50cy8ke2NvbXBvbmVudElkfS8ke2ZpbGV9Lmpzb25gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHFzID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh0aGlzLl9xdWVyeVBhcmFtcykudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocXMpIHVybCArPSBgPyR7cXN9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gYC9jb25zdW1lP2lkPSR7Y29tcG9uZW50SWR9JmVudj0ke2Vudn1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VQcmV2aWV3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCArPSAnJnByZXZpZXc9dHJ1ZSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgcHJldmlldyBpcyBuZXZlciBtaW5pZmllZDogdGhlIGFydGlmYWN0IGlzIGJ1aWx0IGZyb20gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVsZWFzZWQgdmFyaWFudCwgYW5kIGFuIGF1dGhvciBtdXN0IHNlZSB0aGVpciBvd24gZWRpdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fZGVsaXZlcnkubWluaWZ5ICYmICF1c2VQcmV2aWV3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCArPSAnJm9wdD1taW4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gLS0tLSB0aGUgY2xpZW50IHdpbmRvdyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHByZXZpZXcgaXMgbmV2ZXIgaGVsZDogYW4gYXV0aG9yIGhhcyB0byBzZWUgdGhlaXIgb3duIGVkaXQuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWNoZWFibGUgPSB0aGlzLl9kZWxpdmVyeS5jYWNoZSAmJiAhdGhpcy5fc3RhdGljTW9kZSAmJiAhdXNlUHJldmlldztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0b3JlS2V5ID0gY2FjaGVhYmxlID8gZGVsaXZlcnlTdG9yZS5rZXkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxpdmVyeUhvc3QoKSwgY29tcG9uZW50SWQsIGVudixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VQcmV2aWV3LCB0aGlzLl9kZWxpdmVyeS5taW5pZnkgPyAnbWluJyA6ICdyYXcnKSA6ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhlbGQgPSBjYWNoZWFibGUgPyBhd2FpdCBkZWxpdmVyeVN0b3JlLmdldChzdG9yZUtleSkgOiBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGVsZCAmJiBkZWxpdmVyeVN0b3JlLmZyZXNoKGhlbGQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5zaWRlIHRoZSB3aW5kb3c6IG5vIHJlcXVlc3QgYXQgYWxsLiBDb3VudGVkIGxvY2FsbHkgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwb3J0ZWQgbGF0ZXIsIG9yIHRoaXMgdmlzaXQgaXMgaW52aXNpYmxlIHRvIHRoZSBsZWRnZXIuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVsaXZlcnlTdGF0cy5mcm9tU3RvcmFnZSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm90ZUxvY2FsU2VydmUoY29tcG9uZW50SWQsIGVudik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMudmFyaWFudHNbY2FjaGVLZXldIGFzIGFueSkucmVzb2x2ZWQgPSBoZWxkLmNvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGhlbGQuY29uZmlnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWxkICYmIGhlbGQudGFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHdpbmRvdyBlbmRlZC4gU2VuZCBiYWNrIHRoZSB2ZXJzaW9uIHdlIGhvbGQgcmF0aGVyIHRoYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1kb3dubG9hZGluZzogdGhlIGFuc3dlciBpcyB1c3VhbGx5IGEgZmV3IGh1bmRyZWQgYnl0ZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZWxpYmVyYXRlbHkgdGhlIGBpZHM9YC9gaGF2ZT1gIHJvdXRlIGFuZCBOT1QgSWYtTm9uZS1NYXRjaDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIHJlcXVlc3QgaGVhZGVyIHRyaWdnZXJzIGEgQ09SUyBwcmVmbGlnaHQsIHRoZXJlIGlzIG5vIE9QVElPTlNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByb3V0ZSwgYW5kIGl0IGZhaWxzIGluIGEgYnJvd3NlciB3aGlsZSB3b3JraW5nIHBlcmZlY3RseSBpbiBjdXJsLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSB2YWxpZGF0b3IgdHJhdmVscyBpbiB0aGUgcXVlcnkgc3RyaW5nLCBzbyBpdCBpcyBhIHBsYWluIEdFVC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgdWlUYWdzYCByaWRlIGluc2lkZSB0aGUgaGVsZCBjb25maWcuIEEgdGFnIGVkaXQgZG9lcyBub3QgYnVtcCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXYgKHRoZSBzZXJ2ZXIgcGF0Y2hlcyB0aGUgY29tcG9uZW50IGRvYyBpbiBwbGFjZSksIHNvIHRoZSBsYW5lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwZW5kcyBhIGhhc2ggb2YgdWlUYWdzIHRvIGB0YWdgIChkZWxpdmVyeS9sYW5lIGxvZ2ljL3VpVGFncy50c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVpVGFnc0tleSk6IGEgdGFnLW9ubHkgZWRpdCBpcyBhbnN3ZXJlZCBcImNoYW5nZWRcIiwgd2l0aCB0aGUgbmV3IHRhZ3MuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hlY2tVcmwgPSBgL2NvbnN1bWU/aWRzPSR7Y29tcG9uZW50SWR9JmVudj0ke2Vudn1gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuX2RlbGl2ZXJ5Lm1pbmlmeSA/ICcmb3B0PW1pbicgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJmhhdmU9JHtlbmNvZGVVUklDb21wb25lbnQoaGVsZC50YWcpfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVsaXZlcnlTdGF0cy5yZXZhbGlkYXRpb25zKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hlY2sgPSBhd2FpdCB0aGlzLmRlbGl2ZXJ5RmV0Y2goY2hlY2tVcmwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2sub2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCBjaGVjay5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGJvZHkudW5jaGFuZ2VkIHx8IFtdKS5pbmNsdWRlcyhjb21wb25lbnRJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWxpdmVyeVN0YXRzLnVuY2hhbmdlZCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlbGl2ZXJ5U3RhdHMuYnl0ZXNTYXZlZCArPSBDbG91ZFJlcG9zaXRvcnkuc2l6ZU9mSGVsZChoZWxkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxkLnN0b3JlZEF0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxkLndpbmRvd01zID0gZGVsaXZlcnlTdG9yZS53aW5kb3dGcm9tKGNoZWNrLmhlYWRlcnMpIHx8IGhlbGQud2luZG93TXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZGVsaXZlcnlTdG9yZS5wdXQoaGVsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMudmFyaWFudHNbY2FjaGVLZXldIGFzIGFueSkucmVzb2x2ZWQgPSBoZWxkLmNvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGhlbGQuY29uZmlnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCBjaGFuZ2VkLiBUaGUgYW5zd2VyIGFscmVhZHkgY2FycmllcyB0aGUgbmV3IGJ5dGVzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IChib2R5Lml0ZW1zIHx8IFtdKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2ZnID0gY29udmVydFYyVmFyaWFudFRvQ29tcG9uZW50Q29uZmlnKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlbGl2ZXJ5U3RhdHMuZnJvbU5ldHdvcmsrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBkZWxpdmVyeVN0b3JlLnB1dCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogc3RvcmVLZXksIGNvbmZpZzogY2ZnLCB0YWc6IGl0ZW0udGFnIHx8IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZEF0OiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dNczogZGVsaXZlcnlTdG9yZS53aW5kb3dGcm9tKGNoZWNrLmhlYWRlcnMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0OiB0aGlzLmRlbGl2ZXJ5SG9zdCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gYXMgYW55KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcy52YXJpYW50c1tjYWNoZUtleV0gYXMgYW55KS5yZXNvbHZlZCA9IGNmZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGNmZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgZmFpbGVkIHJlLWNoZWNrIG11c3Qgbm90IGZhaWwgdGhlIHBhZ2U6IGZhbGwgdGhyb3VnaCB0b1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgb3JkaW5hcnkgZmV0Y2ggYmVsb3cuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSB0aGlzLl9zdGF0aWNNb2RlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBhd2FpdCBmZXRjaCh1cmwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhd2FpdCB0aGlzLmRlbGl2ZXJ5RmV0Y2godXJsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgY29tcG9uZW50IFwiJHtjb21wb25lbnRJZH1cIiAoJHtyZXMuc3RhdHVzfSR7dGhpcy5fc3RhdGljTW9kZSA/IGAgZnJvbSAke3VybH1gIDogJyd9KWApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhcmlhbnQgPSBqc29uLml0ZW07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdmFyaWFudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYENvbXBvbmVudCBcIiR7Y29tcG9uZW50SWR9XCIgbm90IGZvdW5kYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YXJpYW50LmNvbnN1bWVfdmFyaWFudCB8fCAhdmFyaWFudC5jb25zdW1lX3ZhcmlhbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQ29tcG9uZW50IFwiJHtjb21wb25lbnRJZH1cIiBoYXMgbm8gaW1wbGVtZW50YXRpb24gZm9yIGVudmlyb25tZW50IFwiJHtlbnZ9XCJgKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRDb25maWcgPSBjb252ZXJ0VjJWYXJpYW50VG9Db21wb25lbnRDb25maWcodmFyaWFudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWxpdmVyeVN0YXRzLmZyb21OZXR3b3JrKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSG9sZCBpdCBmb3IgZXhhY3RseSBhcyBsb25nIGFzIHRoZSBzZXJ2ZXIgc2FpZCwgbWludXMgd2hhdCBhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ0ROIGFscmVhZHkgc3BlbnQgKGRlbGl2ZXJ5U3RvcmUud2luZG93RnJvbSkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZGVsaXZlcnlTdG9yZS5wdXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IHN0b3JlS2V5LCBjb25maWc6IGNvbXBvbmVudENvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnOiAodmFyaWFudCBhcyBhbnkpLnRhZyB8fCBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZWRBdDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93TXM6IGRlbGl2ZXJ5U3RvcmUud2luZG93RnJvbShyZXMuaGVhZGVycyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3Q6IHRoaXMuZGVsaXZlcnlIb3N0KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBhbnkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGFnIHRoZSBQcm9taXNlIHNvIGdldFJlc29sdmVkQ29uZmlnIGNhbiByZWFkIGl0IHN5bmNocm9ub3VzbHlcbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XSBhcyBhbnkpLnJlc29sdmVkID0gY29tcG9uZW50Q29uZmlnO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShjb21wb25lbnRDb25maWcpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciB0aGUgY2FjaGVkIHJlamVjdGVkIHByb21pc2Ugc28gdGhlIG5leHQgY2FsbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZXMgYSBmcmVzaCByZXF1ZXN0IChlLmcuIGFmdGVyIG5ldHdvcmsgcmVjb3ZlcnkpXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy52YXJpYW50c1tjYWNoZUtleV07XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudmFyaWFudHNbY2FjaGVLZXldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN5bmNocm9ub3VzIHZlcnNpb24gb2YgZmV0Y2hDb21wb25lbnRWMiBcdTIwMTQgcmV0dXJucyB0aGUgY29uZmlnIG9ubHkgaWZcbiAgICAgKiB0aGUgZmV0Y2ggYWxyZWFkeSBjb21wbGV0ZWQsIG51bGwgb3RoZXJ3aXNlLlxuICAgICAqXG4gICAgICogVXNlcyB0aGUgc2FtZSBgdGhpcy52YXJpYW50c2AgY2FjaGUgdGhhdCBmZXRjaENvbXBvbmVudFYyL3ByZWxvYWRDb21wb25lbnRzXG4gICAgICogcG9wdWxhdGUuIEVhY2ggY2FjaGVkIFByb21pc2UgaXMgdGFnZ2VkIHdpdGggYSBgLnJlc29sdmVkYCBwcm9wZXJ0eSB3aGVuXG4gICAgICogaXQgc2V0dGxlcyBcdTIwMTQgdGhpcyBtZXRob2QganVzdCByZWFkcyB0aGF0IHByb3BlcnR5LiBObyBzZXBhcmF0ZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIFdoeSB0aGlzIGV4aXN0czogUmVhY3QgTmF0aXZlIG5lZWRzIHRoZSBjb25maWcgYXQgcmVuZGVyIHRpbWUgdG8gZW1iZWQgaXRcbiAgICAgKiBpbiB0aGUgV2ViVmlldyBIVE1MIChjYW4ndCBhd2FpdCBpbiB1c2VTdGF0ZSkuIElmIHByZWxvYWRDb21wb25lbnRzIHJhblxuICAgICAqIGVhcmxpZXIgYW5kIHRoZSBmZXRjaCBjb21wbGV0ZWQsIHRoaXMgcmV0dXJucyB0aGUgcmVzdWx0IHN5bmNocm9ub3VzbHksXG4gICAgICogc2tpcHBpbmcgdGhlIFdFQlZJRVdfUkVBRFkgXHUyMTkyIGZldGNoIFx1MjE5MiBpbmplY3Qgcm91bmQgdHJpcCBlbnRpcmVseS5cbiAgICAgKi9cbiAgICBnZXRSZXNvbHZlZENvbmZpZyhjb21wb25lbnRJZDogc3RyaW5nLCBlbnY/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKTogSUNvbXBvbmVudENvbmZpZyB8IG51bGwge1xuICAgICAgICBjb25zdCB7IGNhY2hlS2V5IH0gPSB0aGlzLnJlc29sdmVQYXJhbXMoY29tcG9uZW50SWQsIGVudiwgcHJldmlldyk7XG4gICAgICAgIHJldHVybiB0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XT8ucmVzb2x2ZWQgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYHVpOmAgdGFncyBvZiBhbiBhbHJlYWR5LXJlc29sdmVkIGNvbXBvbmVudCAoYFtdYCBpZiBpdCBoYXMgbm9uZSBvciBpcyBub3RcbiAgICAgKiByZXNvbHZlZCB5ZXQpLiBTeW5jaHJvbm91cywgbm8gcmVxdWVzdDogdGFncyBhcnJpdmUgd2l0aCB0aGUgY29tcG9uZW50IGl0c2VsZi5cbiAgICAgKi9cbiAgICBnZXRDb21wb25lbnRUYWdzKGNvbXBvbmVudElkOiBzdHJpbmcsIGVudj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFJlc29sdmVkQ29uZmlnKGNvbXBvbmVudElkLCBlbnYsIHByZXZpZXcpPy50eXBlPy51aVRhZ3MgfHwgW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSB3aGljaCAoZW52LCBwcmV2aWV3KSBwYWlyIFx1MjAxNCBhbmQgdGhlcmVmb3JlIHdoaWNoIGNhY2hlIGtleSBcdTIwMTQgYSBjYWxsXG4gICAgICogZm9yIGBjb21wb25lbnRJZGAgcmVmZXJzIHRvLlxuICAgICAqXG4gICAgICogU2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3IgZmV0Y2hDb21wb25lbnRWMiwgZ2V0UmVzb2x2ZWRDb25maWcgYW5kXG4gICAgICogaHlkcmF0ZUNvbXBvbmVudCwgc28gYSBoeWRyYXRlZCBjb25maWcgYWx3YXlzIGxhbmRzIG9uIHRoZSBrZXkgYSBsYXRlclxuICAgICAqIGZldGNoIHdpbGwgbG9vayB1bmRlci5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlc29sdmVQYXJhbXMoY29tcG9uZW50SWQ6IHN0cmluZywgZW52aXJvbm1lbnRJZGVudGlmaWVyPzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbikge1xuICAgICAgICAvLyBJZiBubyBleHBsaWNpdCBlbnYvcHJldmlldyBhbmQgY29tcG9uZW50IHdhcyBwcmVsb2FkZWQsIHVzZSBwcmVsb2FkZWQgcGFyYW1zXG4gICAgICAgIGNvbnN0IHByZWxvYWRlZCA9IHRoaXMucHJlbG9hZGVkQ29tcG9uZW50c1tjb21wb25lbnRJZF07XG4gICAgICAgIGNvbnN0IGhhc0V4cGxpY2l0UGFyYW1zID0gZW52aXJvbm1lbnRJZGVudGlmaWVyICE9PSB1bmRlZmluZWQgfHwgcHJldmlldyAhPT0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBlbnY6IHN0cmluZztcbiAgICAgICAgbGV0IHVzZVByZXZpZXc6IGJvb2xlYW47XG5cbiAgICAgICAgaWYgKCFoYXNFeHBsaWNpdFBhcmFtcyAmJiBwcmVsb2FkZWQpIHtcbiAgICAgICAgICAgIC8vIFVzZSBwcmVsb2FkZWQgcGFyYW1zXG4gICAgICAgICAgICBlbnYgPSBwcmVsb2FkZWQuZW52O1xuICAgICAgICAgICAgdXNlUHJldmlldyA9IHByZWxvYWRlZC5wcmV2aWV3O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVXNlIHByb3ZpZGVkIHBhcmFtcyBvciBkZWZhdWx0c1xuICAgICAgICAgICAgZW52ID0gZW52aXJvbm1lbnRJZGVudGlmaWVyIHx8IHRoaXMuX2RlZmF1bHRFbnY7XG4gICAgICAgICAgICAvLyBJZiBwcmV2aWV3IGV4cGxpY2l0bHkgdHJ1ZSBcdTIxOTIgdHJ1ZVxuICAgICAgICAgICAgLy8gSWYgcHJldmlldyBleHBsaWNpdGx5IGZhbHNlIFx1MjE5MiBmYWxzZVxuICAgICAgICAgICAgLy8gSWYgcHJldmlldyB1bmRlZmluZWQ6IGVudiB3YXMgc3BlY2lmaWVkICh2aWEgcGFyYW0gb3Igc2V0RW52aXJvbm1lbnQpIFx1MjE5MiBmYWxzZSwgb3RoZXJ3aXNlIFx1MjE5MiB0cnVlXG4gICAgICAgICAgICBjb25zdCBoYXNFZmZlY3RpdmVFbnYgPSBlbnZpcm9ubWVudElkZW50aWZpZXIgfHwgdGhpcy5fZW52RXhwbGljaXRseVNldDtcbiAgICAgICAgICAgIHVzZVByZXZpZXcgPSBwcmV2aWV3ID09PSB0cnVlID8gdHJ1ZSA6IChwcmV2aWV3ID09PSBmYWxzZSA/IGZhbHNlIDogIWhhc0VmZmVjdGl2ZUVudik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBlbnYsIHVzZVByZXZpZXcsIGNhY2hlS2V5OiBgJHtjb21wb25lbnRJZH06JHtlbnZ9OiR7dXNlUHJldmlldyA/ICdwcmV2aWV3JyA6ICdsaXZlJ31gIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VlZCBhbiBhbHJlYWR5LXJlc29sdmVkIGNvbXBvbmVudCBjb25maWcgaW50byB0aGUgY2FjaGUsIHdpdGhvdXQgYW55XG4gICAgICogbmV0d29yayByZXF1ZXN0LlxuICAgICAqXG4gICAgICogVGhlIGNvdW50ZXJwYXJ0IHRvIHtAbGluayBmZXRjaENvbXBvbmVudFYyfTogdXNlIGl0IHdoZW4gdGhlIGNvbmZpZyB3YXNcbiAgICAgKiByZXNvbHZlZCBzb21ld2hlcmUgZWxzZSBcdTIwMTQgbW9zdCBvZnRlbiBvbiBhIHNlcnZlciwgdGhlbiBlbWJlZGRlZCBpbiB0aGVcbiAgICAgKiBwYWdlIFx1MjAxNCBzbyB0aGUgYnJvd3NlciBjYW4gcmVuZGVyIHRoZSBjb21wb25lbnQgd2l0aCBubyByb3VuZCB0cmlwLlxuICAgICAqXG4gICAgICogQWZ0ZXIgaHlkcmF0aW5nLCBgZmV0Y2hDb21wb25lbnRWMmAsIGBnZXRSZXNvbHZlZENvbmZpZ2AgYW5kIGBpc1ByZWxvYWRlZGBcbiAgICAgKiBhbGwgYW5zd2VyIGZvciB0aGlzIGNvbXBvbmVudCBmcm9tIG1lbW9yeS5cbiAgICAgKlxuICAgICAqIFBhc3MgdGhlIHNhbWUgYGVudmAgLyBgcHJldmlld2AgdGhlIGNvbmZpZyB3YXMgcmVzb2x2ZWQgd2l0aDsgdGhlIGRlZmF1bHRzXG4gICAgICogbWF0Y2ggd2hhdCBhIHBsYWluIGBmZXRjaENvbXBvbmVudFYyKGNvbXBvbmVudElkKWAgd291bGQgaGF2ZSB1c2VkLlxuICAgICAqL1xuICAgIGh5ZHJhdGVDb21wb25lbnQoY29tcG9uZW50SWQ6IHN0cmluZywgY29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBlbnY/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHsgZW52OiByZXNvbHZlZEVudiwgdXNlUHJldmlldywgY2FjaGVLZXkgfSA9IHRoaXMucmVzb2x2ZVBhcmFtcyhjb21wb25lbnRJZCwgZW52LCBwcmV2aWV3KTtcblxuICAgICAgICBjb25zdCBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKGNvbmZpZykgYXMgUHJvbWlzZTxJQ29tcG9uZW50Q29uZmlnPiAmIHsgcmVzb2x2ZWQ/OiBJQ29tcG9uZW50Q29uZmlnIH07XG4gICAgICAgIC8vIFRhZyBpdCB0aGUgc2FtZSB3YXkgZmV0Y2hDb21wb25lbnRWMiBkb2VzLCBzbyBnZXRSZXNvbHZlZENvbmZpZyBjYW5cbiAgICAgICAgLy8gcmVhZCBpdCBzeW5jaHJvbm91c2x5LlxuICAgICAgICBwcm9taXNlLnJlc29sdmVkID0gY29uZmlnO1xuXG4gICAgICAgIHRoaXMudmFyaWFudHNbY2FjaGVLZXldID0gcHJvbWlzZTtcbiAgICAgICAgdGhpcy5wcmVsb2FkZWRDb21wb25lbnRzW2NvbXBvbmVudElkXSA9IHsgZW52OiByZXNvbHZlZEVudiwgcHJldmlldzogdXNlUHJldmlldyB9O1xuICAgIH1cblxuICAgIC8vID09PT09PT09PT09PSBWMSBNZXRob2RzIChMZWdhY3kpID09PT09PT09PT09PVxuXG4gICAgLyoqIGlkcyBzZWVkZWQgYnkgaHlkcmF0ZVYxQ29tcG9uZW50IHdob3NlIGZpcnN0IHVzZSBoYXMgbm90IGJlZW4gY291bnRlZCB5ZXQgKi9cbiAgICBwcml2YXRlIF9oeWRyYXRlZFYxID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICAvKipcbiAgICAgKiBTZWVkIGEgdjEgY29tcG9uZW50J3MgY29uZmlnLCBzbyBgZmV0Y2hDb21wb25lbnRWMShjb21wb25lbnRJZClgIGFuc3dlcnMgZnJvbSBtZW1vcnlcbiAgICAgKiB3aXRoIG5vIHJlcXVlc3QuIFRoZSB2MSBjb3VudGVycGFydCBvZiB7QGxpbmsgaHlkcmF0ZUNvbXBvbmVudH0uXG4gICAgICpcbiAgICAgKiBgZmxvd2AgaXMgd2hhdCBgR0VUIC9mbG93P2lkPTxjb21wb25lbnRJZD4mYXV0bz10cnVlYCByZXR1cm5zOiBlaXRoZXIgdGhlIHdob2xlIGJvZHlcbiAgICAgKiAoYHtpdGVtOiB7Li4ufX1gKSBvciBpdHMgYGl0ZW1gLiBUeXBpY2FsIHVzZSBpcyBhIHNlcnZlciB0aGF0IGZldGNoZWQgaXQgKHdpdGhcbiAgICAgKiBgJnByZWZldGNoPTFgLCBzbyB0aGUgZmV0Y2ggaXMgbm90IGNvdW50ZWQgYXMgYSB2aWV3KSBhbmQgZW1iZWRkZWQgaXQgaW4gdGhlIHBhZ2UuXG4gICAgICpcbiAgICAgKiBUaGUgdmlldyBJUyBjb3VudGVkOiB0aGUgZmlyc3QgdGltZSB0aGUgc2VlZGVkIGNvbmZpZyBpcyB1c2VkLCBpdCBpcyByZXBvcnRlZCB0aHJvdWdoXG4gICAgICogL2NsaWVudFVzYWdlIChmbGFnZ2VkIGA6aGAsIHJlY29yZGVkIGFzIGRlbGl2ZXJ5UGF0aCAnaHlkcmF0ZWQnKSwgc28gaHlkcmF0aW5nIG5ldmVyIG1ha2VzXG4gICAgICogdXNhZ2UgZGlzYXBwZWFyIGFuZCBzZXJ2ZXItcmVuZGVyZWQgdmlld3Mgc3RheSBkaXN0aW5ndWlzaGFibGUuXG4gICAgICovXG4gICAgaHlkcmF0ZVYxQ29tcG9uZW50KGNvbXBvbmVudElkOiBzdHJpbmcsIGZsb3c6IElVc2VyRmxvdyB8IHsgaXRlbTogSVVzZXJGbG93IH0pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IChmbG93IGFzIGFueSk/Lml0ZW0gPz8gZmxvdztcbiAgICAgICAgaWYgKCFpdGVtPy5jb21wb25lbnRzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgaHlkcmF0ZVYxQ29tcG9uZW50KCR7Y29tcG9uZW50SWR9KTogbm90IGEgL2Zsb3c/YXV0bz10cnVlIHJlc3BvbnNlYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51c2VyRmxvd3NbY29tcG9uZW50SWRdID0gUHJvbWlzZS5yZXNvbHZlKGl0ZW0gYXMgSVVzZXJGbG93KTtcbiAgICAgICAgdGhpcy5faHlkcmF0ZWRWMS5hZGQoY29tcG9uZW50SWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZldGNoIGEgdjEgY29tcG9uZW50IGZyb20gYSBmbG93XG4gICAgICovXG4gICAgYXN5bmMgZmV0Y2hDb21wb25lbnRWMShjb21wb25lbnRJZDogc3RyaW5nLCBmbG93SWQ/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKGZsb3dJZCkge1xuICAgICAgICAgICAgY29uc3QgZmxvdyA9IGF3YWl0IHRoaXMuZmV0Y2hGbG93KGZsb3dJZCk7XG4gICAgICAgICAgICByZXR1cm4gZmxvdy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLnR5cGUuaWQgPT09IGNvbXBvbmVudElkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGZsb3cgPSBhd2FpdCB0aGlzLmZldGNoQXV0b0Zsb3coY29tcG9uZW50SWQpO1xuICAgICAgICAgICAgcmV0dXJuIGZsb3cuY29tcG9uZW50c1swXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGZldGNoQXV0b0Zsb3coY29tcG9uZW50SWQ6IHN0cmluZykge1xuICAgICAgICBpZiAodGhpcy5faHlkcmF0ZWRWMS5kZWxldGUoY29tcG9uZW50SWQpKSB7XG4gICAgICAgICAgICB0aGlzLm5vdGVMb2NhbFNlcnZlKGNvbXBvbmVudElkLCAndjFfYXV0b19mbG93JywgJ2gnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMudXNlckZsb3dzW2NvbXBvbmVudElkXSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3JcbiAgICAgICAgICAgIHRoaXMudXNlckZsb3dzW2NvbXBvbmVudElkXSA9IG5ldyBQcm9taXNlKFxuICAgICAgICAgICAgICAgIGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGl2ZXJ5KHtmbG93OiB0cnVlfSkgbW92ZXMgdjEgY29uZmlncyB0byB0aGUgbGFuZSwgd2l0aCB0aGUgc2FtZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25lLXNob3QgZmFsbGJhY2sgdG8gY2xvdWQubXlvcC5kZXYgYXMgL2NvbnN1bWUuIE9mZjogdW5jaGFuZ2VkLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF0aCA9IGAvZmxvdz9pZD0ke2NvbXBvbmVudElkfSZhdXRvPXRydWVgO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gdGhpcy5fZGVsaXZlcnkuZmxvdyAmJiB0aGlzLl9kZWxpdmVyeS5ob3N0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBhd2FpdCB0aGlzLmRlbGl2ZXJ5RmV0Y2gocGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGF3YWl0IGZldGNoKGAke3RoaXMuX2Jhc2VVcmx9JHtwYXRofWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGpzb24uaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnVzZXJGbG93c1tjb21wb25lbnRJZF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudXNlckZsb3dzW2NvbXBvbmVudElkXTtcbiAgICB9XG5cbiAgICBhc3luYyBmZXRjaEZsb3coZmxvd0lkOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLnVzZXJGbG93c1tmbG93SWRdKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXN5bmMtcHJvbWlzZS1leGVjdXRvclxuICAgICAgICAgICAgdGhpcy51c2VyRmxvd3NbZmxvd0lkXSA9IG5ldyBQcm9taXNlKFxuICAgICAgICAgICAgICAgIGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke3RoaXMuX2Jhc2VVcmx9L2Zsb3c/aWQ9JHtmbG93SWR9JnJlc29sdmU9Y29tcG9uZW50c2BcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoanNvbi5pdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMudXNlckZsb3dzW2Zsb3dJZF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudXNlckZsb3dzW2Zsb3dJZF07XG4gICAgfVxuXG4gICAgLy8gPT09PT09PT09PT09IEJhY2t3YXJkIENvbXBhdGliaWxpdHkgPT09PT09PT09PT09XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgZmV0Y2hDb21wb25lbnRWMiBvciBmZXRjaENvbXBvbmVudFYxIGV4cGxpY2l0bHlcbiAgICAgKiBEZWZhdWx0cyB0byB2MSBiZWhhdmlvciBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIGNvZGVcbiAgICAgKi9cbiAgICBhc3luYyBmZXRjaENvbXBvbmVudChjb21wb25lbnRJZDogc3RyaW5nLCBmbG93SWQ/OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hDb21wb25lbnRWMShjb21wb25lbnRJZCwgZmxvd0lkKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIENsb3VkUmVwb3NpdG9yeSBpbnN0ZWFkXG4gKi9cbmV4cG9ydCBjb25zdCB2Ml9DbG91ZFJlcG9zaXRvcnkgPSBDbG91ZFJlcG9zaXRvcnk7XG4iLCAiaW1wb3J0IHsgQ2xvdWRSZXBvc2l0b3J5IH0gZnJvbSBcIi4vQ2xvdWRSZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBJQ29tcG9uZW50Q29uZmlnIH0gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5sZXQgX2Nsb3VkUmVwb3NpdG9yeSA9IENsb3VkUmVwb3NpdG9yeS5NYWluO1xuXG5leHBvcnQgY29uc3QgZ2V0Q2xvdWRSZXBvc2l0b3J5ID0gKCkgPT4gX2Nsb3VkUmVwb3NpdG9yeTtcblxuZXhwb3J0IGNvbnN0IGlzUHJlbG9hZGVkID0gKGNvbXBvbmVudElkOiBzdHJpbmcsIGVudj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pOiBib29sZWFuID0+IHtcbiAgICByZXR1cm4gX2Nsb3VkUmVwb3NpdG9yeS5pc1ByZWxvYWRlZChjb21wb25lbnRJZCwgZW52LCBwcmV2aWV3KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQcmVsb2FkZWRQYXJhbXMgPSAoY29tcG9uZW50SWQ6IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBfY2xvdWRSZXBvc2l0b3J5LmdldFByZWxvYWRlZFBhcmFtcyhjb21wb25lbnRJZCk7XG59O1xuXG5leHBvcnQgY29uc3QgZW5hYmxlTG9jYWxEZXYgPSAoKSA9PiB7XG4gICAgX2Nsb3VkUmVwb3NpdG9yeSA9IG5ldyBDbG91ZFJlcG9zaXRvcnkoXCJodHRwOi8vbG9jYWxob3N0OjkyOTJcIik7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0Q2xvdWRSZXBvc2l0b3J5VXJsID0gKHVybDogc3RyaW5nKSA9PiB7XG4gICAgX2Nsb3VkUmVwb3NpdG9yeSA9IG5ldyBDbG91ZFJlcG9zaXRvcnkodXJsKTtcbn07XG5cbi8qKlxuICogQ29uZmlndXJlIHRoZSBTREsgdG8gZmV0Y2ggY29tcG9uZW50cyBmcm9tIGEgc2VsZi1ob3N0ZWQgc3RhdGljIHJlZ2lzdHJ5IChTMywgQ0ROLCBldGMuKVxuICogaW5zdGVhZCBvZiB0aGUgTXlvcCBjbG91ZC4gQ29tcG9uZW50cyBhcmUgc2VydmVkIGFzIHN0YXRpYyBKU09OIGZpbGVzOlxuICogICBgJHtjZG5Vcmx9L2NvbXBvbmVudHMvJHtjb21wb25lbnRJZH0vJHtlbnZpcm9ubWVudH0uanNvbmBcbiAqL1xuZXhwb3J0IGNvbnN0IGVuYWJsZVNlbGZIb3N0ZWQgPSAoY2RuVXJsOiBzdHJpbmcsIHF1ZXJ5UGFyYW1zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPikgPT4ge1xuICAgIF9jbG91ZFJlcG9zaXRvcnkgPSBuZXcgQ2xvdWRSZXBvc2l0b3J5KGNkblVybCk7XG4gICAgX2Nsb3VkUmVwb3NpdG9yeS5lbmFibGVTdGF0aWNNb2RlKCk7XG4gICAgaWYgKHF1ZXJ5UGFyYW1zKSB7XG4gICAgICAgIF9jbG91ZFJlcG9zaXRvcnkuc2V0UXVlcnlQYXJhbXMocXVlcnlQYXJhbXMpO1xuICAgIH1cbn07XG5cbi8qKlxuICogVEhFIE9QVC1JTi4gT25lIGNhbGwsIGFuZCBub3RoaW5nIGNoYW5nZXMgZm9yIGFueW9uZSB3aG8gZG9lcyBub3QgbWFrZSBpdC5cbiAqXG4gKiAgIG15b3AuZGVsaXZlcnkoeyBtaW5pZnk6IHRydWUgfSk7XG4gKlxuICogT3B0aW5nIGluIElTIGNob29zaW5nIHRoZSBkZWxpdmVyeSBsYW5lOiBhIHNlY29uZCwgY29tcGxldGUgTXlvcCBzdGFjayAoaXRzIG93biBzZXJ2ZXJcbiAqIGFuZCBDRE4pIHJlYWRpbmcgdGhlIHNhbWUgY29tcG9uZW50IGRhdGEuIFNvIHRoaXMgY2FsbCBkb2VzIHR3byB0aGluZ3MgYXQgb25jZSBcdTIwMTQgaXRcbiAqIHBvaW50cyBgL2NvbnN1bWVgIGF0IHRoYXQgc3RhY2sgYW5kIGFza3MgaXQgZm9yIHRoZSBtaW5pZmllZCBhcnRpZmFjdCBcdTIwMTQgd2hpY2ggaXMgd2h5XG4gKiB0dXJuaW5nIHRoZSBmZWF0dXJlIG9mZiBpcyBhIGNvbmZpZyB2YWx1ZSBvbiBvdXIgc2lkZSBvciBvbmUgbGluZSBvbiB5b3VycywgYW5kIG5ldmVyXG4gKiBhIEROUyBjaGFuZ2UuXG4gKlxuICogU2FmZXR5IHByb3BlcnRpZXMsIGFsbCBkZWxpYmVyYXRlOlxuICogICAtIElmIHRoZSBsYW5lIGZhaWxzICh0cmFuc3BvcnQgZXJyb3Igb3IgNXh4KSwgdGhlIFNESyByZXRyaWVzIE9OQ0UgYWdhaW5zdFxuICogICAgIGNsb3VkLm15b3AuZGV2IGFuZCB0aGUgcGFnZSByZW5kZXJzIGFueXdheS4gYGRlbGl2ZXJ5LnN0YXRzKCkuZmVsbEJhY2tgIGNvdW50cyBpdC5cbiAqICAgLSBgY2FjaGU6IHRydWVgIGFkZHMgdGhlIGNsaWVudCB3aW5kb3c6IGEgY29tcG9uZW50IHRoaXMgYnJvd3NlciBhbHJlYWR5IGhvbGRzLCBzdGlsbFxuICogICAgIGluc2lkZSB0aGUgZnJlc2huZXNzIHRoZSBzZXJ2ZXIgcHJvbWlzZWQsIGlzIHJlbmRlcmVkIHdpdGggTk8gcmVxdWVzdC4gT25jZSB0aGVcbiAqICAgICB3aW5kb3cgZW5kcyB0aGUgYnJvd3NlciBzZW5kcyBiYWNrIHRoZSB2ZXJzaW9uIGl0IGhvbGRzIGluc3RlYWQgb2YgcmUtZG93bmxvYWRpbmcuXG4gKiAgIC0gQSBwcmV2aWV3IGlzIG5ldmVyIG1pbmlmaWVkIGFuZCBuZXZlciBjYWNoZWQuXG4gKiAgIC0gT25seSAvY29uc3VtZSBtb3Zlcy4gRXZlcnl0aGluZyBlbHNlIGtlZXBzIHRoZSBob3N0IGl0IGhhcyB0b2RheSAtLSB1bmxlc3NcbiAqICAgICBgZmxvdzogdHJ1ZWAsIHdoaWNoIGFsc28gbW92ZXMgdjEgY29tcG9uZW50IGNvbmZpZ3MgKGAvZmxvdz9hdXRvPXRydWVgKSwgd2l0aCB0aGVcbiAqICAgICBzYW1lIGZhbGxiYWNrLlxuICogICAtIEFza2luZyBmb3IgYG1pbmlmeWAgZG9lcyBub3QgZm9yY2UgaXQ6IHRoZSBzZXJ2ZXIgZGVjaWRlcyBwZXIgY29tcG9uZW50LCBhbmQgYVxuICogICAgIGNvbXBvbmVudCB0aGF0IGlzIG5vdCBlbmFibGVkIGlzIHNlcnZlZCByYXcsIHdoaWNoIGlzIG5vdCBhbiBlcnJvci5cbiAqXG4gKiBgaG9zdGAgaXMgZm9yIHVzIChhIHN0YWdpbmcgbGFuZSwgYSBsb2NhbCBzZXJ2ZXIpOyBsZWF2ZSBpdCBvdXQuXG4gKlxuICogQGludGVybmFsIERlbGl2ZXJ5IGxhbmU6IGtlcHQgb3V0IG9mIHRoZSBwdWJsaWMgQVBJIHJlZmVyZW5jZSB1bnRpbCBpdCBpcyByZWxlYXNlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IERFTElWRVJZX0hPU1QgPSAnaHR0cHM6Ly9kZWxpdmVyeS5teW9wLmRldic7XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBjb25zdCBkZWxpdmVyeSA9IChvcHRzOiB7IG1pbmlmeT86IGJvb2xlYW47IGNhY2hlPzogYm9vbGVhbjsgZmxvdz86IGJvb2xlYW47IGhvc3Q/OiBzdHJpbmcgfCBudWxsIH0gPSB7fSkgPT4ge1xuICAgIGNvbnN0IHdhbnRzTGFuZSA9IG9wdHMubWluaWZ5ICE9PSBmYWxzZSB8fCBvcHRzLmNhY2hlID09PSB0cnVlIHx8IG9wdHMuZmxvdyA9PT0gdHJ1ZTtcbiAgICBfY2xvdWRSZXBvc2l0b3J5LnNldERlbGl2ZXJ5KHtcbiAgICAgICAgbWluaWZ5OiBvcHRzLm1pbmlmeSA/PyBmYWxzZSxcbiAgICAgICAgY2FjaGU6IG9wdHMuY2FjaGUgPz8gZmFsc2UsXG4gICAgICAgIGZsb3c6IG9wdHMuZmxvdyA/PyBmYWxzZSxcbiAgICAgICAgaG9zdDogb3B0cy5ob3N0ICE9PSB1bmRlZmluZWQgPyBvcHRzLmhvc3QgOiAod2FudHNMYW5lID8gREVMSVZFUllfSE9TVCA6IG51bGwpLFxuICAgIH0pO1xuICAgIHJldHVybiBkZWxpdmVyeVN0YXRzKCk7XG59O1xuXG4vKipcbiAqIEZvcmdldCB3aGF0IHRoaXMgYnJvd3NlciBob2xkcywgc28gdGhlIG5leHQgbG9hZCBhc2tzIHRoZSBzZXJ2ZXIuIFVzZSBpdCB3aGVuIGEgY2hhbmdlXG4gKiBoYXMgdG8gYmUgdmlzaWJsZSBvbiBUSElTIGxvYWQgXHUyMDE0IHJpZ2h0IGFmdGVyIHNvbWVvbmUgcHVibGlzaGVzIFx1MjAxNCByYXRoZXIgdGhhbiB3aXRoaW4gdGhlXG4gKiBmcmVzaG5lc3Mgd2luZG93LlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgZGVsaXZlcnlSZWZyZXNoID0gYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IF9jbG91ZFJlcG9zaXRvcnkucmVmcmVzaERlbGl2ZXJ5KCk7XG4gICAgcmV0dXJuIGRlbGl2ZXJ5U3RhdHMoKTtcbn07XG5cbi8qKlxuICogV2hhdCBhbnN3ZXJlZCB0aGUgbGFzdCByZXF1ZXN0cywgYW5kIFx1MjAxNCB0aGUgbnVtYmVyIHdvcnRoIHdhdGNoaW5nIFx1MjAxNCBob3cgbWFueSB0aW1lcyB0aGVcbiAqIFNESyBoYWQgdG8gZmFsbCBiYWNrIHRvIHRoZSBkZWZhdWx0IGhvc3QgYmVjYXVzZSB0aGUgbGFuZSBkaWQgbm90IGFuc3dlci5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGRlbGl2ZXJ5U3RhdHMgPSAoKSA9PiBfY2xvdWRSZXBvc2l0b3J5LmRlbGl2ZXJ5U3RhdHMoKTtcblxuLyoqIFVuZG8gZGVsaXZlcnkoKTogYmFjayB0byB0aGUgZGVmYXVsdCBob3N0IGFuZCByYXcgYnl0ZXMsIHdpdGggbm8gcmVsb2FkLiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBjb25zdCBkZWxpdmVyeU9mZiA9ICgpID0+IHtcbiAgICBfY2xvdWRSZXBvc2l0b3J5LnNldERlbGl2ZXJ5KHsgbWluaWZ5OiBmYWxzZSwgY2FjaGU6IGZhbHNlLCBmbG93OiBmYWxzZSwgaG9zdDogbnVsbCB9KTtcbiAgICByZXR1cm4gZGVsaXZlcnlTdGF0cygpO1xufTtcblxuZXhwb3J0IGNvbnN0IHNldENsb3VkUmVwb3NpdG9yeSA9IChyZXBvc2l0b3J5OiBDbG91ZFJlcG9zaXRvcnkpID0+IHtcbiAgICBfY2xvdWRSZXBvc2l0b3J5ID0gcmVwb3NpdG9yeTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRFbnZpcm9ubWVudCA9IChlbnY6IHN0cmluZykgPT4ge1xuICAgIF9jbG91ZFJlcG9zaXRvcnkuc2V0RW52aXJvbm1lbnQoZW52KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRSZXNvbHZlZENvbmZpZyA9IChjb21wb25lbnRJZDogc3RyaW5nLCBlbnY/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKSA9PiB7XG4gICAgcmV0dXJuIF9jbG91ZFJlcG9zaXRvcnkuZ2V0UmVzb2x2ZWRDb25maWcoY29tcG9uZW50SWQsIGVudiwgcHJldmlldyk7XG59O1xuXG4vKipcbiAqIFRoZSBydW50aW1lIHRhZ3Mgb2YgYSBsb2FkZWQvcHJlbG9hZGVkIGNvbXBvbmVudDogb25seSB0YWdzIG5hbWVkIGB1aTouLi5gIChlLmcuXG4gKiBgdWk6YmV0YWApLiBSZXR1cm5zIGBbXWAgd2hlbiBpdCBoYXMgbm9uZSBvciBoYXMgbm90IGJlZW4gZmV0Y2hlZCB5ZXQuXG4gKlxuICogYGBgdHNcbiAqIGF3YWl0IHByZWxvYWRDb21wb25lbnRzKFtpZF0pO1xuICogZ2V0Q29tcG9uZW50VGFncyhpZCk7IC8vIFsndWk6YmV0YSddXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IGdldENvbXBvbmVudFRhZ3MgPSAoY29tcG9uZW50SWQ6IHN0cmluZywgZW52Pzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbik6IHN0cmluZ1tdID0+IHtcbiAgICByZXR1cm4gX2Nsb3VkUmVwb3NpdG9yeS5nZXRDb21wb25lbnRUYWdzKGNvbXBvbmVudElkLCBlbnYsIHByZXZpZXcpO1xufTtcblxuZXhwb3J0IGNvbnN0IHByZWxvYWRDb21wb25lbnRzID0gYXN5bmMgKGlkczogc3RyaW5nW10sIGVudj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pID0+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgICBpZHMubWFwKChpZCkgPT4gX2Nsb3VkUmVwb3NpdG9yeS5mZXRjaENvbXBvbmVudFYyKGlkLCBlbnYsIHByZXZpZXcpKSxcbiAgICApO1xufTtcblxuLyoqXG4gKiBTZWVkIGFscmVhZHktcmVzb2x2ZWQgY29tcG9uZW50IGNvbmZpZ3MgaW50byB0aGUgU0RLIGNhY2hlLCB3aXRoIG5vIG5ldHdvcmtcbiAqIHJlcXVlc3QuIFRoZSBjb3VudGVycGFydCB0byB7QGxpbmsgcHJlbG9hZENvbXBvbmVudHN9LlxuICpcbiAqIFVzZSBpdCB3aGVuIHRoZSBjb25maWdzIHdlcmUgcmVzb2x2ZWQgc29tZXdoZXJlIGVsc2UgXHUyMDE0IHR5cGljYWxseSBvbiBhIHNlcnZlclxuICogYW5kIGVtYmVkZGVkIGluIHRoZSBwYWdlIFx1MjAxNCBzbyB0aGUgY29tcG9uZW50IHJlbmRlcnMgd2l0aCB6ZXJvIHJvdW5kIHRyaXBzOlxuICpcbiAqIGBgYHRzXG4gKiAvLyBzZXJ2ZXI6IGNvbnN0IGNvbmZpZ3MgPSB7IFtpZF06IGF3YWl0IG5ldyBDbG91ZFJlcG9zaXRvcnkoKS5mZXRjaENvbXBvbmVudFYyKGlkKSB9XG4gKiAvLyBjbGllbnQ6XG4gKiBoeWRyYXRlQ29tcG9uZW50cyhjb25maWdzKTtcbiAqIC8vIDxNeW9wQ29tcG9uZW50IGNvbXBvbmVudElkPXtpZH0gLz4gbm93IHJlbmRlcnMgd2l0aG91dCBmZXRjaGluZ1xuICogYGBgXG4gKlxuICogUGFzcyB0aGUgc2FtZSBgZW52YCAvIGBwcmV2aWV3YCB0aGUgY29uZmlncyB3ZXJlIHJlc29sdmVkIHdpdGg7IHRoZSBkZWZhdWx0c1xuICogbWF0Y2ggd2hhdCBhIHBsYWluIGBwcmVsb2FkQ29tcG9uZW50cyhbaWRdKWAgd291bGQgaGF2ZSB1c2VkLlxuICovXG5leHBvcnQgY29uc3QgaHlkcmF0ZUNvbXBvbmVudHMgPSAoXG4gICAgY29uZmlnczogUmVjb3JkPHN0cmluZywgSUNvbXBvbmVudENvbmZpZz4sXG4gICAgZW52Pzogc3RyaW5nLFxuICAgIHByZXZpZXc/OiBib29sZWFuLFxuKSA9PiB7XG4gICAgZm9yIChjb25zdCBbaWQsIGNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlncykpIHtcbiAgICAgICAgX2Nsb3VkUmVwb3NpdG9yeS5oeWRyYXRlQ29tcG9uZW50KGlkLCBjb25maWcsIGVudiwgcHJldmlldyk7XG4gICAgfVxufTtcblxuLyoqXG4gKiBUaGUgdjEgKGlmcmFtZSBjb21wb25lbnQpIGNvdW50ZXJwYXJ0IG9mIHtAbGluayBoeWRyYXRlQ29tcG9uZW50c306IHNlZWQgY29uZmlncyB0aGF0IGFcbiAqIHNlcnZlciBhbHJlYWR5IGZldGNoZWQsIHNvIGBsb2FkQ29tcG9uZW50YCBuZWVkcyBubyBgL2Zsb3dgIHJlcXVlc3QgYXQgYWxsLlxuICpcbiAqIGBgYHRzXG4gKiAvLyBzZXJ2ZXIgKGNhY2hlIGl0IH42MCBzOyBgcHJlZmV0Y2g9MWAga2VlcHMgdGhpcyBmZXRjaCBvdXQgb2YgdGhlIHZpZXcgY291bnQsIGBmb3JgIHNheXMgd2hpY2hcbiAqIC8vIHBhZ2UgaXQgaXMgZm9yLCBzbyB0aGUgcHJlZmV0Y2ggaXMgYXR0cmlidXRlZCB0byB5b3VyIHNpdGUgXHUyMDE0IGl0cyBxdWVyeSBzdHJpbmcgaXMgbm90IHN0b3JlZCk6XG4gKiBjb25zdCBmbG93ID0gYXdhaXQgKGF3YWl0IGZldGNoKGBodHRwczovL2Nsb3VkLm15b3AuZGV2L2Zsb3c/aWQ9JHtpZH0mYXV0bz10cnVlJnByZWZldGNoPTEmZm9yPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhZ2VVcmwpfWApKS5qc29uKCk7XG4gKiAvLyBlbWJlZCBKU09OLnN0cmluZ2lmeShmbG93KSBpbiB0aGUgcGFnZSwgdGhlbiBvbiB0aGUgY2xpZW50OlxuICogaHlkcmF0ZVYxQ29tcG9uZW50cyh7IFtpZF06IGZsb3cgfSk7XG4gKiBjb25zdCBjZmcgPSBhd2FpdCBDbG91ZFJlcG9zaXRvcnkuTWFpbi5mZXRjaENvbXBvbmVudFYxKGlkKTsgICAvLyBubyByZXF1ZXN0XG4gKiBgYGBcbiAqXG4gKiBFYWNoIHNlZWRlZCBjb25maWcgaXMgY291bnRlZCBhcyBhIHZpZXcgdGhlIGZpcnN0IHRpbWUgaXQgaXMgdXNlZCAodmlhIC9jbGllbnRVc2FnZSkuXG4gKi9cbmV4cG9ydCBjb25zdCBoeWRyYXRlVjFDb21wb25lbnRzID0gKGZsb3dzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiB7XG4gICAgZm9yIChjb25zdCBbaWQsIGZsb3ddIG9mIE9iamVjdC5lbnRyaWVzKGZsb3dzKSkge1xuICAgICAgICBfY2xvdWRSZXBvc2l0b3J5Lmh5ZHJhdGVWMUNvbXBvbmVudChpZCwgZmxvdyk7XG4gICAgfVxufTtcbiIsICJpbXBvcnQge0Jhc2VDb250ZXh0TWVzc2FnZUhhbmRsZXIsIEhvc3RlZENvbXBvbmVudH0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5cbmV4cG9ydCB0eXBlIE1lc3NhZ2VUb0hvc3QgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSA9PiB2b2lkXG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSA9IGFueT4gZXh0ZW5kcyBCYXNlQ29udGV4dE1lc3NhZ2VIYW5kbGVyPFQsIFJlY29yZDxzdHJpbmcsIEhvc3RlZENvbXBvbmVudDxTaGFkb3dSb290UmVmPj4+IHtcblxuICAgIGFic3RyYWN0IG1lc3NhZ2VUeXBlOiBzdHJpbmdcblxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2VUb0hvc3Q6IGFueSwgcHVibGljIGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIEhvc3RlZENvbXBvbmVudDxTaGFkb3dSb290UmVmPj4pIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZVRvSG9zdCk7XG4gICAgfVxuXG4gICAgYWJzdHJhY3QgaW5uZXJFeGVjdXRvcjogKGV2ZW50OiBULCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB2b2lkO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IFQpID0+IHtcbiAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgaWYgKGV2ZW50LmRlc3RpbmF0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbiA9IGV2ZW50LmRlc3RpbmF0aW9uO1xuICAgICAgICAgICAgaWYgKHRoaXMuY29udGV4dFtkZXN0aW5hdGlvbl0uY29udGV4dCkge1xuXG4gICAgICAgICAgICAgICAgLy8gcGF0Y2ggdGhlIHNvdXJjZSBpZCwgdGhpbmsgYWJvdXQgdGhhdCA/XG4gICAgICAgICAgICAgICAgY29uc3QgX21lc3NhZ2VUb0hvc3QgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3Qoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4ubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZXZlbnQuZGVzdGluYXRpb24gPyBldmVudC5kZXN0aW5hdGlvbiA6IGV2ZW50LnNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uOiBldmVudC5zb3VyY2UgPyBldmVudC5zb3VyY2UgOiBldmVudC5kZXN0aW5hdGlvblxuICAgICAgICAgICAgICAgICAgICB9IGFzIEJhc2VNeW9wTWVzc2FnZSwgcmVwbGF5VG8pXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5uZXJFeGVjdXRvcihldmVudCwgdGhpcy5jb250ZXh0W2Rlc3RpbmF0aW9uXS5jb250ZXh0LCBfbWVzc2FnZVRvSG9zdCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IG15b3BBdHRyaWJ1dGVzID0ge1xuICAgIGlkOiAnbXlvcC1pZCdcbn1cbiIsICJpbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzLnRzXCI7XG5pbXBvcnQge1JlZn0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5cbmV4cG9ydCBjb25zdCBnZXRFbGVtZW50c0J5UmVmID0gKHJlZjogUmVmLCBlbDogUGFyZW50Tm9kZSkgPT4ge1xuICAgIHJldHVybiBlbC5xdWVyeVNlbGVjdG9yQWxsKGBbJHtteW9wQXR0cmlidXRlcy5pZH09JyR7cmVmLnJlZkNvbmZpZy5zZWxlY3Rvcn0nXWApO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0Rmlyc3RFbGVtZW50QnlSZWYgPSAocmVmOiBSZWYsIGVsOiBQYXJlbnROb2RlKSA9PiB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBnZXRFbGVtZW50c0J5UmVmKHJlZiwgZWwpO1xuICAgIGlmIChlbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnRzLml0ZW0oMCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufSIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmluZENsaWNrTWVzc2FnZSwgQ2xpY2tSZXBsYXlNZXNzYWdlLCBNeW9wQmluZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIsIE1lc3NhZ2VUb0hvc3R9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBCaW5kT25DbGlja0hhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8QmluZENsaWNrTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQmluZENsaWNrTWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IEJpbmRDbGlja01lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KVxuICAgICAgICBjb25zdCBjbGVhbnVwVGFza3M6IGFueVtdID0gW107XG5cbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgQ2xpY2tSZXBsYXlNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCkpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZXIpO1xuICAgICAgICAgICAgY2xlYW51cFRhc2tzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5mb3JFYWNoKHRhc2sgPT4gdGFzaygpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7TXlvcEVsZW1lbnRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlVGV4dEhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8TXlvcEVsZW1lbnRNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5DaGFuZ2VUZXh0TWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IE15b3BFbGVtZW50TWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZikgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS50ZXh0Q29udGVudCA9IGV2ZW50LmNvbnRlbnQ7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7Um9vdFJlZn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5leHBvcnQgY2xhc3MgU2hhZG93Um9vdFJlZiBleHRlbmRzIFJvb3RSZWYge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBwdWJsaWMgc2hhZG93Um9vdDogU2hhZG93Um9vdCkge1xuICAgICAgICBzdXBlcihjb250YWluZXIsIHNoYWRvd1Jvb3QpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BFbGVtZW50UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlLCBEZXRlY3RNeW9wUmVmc01lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5cbmV4cG9ydCBjbGFzcyBEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPERldGVjdE15b3BSZWZzTWVzc2FnZT4ge1xuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IERldGVjdE15b3BSZWZzTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZikgPT4ge1xuXG4gICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgIGNvbnN0IGFsbE15b3BJdGVtcyA9IHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKGBbJHtteW9wQXR0cmlidXRlcy5pZH1dYCk7XG5cbiAgICAgICAgbGV0IG15b3BSZWZzOiBNeW9wRWxlbWVudFJlZltdID0gW107XG5cbiAgICAgICAgYWxsTXlvcEl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG5cbiAgICAgICAgICAgIC8vIFRPRE8gOiB0YWtlIHRoYXQgYmFjayB0byB0aGUgZGFzaGJvYXJkP1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhpdGVtLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTtcblxuICAgICAgICAgICAgY29uc3QgbXlvcElkID0gaXRlbS5nZXRBdHRyaWJ1dGUobXlvcEF0dHJpYnV0ZXMuaWQpO1xuXG4gICAgICAgICAgICBpZiAobXlvcElkKSB7XG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnd2MgcmVjdCcsICBpdGVtLnBhcmVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIG15b3BSZWZzLnB1c2gobmV3IE15b3BFbGVtZW50UmVmKG15b3BJZCwgaXRlbS50YWdOYW1lLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBpdGVtLm9mZnNldFRvcCwgaXRlbS5vZmZzZXRMZWZ0KSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IERldGVjdGVkTXlvcFJlZnNNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgbXlvcFJlZnMpKVxuICAgIH07XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5EZXRlY3RNeW9wUmVmc01lc3NhZ2U7XG5cblxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXRBdHRyaWJ1dGVNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWYudHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3Mgc2V0QXR0cmlidXRlSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxTZXRBdHRyaWJ1dGVNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRBdHRyaWJ1dGVNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogU2V0QXR0cmlidXRlTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZikgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5zZXRBdHRyaWJ1dGUoZXZlbnQubmFtZSwgZXZlbnQudmFsdWUpXG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtcbiAgICBBZGRFdmVudExpc3RlbmVyTWVzc2FnZSxcbiAgICBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlLFxufSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWYudHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuZXhwb3J0IGNsYXNzIEFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5BZGRFdmVudExpc3RlbmVyTWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG5cbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KTtcbiAgICAgICAgY29uc3QgY2xlYW51cFRhc2tzOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuXG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKGUpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBpbiBmYWN0IHdoZW4gcnVubmluZyBpbiBXZWJDb21wb25lbnQgd2UgY2FuIHRyYW5zZmVyIHRoZSBvcmlnaW5hbCBlXG4gICAgICAgICAgICAgICAgLy8gY3VycmVudGx5IHVzaW5nIG1ha2VTZXJpYWxpemFibGUgZm9yIG5lc3RlZCBjYXNlcywgdGhpbmsgYWJvdXQgdGhhdFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCAgbWFrZVNlcmlhbGl6YWJsZShlLCBldmVudC5zZXJpYWxpemFibGVTa2VsZXRvbikpKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcihldmVudC50eXBlLCBoYW5kbGVyKTtcblxuICAgICAgICAgICAgY2xlYW51cFRhc2tzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudC50eXBlLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MuZm9yRWFjaCh0YXNrID0+IHRhc2soKSlcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHNcIjtcbmltcG9ydCB7SG9zdFNES30gZnJvbSBcIi4uLy4uL2hvc3QvaG9zdFNES1wiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLCBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi8uLi9ob3N0XCI7XG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuXG4gICAgICAgIGNvbnN0IGNyZWF0ZVJlZiA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIC8vY29uc3QgYWxsSXRlbXMgPSBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oYFske215b3BBdHRyaWJ1dGVzLmlkfT0nJHtldmVudC5yZWY/LnJlZkNvbmZpZy5zZWxlY3Rvcn0nXWApO1xuICAgICAgICAgICAgY29uc3QgYWxsSXRlbXMgPSBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oYFske215b3BBdHRyaWJ1dGVzLmlkfT0nJHtldmVudC5yZWZDb25maWcuc2VsZWN0b3J9J11gKTtcblxuICAgICAgICAgICAgaWYgKGFsbEl0ZW1zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhvc3RTREsgPSBIb3N0U0RLLkluc3RhbmNlKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZWZDb21wb25lbnQgPSBob3N0U0RLLmNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT09IGV2ZW50Lm9wdGlvbnMuaWQpITtcbiAgICAgICAgICAgICAgICBpZiAocmVmQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vLy8+Pj4+XG4gICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vICBjb25zb2xlLmxvZyhgZmFpbGVkIHRvIGZpbmQgJHtldmVudC5vcHRpb25zLmlkfSBpbiBtZW0gc2NvcGVgLCBob3N0U0RLKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy93ZSBoYXZlIHRoZSByZWYgY29tcG9uZW50IGluIG91ciBIb3N0U0RLIChzYW1lIG1lbW9yeSB3aGVuIHVzaW5nIHdlYmNvbXBvbmVudClcbiAgICAgICAgICAgICAgICAvLyAgcmVmQ29tcG9uZW50LnBhcmVudCA9IGltcGxlbWVudGF0aW9uQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIC8vZGVsZXRlIHRoZSByZWYgY29tcG9uZW50XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBob3N0U0RLLmNvbXBvbmVudHMuaW5kZXhPZihyZWZDb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgaG9zdFNESy5jb21wb25lbnRzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2NyZWF0ZVJlZkNvbXBvbmVudCBjYWxsZWQgcmVtb3ZlZCB0ZW1wIHJlZiBjb21wb25lbnQnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdjcmVhdGVSZWZDb21wb25lbnQgY2FsbGVkIHVzaW5nIHRlbXAgcmVmIGNvbXBvbmVudCcpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGltcGxlbWVudGF0aW9uQ29tcG9uZW50ID0gYXdhaXQgaG9zdFNESy5sb2FkQ29tcG9uZW50KGV2ZW50Lm5lc3RlZENvbXBvbmVudENvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgYWxsSXRlbXMuaXRlbSgwKSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQub3B0aW9ucylcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IG5vIG5lZWQgdGhpcywgcGFzcyBvcHRpb25zIGZyb20gcGFyZW50XG4gICAgICAgICAgICAgICAgLy9pbXBsZW1lbnRhdGlvbkNvbXBvbmVudC5pZCA9IGV2ZW50LnByZWRlZmluZWRJZDtcbiAgICAgICAgICAgICAgICAvL3JlZkNvbXBvbmVudC5pZCArPSAnLic7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBub3QgcmVhbGx5IG5lZWRlZCA/XG4gICAgICAgICAgICAgICAgLy8gYXdhaXQgaW1wbGVtZW50YXRpb25Db21wb25lbnQuaW5pdGlhdGVkKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRSZWZDb25maWc6IGFueVtdID0gW107XG5cbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhpbXBsZW1lbnRhdGlvbkNvbXBvbmVudC5yZWZzKS5mb3JFYWNoKHJlZk5hbWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVmID0gaW1wbGVtZW50YXRpb25Db21wb25lbnQucmVmc1tyZWZOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgcmVmID0gcmVmLl9fbm9uUHJveGllZCB8fCByZWY7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKChyZWYgYXMgSU15b3BDb21wb25lbnQpLmNvbXBvbmVudERlZmluaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZFJlZkNvbmZpZy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudERlZmluaXRpb25JZDogKHJlZiBhcyBJTXlvcENvbXBvbmVudCkuY29tcG9uZW50RGVmaW5pdGlvbi5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgbmVzdGVkUmVmQ29uZmlnKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIC0gRE9NIGVsZW1lbnQgbm90IGZvdW5kJylcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgW10sIHRydWUpKTtcblxuICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY3JlYXRlUmVmKCkudGhlbigpXG4gICAgICAgIC8vcmV0dXJuaW5nIHVuZGVmaW5lZCBzbyBpdCB3b24ndCBhY3QgYXMgYSBjbGVhbnVwXG4gICAgfVxufVxuIiwgImltcG9ydCB7RXhlY3V0ZVNjcmlwdE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtSb290UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge21ha2VTZXJpYWxpemFibGV9IGZyb20gXCIuLi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmV4cG9ydCBjb25zdCBFeGVjdXRlU2NyaXB0SGFuZGxlckV4ZWN1dG9yID0gKGV2ZW50OiBFeGVjdXRlU2NyaXB0TWVzc2FnZSwgcmVwbGllcjogKGRhdGE6IGFueSkgPT4gdm9pZCwgcm9vdFJlZjogUm9vdFJlZikgPT4ge1xuICAgIGNvbnN0IF9fc2NyaXB0SW5wdXRzID0gZXZlbnQuc2NyaXB0SW5wdXRzID8gZXZlbnQuc2NyaXB0SW5wdXRzIDoge31cbiAgICBfX3NjcmlwdElucHV0cy5tYWtlU2VyaWFsaXphYmxlID0gbWFrZVNlcmlhbGl6YWJsZTtcblxuICAgIF9fc2NyaXB0SW5wdXRzLnNlbmQgPSByZXBsaWVyO1xuICAgIF9fc2NyaXB0SW5wdXRzLnJvb3RSZWYgPSByb290UmVmO1xuICAgIF9fc2NyaXB0SW5wdXRzLl9fc2NyaXB0SW5wdXRzID0gX19zY3JpcHRJbnB1dHM7XG5cbiAgICBjb25zdCBkeW5hbWljRnVuY3Rpb24gPSBuZXcgRnVuY3Rpb24oYHJldHVybiAoJHtldmVudC5zY3JpcHR9KSguLi5hcmd1bWVudHMpYCk7XG4gICAgY29uc3QgcmV0ID0gZHluYW1pY0Z1bmN0aW9uKF9fc2NyaXB0SW5wdXRzKTtcblxuICAgIC8vIGNvbnN0IGR5bmFtaWNGdW5jdGlvbiA9IEZ1bmN0aW9uKCdzZW5kJywgJ3Jvb3RSZWYnLCdfX3NjcmlwdElucHV0cycsIC4uLk9iamVjdC5rZXlzKF9fc2NyaXB0SW5wdXRzKSwgZXZlbnQuY29udGVudCA/IGV2ZW50LmNvbnRlbnQgOiAnJylcbiAgICAvL2NvbnN0IHJldCA9IGR5bmFtaWNGdW5jdGlvbihyZXBsaWVyLCByb290UmVmLCBfX3NjcmlwdElucHV0cywgLi4uT2JqZWN0LnZhbHVlcyhfX3NjcmlwdElucHV0cykpO1xuICAgIHJlcGxpZXIocmV0KTtcbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIsIE1lc3NhZ2VUb0hvc3R9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZi50c1wiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0SGFuZGxlckV4ZWN1dG9yfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9leGVjdXRlU2NyaXB0SGFuZGxlci50c1wiO1xuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZVNjcmlwdEhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8RXhlY3V0ZVNjcmlwdE1lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5FeGVjdXRlU2NyaXB0TWVzc2FnZVxuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogRXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHtcbiAgICAgICAgY29uc3QgcmVwbGllciA9IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBkYXRhKSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgRXhlY3V0ZVNjcmlwdEhhbmRsZXJFeGVjdXRvcihldmVudCwgcmVwbGllciwgc2hhZG93Um9vdFJlZik7XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlLCBGb3JtRGF0YUVudHJ5LCBHZXRFbGVtZW50VmFsdWVNZXNzYWdlLCBJbnB1dEVsZW1lbnRWYWx1ZSx9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIsIE1lc3NhZ2VUb0hvc3R9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZi50c1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzLnRzXCI7XG5pbXBvcnQge21ha2VTZXJpYWxpemFibGV9IGZyb20gXCIuLi8uLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5jb25zdCBnZXRJbnB1dFZhbHVlID0gKGVsZW1lbnQpOiBJbnB1dEVsZW1lbnRWYWx1ZSA9PiB7XG4gICAgaWYgKCFlbGVtZW50KSByZXR1cm4gbnVsbDtcblxuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBmb3JtXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ0ZPUk0nKSB7XG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBkYXRhT2JqZWN0OiBJbnB1dEVsZW1lbnRWYWx1ZSA9IHtcbiAgICAgICAgICAgIGZvcm1EYXRhOiB7fSxcbiAgICAgICAgICAgIHVubWFwcGVkRGF0YTogW11cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBNYW51YWxseSBhZGQgZWxlbWVudHMgd2l0aG91dCBuYW1lc1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEnKTtcbiAgICAgICAgbGV0IGF1dG9OYW1lSW5kZXhlciA9IC0xO1xuXG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXlvcElkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUobXlvcEF0dHJpYnV0ZXMuaWQpO1xuICAgICAgICAgICAgICAgIGxldCBrZXkgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnbmFtZScpO1xuXG4gICAgICAgICAgICAgICAgLy8gYF8keygrK2F1dG9OYW1lSW5kZXhlcil9YFxuXG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZURhdGE6IEZvcm1EYXRhRW50cnkgPSB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBlbGVtZW50LmlkLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBrZXksXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBnZXRJbnB1dFZhbHVlKGVsZW1lbnQpLFxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogZWxlbWVudC5yZXF1aXJlZCxcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRpdHk6IG1ha2VTZXJpYWxpemFibGUoZWxlbWVudC52YWxpZGl0eSwgdHJ1ZSksXG4gICAgICAgICAgICAgICAgICAgIG15b3BJZCxcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgaWYgKCFrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2gobm9kZURhdGEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XS52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKG5vZGVEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2goZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSA9IG5vZGVEYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldID0gbm9kZURhdGFcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGRhdGFPYmplY3Q7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhIGNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvblxuICAgIGlmIChlbGVtZW50LnR5cGUgPT09ICdjaGVja2JveCcgfHwgZWxlbWVudC50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmNoZWNrZWQgPyBlbGVtZW50LnZhbHVlIDogbnVsbDtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgaW5wdXQgYW5kIHRleHRhcmVhIGVsZW1lbnRzXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ0lOUFVUJyB8fCBlbGVtZW50LnRhZ05hbWUgPT09ICdURVhUQVJFQScpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQudmFsdWU7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHNlbGVjdCBlbGVtZW50cyAoZHJvcGRvd25zKVxuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdTRUxFQ1QnKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbHVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBlZGl0YWJsZSBkaXZzIChjb250ZW50RWRpdGFibGUpXG4gICAgaWYgKGVsZW1lbnQuaXNDb250ZW50RWRpdGFibGUpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuaW5uZXJUZXh0IHx8IGVsZW1lbnQudGV4dENvbnRlbnQ7XG4gICAgfVxuXG4gICAgLy8gSWYgaXQncyBhbiB1bnN1cHBvcnRlZCBlbGVtZW50IHR5cGVcbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGNsYXNzIEdldEVsZW1lbnRWYWx1ZUhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8R2V0RWxlbWVudFZhbHVlTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuR2V0RWxlbWVudFZhbHVlTWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IEVsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UoZ2V0SW5wdXRWYWx1ZShpdGVtKSksIGV2ZW50KTtcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NldElubmVySHRtbH0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge015b3BFbGVtZW50TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIFNldElubmVySHRtbEhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8U2V0SW5uZXJIdG1sPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRJbm5lckh0bWw7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBNeW9wRWxlbWVudE1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGl0ZW0uaW5uZXJIVE1MID0gZXZlbnQuY29udGVudDtcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqIFRoZSBXZWJjb21wb25lbnQgU0RLIGlzIHRhaWxvcmVkIGZvciB1c2luZyBNeW9wIGNvbXBvbmVudHMgcGFja2FnZWQgYXMgc2VwYXJhdGUgYnVuZGxlcyBhbmQgZXhwb3NlZCBhcyB3ZWIgY29tcG9uZW50cy48YnIvPlxuICogRGV2ZWxvcGVycyBpbXBvcnRpbmcgdGhpcyBTREsgY2FuIGxldmVyYWdlIEFQSXMgYW5kIHV0aWxpdGllcyBzcGVjaWZpY2FsbHkgY3JhZnRlZCB0byBzdXBwb3J0IHRoZSBsaWZlY3ljbGUgbWFuYWdlbWVudCBhbmQgY29tbXVuaWNhdGlvbiBwYXR0ZXJucyByZXF1aXJlZCBmb3Igd2ViIGNvbXBvbmVudHMgd2l0aGluIHRoZSBNeW9wIGFyY2hpdGVjdHVyZS48YnIvPlxuICogVGhpcyBTREsgcHJvbW90ZXMgcmV1c2FiaWxpdHkgYW5kIGVuY2Fwc3VsYXRpb24sIGVuYWJsaW5nIGRldmVsb3BlcnMgdG8gYnVpbGQgbW9kdWxhciwgc2VsZi1jb250YWluZWQgY29tcG9uZW50cyB0aGF0IGNhbiBiZSBzZWFtbGVzc2x5IGludGVncmF0ZWQgaW50byB0aGUgaG9zdCBhcHBsaWNhdGlvbidzIERPTSBzdHJ1Y3R1cmUuXG4gKlxuICpcbiAqIE9uY2UgbG9hZGVkIHRoZSBgUm9vdFNES2AsIHlvdSBjYW4gbG9hZCB0aGUgYElmcmFtZVNES2BcbiAqIGBgYGpzXG4gKiBjb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IChhd2FpdCB3aW5kb3cubXlvcC5yb290U0RLLmdldFdlYmNvbXBvbmVudE1vZHVsZSgpKTtcbiAqIGBgYFxuICogb3JcbiAqIGBgYHRzXG4gKiBpbXBvcnQge2dldFdlYmNvbXBvbmVudE1vZHVsZX0gZnJvbSAnQG15b3Avc2RrJztcbiAqIGNvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gKGF3YWl0IGdldFdlYmNvbXBvbmVudE1vZHVsZSgpKTtcbiAqIGBgYFxuICogb3JcbiAqIGBgYHRzXG4gKiBpbXBvcnQge1dlYkNvbXBvbmVudFNES30gZnJvbSAnQG15b3Avc2RrL3dlYmNvbXBvbmVudCc7XG4gKiBgYGBcbiAqXG4gKi9cbmltcG9ydCB7QmFzZU15b3BTREt9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtteW9wV2ViY29tcG9uZW50Q29uc3RzfSBmcm9tIFwiLi9jb25zdHNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge0JpbmRPbkNsaWNrSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlclwiO1xuaW1wb3J0IHtDaGFuZ2VUZXh0SGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2NoYW5nZVRleHRIYW5kbGVyXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7RGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7ZGVmaW5lRHluYW1pY0ltcG9ydH0gZnJvbSBcIi4uL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydFwiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsXG4gICAgSW5pdE1lc3NhZ2UsXG4gICAgSW5pdFJlcXVlc3QsXG4gICAgTWVzc2FnZURpcmVjdGlvbixcbiAgICBNeW9wQmluZE1lc3NhZ2UsXG4gICAgTXlvcEJpbmRSZXBsYXlNZXNzYWdlXG59IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtzZXRBdHRyaWJ1dGVIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvc2V0QXR0cmlidXRlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtBZGRFdmVudExpc3RlbmVySGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyLnRzXCI7XG5pbXBvcnQge0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9leGVjdXRlU2NyaXB0SGFuZGxlci50c1wiO1xuaW1wb3J0IHtHZXRFbGVtZW50VmFsdWVIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvR2V0RWxlbWVudFZhbHVlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTZXRJbm5lckh0bWxIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvc2V0SW5uZXJIdG1sSGFuZGxlci50c1wiO1xuXG4vKipcbiAqIFRoZSBXZWJjb21wb25lbnQgU0RLIGlzIHRhaWxvcmVkIGZvciB1c2luZyBNeW9wIGNvbXBvbmVudHMgcGFja2FnZWQgYXMgc2VwYXJhdGUgYnVuZGxlcyBhbmQgZXhwb3NlZCBhcyB3ZWIgY29tcG9uZW50cy48YnIvPlxuICogRGV2ZWxvcGVycyBpbXBvcnRpbmcgdGhpcyBTREsgY2FuIGxldmVyYWdlIEFQSXMgYW5kIHV0aWxpdGllcyBzcGVjaWZpY2FsbHkgY3JhZnRlZCB0byBzdXBwb3J0IHRoZSBsaWZlY3ljbGUgbWFuYWdlbWVudCBhbmQgY29tbXVuaWNhdGlvbiBwYXR0ZXJucyByZXF1aXJlZCBmb3Igd2ViIGNvbXBvbmVudHMgd2l0aGluIHRoZSBNeW9wIGFyY2hpdGVjdHVyZS48YnIvPlxuICogVGhpcyBTREsgcHJvbW90ZXMgcmV1c2FiaWxpdHkgYW5kIGVuY2Fwc3VsYXRpb24sIGVuYWJsaW5nIGRldmVsb3BlcnMgdG8gYnVpbGQgbW9kdWxhciwgc2VsZi1jb250YWluZWQgY29tcG9uZW50cyB0aGF0IGNhbiBiZSBzZWFtbGVzc2x5IGludGVncmF0ZWQgaW50byB0aGUgaG9zdCBhcHBsaWNhdGlvbidzIERPTSBzdHJ1Y3R1cmUuXG4gKlxuICpcbiAqIE9uY2UgbG9hZGVkIHRoZSBgUm9vdCBTREtgLCB5b3UgY2FuIGxvYWQgdGhlIGBJZnJhbWVTREtgXG4gKiBgYGBqc1xuICogY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSAoYXdhaXQgd2luZG93Lm15b3Aucm9vdFNESy5nZXRXZWJjb21wb25lbnRNb2R1bGUoKSk7XG4gKiBgYGBcbiAqIG9yXG4gKiBgYGB0c1xuICogaW1wb3J0IHtnZXRXZWJjb21wb25lbnRNb2R1bGV9IGZyb20gJ0BteW9wL3Nkayc7XG4gKiBjb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IChhd2FpdCBnZXRXZWJjb21wb25lbnRNb2R1bGUoKSk7XG4gKiBgYGBcbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJDb21wb25lbnRTREsgZXh0ZW5kcyBCYXNlTXlvcFNESyB7XG5cbiAgICBhbHdheXNQYXNzRW52ZWxvcGVzVG9Ib3N0ID0gdHJ1ZTtcblxuICAgIC8vd2hlbiBuZXcgd2ViIGNvbXBvbmVudCBjcmVhdGVkLlxuICAgIGNvbm5lY3RlZENhbGxiYWNrID0gKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHNoYWRvdzogU2hhZG93Um9vdCkgPT4ge1xuICAgICAgICBjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihteW9wV2ViY29tcG9uZW50Q29uc3RzLndlYmNvbXBvbmVudF9tZXNzYWdlX2tleSwgKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50Q29udGVudCA9IGUuZGF0YSA/IGUuZGF0YSA6IGUuZGV0YWlsO1xuICAgICAgICAgICAgaWYgKCFldmVudENvbnRlbnQgfHwgIWV2ZW50Q29udGVudC5teW9wKSB7XG4gICAgICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZWN2aWVkIHdlYmNvbXBvbmVudF9tZXNzYWdlIHdpdGggd3JvbmcgdHlwZScpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBldmVudENvbnRlbnQgYXMgQmFzZU15b3BNZXNzYWdlO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogc2VuZCBjb250YWluZXIgLyBjb21wb2VubnQgaWRlbnRpZmllciBmb3IgbXVsdGlsIGNvbXBvbmVudHMgc3VwcG9ydFxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlSW5jb21lTWVzc2FnZXMoZSlcblxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW5pdE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdDb21wb25lbnRJZCA9IChtZXNzYWdlIGFzIEluaXRNZXNzYWdlKS5jb250ZW50LmlkO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHNbbmV3Q29tcG9uZW50SWRdLmNvbnRleHQgPSBuZXcgU2hhZG93Um9vdFJlZihjb250YWluZXIsIHNoYWRvdylcblxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnN1cHBvcnRlZEhhbmRsZXJzLmZvckVhY2goaGFuZGxlciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBoYW5kbGVyLmNvbnRleHQgPSB0aGlzLnNoYWRvd1Jvb3RzO1xuICAgICAgICAgICAgICAgICAgICAvLyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgLy9UT0RPIDogZml4IHRoYXQgaGFjay4gcmFjZSBjb25kaXRpb24gd2l0aCBob3N0LmxvYWQgd2hlbiBtb2R1bGUgbG9hZGVkXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBJbml0UmVxdWVzdCgpKVxuICAgICAgICB9LCAxKVxuICAgIH1cblxuICAgIG1lc3NhZ2VUb0hvc3QgPSAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4ge1xuICAgICAgICBtZXNzYWdlLmRpcmVjdGlvbiA9IE1lc3NhZ2VEaXJlY3Rpb24udXBcbiAgICAgICAgLy9tZXNzYWdlLnJlcGxheVRvSGFuZGxlciA9IHJlcGxheVRvPy5oYW5kbGVyVW5pcXVlSWQ7XG5cbiAgICAgICAgaWYgKCFtZXNzYWdlLnJlcGxheVRvSGFuZGxlciAmJiByZXBsYXlUbz8uaGFuZGxlclVuaXF1ZUlkKVxuICAgICAgICAgICAgbWVzc2FnZS5yZXBsYXlUb0hhbmRsZXIgPSByZXBsYXlUby5oYW5kbGVyVW5pcXVlSWRcblxuICAgICAgICB3aW5kb3cubXlvcC5ob3N0U0RLLnNlbmQobWVzc2FnZSlcbiAgICB9XG5cbiAgICBzdXBwb3J0ZWRIYW5kbGVyczogQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyW10gPSBbXG4gICAgICAgIG5ldyBDaGFuZ2VUZXh0SGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBTZXRJbm5lckh0bWxIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IEJpbmRPbkNsaWNrSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IHNldEF0dHJpYnV0ZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgQWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgRXhlY3V0ZVNjcmlwdEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgR2V0RWxlbWVudFZhbHVlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIC8vXG4gICAgICAgIG5ldyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cylcbiAgICBdO1xuXG4gICAgcHVibGljIGluaXQgPSAoKSA9PiB7XG4gICAgICAgIC8vdGhpcy5teUNvbXBvbmVudElkXG4gICAgICAgIC8vdGhpcy5oYW5kbGVJbmNvbWVNZXNzYWdlc1xuICAgIH1cbn1cblxuZGVmaW5lRHluYW1pY0ltcG9ydCgnV2ViQ29tcG9uZW50U0RLJywgV2ViQ29tcG9uZW50U0RLKTtcbiIsICJleHBvcnQgKiBmcm9tIFwiLi9XZWJDb21wb25lbnRTREtcIjtcbiIsICJpbXBvcnQge015b3BXZWJDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL215b3BXZWJjb21wb25lbnRcIjtcbmltcG9ydCB7TXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudFwiO1xuaW1wb3J0IHtCYXNlTXlvcExvYWRlcn0gZnJvbSBcIi4vSU15b3BMb2FkZXJcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREsudHNcIjtcbmltcG9ydCB7dXVpZHY0fSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHMudHNcIjtcbmltcG9ydCB7XG4gICAgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgSUhUTUxMb2FkZXJDb25maWcsXG4gICAgSVNraW5Db25maWcsIFNoYWRvd1Jvb3RNb2RlVHlwZSxcbiAgICBTa2luTG9hZGVycyxcbiAgICBSZW5kZXJNb2RlLCBSZW5kZXJQb2xpY3lcbn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtXZWJDb21wb25lbnRTREt9IGZyb20gXCIuLi8uLi93ZWJjb21wb25lbnRcIjtcbmltcG9ydCB7TXlvcElmcmFtZUNvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbXlvcElmcmFtZUNvbXBvbmVudC50c1wiO1xuaW1wb3J0IHtFTUJFRERFRF9TREtfQ09OVEVOVCwgSEFTX0VNQkVEREVEX1NES30gZnJvbSBcIi4uL2VtYmVkZGVkU0RLLnRzXCI7XG4vL2ltcG9ydCB7Z2V0V2ViY29tcG9uZW50TW9kdWxlfSBmcm9tIFwiLi4vLi4vU0RLLnRzXCI7XG5cbmNvbnN0IE1ZT1BfV0VCX0NPTVBPTkVOVF9NQVJLRVIgPSAnPCEtLSBteW9wLXdlYi1jb21wb25lbnQgLS0+JztcbmNvbnN0IE1ZT1BfV0VCX0NPTVBPTkVOVF9TQ1JJUFRfSUQgPSAnbXlvcC13ZWItY29tcG9uZW50JztcblxuLy8gVHJhY2sgZXh0cmFjdGVkIHdlYiBjb21wb25lbnQgc2NyaXB0cyB0byBwcmV2ZW50IGRvdWJsZSByZWdpc3RyYXRpb24uXG4vLyBNYXBzIHNjcmlwdElkIC0+IHRoZSB0YWcgbmFtZSB0aGF0IHNjcmlwdCByZWdpc3RlcmVkLiBUaGUgdGFnIE1VU1QgYmUgcmVtZW1iZXJlZCBwZXJcbi8vIHNjcmlwdDogd2luZG93Ll9fTVlPUF9UQUdfTkFNRV9fIGlzIGEgc2luZ2xlIGdsb2JhbCBzbG90IHRoYXQgZXZlcnkgZXh0cmFjdGVkIGNvbXBvbmVudFxuLy8gb3ZlcndyaXRlcywgc28gb24gYSByZS1tb3VudCAoc2NyaXB0IHNraXBwZWQpIGl0IGhvbGRzIHdoaWNoZXZlciBjb21wb25lbnQgcmFuIGxhc3QuXG5jb25zdCBleHRyYWN0ZWRXZWJDb21wb25lbnRTY3JpcHRzOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xuXG5jb25zdCBzZWVuOiBzdHJpbmdbXSA9IFtdO1xubGV0IHNkaztcbmNvbnN0IGdldEluaXRpYXRlZFNkayA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAoIXNkaykge1xuICAgICAgICAvL2NvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gYXdhaXQgZ2V0V2ViY29tcG9uZW50TW9kdWxlKClcbiAgICAgICAgc2RrID0gbmV3IFdlYkNvbXBvbmVudFNESygpO1xuICAgICAgICBzZGsuaW5pdCgpO1xuICAgIH1cbiAgICByZXR1cm4gc2RrO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVIVE1MRWxlbWVudENvbnN0cnVjdG9yKGh0bWxTdHJpbmc6IHN0cmluZywgU2hhZG93Um9vdE1vZGU/OiBrZXlvZiB0eXBlb2YgU2hhZG93Um9vdE1vZGVUeXBlKTogbmV3ICgpID0+IEhUTUxFbGVtZW50IHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBIVE1MRWxlbWVudCB7XG5cbiAgICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICAgICAgICBjb25zdCBtb2RlID0gU2hhZG93Um9vdE1vZGUgPT09IFNoYWRvd1Jvb3RNb2RlVHlwZS5vcGVuID8gJ29wZW4nIDogJ2Nsb3NlZCc7XG4gICAgICAgICAgICBjb25zdCBzaGFkb3cgPSB0aGlzLmF0dGFjaFNoYWRvdyh7bW9kZX0pO1xuICAgICAgICAgICAgZ2V0SW5pdGlhdGVkU2RrKCkudGhlbigoc2RrKSA9PiB7XG4gICAgICAgICAgICAgICAgc2RrLmNvbm5lY3RlZENhbGxiYWNrKHRoaXMsIHNoYWRvdyk7XG4gICAgICAgICAgICAgICAgc2hhZG93LmlubmVySFRNTCA9IGh0bWxTdHJpbmdcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5jb25zdCBjcmVhdGVDdXN0b21XZWJDb21wb25lbnQgPSAoY29tcG9uZW50TmFtZTogc3RyaW5nLCBodG1sOiBzdHJpbmcsIFNoYWRvd1Jvb3RNb2RlPzoga2V5b2YgdHlwZW9mIFNoYWRvd1Jvb3RNb2RlVHlwZSkgPT4ge1xuICAgIGN1c3RvbUVsZW1lbnRzLmRlZmluZShjb21wb25lbnROYW1lLCBjcmVhdGVIVE1MRWxlbWVudENvbnN0cnVjdG9yKGh0bWwsIFNoYWRvd1Jvb3RNb2RlKSk7XG4gICAgY29uc29sZS5sb2coYGRlZmluZSgnJHtjb21wb25lbnROYW1lfScpIHdhcyBjYWxsZWQsIHdlYiBjb21wb25lbnQgcmVhZHkgdG8gdXNlYCk7XG59XG5cbmNvbnN0IHRvV2ViQ29tcG9uZW50TmFtZSA9IChzdHIpID0+IHtcbiAgICByZXR1cm4gc3RyXG4gICAgICAgIC5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCAnJDEtJDInKSAvLyBBZGQgaHlwaGVuIGJlZm9yZSB1cHBlcmNhc2UgbGV0dGVyc1xuICAgICAgICAucmVwbGFjZSgvKFxcZCspL2csICctJDEnKSAvLyBBZGQgaHlwaGVuIGJlZm9yZSBkaWdpdHNcbiAgICAgICAgLnRvTG93ZXJDYXNlKCk7IC8vIENvbnZlcnQgdG8gbG93ZXJjYXNlXG59XG5cbmNvbnN0IHRvQ3VzdG9tRWxlbWVudE5hbWUgPSAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgbmFtZSA9IHRvV2ViQ29tcG9uZW50TmFtZShuYW1lKTtcbiAgICByZXR1cm4gbmFtZS5yZXBsYWNlKC9fL2csICctJyk7XG59XG5cbmxldCBwYXJzZXI6IERPTVBhcnNlcjsgLy8gPSBuZXcgRE9NUGFyc2VyKCk7XG5cbmV4cG9ydCBjbGFzcyBIVE1MQ29tcG9uZW50TG9hZGVyIGV4dGVuZHMgQmFzZU15b3BMb2FkZXIge1xuXG4gICAgdHlwZSA9IFNraW5Mb2FkZXJzLkhUTUxMb2FkZXJcblxuICAgIC8qKlxuICAgICAqIERldGVjdCBpZiBIVE1MIGlzIGEgTXlvcCBXZWIgQ29tcG9uZW50LlxuICAgICAqXG4gICAgICogVEhFIE1BUktFUiBDT01NRU5UIEFMT05FIElTIE5PVCBBIFNBRkUgU0lHTkFMLCBCRUNBVVNFIE1JTklGSUVSUyBERUxFVEUgQ09NTUVOVFMuXG4gICAgICpcbiAgICAgKiBUaGlzIHVzZWQgdG8gYmUgYHN0YXJ0c1dpdGgoTVlPUF9XRUJfQ09NUE9ORU5UX01BUktFUilgIGFuZCBub3RoaW5nIGVsc2UuIFRoZVxuICAgICAqIGRlbGl2ZXJ5IGxhbmUgbWluaWZpZXMgd2l0aCBgcmVtb3ZlQ29tbWVudHM6IHRydWVgIChteW9wLXNlcnZlciBkZXJpdmUudHMgTUlOX0NGRyksXG4gICAgICogc28gdGhlIHN0b3JlZCBgbWluYCBhcnRpZmFjdCBvZiBldmVyeSB2MiB3ZWIgY29tcG9uZW50IGxvc2VzIGl0cyBsZWFkaW5nXG4gICAgICogYDwhLS0gbXlvcC13ZWItY29tcG9uZW50IC0tPmAuIERldGVjdGlvbiB0aGVuIHJldHVybmVkIGZhbHNlLCB0aGUgY29tcG9uZW50IGZlbGxcbiAgICAgKiBiYWNrIHRvIHBsYWluIGlmcmFtZSByZW5kZXJpbmcsIGFuZCB0aGUgd2hvbGUgYXV0aG9yZWQgZG9jdW1lbnQgd2FzIHNob3duIC0tXG4gICAgICogaW5jbHVkaW5nIHRoZSB2MiBhdXRob3Jpbmcgd3JhcHBlciwgc28gUGljLVRpbWUncyBwcm9kdWN0aW9uIGRhc2hib2FyZCBkaXNwbGF5ZWQgdGhlXG4gICAgICogcHJldmlldyBjaHJvbWUgKFwiV2ViIENvbXBvbmVudCB2MlwiLCBhIHRhZy1uYW1lIGJhZGdlIHJlYWRpbmcgYGxvYWRpbmcuLi5gLCBTSVpFIC9cbiAgICAgKiBPVkVSRkxPVyAvIEJHIGNvbnRyb2xzKSBpbnN0ZWFkIG9mIHRoZWlyIGNvbXBvbmVudC4gUmVwb3J0ZWQgMjAyNi0xMC0xODsgdGhlIHNlcnZlZFxuICAgICAqIEhUTUwgbWVhc3VyZWQgMzI4LDA3MSBieXRlcyBhZ2FpbnN0IDk1MSwxMzAgYXQgb3JpZ2luLCB3aXRoIHplcm8gYDwhLS1gIGxlZnQgaW4gaXQuXG4gICAgICpcbiAgICAgKiBUaGUgc2NyaXB0IGlkIGlzIHRoZSBzaWduYWwgdGhhdCBzdXJ2aXZlcywgYW5kIGl0IGlzIHRoZSBvbmUgYGV4dHJhY3RXZWJDb21wb25lbnRTY3JpcHRgXG4gICAgICogYWxyZWFkeSBkZXBlbmRzIG9uOiBpZiB0aGF0IGVsZW1lbnQgaXMgcHJlc2VudCwgZXh0cmFjdGlvbiB3b3Jrcywgc28gZGV0ZWN0aW9uXG4gICAgICogc2hvdWxkIGFncmVlLiBDaGVja2VkIHdpdGggYSByZWdleCByYXRoZXIgdGhhbiBET01QYXJzZXIgLS0gdGhpcyBydW5zIGZvciBldmVyeVxuICAgICAqIEhUTUwgY29tcG9uZW50LCBhbmQgcGFyc2luZyBhIDMwMCBLQiBkb2N1bWVudCB0byBhbnN3ZXIgYSB5ZXMvbm8gcXVlc3Rpb24gaXMgbm90XG4gICAgICogd29ydGggaXQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBpc015b3BXZWJDb21wb25lbnQoaHRtbDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChodG1sLnRyaW1TdGFydCgpLnN0YXJ0c1dpdGgoTVlPUF9XRUJfQ09NUE9ORU5UX01BUktFUikpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChgPHNjcmlwdFtePl0qXFxcXHNpZD1bXCInXT8ke01ZT1BfV0VCX0NPTVBPTkVOVF9TQ1JJUFRfSUR9W1wiJ1xcXFxzPl1gLCAnaScpLnRlc3QoaHRtbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSBob3cgdGhpcyBjb21wb25lbnQgc2hvdWxkIHJlbmRlciwgYXBwbHlpbmcgdGhlIGhvc3QgcmVuZGVyIHBvbGljeS5cbiAgICAgKiBQcmVjZWRlbmNlOiBvcHRpb25zLnJlbmRlclBvbGljeSAocGVyLWNhbGwpIGZ1bGx5IHJlcGxhY2VzIHRoZSBnbG9iYWxcbiAgICAgKiBob3N0U0RLLnNldFJlbmRlclBvbGljeSBcdTIwMTQgc28gYW4gYXBwIGNhbiByZXN0cmljdCBnbG9iYWxseSBhbmQgYWxsb3cgc3BlY2lmaWNzLlxuICAgICAqIFdpdGggbm8gcG9saWN5IHNldCwgYmVoYXZpb3IgaXMgdW5jaGFuZ2VkIGZyb20gYmVmb3JlIChtYXJrZXIgXHUyMUQyIHdlYiBjb21wb25lbnQpLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgcmVzb2x2ZVJlbmRlck1vZGUoXG4gICAgICAgIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgICAgICBza2luOiBJU2tpbkNvbmZpZyxcbiAgICAgICAgbG9hZGVyQ29uZmlnOiBJSFRNTExvYWRlckNvbmZpZyxcbiAgICAgICAgaXNXZWJDb21wb25lbnQ6IGJvb2xlYW4sXG4gICAgICAgIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zLFxuICAgICk6IFByb21pc2U8eyBtb2RlOiBSZW5kZXJNb2RlIHwgZmFsc2U7IGlzb2xhdGU6IGJvb2xlYW4gfT4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0ZWRNb2RlOiBSZW5kZXJNb2RlID0gaXNXZWJDb21wb25lbnRcbiAgICAgICAgICAgID8gJ3dlYkNvbXBvbmVudCdcbiAgICAgICAgICAgIDogKChsb2FkZXJDb25maWcuaXNvbGF0aW9uIHx8IG9wdGlvbnM/Lmlzb2xhdGlvbikgPyAnaXNvbGF0ZWRJZnJhbWUnIDogJ2lmcmFtZScpO1xuXG4gICAgICAgIC8vIHBlci1jYWxsIHBvbGljeSB3aW5zOyBlbHNlIGdsb2JhbCBwb2xpY3kgb24gdGhlIGhvc3QgU0RLIHNpbmdsZXRvbi5cbiAgICAgICAgY29uc3QgcG9saWN5OiBSZW5kZXJQb2xpY3kgfCB1bmRlZmluZWQgPVxuICAgICAgICAgICAgb3B0aW9ucz8ucmVuZGVyUG9saWN5ID8/ICh3aW5kb3cgYXMgYW55KT8ubXlvcD8uaG9zdFNESz8uZ2V0UmVuZGVyUG9saWN5Py4oKTtcblxuICAgICAgICBjb25zdCBtb2RlOiBSZW5kZXJNb2RlIHwgZmFsc2UgPSBwb2xpY3lcbiAgICAgICAgICAgID8gYXdhaXQgcG9saWN5KHsgY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgcmVxdWVzdGVkTW9kZSwgaXNXZWJDb21wb25lbnQgfSlcbiAgICAgICAgICAgIDogcmVxdWVzdGVkTW9kZTtcblxuICAgICAgICByZXR1cm4geyBtb2RlLCBpc29sYXRlOiBtb2RlID09PSAnaXNvbGF0ZWRJZnJhbWUnIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGluLWZyYW1lIGJyaWRnZSBmb3IgaXNvbGF0ZWQgY29tcG9uZW50cy4gUnVucyBpbnNpZGUgdGhlIHNhbmRib3hlZFxuICAgICAqIChvcGFxdWUtb3JpZ2luKSBpZnJhbWUsIHRyYW5zbGF0aW5nIHRoZSBzYW1lIGF1dGhvci1mYWNpbmcgY29udHJhY3QgdG8vZnJvbVxuICAgICAqIHBvc3RNZXNzYWdlIHNpbmNlIHRoZSBob3N0IGhhcyBubyBzYW1lLW9yaWdpbiBhY2Nlc3M6XG4gICAgICogICBcdTIwMjIgZGF0YS1pbiA6IHBhcmVudCBwb3N0cyB7dHlwZTonbXlvcDppbml0J30gXHUyMTkyIGNhbGxzIHdpbmRvdy5teW9wX2luaXRfaW50ZXJmYWNlXG4gICAgICogICAgICAgICAgICAgICAocGx1cyBhIGJha2VkIGluaXRpYWwgdmFsdWUgZm9yIHRoZSBmaXJzdCByZW5kZXIpXG4gICAgICogICBcdTIwMjIgZGF0YS1vdXQ6IHdpbmRvdy5teW9wX2N0YV9oYW5kbGVyIFx1MjE5MiBwYXJlbnQucG9zdE1lc3NhZ2Uoe3R5cGU6J215b3A6Y3RhJ30pXG4gICAgICogICBcdTIwMjIgcmVzaXplICA6IFJlc2l6ZU9ic2VydmVyIFx1MjE5MiBwYXJlbnQucG9zdE1lc3NhZ2Uoe3R5cGU6J215b3A6c2l6ZSd9KVxuICAgICAqXG4gICAgICogVE9ETyhkZXYtZXh0ZW5zaW9uKTogdGhlIGlzb2xhdGVkIHBhdGggZGVsaWJlcmF0ZWx5IHNraXBzIHRoZSBzYW1lLW9yaWdpblxuICAgICAqIGRhdGFTY3JpcHQsIHNvIGl0IG5ldmVyIHBvc3RzIHRoZSBgTVlPUF9QUkVJTkpFQ1RFRF9JTklUYCBtZXNzYWdlIHRoZSBNeW9wIGRldlxuICAgICAqIGV4dGVuc2lvbiBsaXN0ZW5zIGZvciB0byBsb2cgdGhlIElOSVRJQUwgcmVuZGVyIChgaW5pdCpgKS4gTGF0ZXIgaW5pdCB1cGRhdGVzIGFuZFxuICAgICAqIGFsbCBDVEFzIGFyZSBzdGlsbCB0cmFja2VkICh0aGUgZXh0ZW5zaW9uIHdyYXBzIGBjb21wLnByb3BzYCwgd2hpY2ggb3VyIGlzb2xhdGVkXG4gICAgICogY29ubmVjdFByb3BzIGJyYW5jaCByb3V0ZXMgdGhyb3VnaCksIHNvIG9ubHkgdGhlIGZpcnN0LXJlbmRlciBwYXlsb2FkIGlzIG1pc3NpbmdcbiAgICAgKiBmcm9tIHRoZSBleHRlbnNpb24ncyBhY3Rpdml0eSBsb2cgZm9yIGlzb2xhdGVkIGNvbXBvbmVudHMuIENsb3NpbmcgdGhpcyB3b3VsZCBiZSBhXG4gICAgICogfjEtbGluZSBgcGFyZW50LnBvc3RNZXNzYWdlKHt0eXBlOidNWU9QX1BSRUlOSkVDVEVEX0lOSVQnLCBwYXlsb2FkOntkYXRhfX0pYCBpbnNpZGVcbiAgICAgKiBmbHVzaEluaXRpYWwoKSBiZWxvdyBcdTIwMTQgaW50ZW50aW9uYWxseSBOT1QgZG9uZSBmb3Igbm93IHRvIGF2b2lkIGFkZGluZyBleHRlbnNpb24tb25seVxuICAgICAqIHRyYWZmaWMgdG8gdGhlIGNvbXBvbmVudCBydW50aW1lLiBXZWIgY29tcG9uZW50cyBoYXZlIHRoZSBzYW1lIGluaXRpYWwtaW5pdCBnYXBcbiAgICAgKiAoaW5pdFdpdGhEYXRhIGlzIGNhbGxlZCBvbiB0aGUgZWxlbWVudCwgbm90IHZpYSBjb21wLnByb3BzKSBhbmQgaXQgcHJlZGF0ZXMgdGhpcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGJ1aWxkSXNvbGF0aW9uQnJpZGdlKGluaXRpYWxEYXRhTGl0ZXJhbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGA8c2NyaXB0PlxuICAgICAgICAgICAgKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgX19pbml0aWFsID0gJHtpbml0aWFsRGF0YUxpdGVyYWx9O1xuICAgICAgICAgICAgICAgIHZhciBfX3BlbmRpbmc7XG4gICAgICAgICAgICAgICAgLy8gZGF0YS1vdXQgKGN0YSlcbiAgICAgICAgICAgICAgICB3aW5kb3cubXlvcF9jdGFfaGFuZGxlciA9IGZ1bmN0aW9uIChhY3Rpb24sIHBheWxvYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgcGFyZW50LnBvc3RNZXNzYWdlKHsgX19teW9wOiB0cnVlLCB0eXBlOiAnbXlvcDpjdGEnLCBhY3Rpb246IGFjdGlvbiwgcGF5bG9hZDogcGF5bG9hZCB9LCAnKicpOyB9IGNhdGNoIChlKSB7fVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gY2FsbEluaXQoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5teW9wX2luaXRfaW50ZXJmYWNlID09PSAnZnVuY3Rpb24nKSB7IHdpbmRvdy5teW9wX2luaXRfaW50ZXJmYWNlKGRhdGEpOyByZXR1cm4gdHJ1ZTsgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGRhdGEtaW4gKGluaXQgdXBkYXRlcylcbiAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkID0gZS5kYXRhO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWQgfHwgZC5fX215b3AgIT09IHRydWUpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGQudHlwZSA9PT0gJ215b3A6aW5pdCcpIHsgaWYgKCFjYWxsSW5pdChkLmRhdGEpKSBfX3BlbmRpbmcgPSBkLmRhdGE7IH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAvLyBmaXJzdCByZW5kZXI6IHVzZSBhIHBlbmRpbmcgdXBkYXRlIGlmIG9uZSBhcnJpdmVkLCBlbHNlIHRoZSBiYWtlZCBpbml0aWFsIGRhdGFcbiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gZmx1c2hJbml0aWFsKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IChfX3BlbmRpbmcgIT09IHVuZGVmaW5lZCkgPyBfX3BlbmRpbmcgOiBfX2luaXRpYWw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxJbml0KGRhdGEpKSB7IF9fcGVuZGluZyA9IHVuZGVmaW5lZDsgX19pbml0aWFsID0gdW5kZWZpbmVkOyB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZsdXNoSW5pdGlhbCk7XG4gICAgICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgICAgICAvLyByZXNpemUgKHJlcG9ydCBjb250ZW50IHNpemUpXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gY29udGVudEhlaWdodCgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTWVhc3VyZSB0aGUgQk9EWSAoY29udGVudCBib3gpLiBkb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0IGluY2x1ZGVzXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpZnJhbWUgdmlld3BvcnQgXHUyMDE0IHdoaWNoIHdlJ3JlIGRyaXZpbmcgXHUyMDE0IHNvIGl0IHdvdWxkIHJlcG9ydCB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBmcmFtZSBoZWlnaHQsIG5vdCB0aGUgY29udGVudCwgYW5kIG5ldmVyIHNocmluay5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBkb2N1bWVudC5ib2R5O1xuICAgICAgICAgICAgICAgICAgICBpZiAoYikgcmV0dXJuIE1hdGgubWF4KGIuc2Nyb2xsSGVpZ2h0LCBiLm9mZnNldEhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBwb3N0U2l6ZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX19teW9wOiB0cnVlLCB0eXBlOiAnbXlvcDpzaXplJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGNvbnRlbnRIZWlnaHQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFdpZHRoXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCAnKicpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBPYnNlcnZlIHRoZSBCT0RZIChyZWZsb3dzIHdpdGggY29udGVudCkgXHUyMDE0IG5vdCBkb2N1bWVudEVsZW1lbnQsIHdob3NlIGJveCBpc1xuICAgICAgICAgICAgICAgIC8vIHRoZSBpZnJhbWUgdmlld3BvcnQgYW5kIHdvdWxkIGZlZWQgYmFjayBpbnRvIGEgcmVzaXplIGxvb3AuIEEgTXV0YXRpb25PYnNlcnZlclxuICAgICAgICAgICAgICAgIC8vIGNhdGNoZXMgY29udGVudCBzd2FwcyAoZS5nLiBpbm5lckhUTUwgcmUtcmVuZGVyKSB0aGF0IGRvbid0IGNoYW5nZSBib2R5J3MgYm94LlxuICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuUmVzaXplT2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgdmFyIF9fcm8gPSBuZXcgUmVzaXplT2JzZXJ2ZXIocG9zdFNpemUpOyBpZiAoZG9jdW1lbnQuYm9keSkgX19yby5vYnNlcnZlKGRvY3VtZW50LmJvZHkpOyB9IGNhdGNoIChlKSB7fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAod2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIgJiYgZG9jdW1lbnQuYm9keSkge1xuICAgICAgICAgICAgICAgICAgICB0cnkgeyBuZXcgTXV0YXRpb25PYnNlcnZlcihwb3N0U2l6ZSkub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSwgYXR0cmlidXRlczogdHJ1ZSwgY2hhcmFjdGVyRGF0YTogdHJ1ZSB9KTsgfSBjYXRjaCAoZSkge31cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBwb3N0U2l6ZSk7XG4gICAgICAgICAgICAgICAgcG9zdFNpemUoKTtcbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgIDwvc2NyaXB0PmA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXh0cmFjdCB0aGUgd2ViIGNvbXBvbmVudCBzY3JpcHQgY29udGVudCBmcm9tIEhUTUxcbiAgICAgKi9cbiAgICBwcml2YXRlIGV4dHJhY3RXZWJDb21wb25lbnRTY3JpcHQoaHRtbDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgY29uc3QgZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhodG1sLCAndGV4dC9odG1sJyk7XG4gICAgICAgIGNvbnN0IHNjcmlwdCA9IGRvYy5nZXRFbGVtZW50QnlJZChNWU9QX1dFQl9DT01QT05FTlRfU0NSSVBUX0lEKTtcbiAgICAgICAgcmV0dXJuIHNjcmlwdD8udGV4dENvbnRlbnQgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlIHRoZSB3ZWIgY29tcG9uZW50IHNjcmlwdCBvbiB0aGUgaG9zdCBkb2N1bWVudC5cbiAgICAgKiBSZXR1cm5zIHRoZSBjdXN0b20gZWxlbWVudCB0YWcgbmFtZSB0aGlzIHNjcmlwdCByZWdpc3RlcmVkLlxuICAgICAqL1xuICAgIHByaXZhdGUgZXhlY3V0ZVdlYkNvbXBvbmVudFNjcmlwdChzY3JpcHRDb250ZW50OiBzdHJpbmcsIHNjcmlwdElkOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICAvLyBDaGVjayBpZiBhbHJlYWR5IGV4ZWN1dGVkIChieSBzY3JpcHQgY29udGVudCBoYXNoKVxuICAgICAgICBjb25zdCBjYWNoZWRUYWdOYW1lID0gZXh0cmFjdGVkV2ViQ29tcG9uZW50U2NyaXB0cy5nZXQoc2NyaXB0SWQpO1xuICAgICAgICBpZiAoY2FjaGVkVGFnTmFtZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFtNeW9wV2ViQ29tcG9uZW50XSBTY3JpcHQgYWxyZWFkeSBleGVjdXRlZCBmb3IgJHtzY3JpcHRJZH0sIHJldXNpbmcgPCR7Y2FjaGVkVGFnTmFtZX0+YCk7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkVGFnTmFtZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgICBzY3JpcHQudGV4dENvbnRlbnQgPSBzY3JpcHRDb250ZW50O1xuICAgICAgICBzY3JpcHQuaWQgPSBgbXlvcC1leHRyYWN0ZWQtJHtzY3JpcHRJZH1gO1xuICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgZ2xvYmFsIGltbWVkaWF0ZWx5OiB0aGUgbmV4dCBleHRyYWN0ZWQgc2NyaXB0IHRvIHJ1biB3aWxsIG92ZXJ3cml0ZSBpdC5cbiAgICAgICAgY29uc3QgdGFnTmFtZSA9ICh3aW5kb3cgYXMgYW55KS5fX01ZT1BfVEFHX05BTUVfXztcbiAgICAgICAgaWYgKHRhZ05hbWUpIHtcbiAgICAgICAgICAgIGV4dHJhY3RlZFdlYkNvbXBvbmVudFNjcmlwdHMuc2V0KHNjcmlwdElkLCB0YWdOYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgW015b3BXZWJDb21wb25lbnRdIEV4ZWN1dGVkIHdlYiBjb21wb25lbnQgc2NyaXB0OiAke3NjcmlwdElkfSAtPiA8JHt0YWdOYW1lfT5gKTtcbiAgICAgICAgcmV0dXJuIHRhZ05hbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZCBhIE15b3AgV2ViIENvbXBvbmVudCAoZXh0cmFjdGVkIGFuZCBydW4gb24gaG9zdCBkb2N1bWVudClcbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIGxvYWRFeHRyYWN0ZWRXZWJDb21wb25lbnQoXG4gICAgICAgIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgICAgICBza2luOiBJU2tpbkNvbmZpZyxcbiAgICAgICAgY29udGFpbmVyOiBIVE1MRWxlbWVudCxcbiAgICAgICAgaHRtbDogc3RyaW5nLFxuICAgICAgICBvcHRpb25zPzogbG9hZGVyT3B0aW9uc1xuICAgICk6IFByb21pc2U8TXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudD4ge1xuICAgICAgICBjb25zdCBzY3JpcHRDb250ZW50ID0gdGhpcy5leHRyYWN0V2ViQ29tcG9uZW50U2NyaXB0KGh0bWwpO1xuXG4gICAgICAgIGlmICghc2NyaXB0Q29udGVudCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbTXlvcFdlYkNvbXBvbmVudF0gTm8gPHNjcmlwdCBpZD1cIm15b3Atd2ViLWNvbXBvbmVudFwiPiBmb3VuZCBpbiBIVE1MJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVc2UgY29tcG9uZW50IGRlZmluaXRpb24gaWQgYXMgc2NyaXB0IGlkZW50aWZpZXIgZm9yIGRlZHVwbGljYXRpb25cbiAgICAgICAgY29uc3Qgc2NyaXB0SWQgPSBgJHtjb21wb25lbnREZWZpbml0aW9uLmlkfS0ke3NraW4uaWR9YDtcblxuICAgICAgICAvLyBFeGVjdXRlIHRoZSBzY3JpcHQgb24gdGhlIGhvc3QgZG9jdW1lbnQsIG9yIHJldXNlIHRoZSB0YWcgaXQgcmVnaXN0ZXJlZCBlYXJsaWVyLlxuICAgICAgICAvLyBOZXZlciByZS1yZWFkIHdpbmRvdy5fX01ZT1BfVEFHX05BTUVfXyBoZXJlOiBvbiBhIHJlLW1vdW50IHRoZSBzY3JpcHQgaXMgc2tpcHBlZCBhbmRcbiAgICAgICAgLy8gdGhlIGdsb2JhbCBzdGlsbCBwb2ludHMgYXQgd2hpY2hldmVyIGNvbXBvbmVudCdzIHNjcmlwdCByYW4gbGFzdCwgd2hpY2ggd291bGQgYnVpbGRcbiAgICAgICAgLy8gdGhpcyBjb250YWluZXIncyBlbGVtZW50IGZyb20gYW5vdGhlciBjb21wb25lbnQncyB0YWcuXG4gICAgICAgIGNvbnN0IHRhZ05hbWUgPSB0aGlzLmV4ZWN1dGVXZWJDb21wb25lbnRTY3JpcHQoc2NyaXB0Q29udGVudCwgc2NyaXB0SWQpO1xuXG4gICAgICAgIGlmICghdGFnTmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbTXlvcFdlYkNvbXBvbmVudF0gU2NyaXB0IGRpZCBub3Qgc2V0IHdpbmRvdy5fX01ZT1BfVEFHX05BTUVfXycpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBjdXN0b20gZWxlbWVudFxuICAgICAgICBjb25zdCBkb21JZCA9IGBteW9wLWNvbXAtJHt1dWlkdjQoKX1gO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTtcbiAgICAgICAgZWxlbWVudC5pZCA9IGRvbUlkO1xuXG4gICAgICAgIGlmIChvcHRpb25zPy5oaWRkZW4pIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMCc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gJzAnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciBjb250YWluZXIgaWYgbmVlZGVkXG4gICAgICAgIGlmICghY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJteW9wLWNvbXAtXCJdJykpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENPTlNUUlVDVCBCRUZPUkUgQVBQRU5ESU5HLiBBcHBlbmRpbmcgaXMgd2hhdCBjb25uZWN0cyB0aGUgZWxlbWVudCBhbmQgZmlyZXMgaXRzXG4gICAgICAgIC8vIGNvbm5lY3RlZENhbGxiYWNrLCBhbmQgdGhlIHdyYXBwZXIncyBjb25zdHJ1Y3RvciBpcyB3aGVyZSB0aGUgc2luZ2xlICdteW9wLWN0YSdcbiAgICAgICAgLy8gbGlzdGVuZXIgaXMgYXR0YWNoZWQuIFdpdGggdGhlIGFwcGVuZCBmaXJzdCwgYW55IENUQSBhIGNvbXBvbmVudCBlbWl0cyBmcm9tXG4gICAgICAgIC8vIGNvbm5lY3RlZENhbGxiYWNrIC0tIGEgc2VhcmNoIGJveCBhbm5vdW5jaW5nIGl0cyBpbml0aWFsIHN0YXRlLCBhIHdpZGdldFxuICAgICAgICAvLyByZXBvcnRpbmcgYSBkZWZhdWx0IHNlbGVjdGlvbiAtLSB3YXMgZGlzcGF0Y2hlZCBiZWZvcmUgYW55dGhpbmcgd2FzIGxpc3RlbmluZ1xuICAgICAgICAvLyBhbmQgc2lsZW50bHkgbG9zdC4gVGhlIHdyYXBwZXIgb25seSBuZWVkcyB0aGUgZWxlbWVudCByZWZlcmVuY2UsIG5vdCBhIGNvbm5lY3RlZFxuICAgICAgICAvLyBlbGVtZW50LCBzbyBjb25zdHJ1Y3RpbmcgZmlyc3QgY29zdHMgbm90aGluZyBhbmQgbWFrZXMgdGhlIGJ1ZmZlciBjb3ZlciB0aGVcbiAgICAgICAgLy8gd2hvbGUgZmlyc3QgcmVuZGVyIHJhdGhlciB0aGFuIG9ubHkgdGhlIGluaXRXaXRoRGF0YSBwYXJ0IG9mIGl0LlxuICAgICAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgTXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudChcbiAgICAgICAgICAgIGNvbXBvbmVudERlZmluaXRpb24sXG4gICAgICAgICAgICBza2luLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgIHRhZ05hbWUsXG4gICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIGVsZW1lbnQsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIEluaXRpYWxpemUgd2l0aCBkYXRhIGlmIHByb3ZpZGVkLiBgbnVsbGAgaXMgbm90IGRhdGEgLS0gc2VlIHRoZSBkYXRhIHNjcmlwdFxuICAgICAgICAvLyBndWFyZCBpbiB0aGUgSFRNTCBwYXRoIGZvciB3aHkgY2FsbGluZyBhbiBpbml0IGludGVyZmFjZSB3aXRoIG51bGwgaXMgd29yc2VcbiAgICAgICAgLy8gdGhhbiBub3QgY2FsbGluZyBpdC5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmRhdGEgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zPy5kYXRhICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb21wb25lbnQuaW5pdFdpdGhEYXRhKG9wdGlvbnMuZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZyhgW015b3BXZWJDb21wb25lbnRdIExvYWRlZCA8JHt0YWdOYW1lfT4gaW50byBjb250YWluZXJgKTtcblxuICAgICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgIH1cblxuICAgIGxvYWQgPSBhc3luYyAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4ge1xuXG4gICAgICAgIGNvbnN0IGxvYWRlckNvbmZpZyA9IChza2luLmxvYWRlciBhcyBJSFRNTExvYWRlckNvbmZpZyk7XG5cbiAgICAgICAgY29uc3QgaXNXQyA9IHRoaXMuaXNNeW9wV2ViQ29tcG9uZW50KGxvYWRlckNvbmZpZy5IVE1MKTtcbiAgICAgICAgY29uc3QgeyBtb2RlLCBpc29sYXRlIH0gPSBhd2FpdCB0aGlzLnJlc29sdmVSZW5kZXJNb2RlKGNvbXBvbmVudERlZmluaXRpb24sIHNraW4sIGxvYWRlckNvbmZpZywgaXNXQywgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKG1vZGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFtNeW9wXSBSZW5kZXJpbmcgYmxvY2tlZCBieSByZW5kZXIgcG9saWN5IGZvciBjb21wb25lbnQgXCIke2NvbXBvbmVudERlZmluaXRpb24uaWR9XCJgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc1dDKSB7XG4gICAgICAgICAgICAvLyBXZWItY29tcG9uZW50IEhUTUwgb25seSBzdXBwb3J0cyB0aGUgd2ViLWNvbXBvbmVudCBjb250cmFjdDsgYSBwb2xpY3kgdGhhdFxuICAgICAgICAgICAgLy8gZGVuaWVzIGl0IGhhcyBubyBpZnJhbWUgZmFsbGJhY2sgKHNlZSBwbGFuIFx1MDBBNzMuMykgXHUyMDE0IGJsb2NrIHJhdGhlciB0aGFuXG4gICAgICAgICAgICAvLyBzaWxlbnRseSByZW5kZXIgYnJva2VuLiBVbnRydXN0ZWQgY29udHJpYnV0b3JzIG11c3Qgc2hpcCBpZnJhbWUgY29tcG9uZW50cy5cbiAgICAgICAgICAgIGlmIChtb2RlICE9PSAnd2ViQ29tcG9uZW50Jykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgW015b3BdIFdlYi1jb21wb25lbnQgcmVuZGVyaW5nIGRlbmllZCBieSByZW5kZXIgcG9saWN5IGZvciBjb21wb25lbnQgXCIke2NvbXBvbmVudERlZmluaXRpb24uaWR9XCJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRFeHRyYWN0ZWRXZWJDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgY29udGFpbmVyLCBsb2FkZXJDb25maWcuSFRNTCwgb3B0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZG9tSWQgPSBgbXlvcC1jb21wLSR7dXVpZHY0KCl9YFxuICAgICAgICBsZXQgZWxlbWVudDtcblxuICAgICAgICBpZiAobG9hZGVyQ29uZmlnLnNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUubG9jYWxGcmFtZSkge1xuICAgICAgICAgICAgY29uc3QgdW5pcUlkID0gdXVpZHY0KCk7XG4gICAgICAgICAgICBjb25zdCBkb21JZCA9IGBteW9wLWNvbXAtJHt1bmlxSWR9YFxuXG4gICAgICAgICAgICBsZXQgSWZyYW1lRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5pZCA9IGRvbUlkO1xuXG4gICAgICAgICAgICAvLyBGdWxsIGlzb2xhdGlvbjogYSBzYW5kYm94IFdJVEhPVVQgYWxsb3ctc2FtZS1vcmlnaW4gZ2l2ZXMgdGhlIGZyYW1lIGFuXG4gICAgICAgICAgICAvLyBvcGFxdWUgb3JpZ2luIFx1MjAxNCBubyBob3N0IERPTS9jb29raWVzL3BhcmVudCBhY2Nlc3MuIE11c3QgYmUgc2V0IGJlZm9yZVxuICAgICAgICAgICAgLy8gdGhlIGZyYW1lIG5hdmlnYXRlcyAoaS5lLiBiZWZvcmUgc3JjZG9jIC8gYXBwZW5kKS5cbiAgICAgICAgICAgIGlmIChpc29sYXRlKSB7XG4gICAgICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3NhbmRib3gnLCAnYWxsb3ctc2NyaXB0cyBhbGxvdy1mb3JtcyBhbGxvdy1wb3B1cHMnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2V0IGFsbCBzdHlsZXMgQkVGT1JFIGFwcGVuZGluZyB0byBwcmV2ZW50IGZsYXNoIGF0IHdyb25nIHBvc2l0aW9uXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LnN0eWxlLmNzc1RleHQgPSBgXG4gICAgICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgICAgICAgIGluc2V0OiAwO1xuICAgICAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgICAgICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgICAgICAgICAgIG9wYWNpdHk6ICR7b3B0aW9ucz8uaGlkZGVuID8gJzAnIDogJzEnfTtcbiAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgICAgICAgICAgcG9pbnRlci1ldmVudHM6ICR7b3B0aW9ucz8uaGlkZGVuID8gJ25vbmUnIDogJ2FsbCd9O1xuICAgICAgICAgICAgYDtcblxuICAgICAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgICAgIGlmICghY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJteW9wLWNvbXAtXCJdJykpXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuXG4gICAgICAgICAgICAvLyBXcml0ZSBjb250ZW50IGludG8gdGhlIGlmcmFtZS4gQW4gaXNvbGF0ZWQgKHNhbmRib3hlZCwgb3BhcXVlLW9yaWdpbikgZnJhbWVcbiAgICAgICAgICAgIC8vIGNhbid0IGJlIGRvYy53cml0ZSgpJ24gZnJvbSB0aGUgaG9zdCwgc28gYWNjdW11bGF0ZSB0aGUgbWFya3VwIGFuZCBzZXQgaXQgdmlhXG4gICAgICAgICAgICAvLyBzcmNkb2Mgb24gY2xvc2UoKS4gTm9uLWlzb2xhdGVkIGZyYW1lcyBrZWVwIHRoZSBzYW1lLW9yaWdpbiBkb2Mud3JpdGUgcGF0aC5cbiAgICAgICAgICAgIGNvbnN0IF9fc3JjUGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICBjb25zdCBkb2M6IHsgb3BlbigpOiB2b2lkOyB3cml0ZWxuKHM6IHN0cmluZyk6IHZvaWQ7IGNsb3NlKCk6IHZvaWQgfSA9IGlzb2xhdGVcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgb3BlbigpIHt9LFxuICAgICAgICAgICAgICAgICAgICB3cml0ZWxuKHM6IHN0cmluZykgeyBfX3NyY1BhcnRzLnB1c2gocyk7IH0sXG4gICAgICAgICAgICAgICAgICAgIGNsb3NlKCkgeyBJZnJhbWVFbGVtZW50LnNyY2RvYyA9IF9fc3JjUGFydHMuam9pbignXFxuJyk7IH0sXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDogKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGQgPSBJZnJhbWVFbGVtZW50LmNvbnRlbnREb2N1bWVudCB8fCBJZnJhbWVFbGVtZW50LmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGQub3BlbigpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgICAgICAgICB9KSgpO1xuXG5cbiAgICAgICAgICAgIC8vIFBhcnNlIG15b3A6c2l6ZSBtZXRhIHRhZyBiZWZvcmUgaWZyYW1lIGNyZWF0aW9uIChzYW1lIERPTVBhcnNlciBwYXNzIHBhdHRlcm4gYXMgbXlvcF9wcmV2aWV3IHJlbW92YWwpLlxuICAgICAgICAgICAgLy8gVGhpcyBsZXRzIHRoZSBSZWFjdCBob3N0IGRldGVybWluZSBzaXppbmcgbW9kZSAoZmlsbCB2cyBjb250ZW50KSBmcm9tIHRoZSBzdGFydC5cbiAgICAgICAgICAgIGxldCBwYXJzZWRTaXplTWV0YTogeyB3aWR0aD86IHN0cmluZyB8IG51bWJlcjsgaGVpZ2h0Pzogc3RyaW5nIHwgbnVtYmVyOyBtaW5XaWR0aD86IG51bWJlcjsgbWF4V2lkdGg/OiBudW1iZXI7IG1pbkhlaWdodD86IG51bWJlcjsgbWF4SGVpZ2h0PzogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCBfcHJlUGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IF9wcmVEb2MgPSBfcHJlUGFyc2VyLnBhcnNlRnJvbVN0cmluZyhsb2FkZXJDb25maWcuSFRNTCwgJ3RleHQvaHRtbCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNpemVNZXRhID0gX3ByZURvYy5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJteW9wOnNpemVcIl0nKTtcbiAgICAgICAgICAgICAgICBpZiAoc2l6ZU1ldGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgcGFyc2VkU2l6ZU1ldGEgPSBKU09OLnBhcnNlKHNpemVNZXRhLmdldEF0dHJpYnV0ZSgnY29udGVudCcpIHx8ICd7fScpOyB9IGNhdGNoIHt9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgSFRNTDJSZW5kZXIgPSBsb2FkZXJDb25maWcuSFRNTDtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/Ll9pbnNwZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgLy9pbmplY3QgaW5zcGVjdGlvbiBzY3JpcHQgZm9yIHByb3BzIGRldGVjdGlvblxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBfZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhsb2FkZXJDb25maWcuSFRNTCwgJ3RleHQvaHRtbCcpO1xuXG4gICAgICAgICAgICAgICAgLy8gVE9ETyA6IHBhcnQgb2YgQUkgY29tcG9uZW50cywgdGhpbmsgYWJvdXQgdGhhdCwgZG9jdW1lbnQgaXQuXG4gICAgICAgICAgICAgICAgY29uc3QgbXlvcF9wcmV2aWV3X3NjcmlwdCA9IF9kb2MuZ2V0RWxlbWVudEJ5SWQoJ215b3BfcHJldmlldycpO1xuICAgICAgICAgICAgICAgIG15b3BfcHJldmlld19zY3JpcHQ/LnJlbW92ZUF0dHJpYnV0ZSgndHlwZScpO1xuXG4gICAgICAgICAgICAgICAgLy8gUGFyc2UgdGhlIGluamVjdGVkIEhUTUwgc3RyaW5nIGludG8gYSBub2RlXG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcCA9IF9kb2MuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCk7XG4gICAgICAgICAgICAgICAgdGVtcC5ib2R5LmlubmVySFRNTCA9IGA8c2NyaXB0PlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmVmb3JlS2V5c1dpbmRvdyA9IG5ldyBTZXQoT2JqZWN0LmtleXMod2luZG93KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubXlvcFN0YXRlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZUtleXNXaW5kb3csXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIDwvc2NyaXB0PmA7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gdGVtcC5ib2R5LmZpcnN0Q2hpbGQ7XG5cbiAgICAgICAgICAgICAgICBpZiAobm9kZSAmJiBfZG9jLmhlYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgX2RvYy5oZWFkLmluc2VydEJlZm9yZShfZG9jLmltcG9ydE5vZGUobm9kZSwgdHJ1ZSksIF9kb2MuaGVhZC5maXJzdENoaWxkKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBQcmVwZW5kIERPQ1RZUEU6IGRvY3VtZW50RWxlbWVudC5vdXRlckhUTUwgcmV0dXJucyBvbmx5IDxodG1sPi4uLjwvaHRtbD5cbiAgICAgICAgICAgICAgICAvLyBhbmQgZHJvcHMgdGhlIGRvY3R5cGUsIHdoaWNoIHdvdWxkIHB1dCB0aGUgaWZyYW1lIGluIHF1aXJrcyBtb2RlLlxuICAgICAgICAgICAgICAgIC8vIFF1aXJrcyBtb2RlIGJyZWFrcyBhdXRvLXNpemluZyBiZWNhdXNlIDxib2R5PiBzdHJldGNoZXMgdG8gdGhlIGlmcmFtZVxuICAgICAgICAgICAgICAgIC8vIHZpZXdwb3J0IGluc3RlYWQgb2Ygc2hyaW5raW5nIHRvIGNvbnRlbnQsIHNvIFJlc2l6ZU9ic2VydmVyIG9uIGJvZHlcbiAgICAgICAgICAgICAgICAvLyBuZXZlciBmaXJlcyB3aGVuIGNvbnRlbnQgcmVmbG93cyAoZS5nLiBhZnRlciBmb250IHN3YXApLlxuICAgICAgICAgICAgICAgIEhUTUwyUmVuZGVyID0gJzwhRE9DVFlQRSBodG1sPicgKyBfZG9jLmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnM/LmRhdGEgIT09IHVuZGVmaW5lZCkge1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPOiBpbXByb3ZlIGJ5IGRvIGl0IG9uIHRoZSBzZXJ2ZSBvbmNlXG5cbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgbXlvcF9wcmV2aWV3IHNjcmlwdCB3aGVuIG5vdCBpbiBpbnNwZWN0aW9uIG1vZGVcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgX2RvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcobG9hZGVyQ29uZmlnLkhUTUwsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBteW9wX3ByZXZpZXdfc2NyaXB0ID0gX2RvYy5nZXRFbGVtZW50QnlJZCgnbXlvcF9wcmV2aWV3Jyk7XG5cbiAgICAgICAgICAgICAgICBpZiAobXlvcF9wcmV2aWV3X3NjcmlwdCkge1xuICAgICAgICAgICAgICAgICAgICBteW9wX3ByZXZpZXdfc2NyaXB0LnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICAvLyBTZWUgbm90ZSBhYm92ZTogcHJlcGVuZCBET0NUWVBFIHRvIGtlZXAgdGhlIGlmcmFtZSBpbiBzdGFuZGFyZHMgbW9kZS5cbiAgICAgICAgICAgICAgICAgICAgSFRNTDJSZW5kZXIgPSAnPCFET0NUWVBFIGh0bWw+JyArIF9kb2MuZG9jdW1lbnRFbGVtZW50Lm91dGVySFRNTDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEluamVjdCBob3N0LXByb3ZpZGVkIENTUyBiZWZvcmUgdGhlIGlmcmFtZSBpcyB3cml0dGVuIHNvIHN0eWxlcyBhcmVcbiAgICAgICAgICAgIC8vIHByZXNlbnQgb24gZmlyc3QgcGFpbnQgKG5vIEZPVUMpLiBBcHBlbmRlZCBsYXN0IGluIDxoZWFkPiBzbyBpdCB3aW5zXG4gICAgICAgICAgICAvLyBvdmVyIHRoZSBjb21wb25lbnQncyBvd24gc3R5bGVzIHZpYSBub3JtYWwgY2FzY2FkZSBvcmRlci5cbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5pbmplY3RDc3MpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgX2RvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoSFRNTDJSZW5kZXIsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdHlsZVRhZyA9IF9kb2MuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgICAgICAgICBzdHlsZVRhZy5zZXRBdHRyaWJ1dGUoJ2RhdGEtbXlvcC1pbmplY3RlZCcsICd0cnVlJyk7XG4gICAgICAgICAgICAgICAgLy8gPHN0eWxlPiBpcyBhbiBIVE1MIHJhdy10ZXh0IGVsZW1lbnQ6IHRoZSBzZXJpYWxpemVyIGJlbG93IHdyaXRlcyBpdHNcbiAgICAgICAgICAgICAgICAvLyBjb250ZW50cyBMSVRFUkFMTFksIHdpdGhvdXQgZXNjYXBpbmcuIENTUyBjb250YWluaW5nIFwiPC9zdHlsZT5cIiB3b3VsZFxuICAgICAgICAgICAgICAgIC8vIHRoZXJlZm9yZSBjbG9zZSB0aGUgdGFnIGFuZCBpbmplY3QgbGl2ZSBtYXJrdXAgaW50byB0aGUgaWZyYW1lLCB3aGljaFxuICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGVzIHNhbWUtb3JpZ2luIHdpdGggdGhpcyBwYWdlLiBOZXV0cmFsaXplIHRoZSBzZXF1ZW5jZSBcdTIwMTQgbm8gcmVhbFxuICAgICAgICAgICAgICAgIC8vIHN0eWxlc2hlZXQgY29udGFpbnMgaXQuIChTYW1lIGNsYXNzIG9mIGJ1ZyBhcyB0aGUgPC9zY3JpcHQ+IGVzY2FwZSBpblxuICAgICAgICAgICAgICAgIC8vIHRoZSBkYXRhIHBheWxvYWQgYmVsb3cuKVxuICAgICAgICAgICAgICAgIHN0eWxlVGFnLnRleHRDb250ZW50ID0gb3B0aW9ucy5pbmplY3RDc3MucmVwbGFjZSgvPFxccypcXC9cXHMqc3R5bGUvZ2ksICc8XFxcXC9zdHlsZScpO1xuICAgICAgICAgICAgICAgIChfZG9jLmhlYWQgfHwgX2RvYy5kb2N1bWVudEVsZW1lbnQpLmFwcGVuZENoaWxkKHN0eWxlVGFnKTtcbiAgICAgICAgICAgICAgICAvLyBTZWUgbm90ZSBhYm92ZTogcHJlcGVuZCBET0NUWVBFIHRvIGtlZXAgdGhlIGlmcmFtZSBpbiBzdGFuZGFyZHMgbW9kZS5cbiAgICAgICAgICAgICAgICBIVE1MMlJlbmRlciA9ICc8IURPQ1RZUEUgaHRtbD4nICsgX2RvYy5kb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MO1xuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIGRvYy53cml0ZWxuKEhUTUwyUmVuZGVyKTtcblxuICAgICAgICAgICAgLy8gd2luZG93Ll9fZmVkZXJhdGlvbl9fID1cbiAgICAgICAgICAgIC8vICAgICB7IC4uLndpbmRvdy5fX2ZlZGVyYXRpb25fXyxcbiAgICAgICAgICAgIC8vICAgICAgICAgLy9UT0RPIDogZ2V0IGZyb20gRU5WIGF0IGJ1aWxkIHRpbWUsXG4gICAgICAgICAgICAvLyAgICAgICAgIC8vIGluamVjdCB2YWx1ZSB0byBtb2R1bGUgYXQgYnVpbGQgdGltZVxuICAgICAgICAgICAgLy8gICAgICAgICAvLyB0b2RheSB3ZSBkb2luZyBzbyBqdXN0IGZvciB0aGUgQ0pTIHZlcnNpb25cbiAgICAgICAgICAgIC8vICAgICAgICAgX19wdWJsaWNfcGF0aF9fIDonaHR0cHM6Ly9jZG4ubXlvcC5kZXYvc2RrL25leHQnXG4gICAgICAgICAgICAvLyAgICAgICAgICwuLi4ke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICB3aW5kb3cuX19mZWRlcmF0aW9uX18pXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gICAgIH07XG5cbiAgICAgICAgICAgIC8vIEZvciBucG0gcGFja2FnZSB1c2VycyB3aXRoIGJ1bmRsZXJzIChWaXRlL1dlYnBhY2spLCBpbmplY3QgU0RLIGlubGluZVxuICAgICAgICAgICAgLy8gRm9yIENETiB1c2VycyAoc2NyaXB0IHRhZyksIHVzZSBDRE4gVVJMXG4gICAgICAgICAgICBjb25zdCBzZGtTY3JpcHQgPSBIQVNfRU1CRURERURfU0RLXG4gICAgICAgICAgICAgICAgPyBgPHNjcmlwdD4ke0VNQkVEREVEX1NES19DT05URU5UfTwvc2NyaXB0PmBcbiAgICAgICAgICAgICAgICA6IGA8c2NyaXB0IHNyYz1cIiR7d2luZG93Lm15b3AuX19ST09UX1NES19QVUJMSUNfVVJMX199XCI+PC9zY3JpcHQ+YDtcblxuICAgICAgICAgICAgLy8gRGlmZmVyZW50IGluaXQgc2NyaXB0IGZvciBlbWJlZGRlZCB2cyBDRE4gU0RLXG4gICAgICAgICAgICAvLyAtIEVtYmVkZGVkIChidW5kbGVkIElJRkUpOiB1c2VzIE15b3BTREsuZ2V0SWZyYW1lTW9kdWxlKCkgd2hpY2ggcmV0dXJucyBtb2R1bGUgZGlyZWN0bHlcbiAgICAgICAgICAgIC8vIC0gQ0ROIChkeW5hbWljIGxvYWRpbmcpOiB1c2VzIHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0SWZyYW1lTW9kdWxlKCkgd2hpY2ggd3JhcHMgd2l0aCAuZ2V0KClcbiAgICAgICAgICAgIGNvbnN0IGluaXRTY3JpcHQgPSBIQVNfRU1CRURERURfU0RLXG4gICAgICAgICAgICAgICAgPyBgPHNjcmlwdD5cbiAgICAgICAgICAgICAgICAgICBjb25zdCBfX215b3BfaW5pdCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlmcmFtZU1vZHVsZSA9IGF3YWl0IE15b3BTREsuZ2V0SWZyYW1lTW9kdWxlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJZnJhbWVTREsgPSBpZnJhbWVNb2R1bGUuSWZyYW1lU0RLO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2RrID0gbmV3IElmcmFtZVNESygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2RrLmluaXQoKTtcbiAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgX19teW9wX2luaXQoKS50aGVuKCk7XG4gICAgICAgICAgICAgICAgPC9zY3JpcHQ+YFxuICAgICAgICAgICAgICAgIDogYDxzY3JpcHQ+XG4gICAgICAgICAgICAgICAgICAgd2luZG93Ll9fZmVkZXJhdGlvbl9fLl9fcHVibGljX3BhdGhfXyA9IHdpbmRvdy5fX2ZlZGVyYXRpb25fXy5fX3B1YmxpY19wYXRoX187XG4gICAgICAgICAgICAgICAgICAgY29uc3QgX19teW9wX2luaXQgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7SWZyYW1lU0RLfSA9IChhd2FpdCB3aW5kb3cubXlvcC5yb290U0RLLmdldElmcmFtZU1vZHVsZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNkayA9IG5ldyBJZnJhbWVTREsoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNkay5pbml0KCk7XG4gICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgIF9fbXlvcF9pbml0KCkudGhlbigpO1xuICAgICAgICAgICAgICAgIDwvc2NyaXB0PmA7XG5cbiAgICAgICAgICAgIC8vIElzb2xhdGVkIGZyYW1lcyB1c2UgdGhlIHBvc3RNZXNzYWdlIGJyaWRnZSBpbnN0ZWFkIG9mIHRoZSBzYW1lLW9yaWdpblxuICAgICAgICAgICAgLy8gSWZyYW1lU0RLICsgZGF0YS1pbmplY3Rpb24gc2NyaXB0cyAod2hpY2ggcmVseSBvbiBob3N0XHUyMTk0ZnJhbWUgYWNjZXNzKS5cbiAgICAgICAgICAgIGlmICghaXNvbGF0ZSkge1xuICAgICAgICAgICAgICAgIGRvYy53cml0ZWxuKGAke3Nka1NjcmlwdH0ke2luaXRTY3JpcHR9YCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEluamVjdCBkYXRhIHNjcmlwdCBpZiBkYXRhIG9wdGlvbiBpcyBwcm92aWRlZC5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBgbnVsbGAgQ09VTlRTIEFTIE5PIERBVEEsIE5PVCBBUyBEQVRBLiBUaGUgY2hlY2sgdXNlZCB0byBiZSBgIT09IHVuZGVmaW5lZGAsXG4gICAgICAgICAgICAvLyBhbmQgYG51bGwgIT09IHVuZGVmaW5lZGAgaXMgdHJ1ZSAtLSBzbyBhIGhvc3QgdGhhdCBwYXNzZXMgYGRhdGE6IG51bGxgICh0aGVcbiAgICAgICAgICAgIC8vIG5hdHVyYWwgd2F5IHRvIHNheSBcIm5vdGhpbmcgdG8gc2VuZCB5ZXRcIikgZ290IHRoZSB3aG9sZSBkYXRhIHNjcmlwdCBpbmplY3RlZFxuICAgICAgICAgICAgLy8gYW5kIHRoZSBjb21wb25lbnQncyBvd24gYG15b3BfaW5pdF9pbnRlcmZhY2VgIGludm9rZWQgd2l0aCBudWxsLiBBIGNvbXBvbmVudFxuICAgICAgICAgICAgLy8gdGhhdCB2YWxpZGF0ZXMgaXRzIGlucHV0IHRoZW4gcmVqZWN0cyBpdCwgd2hpY2ggaXMgd2hlcmUgUGljLVRpbWUncyBjb25zb2xlXG4gICAgICAgICAgICAvLyBlcnJvciBgbXlvcF9pbml0X2ludGVyZmFjZTogSW52YWxpZCBjb25maWcgcHJvdmlkZWQuYCBjYW1lIGZyb206IG1lYXN1cmVkIG9uXG4gICAgICAgICAgICAvLyB0aGVpciBwYWdlIDIwMjYtMTAtMTgsIEFMTCAxMyBjb21wb25lbnRzIGFyZSBtb3VudGVkIHdpdGggYGRhdGE6IG51bGxgLCBzb1xuICAgICAgICAgICAgLy8gZXZlcnkgb25lIG9mIHRoZW0gcGFpZCBmb3IgYW4gaW5qZWN0ZWQgc2NyaXB0IGFuZCBhIG1lYW5pbmdsZXNzIGluaXQgY2FsbC5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBJbml0aWFsaXNpbmcgYSBjb21wb25lbnQgd2l0aCBudWxsIGNhbiBuZXZlciB0ZWxsIGl0IGFueXRoaW5nIHRoYXQgb21pdHRpbmdcbiAgICAgICAgICAgIC8vIHRoZSBjYWxsIGRvZXMgbm90LCBzbyB0aGUgdHdvIGFyZSBub3cgdHJlYXRlZCB0aGUgc2FtZS5cbiAgICAgICAgICAgIGlmICghaXNvbGF0ZSAmJiBvcHRpb25zPy5kYXRhICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucz8uZGF0YSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIFNldHVwIENUQSBxdWV1ZSAtIGNhcHR1cmVzIGFueSBDVEFzIGVtaXR0ZWQgZHVyaW5nIGluaXQgYmVmb3JlIGhvc3QgcmVnaXN0ZXJzIGhhbmRsZXJcbiAgICAgICAgICAgICAgICBjb25zdCBjdGFRdWV1ZVNjcmlwdCA9IGA8c2NyaXB0PlxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuX19teW9wX2N0YV9xdWV1ZSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubXlvcF9jdGFfaGFuZGxlciA9IGZ1bmN0aW9uKGFjdGlvbiwgcGF5bG9hZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fbXlvcF9jdGFfcXVldWUucHVzaCh7YWN0aW9uOiBhY3Rpb24sIHBheWxvYWQ6IHBheWxvYWR9KTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICA8L3NjcmlwdD5gO1xuXG4gICAgICAgICAgICAgICAgLy8gRXNjYXBlIGRhdGEgZm9yIHNhZmUgZW1iZWRkaW5nIGluIHNjcmlwdCB0YWdcbiAgICAgICAgICAgICAgICAvLyBKU09OLnN0cmluZ2lmeSBkb2Vzbid0IGVzY2FwZSA8L3NjcmlwdD4gd2hpY2ggY291bGQgYnJlYWsgSFRNTCBwYXJzaW5nXG4gICAgICAgICAgICAgICAgY29uc3QgZXNjYXBlZERhdGEgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zLmRhdGEpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC88XFwvc2NyaXB0L2dpLCAnXFxcXHUwMDNjL3NjcmlwdCcpO1xuXG4gICAgICAgICAgICAgICAgLy8gU2VsZi1jb250YWluZWQgZGF0YSBpbmplY3Rpb24gc2NyaXB0IHRoYXQ6XG4gICAgICAgICAgICAgICAgLy8gMS4gQ2FsbHMgbXlvcF9pbml0X2ludGVyZmFjZSBpbW1lZGlhdGVseSBpZiBhbHJlYWR5IGRlZmluZWRcbiAgICAgICAgICAgICAgICAvLyAyLiBXYXRjaGVzIGZvciBsYXRlLWRlZmluZWQgbXlvcF9pbml0X2ludGVyZmFjZSB2aWEgZGVmaW5lUHJvcGVydHlcbiAgICAgICAgICAgICAgICAvLyAzLiBDbGVhbnMgdXAgYWZ0ZXIgaXRzZWxmIChyZW1vdmVzIHNjcmlwdCB0YWcgYW5kIHdpbmRvdyBkYXRhKVxuICAgICAgICAgICAgICAgIC8vIDQuIFBvc3RzIG1lc3NhZ2UgdG8gcGFyZW50IGZvciBleHRlbnNpb24gdHJhY2tpbmcgKHByZS1pbmplY3RlZCBpbml0KilcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhU2NyaXB0ID0gYDxzY3JpcHQgaWQ9XCJfX215b3BfaW5pdF9kYXRhX3NjcmlwdFwiPlxuICAgICAgICAgICAgICAgICAgICAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9ICR7ZXNjYXBlZERhdGF9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNjcmlwdEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ19fbXlvcF9pbml0X2RhdGFfc2NyaXB0Jyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWxsSW5pdEludGVyZmFjZSA9IGZ1bmN0aW9uKGZuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hcmsgYXMgcHJlLWluamVjdGVkIGRhdGEgY2FsbCBmb3IgZXh0ZW5zaW9uIHRyYWNraW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fbXlvcF9pbml0X3ByZWluamVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbihkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuX19teW9wX2luaXRfcHJlaW5qZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGR1cmF0aW9uID0gcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydFRpbWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RpZnkgZXh0ZW5zaW9uIHZpYSBwb3N0TWVzc2FnZSAoaW5pdCogPSBwcmUtaW5qZWN0ZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnTVlPUF9QUkVJTkpFQ1RFRF9JTklUJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgJyonKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYW51cDogcmVtb3ZlIHNjcmlwdCB0YWcgYW5kIHN0b3JlZCBkYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjcmlwdEVsICYmIHNjcmlwdEVsLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0RWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzY3JpcHRFbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB3aW5kb3cuX19teW9wX2luaXRfZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93Lm15b3BfaW5pdF9pbnRlcmZhY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGdW5jdGlvbiBhbHJlYWR5IGV4aXN0cyAtIGNhbGwgaW1tZWRpYXRlbHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsSW5pdEludGVyZmFjZSh3aW5kb3cubXlvcF9pbml0X2ludGVyZmFjZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZ1bmN0aW9uIG5vdCB5ZXQgZGVmaW5lZCAtIHN0b3JlIGRhdGEgYW5kIHdhdGNoIGZvciBkZWZpbml0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fbXlvcF9pbml0X2RhdGEgPSBkYXRhO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9vcmlnaW5hbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCAnbXlvcF9pbml0X2ludGVyZmFjZScsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKGZuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb3JpZ2luYWwgPSBmbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuX19teW9wX2luaXRfZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0b3JlZERhdGEgPSB3aW5kb3cuX19teW9wX2luaXRfZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgd2luZG93Ll9fbXlvcF9pbml0X2RhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbEluaXRJbnRlcmZhY2UoZm4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9vcmlnaW5hbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgICAgIDwvc2NyaXB0PmA7XG4gICAgICAgICAgICAgICAgZG9jLndyaXRlbG4oY3RhUXVldWVTY3JpcHQgKyBkYXRhU2NyaXB0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSXNvbGF0ZWQgZnJhbWVzOiBpbmplY3QgdGhlIHBvc3RNZXNzYWdlIGJyaWRnZSAoaW5pdCBpbiAvIGN0YSBvdXQgLyBzaXplIG91dCkuXG4gICAgICAgICAgICBpZiAoaXNvbGF0ZSkge1xuICAgICAgICAgICAgICAgIC8vIFNhbWUgcnVsZSBhcyB0aGUgbm9uLWlzb2xhdGVkIHBhdGggYWJvdmU6IG51bGwgaXMgbm8gZGF0YS5cbiAgICAgICAgICAgICAgICBjb25zdCBlc2NhcGVkRGF0YSA9IG9wdGlvbnM/LmRhdGEgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zPy5kYXRhICE9PSBudWxsXG4gICAgICAgICAgICAgICAgICAgID8gSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5kYXRhKS5yZXBsYWNlKC88XFwvc2NyaXB0L2dpLCAnXFxcXHUwMDNjL3NjcmlwdCcpXG4gICAgICAgICAgICAgICAgICAgIDogJ3VuZGVmaW5lZCc7XG4gICAgICAgICAgICAgICAgZG9jLndyaXRlbG4odGhpcy5idWlsZElzb2xhdGlvbkJyaWRnZShlc2NhcGVkRGF0YSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkb2MuY2xvc2UoKTtcblxuICAgICAgICAgICAgLy8gVE9ETyA6IGNvbnRyb2wgZnJvbSBkYXNoYm9hcmRcbiAgICAgICAgICAgIC8vICAoc2tpbi5sb2FkZXIgYXMgSUlmcmFtZUxvYWRlckNvbmZpZykuYXV0b0hlaWdodCA9IHRydWU7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbXAgPSBuZXcgTXlvcElmcmFtZUNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpO1xuXG4gICAgICAgICAgICAvLyBJc29sYXRlZDogd2lyZSB0aGUgaG9zdCBzaWRlIG9mIHRoZSBwb3N0TWVzc2FnZSBicmlkZ2UgKGN0YSBpbiwgc2l6ZSBpbiwgaW5pdCBvdXQpLlxuICAgICAgICAgICAgaWYgKGlzb2xhdGUpIGNvbXAuZW5hYmxlSXNvbGF0aW9uKCk7XG5cbiAgICAgICAgICAgIC8vIFN0b3JlIHBhcnNlZCBzaXplTWV0YSBvbiB0aGUgY29tcG9uZW50IHNvIHRoZSBSZWFjdCBob3N0IGNhbiByZWFkIGl0XG4gICAgICAgICAgICBjb21wLnNpemVNZXRhID0gcGFyc2VkU2l6ZU1ldGE7XG5cbiAgICAgICAgICAgIC8vIEF1dG8tc2l6ZTogb2JzZXJ2ZSBjb250ZW50IHNpemUgYW5kIHN5bmMgdG8gaWZyYW1lIGRpbWVuc2lvbnMuXG4gICAgICAgICAgICAvLyBUaGlzIHdvcmtzIGZvciBhbGwgaG9zdHMgKHZhbmlsbGEgU0RLLCBSZWFjdCwgVnVlLCBBbmd1bGFyKS5cbiAgICAgICAgICAgIC8vIElmIGEgZnJhbWV3b3JrIGhvc3QgKGUuZy4gQG15b3AvcmVhY3QpIGFsc28gY2FsbHMgb2JzZXJ2ZUF1dG9TaXplKCksXG4gICAgICAgICAgICAvLyBpdCBjbGVhbmx5IHJlcGxhY2VzIHRoZXNlIG9ic2VydmVycyB2aWEgX2F1dG9TaXplQ2xlYW51cCB0cmFja2luZy5cbiAgICAgICAgICAgIGNvbXAuaW5pdGlhdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnM/LmF1dG9TaXplID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBObyBhdXRvLXNpemluZy4gSWZyYW1lIHN0YXlzIHBvc2l0aW9uOmFic29sdXRlIGZpbGxpbmcgY29udGFpbmVyLlxuICAgICAgICAgICAgICAgICAgICAvLyBIb3N0IGlzIGZ1bGx5IHJlc3BvbnNpYmxlIGZvciBjb250YWluZXIgZGltZW5zaW9ucyAoZS5nLiBSZWFjdCBOYXRpdmUgV2ViVmlldykuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHNob3duID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29tcC5vYnNlcnZlQXV0b1NpemUoe1xuICAgICAgICAgICAgICAgICAgICBmb3JjZUF1dG9TaXplOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBvblNpemVDaGFuZ2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNob3cgYWZ0ZXIgZmlyc3QgbWVhc3VyZW1lbnQgY29tcGxldGVzIChub3QgYmVmb3JlKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBpZnJhbWUgdHJhbnNpdGlvbnMgZnJvbSBhYnNvbHV0ZSBvdmVybGF5IHRvIGRvY3VtZW50IGZsb3dcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0IHRoZSBtZWFzdXJlZCBoZWlnaHQsIHByZXZlbnRpbmcgZmxhc2ggYXQgd3Jvbmcgc2l6ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2hvd24gJiYgIW9wdGlvbnM/LmhpZGRlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3duID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wLnNob3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAvLyBjb21wLnByb3BzLl9nbG9iYWwgPSBjb21wLmVsZW1lbnQuY29udGVudFdpbmRvdztcbiAgICAgICAgICAgIHJldHVybiBjb21wO1xuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobG9hZGVyQ29uZmlnLnNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUubm9uZSkge1xuICAgICAgICAgICAgLy8gcGFyc2VyID0gcGFyc2VyID8gcGFyc2VyIDogbmV3IERPTVBhcnNlcigpO1xuICAgICAgICAgICAgLy8gY29uc3QgZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhsb2FkZXJDb25maWcuSFRNTCwgJ3RleHQvaHRtbCcpO1xuICAgICAgICAgICAgLy8gZWxlbWVudCA9IGRvYy5ib2R5LmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICAvL2VsZW1lbnQuc2V0QXR0cmlidXRlKCdpZCcsIGRvbUlkKTtcblxuICAgICAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xuICAgICAgICAgICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gbG9hZGVyQ29uZmlnLkhUTUw7Ly8udHJpbSgpO1xuICAgICAgICAgICAgZWxlbWVudCA9IHRlbXBsYXRlLmNvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cbiAgICAgICAgICAgIC8vICAgY29uc3QgZmlyc3RFbGVtZW50ID0gdGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICAgICAgICAgIC8vICAgY29uc3QgeiA9IGZpcnN0RWxlbWVudCA/IGZpcnN0RWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgOiBudWxsO1xuICAgICAgICAgICAgLy8gICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vICAgY29uc29sZS5sb2codGVtcGxhdGUsIGZpcnN0RWxlbWVudCwgeilcbiAgICAgICAgICAgIC8vICAgZWxlbWVudCA9IGZpcnN0RWxlbWVudFxuXG4gICAgICAgICAgICAvLyBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0Ym9keScpO1xuICAgICAgICAgICAgLy8gZGVidWdnZXI7XG4gICAgICAgICAgICAvLyBjb250YWluZXIuaW5uZXJIVE1MID0gbG9hZGVyQ29uZmlnLkhUTUw7XG4gICAgICAgICAgICAvLyBlbGVtZW50ID0gY29udGFpbmVyLmZpcnN0RWxlbWVudENoaWxkO1xuXG4gICAgICAgICAgICBnZXRJbml0aWF0ZWRTZGsoKS50aGVuKChzZGspID0+IHtcbiAgICAgICAgICAgICAgICBzZGsuY29ubmVjdGVkQ2FsbGJhY2soZWxlbWVudCwgZWxlbWVudCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY3VzdG9tRWxlbWVudE5hbWUgPSB0b0N1c3RvbUVsZW1lbnROYW1lKGNvbXBvbmVudERlZmluaXRpb24ubmFtZSArIHNraW4uaWQpO1xuXG4gICAgICAgICAgICAvL1RPRE8gOiBzdXBwb3J0IHJlZGVmaW5lICFcbiAgICAgICAgICAgIGlmICghc2Vlbi5pbmNsdWRlcyhjdXN0b21FbGVtZW50TmFtZSkpIHtcbiAgICAgICAgICAgICAgICBjcmVhdGVDdXN0b21XZWJDb21wb25lbnQoY3VzdG9tRWxlbWVudE5hbWUsIGxvYWRlckNvbmZpZy5IVE1MLCBsb2FkZXJDb25maWcuc2hhZG93Um9vdE1vZGUpO1xuICAgICAgICAgICAgICAgIHNlZW4ucHVzaChjdXN0b21FbGVtZW50TmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChjdXN0b21FbGVtZW50TmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcignW2lkXj1cIm15b3AtY29tcC1cIl0nKSlcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAvL2VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICBlbGVtZW50LmlkID0gZG9tSWQ7XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmhpZGRlbikge1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgKGNvbnRhaW5lci5pZC5zdGFydHNXaXRoKCdteW9wLWNvbXAtJykpIHtcbiAgICAgICAgLy8gICAgIC8vIGluIHBsYWNlIHJlcGxhY2VtZW50XG4gICAgICAgIC8vICAgICBjb250YWluZXIucmVwbGFjZVdpdGgoZWxlbWVudCk7XG4gICAgICAgIC8vICAgICAvL2NvbnRhaW5lciA9IGVsZW1lbnQucGFyZW50RWxlbWVudCE7XG4gICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgIC8vIH1cblxuICAgICAgICB0aGlzLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgZWxlbWVudCwgb3B0aW9ucyk7XG5cbiAgICAgICAgLy9lbGVtZW50LmlubmVySFRNTCA9IGA8JHtjdXN0b21FbGVtZW50TmFtZX0gLz5gO1xuICAgICAgICByZXR1cm4gbmV3IE15b3BXZWJDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgY29udGFpbmVyLCBlbGVtZW50LCBvcHRpb25zKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgKiBhcyBDU1MgZnJvbSBcImNzc3R5cGVcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi9ob3N0XCI7XG5pbXBvcnQge3V1aWR2NH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzLnRzXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRNZXNzYWdlfSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcblxuLy8gaWdub3JpbmcgZG9jdW1lbnRhdGlvblxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ1NTUHJvcGVydGllcyBleHRlbmRzIENTUy5Qcm9wZXJ0aWVzPHN0cmluZyB8IG51bWJlcj4ge1xufVxuXG5leHBvcnQgdHlwZSBTdHlsZXNoZWV0RGVmaW5pdGlvbiA9IHsgW2tleTogc3RyaW5nXTogQ1NTUHJvcGVydGllcyB9O1xuXG5leHBvcnQgY29uc3QgYXBwbHlTdHlsZXNoZWV0ID0gKGNvbXBvbmVudDogSU15b3BDb21wb25lbnQsIHN0eWxlc2hlZXQ6IFN0eWxlc2hlZXREZWZpbml0aW9uLCBjc3M/OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCB0YWdJZCA9IGBteW9wLWNzcy0ke3V1aWR2NCgpfWA7XG4gICAgY29tcG9uZW50LnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCh7cm9vdFJlZiwgX3N0eWxlc2hlZXQsIF90YWdJZCwgX2Nzc30pID0+IHtcbiAgICAgICAgY29uc3Qgc3R5bGVUYWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgICBzdHlsZVRhZy50eXBlID0gJ3RleHQvY3NzJztcblxuICAgICAgICAvLyBCdWlsZCB0aGUgQ1NTIHN0cmluZyBmcm9tIHRoZSBzdHlsZXMgb2JqZWN0XG4gICAgICAgIGxldCBjc3NTdHJpbmcgPSBfY3NzO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc2VsZWN0b3IgaW4gX3N0eWxlc2hlZXQpIHtcbiAgICAgICAgICAgIGNzc1N0cmluZyArPSBgJHtzZWxlY3Rvcn0geyBgO1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IF9zdHlsZXNoZWV0W3NlbGVjdG9yXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gcHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgIGNzc1N0cmluZyArPSBgJHtwcm9wZXJ0eX06ICR7cHJvcGVydGllc1twcm9wZXJ0eV19OyBgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3NzU3RyaW5nICs9ICd9ICc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgdGhlIENTUyBzdHJpbmcgYXMgdGhlIGNvbnRlbnQgb2YgdGhlIDxzdHlsZT4gZWxlbWVudFxuICAgICAgICBzdHlsZVRhZy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3NTdHJpbmcpKTtcbiAgICAgICAgc3R5bGVUYWcuaWQgPSBfdGFnSWQ7XG4gICAgICAgIC8vIEFwcGVuZCB0aGUgPHN0eWxlPiBlbGVtZW50XG4gICAgICAgIChyb290UmVmLnNoYWRvd1Jvb3QgfHwgcm9vdFJlZi5jb250YWluZXIpLmFwcGVuZENoaWxkKHN0eWxlVGFnKTtcblxuICAgIH0sICgpID0+IHtcbiAgICB9LCB7XG4gICAgICAgIF9zdHlsZXNoZWV0OiBzdHlsZXNoZWV0LFxuICAgICAgICBfY3NzIDogY3NzID8gY3NzIDogJycsXG4gICAgICAgIF90YWdJZDogdGFnSWRcbiAgICB9KSk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKHtyb290UmVmLCBfdGFnSWR9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gKHJvb3RSZWYuc2hhZG93Um9vdCB8fCBkb2N1bWVudCkuZ2V0RWxlbWVudEJ5SWQoX3RhZ0lkKTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgKCkgPT4ge1xuICAgICAgICB9LCB7XG4gICAgICAgICAgICBfdGFnSWQ6IHRhZ0lkXG4gICAgICAgIH0pKVxuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IGFwcGx5U3R5bGVzaGVldExpbmsgPSAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgbGluazogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgdGFnSWQgPSBgbXlvcC1jc3MtJHt1dWlkdjQoKX1gO1xuICAgIGNvbXBvbmVudC5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoe3Jvb3RSZWYsIF90YWdJZCwgX2xpbmt9KSA9PiB7XG4gICAgICAgIGNvbnN0IGxpbmtFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgICAgICBsaW5rRWxlbWVudC5pZCA9IF90YWdJZDtcbiAgICAgICAgbGlua0VsZW1lbnQucmVsID0gJ3N0eWxlc2hlZXQnO1xuICAgICAgICBsaW5rRWxlbWVudC5ocmVmID0gX2xpbms7XG4gICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobGlua0VsZW1lbnQpO1xuXG4gICAgICAgIC8vIEFwcGVuZCB0aGUgPHN0eWxlPiBlbGVtZW50XG4gICAgICAgIChyb290UmVmLnNoYWRvd1Jvb3QgfHwgcm9vdFJlZi5jb250YWluZXIpLmFwcGVuZENoaWxkKGxpbmtFbGVtZW50KTtcbiAgICB9LCAoKSA9PiB7XG4gICAgfSwge1xuICAgICAgICBfbGluayA6IGxpbmssXG4gICAgICAgIF90YWdJZDogdGFnSWRcbiAgICB9KSk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKHtyb290UmVmLCBfdGFnSWR9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gKHJvb3RSZWYuc2hhZG93Um9vdCB8fCBkb2N1bWVudCkuZ2V0RWxlbWVudEJ5SWQoX3RhZ0lkKTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgKCkgPT4ge1xuICAgICAgICB9LCB7XG4gICAgICAgICAgICBfdGFnSWQ6IHRhZ0lkXG4gICAgICAgIH0pKVxuICAgIH1cbn1cbiIsICJpbXBvcnQge0lJZnJhbWVMb2FkZXJDb25maWcsIElTa2luQ29uZmlnfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmV4cG9ydCB0eXBlIFRva2VuTWFwID0gUmVjb3JkPHN0cmluZywgc3RyaW5nfCBudW1iZXI+XG5cbmNvbnN0IHJlcGxhY2VUb2tlbnMgPSAoaW5wdXQ6IHN0cmluZywgdG9rZW5NYXA6IFRva2VuTWFwKTogc3RyaW5nID0+IHtcbiAgICAvLyBDcmVhdGUgYSByZWdleCBwYXR0ZXJuIGZyb20gdGhlIGtleXMgb2YgdGhlIHRva2VuTWFwXG4gICAgY29uc3QgcGF0dGVybiA9IG5ldyBSZWdFeHAoT2JqZWN0LmtleXModG9rZW5NYXApLmpvaW4oJ3wnKSwgJ2cnKTtcblxuICAgIC8vIFJlcGxhY2UgdG9rZW5zIGluIHRoZSBpbnB1dCBzdHJpbmcgdXNpbmcgdGhlIHJlZ2V4XG4gICAgcmV0dXJuIGlucHV0LnJlcGxhY2UocGF0dGVybiwgKG1hdGNoZWQpID0+IHtcbiAgICAgICAgLy8gUmV0dXJuIHRoZSByZXBsYWNlbWVudCB2YWx1ZSBmcm9tIHRoZSB0b2tlbk1hcFxuICAgICAgICByZXR1cm4gKHRva2VuTWFwW21hdGNoZWRdIHx8IG1hdGNoZWQpLnRvU3RyaW5nKCk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVJZnJhbWVTa2luQnlUb2tlbml6ZXIgPSAoc2VsZWN0ZWRTa2luOiBJU2tpbkNvbmZpZywgdG9rZW5NYXA6IFRva2VuTWFwKSA9PiB7XG4gICAgY29uc3QgdHlwZWRTa2luQ29uZmlnID0gKHNlbGVjdGVkU2tpbi5sb2FkZXIgYXMgSUlmcmFtZUxvYWRlckNvbmZpZylcbiAgICBpZiAodHlwZWRTa2luQ29uZmlnLnR5cGUgIT09ICdJZnJhbWVMb2FkZXInKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgaWZyYW1lU2tpblVybFRva2VuaXplciByZWNlaXZlZCBza2luIHdpdGggbG9hZGVyIHR5cGUgXCIke3R5cGVkU2tpbkNvbmZpZy50eXBlfVwiLCBjdXJyZW50bHkgb25seSBcIklmcmFtZUxvYWRlclwiIGlzIHN1cHBvcnRlZGApXG4gICAgfVxuXG4gICAgc2VsZWN0ZWRTa2luLmxvYWRlciA9IHtcbiAgICAgICAgLi4uc2VsZWN0ZWRTa2luLmxvYWRlclxuICAgIH1cblxuICAgIHNlbGVjdGVkU2tpbi5sb2FkZXIudXJsID0gcmVwbGFjZVRva2VucyhzZWxlY3RlZFNraW4ubG9hZGVyLnVybCwgdG9rZW5NYXApO1xuXG4gICAgcmV0dXJuIHNlbGVjdGVkU2tpbjtcbn1cblxuZXhwb3J0IGNvbnN0IGNoYW5nZVNraW5VcmxCeVRva2VuaXplciA9ICh0b2tlbk1hcDogVG9rZW5NYXApID0+IHtcbiAgICByZXR1cm4gYXN5bmMgKHNlbGVjdGVkU2tpbjogSVNraW5Db25maWcpID0+IHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUlmcmFtZVNraW5CeVRva2VuaXplcihzZWxlY3RlZFNraW4sIHRva2VuTWFwKTtcbiAgICB9XG59IiwgImltcG9ydCB7Q3VzdG9tUmVmTWVzc2FnZX0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vaG9zdFwiO1xuXG4vLyBjb25zdCBzcGFjZSA9ICcgJztcbi8vIGV4cG9ydCBjb25zdCBnZXRDbGFzc2VzID0gYXN5bmMgKGNvbm5lY3RlZFJlZjogUmVmKTogUHJvbWlzZTxzdHJpbmdbXT4gPT4gKGF3YWl0IGV4ZWMoYWN0QXM8SFRNTERpdkVsZW1lbnQ+KGNvbm5lY3RlZFJlZikuY2xhc3NMaXN0KSkudmFsdWUuc3BsaXQoc3BhY2UpO1xuLy8gZXhwb3J0IGNvbnN0IGFkZENsYXNzID0gYXN5bmMgKGNvbm5lY3RlZFJlZjogUmVmLCBjbGFzc05hbWU6IHN0cmluZykgPT4ge1xuLy8gICAgIGNvbnN0IGNsYXNzZXMgPSBhd2FpdCBnZXRDbGFzc2VzKGNvbm5lY3RlZFJlZik7XG4vLyAgICAgY2xhc3Nlcy5pbmNsdWRlcyhjbGFzc05hbWUpIHx8IGNsYXNzZXMucHVzaChjbGFzc05hbWUpO1xuLy8gICAgIC8vIEB0cy1pZ25vcmVcbi8vICAgICBjb25uZWN0ZWRSZWYuY2xhc3NMaXN0ID0gY2xhc3Nlcy5qb2luKHNwYWNlKTtcbi8vIH1cbi8vIGV4cG9ydCBjb25zdCByZW1vdmVDbGFzcyA9IGFzeW5jIChjb25uZWN0ZWRSZWY6IFJlZiwgY2xhc3NOYW1lOiBzdHJpbmcsKSA9PiB7XG4vLyAgICAgbGV0IGNsYXNzZXMgPSBhd2FpdCBnZXRDbGFzc2VzKGNvbm5lY3RlZFJlZik7XG4vLyAgICAgLy8gQHRzLWlnbm9yZVxuLy8gICAgIGNvbm5lY3RlZFJlZi5jbGFzc0xpc3QgPSBjbGFzc2VzLmZpbHRlcihjID0+IGMgIT09IGNsYXNzTmFtZSkuam9pbihzcGFjZSk7XG4vLyB9XG4vL1xuLy9cblxuZXhwb3J0IGNvbnN0IGFkZENsYXNzID0gKGNvbXBvbmVudDogSU15b3BDb21wb25lbnQsIGNsYXNzTmFtZTogc3RyaW5nLCBteW9wSWQ6IHN0cmluZykgPT4ge1xuICAgIGNvbXBvbmVudC5zZW5kKG5ldyBDdXN0b21SZWZNZXNzYWdlKCh7cmVmLCBfY2xhc3NOYW1lfSkgPT4ge1xuICAgICAgICByZWY/LmNsYXNzTGlzdC5hZGQoX2NsYXNzTmFtZSk7XG4gICAgfSwge1xuICAgICAgICBlbGVtZW50SWQ6IG15b3BJZCxcbiAgICAgICAgX2NsYXNzTmFtZTogY2xhc3NOYW1lXG4gICAgfSkpO1xufVxuXG5leHBvcnQgY29uc3QgcmVtb3ZlQ2xhc3MgPSAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgY2xhc3NOYW1lOiBzdHJpbmcsIG15b3BJZDogc3RyaW5nKSA9PiB7XG4gICAgY29tcG9uZW50LnNlbmQobmV3IEN1c3RvbVJlZk1lc3NhZ2UoKHtyZWYsIF9jbGFzc05hbWV9KSA9PiB7XG4gICAgICAgIHJlZj8uY2xhc3NMaXN0LnJlbW92ZShfY2xhc3NOYW1lKTtcbiAgICB9LCB7XG4gICAgICAgIGVsZW1lbnRJZDogbXlvcElkLFxuICAgICAgICBfY2xhc3NOYW1lOiBjbGFzc05hbWVcbiAgICB9KSk7XG59IiwgImltcG9ydCB7XG4gICAgSUNvbXBvbmVudENvbmZpZyxcbiAgICBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICBJQ29tcG9uZW50SW5zdGFuY2VDb25maWcsIElIVE1MTG9hZGVyQ29uZmlnLCBJUmVmQ29uZmlnLFxuICAgIElTa2luTG9hZGVyQ29uZmlnLFxuICAgIElTa2luU2VsZWN0b3JDb25maWcsXG4gICAgSURlZGljYXRlZFNraW5Db25maWcsIElTa2luQ29uZmlnXG59IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7dXVpZHY0fSBmcm9tIFwiLi4vdXRpbHMvdXRpbHMudHNcIjtcblxuZXhwb3J0IGNsYXNzIFNraW5Db25maWcgaW1wbGVtZW50cyBJU2tpbkNvbmZpZyB7XG4gICAgX3J1blRpbWVJbnN0YW5jZUlkID0gJ3J1bnRpbWUtaW5zdGFuY2UtaWQtJyArIHV1aWR2NCgpO1xuICAgIF9ydW5UaW1lSWQgPSAncnVudGltZS1pZC0nICsgdXVpZHY0KCk7XG4gICAgX3J1blRpbWVOYW1lID0gJ3J1bnRpbWUtbmFtZS0nICsgdXVpZHY0KCk7XG5cbiAgICBzdGF0aWMgY3JlYXRlID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFNraW5Db25maWcoKTtcbiAgICB9XG5cbiAgICBpZCA9IHRoaXMuX3J1blRpbWVJZDtcbiAgICBuYW1lID0gdGhpcy5fcnVuVGltZU5hbWU7XG4gICAgZGVzY3JpcHRpb24gPSAnJztcbiAgICBsb2FkZXIgPSBudWxsIGFzIHVua25vd24gYXMgSVNraW5Mb2FkZXJDb25maWc7XG5cbiAgICB3aXRoTG9hZGVyID0gKGxvYWRlcjogSVNraW5Mb2FkZXJDb25maWcpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkZXIgPSBsb2FkZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHdpdGhIVE1MTG9hZGVyID0gKGxvYWRlcjogT21pdDxJSFRNTExvYWRlckNvbmZpZywgJ3R5cGUnPikgPT4ge1xuICAgICAgICBsb2FkZXIudHlwZSA9ICdIVE1MTG9hZGVyJztcbiAgICAgICAgdGhpcy5sb2FkZXIgPSBsb2FkZXIgYXMgSUhUTUxMb2FkZXJDb25maWc7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGJ1aWxkID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb21wb25lbnRDb25maWcgaW1wbGVtZW50cyBJQ29tcG9uZW50Q29uZmlnIHtcbiAgICBfcnVuVGltZUluc3RhbmNlSWQgPSAncnVudGltZS1pbnN0YW5jZS1pZC0nICsgdXVpZHY0KCk7XG4gICAgX3J1blRpbWVJZCA9ICdydW50aW1lLWlkLScgKyB1dWlkdjQoKTtcbiAgICBfcnVuVGltZU5hbWUgPSAncnVudGltZS1uYW1lLScgKyB1dWlkdjQoKTtcblxuICAgIHN0YXRpYyBjcmVhdGUgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50Q29uZmlnKCk7XG4gICAgfVxuXG4gICAgaW5zdGFuY2UgPSB7XG4gICAgICAgIGlkOiB0aGlzLl9ydW5UaW1lSW5zdGFuY2VJZCxcbiAgICAgICAgY29tcG9uZW50SWQ6IHRoaXMuX3J1blRpbWVJZCxcbiAgICAgICAgY29tcG9uZW50TmFtZTogdGhpcy5fcnVuVGltZU5hbWUsXG4gICAgICAgIHNraW5TZWxlY3RvcjogbnVsbCBhcyB1bmtub3duIGFzIElTa2luU2VsZWN0b3JDb25maWdcbiAgICB9IGFzIElDb21wb25lbnRJbnN0YW5jZUNvbmZpZztcblxuICAgIG5hbWUgPSB0aGlzLl9ydW5UaW1lTmFtZVxuICAgIHR5cGUgPSB7XG4gICAgICAgIGlkOiB0aGlzLl9ydW5UaW1lSWQsXG4gICAgICAgIG5hbWU6IHRoaXMuX3J1blRpbWVOYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgIHByb3BzOiBbXSxcbiAgICAgICAgcmVmczogW10sXG4gICAgICAgIHNraW5zOiBbXSxcbiAgICAgICAgZGVmYXVsdFNraW46IDBcbiAgICB9IGFzIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnXG5cbiAgICB3aXRoSW5zdGFuY2UgPSAoaW5zdGFuY2U6IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZykgPT4ge1xuICAgICAgICB0aGlzLmluc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHdpdGhUeXBlID0gKHR5cGU6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnKSA9PiB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHdpdGhOYW1lID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB3aXRoRGVmYXVsdFNraW4gPSAoZGVmYXVsdFNraW46IElTa2luQ29uZmlnKSA9PiB7XG4gICAgICAgIHRoaXMudHlwZS5za2lucy5wdXNoKGRlZmF1bHRTa2luKTtcbiAgICAgICAgdGhpcy50eXBlLmRlZmF1bHRTa2luID0gdGhpcy50eXBlLnNraW5zLmxlbmd0aCAtIDE7XG4gICAgICAgIHRoaXMuaW5zdGFuY2Uuc2tpblNlbGVjdG9yID0ge1xuICAgICAgICAgICAgdHlwZTogJ0RlZGljYXRlZCcsXG4gICAgICAgICAgICBza2luOiB7XG4gICAgICAgICAgICAgICAgaWQ6IGRlZmF1bHRTa2luLmlkXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gYXMgSURlZGljYXRlZFNraW5Db25maWdcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB3aXRoUmVmID0gKHJlZjogSVJlZkNvbmZpZykgPT4ge1xuICAgICAgICB0aGlzLnR5cGUucmVmcy5wdXNoKHJlZik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHdpdGhCYXNpY1JlZiA9IChyZWZTZWxlY3Rvcjogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld0Jhc2ljUmVmID0ge1xuICAgICAgICAgICAgaWQ6ICcnLFxuICAgICAgICAgICAgbmFtZTogcmVmU2VsZWN0b3IsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgICAgICBzZWxlY3RvclR5cGU6ICdpZC1hdHRyaWJ1dGUnLFxuICAgICAgICAgICAgc2VsZWN0b3I6IHJlZlNlbGVjdG9yLFxuICAgICAgICAgICAgYmVoYXZpb3I6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnY29kZSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBhcyBJUmVmQ29uZmlnXG5cbiAgICAgICAgdGhpcy50eXBlLnJlZnMucHVzaChuZXdCYXNpY1JlZik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGJ1aWxkID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzKSlcbiAgICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IGV4ZWMgPSBhc3luYyAoZ2V0dGVyOiBhbnkpID0+IHtcbiAgICByZXR1cm4gYXdhaXQgZ2V0dGVyKClcbn1cbiIsICJleHBvcnQgKiBmcm9tIFwiLi9hcHBseVN0eWxlc2hlZXRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2lmcmFtZVNraW5VcmxUb2tlbml6ZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NsYXNzTGlzdFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29uZmlnQnVpbGRlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vQ2xvdWRSZXBvc2l0b3J5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9leGVjXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jbG91ZFJlcG9zaXRvcnlIZWxwZXJzXCI7IiwgImltcG9ydCB7ZGVjb21wcmVzc1VVSURzfSBmcm9tIFwiLi4vdXRpbHMvdXVpZC50c1wiO1xuaW1wb3J0IHtDbG91ZFJlcG9zaXRvcnl9IGZyb20gXCIuLi9oZWxwZXJzXCI7XG5pbXBvcnQge1xuICAgIEV4cGVyaWVuY2VUeXBlcyxcbiAgICBJQ29tcG9uZW50Q29uZmlnLCBJRGVkaWNhdGVkU2tpbkNvbmZpZyxcbiAgICBJU2VnbWVudGVkU2tpbkNvbmZpZyxcbiAgICBJU2VnbWVudEV4cGVyaWVuY2UsIElTa2luSW5zdGFuY2VDb25maWcsXG4gICAgU2tpblNlbGVjdG9yVHlwZXNcbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5leHBvcnQgY29uc3QgY2hlY2tNeW9wT3ZlcnJpZGUgPSBhc3luYyAoY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnKTogUHJvbWlzZTxJQ29tcG9uZW50Q29uZmlnIHwgbnVsbD4gPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIC8vVE9ETzogc3VwcG9ydCBkaXNhYmxpbmcgdGhlIG1lY2hhbmlzbVxuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh1cmwuc2VhcmNoKTtcbiAgICAgICAgY29uc3QgbXlvcE92ZXJyaWRlID0gcGFyYW1zLmdldCgnbXlvcE92ZXJyaWRlJyk7XG4gICAgICAgIGlmIChteW9wT3ZlcnJpZGUpIHtcbiAgICAgICAgICAgIGNvbnN0IFtzb3VyY2UsIC4uLnV1aWRzXSA9IGRlY29tcHJlc3NVVUlEcyhteW9wT3ZlcnJpZGUpO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKHNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NvbXBvbmVudCc6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW2NvbXBvbmVudElkLCBza2luSWRdID0gdXVpZHM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFRvT3ZlcnJpZGUgPSBhd2FpdCBDbG91ZFJlcG9zaXRvcnkuTWFpbi5mZXRjaENvbXBvbmVudChjb21wb25lbnRJZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRUb092ZXJyaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2RvOiBjaGVjayBmZXRjaEF1dG9GbG93LiBMb29rcyBsaWtlIG9ubHkgb25lIHNraW4gaXMgcmV0dXJuZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNraW4gPSBjb21wb25lbnRUb092ZXJyaWRlLnR5cGUuc2tpbnMuZmluZChza2luID0+IHNraW4uaWQgPT09IHNraW5JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2tpbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvZG86IGZvciBub3cganVzdCBzZXQgc2tpbiBpZC4gQ2hlY2sgdGhlIGNsb3VkIGltcGxlbWVudGF0aW9uXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnNraW5TZWxlY3RvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogU2tpblNlbGVjdG9yVHlwZXMuRGVkaWNhdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2luOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogc2tpbklkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gYXMgSVNraW5JbnN0YW5jZUNvbmZpZ1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRUb092ZXJyaWRlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgLy8gICAgY2FzZSAnZmxvdyc6IHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0IDoge1xuICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IFtmbG93SWQsIGV4cGVyaW1lbnRJZF0gPSB1dWlkcztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW2Zsb3dJZCwgZXhwZXJpbWVudElkXSA9IGRlY29tcHJlc3NVVUlEcyhteW9wT3ZlcnJpZGUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG93ID0gYXdhaXQgQ2xvdWRSZXBvc2l0b3J5Lk1haW4uZmV0Y2hGbG93KGZsb3dJZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFRvT3ZlcnJpZGUgPSBmbG93LmNvbXBvbmVudHMuZmluZChjID0+IGMudHlwZS5pZCA9PT0gY29tcG9uZW50Q29uZmlnLnR5cGUuaWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50VG9PdmVycmlkZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2Uuc2tpblNlbGVjdG9yLnR5cGUgPT09IFNraW5TZWxlY3RvclR5cGVzLlNlZ21lbnRlZCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2UucmVzb2x2ZWRFeHBlcmllbmNlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZEV4cGVyaWVuY2UgPSBjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnJlc29sdmVkRXhwZXJpZW5jZXMuZmluZChlID0+IGUuaWQgPT09IGV4cGVyaW1lbnRJZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkRXhwZXJpZW5jZT8udHlwZSA9PT0gRXhwZXJpZW5jZVR5cGVzLlNlZ21lbnQpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRSZXNvbHZlZEV4cGVyaWVuY2UgPSByZXNvbHZlZEV4cGVyaWVuY2UgYXMgSVNlZ21lbnRFeHBlcmllbmNlXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkU2tpblNlbGVjdG9yID0gY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5za2luU2VsZWN0b3IgYXMgSVNlZ21lbnRlZFNraW5Db25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlZ21lbnQgPSB0eXBlZFNraW5TZWxlY3Rvci5zZWdtZW50cy5maW5kKHMgPT4gcy5zZWdtZW50SWQgPT09IHR5cGVkUmVzb2x2ZWRFeHBlcmllbmNlLnNlZ21lbnQuaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnNraW5TZWxlY3RvciA9IHNlZ21lbnQ/LnNraW5TZWxlY3RvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50VG9PdmVycmlkZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59IiwgIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKiBUaGUgSG9zdCBTREsgaXMgZGVzaWduZWQgZm9yIGludGVncmF0aW9uIHdpdGhpbiB0aGUgaG9zdCBhcHBsaWNhdGlvbiB0aGF0IHNlcnZlcyBhcyB0aGUgY29udGFpbmVyIGZvciBNeW9wICBjb21wb25lbnRzLjxici8+PGJyLz5cbiAqIEl0IHByb3ZpZGVzIGVzc2VudGlhbCBmdW5jdGlvbmFsaXRpZXMgYW5kIEFQSXMgZm9yIHJlZ2lzdGVyaW5nLCBtYW5hZ2luZywgYW5kIGNvbW11bmljYXRpbmcgd2l0aCBNeW9wIGNvbXBvbmVudHMuPGJyLz48YnIvPlxuICogVGhpcyBTREsgZW5hYmxlcyBzZWFtbGVzcyBlbWJlZGRpbmcgb2YgaW5kZXBlbmRlbnRseSBkZXZlbG9wZWQgY29tcG9uZW50cyBpbnRvIHRoZSBob3N0IGFwcGxpY2F0aW9uLCBlbnN1cmluZyBzbW9vdGggaW50ZXJvcGVyYWJpbGl0eSBhbmQgY29uc2lzdGVudCB1c2VyIGV4cGVyaWVuY2UgYWNyb3NzIHZhcmlvdXMgTXlvcCBjb21wb25lbnQgaW1wbGVtZW50YXRpb25zLlxuICovXG5pbXBvcnQge2RlZmluZUR5bmFtaWNJbXBvcnR9IGZyb20gXCIuLi9keW5hbWljSW1wb3J0L2RlZmluZUR5bmFtaWNJbXBvcnRcIjtcbmltcG9ydCB7SU15b3BMb2FkZXJ9IGZyb20gXCIuL2xvYWRlcnMvSU15b3BMb2FkZXJcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuL2NvbXBvbmVudHMvSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsXG4gICAgRW52ZWxvcGVkTWVzc2FnZSwgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCxcbiAgICBJbml0TWVzc2FnZSxcbiAgICBJbml0UmVzcG9uc2UsIE1lc3NhZ2VEaXJlY3Rpb24sIFJlZlxufSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7TXlvcElmcmFtZUxvYWRlcn0gZnJvbSBcIi4vbG9hZGVycy9pZnJhbWVMb2FkZXJcIjtcbmltcG9ydCB7V2ViY29tcG9uZW50TG9hZGVyfSBmcm9tIFwiLi9sb2FkZXJzL3dlYmNvbXBvbmVudExvYWRlclwiO1xuaW1wb3J0IHtSZW5kZXJQb2xpY3l9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB0eXBlIHtJZnJhbWVTREt9IGZyb20gXCIuLi9JZnJhbWVcIjtcbmltcG9ydCB7Y29ubmVjdFByb3BzLCBjb25uZWN0UmVmcywgY3JlYXRlUmVmQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRDb3JlXCI7XG5pbXBvcnQge1xuICAgIEV4cGVyaWVuY2VUeXBlcyxcbiAgICBJQ29tcG9uZW50Q29uZmlnLFxuICAgIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgIElEZWRpY2F0ZWRTa2luQ29uZmlnLCBJRXhwZXJpZW5jZSwgSUZ1bmN0aW9uUmVzdWx0c1NlZ21lbnQsIElTZWdtZW50ZWRTa2luQ29uZmlnLCBJU2VnbWVudEV4cGVyaWVuY2UsXG4gICAgSVNraW5Db25maWcsIElTa2luU2VsZWN0b3JDb25maWcsIFNraW5TZWxlY3RvclR5cGVzLFxuXG5cbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuLy8gQHRzLWlnbm9yZSBoYW5kbGVkIGJ5IGN1c3RvbSBlc2J1aWxkIHBsdWdpblxuaW1wb3J0IHZlcnNpb24gZnJvbSBcIm15b3Atc2RrLXZlcnNpb25cIjtcbmltcG9ydCB7ZGVsaXZlcnksIGRlbGl2ZXJ5T2ZmLCBkZWxpdmVyeVJlZnJlc2gsIGRlbGl2ZXJ5U3RhdHMsIGh5ZHJhdGVWMUNvbXBvbmVudHN9IGZyb20gXCIuLi9oZWxwZXJzL2Nsb3VkUmVwb3NpdG9yeUhlbHBlcnNcIjtcbmltcG9ydCB7SFRNTENvbXBvbmVudExvYWRlcn0gZnJvbSBcIi4vbG9hZGVycy9IVE1MQ29tcG9uZW50TG9hZGVyXCI7XG5pbXBvcnQge2NoZWNrTXlvcE92ZXJyaWRlfSBmcm9tIFwiLi9teW9wT3ZlcnJpZGUudHNcIjtcblxuaW50ZXJmYWNlIGNvbXBvbmVudExvYWRlckNyZWF0b3Ige1xuICAgIG5ldyhsb2FkZXJzOiBJTXlvcExvYWRlcltdKTogYW55O1xufVxuXG4vLyBjb25zdCBnZXRDb21wb25lbnREZWZpbml0aW9uQ29uZmlnID0gYXN5bmMgKGlkOiBzdHJpbmcpID0+IHtcbi8vICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgaHR0cDovL2xvY2FsaG9zdDozMDAwL2NvbXBvbmVudD9pZD0ke2lkfWApO1xuLy8gICAgIGNvbnN0IGNvbXBvbmVudERlZjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcgPSAoYXdhaXQgcmVzLmpzb24oKSkuaXRlbTtcbi8vICAgICByZXR1cm4gY29tcG9uZW50RGVmXG4vLyB9XG5cbi8vY29uc3QgX19ST09UX1NES19QVUJMSUNfVVJMX18gPSAnaHR0cHM6Ly9kZmRsazJwMW0xODd2LmNsb3VkZnJvbnQubmV0L215b3Bfc2RrLm1pbi5qcydcbmNvbnN0IF9fUk9PVF9TREtfUFVCTElDX1VSTF9fID0gJ2h0dHBzOi8vY2RuLm15b3AuZGV2L3Nkay9uZXh0L215b3Bfc2RrLm1pbi5qcydcblxuLyoqXG4gKiBUaGUgSG9zdCBTREsgaXMgZGVzaWduZWQgZm9yIGludGVncmF0aW9uIHdpdGhpbiB0aGUgaG9zdCBhcHBsaWNhdGlvbiB0aGF0IHNlcnZlcyBhcyB0aGUgY29udGFpbmVyIGZvciBNeW9wICBjb21wb25lbnRzLjxici8+PGJyLz5cbiAqIEl0IHByb3ZpZGVzIGVzc2VudGlhbCBmdW5jdGlvbmFsaXRpZXMgYW5kIEFQSXMgZm9yIHJlZ2lzdGVyaW5nLCBtYW5hZ2luZywgYW5kIGNvbW11bmljYXRpbmcgd2l0aCBNeW9wIGNvbXBvbmVudHMuPGJyLz48YnIvPlxuICogVGhpcyBTREsgZW5hYmxlcyBzZWFtbGVzcyBlbWJlZGRpbmcgb2YgaW5kZXBlbmRlbnRseSBkZXZlbG9wZWQgY29tcG9uZW50cyBpbnRvIHRoZSBob3N0IGFwcGxpY2F0aW9uLCBlbnN1cmluZyBzbW9vdGggaW50ZXJvcGVyYWJpbGl0eSBhbmQgY29uc2lzdGVudCB1c2VyIGV4cGVyaWVuY2UgYWNyb3NzIHZhcmlvdXMgTXlvcCBjb21wb25lbnQgaW1wbGVtZW50YXRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgSG9zdFNESyB7XG4gICAgc3RhdGljIEluc3RhbmNlID0gKCkgPT4gd2luZG93Lm15b3AuaG9zdFNESztcblxuICAgIGNvbXBvbmVudHMyaW5pdDogSU15b3BDb21wb25lbnRbXSA9IFtdO1xuICAgIGNvbXBvbmVudHM6IElNeW9wQ29tcG9uZW50W10gPSBbXTtcbiAgICBjb21wb25lbnRzTG9hZGVyczogSU15b3BMb2FkZXJbXSA9IFtdO1xuXG4gICAgLy8gR2xvYmFsIHJlbmRlciBwb2xpY3kgKGFsbG93L2RlbnkvbW9kZSBnYXRlKS4gQSBwZXItY2FsbCBvcHRpb25zLnJlbmRlclBvbGljeVxuICAgIC8vIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGlzIFx1MjAxNCBzZWUgSFRNTENvbXBvbmVudExvYWRlci5yZXNvbHZlUmVuZGVyTW9kZS5cbiAgICBwcml2YXRlIF9yZW5kZXJQb2xpY3k/OiBSZW5kZXJQb2xpY3k7XG4gICAgcHVibGljIHNldFJlbmRlclBvbGljeSA9IChwb2xpY3k/OiBSZW5kZXJQb2xpY3kpID0+IHsgdGhpcy5fcmVuZGVyUG9saWN5ID0gcG9saWN5OyB9O1xuICAgIHB1YmxpYyBnZXRSZW5kZXJQb2xpY3kgPSAoKTogUmVuZGVyUG9saWN5IHwgdW5kZWZpbmVkID0+IHRoaXMuX3JlbmRlclBvbGljeTtcblxuICAgIHB1YmxpYyBpbml0aWF0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHB1YmxpYyB2ZXJzaW9uID0gdmVyc2lvbjtcblxuICAgIHR5cGUySW5zdGFuY2VDb3VudDogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICAgIHB1YmxpYyBhc3NpZ25JZCA9IChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZykgPT4ge1xuICAgICAgICBpZiAoIXRoaXMudHlwZTJJbnN0YW5jZUNvdW50W2NvbXBvbmVudERlZmluaXRpb24uaWRdKSB7XG4gICAgICAgICAgICB0aGlzLnR5cGUySW5zdGFuY2VDb3VudFtjb21wb25lbnREZWZpbml0aW9uLmlkXSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke2NvbXBvbmVudERlZmluaXRpb24uaWR9XyR7Kyt0aGlzLnR5cGUySW5zdGFuY2VDb3VudFtjb21wb25lbnREZWZpbml0aW9uLmlkXX1gO1xuICAgIH1cblxuICAgIC8vVE9ETyA6IGZpeCB0aGUgaW5zcGVjdCBpbXBsZW1lbnRhdGlvbiBpbnNpZGUgcmVmQ29tcG9uZW50XG4gICAgLy90aGVuIGluc3BlY3RlZCBtYXliZSBjYW4gYmUgZHJvcHBlZFxuICAgIHByaXZhdGUgaW5zcGVjdGVkID0gZmFsc2U7XG4gICAgcHVibGljIGluc3BlY3QgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmluc3BlY3RlZClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICB0aGlzLmluc3BlY3RlZCA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5jb21wb25lbnRzLmZvckVhY2goY29tcG9uZW50ID0+IHtcbiAgICAgICAgICAgIGlmIChjb21wb25lbnQuaW5zcGVjdCkge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbnNwZWN0KClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyBBIGNvbXBvbmVudCdzIG9yaWdpbiBpcyB3aGF0ZXZlciBpdHMgaWZyYW1lIFVSTCBpcywgc28gYW4gb3JpZ2luIGFsbG93bGlzdCBjYW4ndCB3b3JrIGhlcmUuXG4gICAgLy8gSW5zdGVhZCBvbmx5IGZyYW1lcyB0aGlzIFNESyBjcmVhdGVkIChvciBhZG9wdGVkKSBtYXkgdGFsayB0byBpdC4gYHNlbmQoKWAgZGlzcGF0Y2hlc1xuICAgIC8vIHN5bnRoZXRpYyBldmVudHMsIHdoaWNoIGhhdmUgbm8gc291cmNlLlxuICAgIHByaXZhdGUgaXNUcnVzdGVkU291cmNlID0gKHNvdXJjZTogTWVzc2FnZUV2ZW50U291cmNlIHwgbnVsbCkgPT4ge1xuICAgICAgICBpZiAoIXNvdXJjZSB8fCBzb3VyY2UgPT09IHdpbmRvdykgcmV0dXJuIHRydWU7XG4gICAgICAgIGNvbnN0IGlzT3duRnJhbWUgPSAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGNvbXBvbmVudC5lbGVtZW50IGFzIEhUTUxJRnJhbWVFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ/Lm5vZGVOYW1lID09PSAnSUZSQU1FJyAmJiBlbGVtZW50LmNvbnRlbnRXaW5kb3cgPT09IHNvdXJjZTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcG9uZW50cy5zb21lKGlzT3duRnJhbWUpIHx8IHRoaXMuY29tcG9uZW50czJpbml0LnNvbWUoaXNPd25GcmFtZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbmNvbWluZ01lc3NhZ2VIYW5kbGVyID0gKGV2ZW50OiBNZXNzYWdlRXZlbnQ8QmFzZU15b3BNZXNzYWdlPikgPT4ge1xuICAgICAgICBpZiAoIWV2ZW50LmRhdGE/Lm15b3ApIHJldHVybjtcblxuICAgICAgICBpZiAoIXRoaXMuaXNUcnVzdGVkU291cmNlKGV2ZW50LnNvdXJjZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5kYXRhLm15b3ApIHtcbiAgICAgICAgICAgIGlmIChldmVudC5kYXRhLmRpcmVjdGlvbiAhPT0gTWVzc2FnZURpcmVjdGlvbi51cCAmJiBldmVudC5kYXRhLm1lc3NhZ2VUeXBlICE9PSBNeW9wTWVzc2FnZXMuRW52ZWxvcGVkTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ21lc3NhZ2UgZHJvcHBlZCBpbiBob3N0c2RrLCBkaXJlY3Rpb24gd2FzICcsIGV2ZW50LmRhdGEuZGlyZWN0aW9uKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZXZlbnQgb24gaG9zdCBzaWRlIFwiLCBldmVudCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG15b3BNZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UgPSBldmVudC5kYXRhO1xuXG4gICAgICAgICAgICBpZiAobXlvcE1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbml0UmVxdWVzdCkge1xuICAgICAgICAgICAgICAgIC8vIEFOU1dFUiBUSEUgRlJBTUUgVEhBVCBBU0tFRCwgTk9UIEVWRVJZIFBFTkRJTkcgQ09NUE9ORU5ULlxuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gYGV2ZW50LnNvdXJjZWAgbmFtZXMgdGhlIGFza2luZyBmcmFtZSwgYW5kIGlnbm9yaW5nIGl0IG1hZGUgdGhlIGFuc3dlciBhXG4gICAgICAgICAgICAgICAgLy8gYnJvYWRjYXN0OiBuIGNvbXBvbmVudHMgZWFjaCBhbm5vdW5jZSBvbmNlLCBhbmQgZWFjaCBhbm5vdW5jZSByZS1zZW50XG4gICAgICAgICAgICAgICAgLy8gSW5pdE1lc3NhZ2UgdG8gYWxsIG4gcGVuZGluZywgc28gYSBwYWdlIHBhaWQgbl4yIHBvc3RNZXNzYWdlcyBkdXJpbmcgdGhlXG4gICAgICAgICAgICAgICAgLy8gZXhhY3Qgd2luZG93IGl0IHdhcyBidXNpZXN0IGJvb3RpbmcgZnJhbWVzLiBNZWFzdXJlZCBvbiBhIDEyLWNvbXBvbmVudFxuICAgICAgICAgICAgICAgIC8vIHBhZ2UgKFBpYy1UaW1lJ3Mgc2hhcGUpOiAxNDQgSW5pdE1lc3NhZ2VzIHdoZXJlIDEyIHdlcmUgbmVlZGVkLlxuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gKEEgZnJhbWUtc2lkZSByZXRyeSBsb29wIGJyaWVmbHkgZXhpc3RlZCBoZXJlIHRvbzsgaXQgd2FzIHJlbW92ZWQgYXNcbiAgICAgICAgICAgICAgICAvLyBkZWFkIHdlaWdodCBvbmNlIGZpeCAxIGxhbmRlZC4gVGFyZ2V0aW5nIG1lYW5zIGEgcmVwZWF0IGFubm91bmNlLCBmcm9tXG4gICAgICAgICAgICAgICAgLy8gYW55IGZ1dHVyZSBzb3VyY2UsIGNvc3RzIG9uZSBtZXNzYWdlIHJhdGhlciB0aGFuIG4uKVxuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gRkFMTCBCQUNLIFRPIFRIRSBCUk9BRENBU1Qgd2hlbiB0aGUgc291cmNlIGNhbm5vdCBiZSBtYXRjaGVkIHRvIGEgZnJhbWUuXG4gICAgICAgICAgICAgICAgLy8gYHNlbmQoKWAgZGlzcGF0Y2hlcyBzeW50aGV0aWMgZXZlbnRzLCB3aGljaCBjYXJyeSBubyBzb3VyY2UsIGFuZCBhIHdlYlxuICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudCdzIEluaXRSZXF1ZXN0IGNvbWVzIGZyb20gYHdpbmRvd2AgaXRzZWxmIC0tIG5laXRoZXIgaGFzIGFcbiAgICAgICAgICAgICAgICAvLyBjb250ZW50V2luZG93IHRvIG1hdGNoLCBhbmQgYm90aCBtdXN0IGtlZXAgd29ya2luZyBleGFjdGx5IGFzIGJlZm9yZS5cbiAgICAgICAgICAgICAgICBjb25zdCBmcm9tQXNraW5nRnJhbWUgPSB0aGlzLmNvbXBvbmVudHMyaW5pdC5maWx0ZXIoY29tcG9uZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGNvbXBvbmVudC5lbGVtZW50IGFzIEhUTUxJRnJhbWVFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudD8ubm9kZU5hbWUgPT09ICdJRlJBTUUnICYmIGVsZW1lbnQuY29udGVudFdpbmRvdyA9PT0gZXZlbnQuc291cmNlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldHMgPSBmcm9tQXNraW5nRnJhbWUubGVuZ3RoID8gZnJvbUFza2luZ0ZyYW1lIDogdGhpcy5jb21wb25lbnRzMmluaXQ7XG4gICAgICAgICAgICAgICAgdGFyZ2V0cy5mb3JFYWNoKGNvbXBvbmVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBJbml0TWVzc2FnZShjb21wb25lbnQuaWQpKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG15b3BNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW5pdFJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gY29tcG9uZW50cyAyIGluaXRcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzMmluaXQgPSB0aGlzLmNvbXBvbmVudHMyaW5pdC5maWx0ZXIoY29tcG9uZW50ID0+IGNvbXBvbmVudC5pZCAhPT0gKG15b3BNZXNzYWdlIGFzIEluaXRSZXNwb25zZSkuY29udGVudC5pZClcblxuICAgICAgICAgICAgICAgIGNvbnN0IGluaXRpYXRlZENvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50cy5maW5kKGNvbXBvbmVudCA9PiBjb21wb25lbnQuaWQgPT09IChteW9wTWVzc2FnZSBhcyBJbml0UmVzcG9uc2UpLmNvbnRlbnQ/LmlkKTtcbiAgICAgICAgICAgICAgICBpbml0aWF0ZWRDb21wb25lbnQ/LnNldEluaXRpYXRlZCgpXG4gICAgICAgICAgICAgICAgLy9pbml0aWF0ZWRDb21wb25lbnQ/LnBhcmVudD8uc2V0SW5pdGlhdGVkKCk7XG4gICAgICAgICAgICAgICAgLy8gVE9ETyA6IGlzIGl0IHRydWUgdG8gbm90IHBhc3MgZnVydGhlciAoIHRvIHRoZSBjb21wb25lbnQgKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG15b3BNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuRW52ZWxvcGVkTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZWRNZXNzYWdlID0gbXlvcE1lc3NhZ2UgYXMgRW52ZWxvcGVkTWVzc2FnZVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50cy5maW5kKGNvbXBvbmVudCA9PiBjb21wb25lbnQuaWQgPT09IHR5cGVkTWVzc2FnZS5kZXN0aW5hdGlvbik7XG5cbiAgICAgICAgICAgICAgICBpZiAocmVmQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZE1lc3NhZ2UuZGlyZWN0aW9uID09PSBNZXNzYWdlRGlyZWN0aW9uLmRvd24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZE1lc3NhZ2UubWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gRXhlY3V0ZUNvbXBvbmVudE1ldGhvZC5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50Lm9uTWVzc2FnZVJlY2VpdmVkKHR5cGVkTWVzc2FnZS5tZXNzYWdlKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVkTWVzc2FnZS5tZXNzYWdlLnJvdXRlID0gdHlwZWRNZXNzYWdlLnJvdXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5zZW5kKHR5cGVkTWVzc2FnZS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlubmVyQ29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzLmZpbmQoY29tcG9uZW50ID0+IGNvbXBvbmVudC5pZCA9PT0gdHlwZWRNZXNzYWdlLm1lc3NhZ2UuZGVzdGluYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5uZXJDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyQ29tcG9uZW50LnNlbmQodHlwZWRNZXNzYWdlLm1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIDogbG9nID9cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgLy9jb21wb25lbnQucmVmcy5ib2R5Lm9uTWVzc2FnZVJlY2VpdmVkKG15b3BNZXNzYWdlLm1lc3NhZ2UpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHMuZmluZChjb21wb25lbnQgPT4gY29tcG9uZW50LmlkID09PSBteW9wTWVzc2FnZS5kZXN0aW5hdGlvbik7XG5cbiAgICAgICAgICAgIGlmICghY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgLy9ubyBpbiBtZW0gY29tcG9uZW50XG4gICAgICAgICAgICAgICAgLy9wYXNzIHRvIHBhcmVudCBIb3N0U0RLIHRvIHRyeSBwcm9jZXNzIHRoZXJlXG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5teW9wLklmcmFtZVNESykge1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubXlvcC5JZnJhbWVTREsubWVzc2FnZVRvSG9zdChteW9wTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQub25NZXNzYWdlUmVjZWl2ZWQobXlvcE1lc3NhZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvL25vdCBwcm9jZXNzZWQgaW4gb25NZXNzYWdlUmVjZWl2ZWRcbiAgICAgICAgICAgICAgICAgICAgLy9wYXNzIHRvIHBhcmVudCBIb3N0U0RLIHRvIHRyeSBwcm9jZXNzIHRoZXJlXG4gICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cubXlvcC5JZnJhbWVTREspXG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubXlvcC5JZnJhbWVTREsubWVzc2FnZVRvSG9zdChteW9wTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gZXZlbnQuc291cmNlLnBvc3RNZXNzYWdlKFxuICAgICAgICAvLyAgICAgXCJoaSB0aGVyZSB5b3Vyc2VsZiEgIHRoZSBzZWNyZXQgcmVzcG9uc2UgXCIgKyBcImlzOiByaGVlZWVldCFcIixcbiAgICAgICAgLy8gICAgIGV2ZW50Lm9yaWdpbixcbiAgICAgICAgLy8gICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBzeW50aGV0aWNFdmVudCA9IG5ldyBNZXNzYWdlRXZlbnQ8QmFzZU15b3BNZXNzYWdlPignJyxcbiAgICAgICAgICAgIHtkYXRhOiBtZXNzYWdlfVxuICAgICAgICApXG5cbiAgICAgICAgdGhpcy5pbmNvbWluZ01lc3NhZ2VIYW5kbGVyKHN5bnRoZXRpY0V2ZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaW5pdCA9IChjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9ycz86IGNvbXBvbmVudExvYWRlckNyZWF0b3JbXSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pbml0aWF0ZWQpIHtcbiAgICAgICAgICAgIC8vIGdldEhvc3RNb2R1bGUoKSBhbHJlYWR5IGluaXRpYXRlcyB0aGUgU0RLLCBhbmQgdGhlIFJFQURNRSB0ZWxscyBob3N0cyB0byBjYWxsIGluaXQoKVxuICAgICAgICAgICAgLy8gYWZ0ZXIgaXQuIE9ubHkgbWVyZ2UgY3VzdG9tIGxvYWRlcnM7IHRoZSBtZXNzYWdlIGxpc3RlbmVyIGlzIGFscmVhZHkgYXR0YWNoZWQuXG4gICAgICAgICAgICBpZiAoY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvcnM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyTG9hZGVycyhjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9ycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiYXNpY0xvYWRlcnMgPSBbXG4gICAgICAgICAgICBuZXcgTXlvcElmcmFtZUxvYWRlcigpLFxuICAgICAgICAgICAgbmV3IFdlYmNvbXBvbmVudExvYWRlcigpLFxuICAgICAgICAgICAgbmV3IEhUTUxDb21wb25lbnRMb2FkZXIoKVxuICAgICAgICBdO1xuXG4gICAgICAgIHRoaXMuY29tcG9uZW50c0xvYWRlcnMgPSBbXG4gICAgICAgICAgICAuLi5iYXNpY0xvYWRlcnNcbiAgICAgICAgXTtcblxuICAgICAgICBpZiAoY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvcnMpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyTG9hZGVycyhjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9ycyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbmNvbW1pbmcgbWVzc2FnZXMgZnJvbSBJRnJhbWVzXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgXCJtZXNzYWdlXCIsXG4gICAgICAgICAgICB0aGlzLmluY29taW5nTWVzc2FnZUhhbmRsZXIsXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zb2xlLmxvZygnbXlvcCBob3N0U0RLIGluaXRpYXRlZCcsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgICB0aGlzLmluaXRpYXRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVnaXN0ZXJMb2FkZXJzID0gKGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3JzOiBjb21wb25lbnRMb2FkZXJDcmVhdG9yW10pID0+IHtcbiAgICAgICAgY29uc3QgbG9hZGVyQnlUeXBlOiBSZWNvcmQ8c3RyaW5nLCBJTXlvcExvYWRlcj4gPSB7fTtcblxuICAgICAgICBjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9ycy5mb3JFYWNoKGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3IgPT4ge1xuICAgICAgICAgICAgY29uc3QgY3VzdG9tTG9hZGVyID0gbmV3IGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3IodGhpcy5jb21wb25lbnRzTG9hZGVycyk7XG4gICAgICAgICAgICBsb2FkZXJCeVR5cGVbY3VzdG9tTG9hZGVyLnR5cGVdID0gY3VzdG9tTG9hZGVyO1xuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMuY29tcG9uZW50c0xvYWRlcnMuZm9yRWFjaChsb2FkZXIgPT4ge1xuICAgICAgICAgICAgaWYgKCFsb2FkZXJCeVR5cGVbbG9hZGVyLnR5cGVdKVxuICAgICAgICAgICAgICAgIGxvYWRlckJ5VHlwZVtsb2FkZXIudHlwZV0gPSBsb2FkZXI7XG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5jb21wb25lbnRzTG9hZGVycyA9IE9iamVjdC52YWx1ZXMobG9hZGVyQnlUeXBlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRTa2luSWRCeVNraW5TZWxlY3RvciA9IGFzeW5jIChza2luU2VsZWN0b3I6IElTa2luU2VsZWN0b3JDb25maWcsIGV4cGVyaWVuY2VzOiBJRXhwZXJpZW5jZVtdID0gW10sIGhvb2tzPzogbG9hZGVySG9va3MpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgICAgICBhc3luYyBmdW5jdGlvbiBhc3luY0ZpbmQ8VD4oXG4gICAgICAgICAgICBhcnJheTogVFtdLFxuICAgICAgICAgICAgcHJlZGljYXRlOiAoaXRlbTogVCkgPT4gUHJvbWlzZTxib29sZWFuPlxuICAgICAgICApOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBhcnJheSkge1xuICAgICAgICAgICAgICAgIGlmIChhd2FpdCBwcmVkaWNhdGUoaXRlbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gUmV0dXJuIHVuZGVmaW5lZCBpZiBubyBtYXRjaCBpcyBmb3VuZFxuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChza2luU2VsZWN0b3IudHlwZSkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY2FzZSBcIkRlZGljYXRlZFNraW5cIiA6IC8vYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgY2FzZSBTa2luU2VsZWN0b3JUeXBlcy5EZWRpY2F0ZWQ6IHtcbiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRTa2luSWQgPSAoc2tpblNlbGVjdG9yIGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnKS5za2luPy5pZFxuICAgICAgICAgICAgICAgICAgICB8fCAoc2tpblNlbGVjdG9yIGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnKS5za2lucyFbMF0uaWQ7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRTa2luSWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNraW5TZWxlY3RvclR5cGVzLlNlZ21lbnRlZDoge1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkU2tpblNlbGVjdG9yID0gKHNraW5TZWxlY3RvciBhcyBJU2VnbWVudGVkU2tpbkNvbmZpZylcbiAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50ID0gYXdhaXQgYXN5bmNGaW5kKHR5cGVkU2tpblNlbGVjdG9yLnNlZ21lbnRzLCBhc3luYyBzZWdtZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQuc2VnbWVudElkID09PSAnRGVmYXVsdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhwZXJpZW5jZSA9IGV4cGVyaWVuY2VzLmZpbmQoZXhwZXJpZW5jZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhwZXJpZW5jZS50eXBlID09PSBFeHBlcmllbmNlVHlwZXMuU2VnbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZXhwZXJpZW5jZSBhcyBJU2VnbWVudEV4cGVyaWVuY2UpLnNlZ21lbnQuaWQgPT09IHNlZ21lbnQuc2VnbWVudElkXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghZXhwZXJpZW5jZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZXhwZXJpZW5jZSBub3QgZm91bmRcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZEV4cGVyaWVuY2UgPSBleHBlcmllbmNlIGFzIElTZWdtZW50RXhwZXJpZW5jZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRTZWdtZW50ID0gKHR5cGVkRXhwZXJpZW5jZS5zZWdtZW50IGFzIElGdW5jdGlvblJlc3VsdHNTZWdtZW50KVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlZ21lbnRGdW5jdGlvbiA9IChob29rcyA/IGhvb2tzIDoge30pW3R5cGVkU2VnbWVudC5mdW5jdGlvbl07XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50RnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBzZWdtZW50RnVuY3Rpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBzZWdtZW50SWQ6JHtzZWdtZW50LnNlZ21lbnRJZH0sICR7dHlwZWRTZWdtZW50LmZ1bmN0aW9ufSBmdW5jdGlvbiBub3QgcHJvdmlkZWQgIWApXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc2VnbWVudClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFNraW5JZEJ5U2tpblNlbGVjdG9yKHNlZ21lbnQuc2tpblNlbGVjdG9yLCBleHBlcmllbmNlcyk7XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJycgLy9UT0RPXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBydW5Ta2luU2VsZWN0b3IgPSBhc3luYyAoY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBob29rcz86IGxvYWRlckhvb2tzKSA9PiB7XG4gICAgICAgIGNvbnN0IHNraW5JZCA9IGF3YWl0IHRoaXMuX2dldFNraW5JZEJ5U2tpblNlbGVjdG9yKGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5za2luU2VsZWN0b3IsIGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5yZXNvbHZlZEV4cGVyaWVuY2VzLCBob29rcyk7XG4gICAgICAgIHJldHVybiBjb21wb25lbnRDb25maWcudHlwZS5za2lucy5maW5kKHNraW4gPT4gc2tpbi5pZCA9PT0gc2tpbklkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZGVySG9va3M/OiBsb2FkZXJIb29rcztcblxuICAgIHB1YmxpYyBsb2FkQ29tcG9uZW50ID0gYXN5bmMgPFQgZXh0ZW5kcyBJTXlvcENvbXBvbmVudCA9IElNeW9wQ29tcG9uZW50Pihjb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsIGNvbnRhaW5lcj86IEhUTUxFbGVtZW50IHwgUmVmLCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucyk6XG4gICAgICAgIFByb21pc2U8VD4gPT4ge1xuXG4gICAgICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbm8gY29udGFpbmVyIHdhcyBmb3VuZCBmb3IgdGhpcyBjb21wb25lbnQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG92ZXJyaWRkZW5Db25maWcgPSBhd2FpdCBjaGVja015b3BPdmVycmlkZShjb21wb25lbnRDb25maWcpO1xuICAgICAgICBpZiAob3ZlcnJpZGRlbkNvbmZpZykge1xuICAgICAgICAgICAgLy9UT0RPIDogbG9nXG4gICAgICAgICAgICBjb21wb25lbnRDb25maWcgPSBvdmVycmlkZGVuQ29uZmlnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gLy8gQHRzLWlnbm9yZVxuICAgICAgICAvLyBpZiAoIWNvbnRhaW5lci5fX25vblByb3hpZWQpIHtcbiAgICAgICAgLy8gICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IChjb250YWluZXIgYXMgdW5rbm93biBhcyBNeW9wUmVmQ29tcG9uZW50KTtcbiAgICAgICAgLy8gICAgIC8vaWYgd2UgZ290IGxvYWRDb21wb25lbnQgb3ZlciBNeW9wUmVmQ29tcG9uZW50XG4gICAgICAgIC8vICAgICBpZiAocmVmQ29tcG9uZW50LmlkICYmIHJlZkNvbXBvbmVudC5wYXJlbnQpIHtcbiAgICAgICAgLy8gICAgICAgICByZXR1cm4gdGhpcy5sb2FkQ29tcG9uZW50KGNvbXBvbmVudENvbmZpZywgcmVmQ29tcG9uZW50LnJlZiwgb3B0aW9ucyk7XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgICAgICAgLy8gbGV0IHJvb3RDb21wb25lbnQ6IElNeW9wQ29tcG9uZW50ID0gcmVmQ29tcG9uZW50O1xuICAgICAgICAvLyAgICAgICAgIC8vIHdoaWxlKCFyb290Q29tcG9uZW50LmVsZW1lbnQgJiYgcm9vdENvbXBvbmVudC5wYXJlbnQpe1xuICAgICAgICAvLyAgICAgICAgIC8vICAgICByb290Q29tcG9uZW50ID0gcm9vdENvbXBvbmVudC5wYXJlbnRcbiAgICAgICAgLy8gICAgICAgICAvLyB9XG4gICAgICAgIC8vICAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICAgICAvLyByb290Q29tcG9uZW50LmVsZW1lbnRcbiAgICAgICAgLy8gICAgICAgICAvLyAvL3doYXQgbm93ID9cbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuXG4gICAgICAgIGNvbnN0IGhvb2tzID0gey4uLih0aGlzLmxvYWRlckhvb2tzID8/IHt9KSwgLi4uKG9wdGlvbnM/Lmhvb2tzID8/IHt9KX07XG5cbiAgICAgICAgY29uc3QgcmVmID0gY29udGFpbmVyIGFzIFJlZjtcbiAgICAgICAgaWYgKHJlZi5teW9wKSB7XG4gICAgICAgICAgICBpZiAocmVmLmNvbXBvbmVudCkge1xuXG4gICAgICAgICAgICAgICAgY29tcG9uZW50Q29uZmlnID0gey4uLmNvbXBvbmVudENvbmZpZ307XG4gICAgICAgICAgICAgICAgY29tcG9uZW50Q29uZmlnLmluc3RhbmNlID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi5jb21wb25lbnRDb25maWcuaW5zdGFuY2VcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRTa2luID0gYXdhaXQgdGhpcy5ydW5Ta2luU2VsZWN0b3IoY29tcG9uZW50Q29uZmlnLCBob29rcykhXG4gICAgICAgICAgICAgICAgaWYgKCFzZWxlY3RlZFNraW4pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicnVuU2tpblNlbGVjdG9yIGZhaWxlZCB0byBjaG9vc2Ugc2tpbiwgY2hlY2sgdGhlIHByb3ZpZGVkIGNvbmZpZ1wiKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucz8uaG9va3M/LmFmdGVyU2tpblNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkU2tpbiA9IGF3YWl0IG9wdGlvbnMuaG9va3MuYWZ0ZXJTa2luU2VsZWN0ZWQoey4uLnNlbGVjdGVkU2tpbn0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5za2luU2VsZWN0b3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFNraW5TZWxlY3RvclR5cGVzLkRlZGljYXRlZCxcbiAgICAgICAgICAgICAgICAgICAgc2tpbjogc2VsZWN0ZWRTa2luXG4gICAgICAgICAgICAgICAgICAgIC8vICBza2luczogW3NlbGVjdGVkU2tpbl1cbiAgICAgICAgICAgICAgICB9IGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnXG5cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gey4uLm9wdGlvbnN9XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBvcHRpb25zLmhvb2tzXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVmQ29tcG9uZW50ID0gYXdhaXQgY3JlYXRlUmVmQ29tcG9uZW50PFQ+KHJlZiwgY29tcG9uZW50Q29uZmlnLCB0aGlzLmNvbXBvbmVudHMsIG9wdGlvbnMpO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogY29ubmVjdCByZWZzIGFuZCBwcm9wcyBpbnNvZGUgY3JlYXRlUmVmQ29tcG9uZW50LCBlbHNld2hlcmUgaXRzIG5vdCByZWFsbHkgPFQ+XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZkNvbXBvbmVudDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdsb2FkIGNvbXBvbmVudCBnb3QgYSBkZXRhY2hlZCByZWYuJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lciBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICAvKipcbiAgICAgICAgICpcbiAgICAgICAgICogY2hvb3NlIHNraW4gb24gcnVudGltZSAuLi5cbiAgICAgICAgICogICAgICAgIGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5za2luU2VsZWN0b3IudHlwZVxuICAgICAgICAgKi9cblxuICAgICAgICBsZXQgc2VsZWN0ZWRTa2luID0gYXdhaXQgdGhpcy5ydW5Ta2luU2VsZWN0b3IoY29tcG9uZW50Q29uZmlnLCBob29rcykhXG5cbiAgICAgICAgaWYgKCFzZWxlY3RlZFNraW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInJ1blNraW5TZWxlY3RvciBmYWlsZWQgdG8gY2hvb3NlIHNraW4sIGNoZWNrIHRoZSBwcm92aWRlZCBjb25maWdcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8uaG9va3M/LmFmdGVyU2tpblNlbGVjdGVkKSB7XG4gICAgICAgICAgICBzZWxlY3RlZFNraW4gPSBhd2FpdCBvcHRpb25zLmhvb2tzLmFmdGVyU2tpblNlbGVjdGVkKHsuLi5zZWxlY3RlZFNraW59KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb21wb25lbnRMb2FkZXIgPSB0aGlzLmNvbXBvbmVudHNMb2FkZXJzLmZpbmQobG9hZGVyID0+IGxvYWRlci50eXBlID09PSBzZWxlY3RlZFNraW4ubG9hZGVyLnR5cGUpO1xuXG4gICAgICAgIGlmICghY29tcG9uZW50TG9hZGVyKSB7XG4gICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgbm8gbG9hZGVyIFwiJHtzZWxlY3RlZFNraW4ubG9hZGVyLnR5cGV9XCIgd2FzIGZvdW5kIGZvciBjb21wb25lbnRgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vZm9yIGxvYWRlZCB3ZWJjb21wb25lbnQgbW9kdWxlcyB0byBmb2xsb3dpbmcgbGluZSBjcmVhdGVzIGEgcmFjZSBjb25kaXRpb24gd2l0aCB0aGUgaW5pdCBtZXNzYWdlIGZsb3dcbiAgICAgICAgbGV0IGNvbXBvbmVudCA9IGF3YWl0IGNvbXBvbmVudExvYWRlci5sb2FkKGNvbXBvbmVudENvbmZpZy50eXBlLCBzZWxlY3RlZFNraW4sIGNvbnRhaW5lciwgb3B0aW9ucyk7XG5cbiAgICAgICAgLy8gVE9ETyA6IHdoZW4gdGhpcyBpcyBub3QgdHJ1ZSA/XG4gICAgICAgIGlmICghY29tcG9uZW50LmlzSW5pdGlhdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMyaW5pdC5wdXNoKGNvbXBvbmVudClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbXBvbmVudC5iaW5kKCdvbkRpc3Bvc2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdjb21wb25lbnQgZGlzcG9zZScsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMgPSB0aGlzLmNvbXBvbmVudHMuZmlsdGVyKGMgPT4gYyAhPT0gY29tcG9uZW50KVxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzMmluaXQgPSB0aGlzLmNvbXBvbmVudHMyaW5pdC5maWx0ZXIoYyA9PiBjICE9PSBjb21wb25lbnQpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLmNvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xuXG4gICAgICAgIC8vIERPIE5PVCBXQUlUIFRPIEJFIEFTS0VEIC0tIEJVVCBPTkxZIE9OQ0UgRlVMTFkgUkVHSVNURVJFRC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhlIGNvbXBvbmVudCBhbm5vdW5jZXMgaXRzZWxmIGFzIHNvb24gYXMgaXQgYm9vdHMsIGFuZCB3ZSBhbnN3ZXIgYnkgbG9va2luZyBpdFxuICAgICAgICAvLyB1cC4gQnV0IGl0IG9ubHkgbGFuZHMgaW4gb3VyIGxpc3RzIEhFUkUsIGFmdGVyIHRoZSBhd2FpdCBhYm92ZSwgd2hpY2ggdGhlXG4gICAgICAgIC8vIGNvbW1lbnQgb24gdGhhdCBsaW5lIGFscmVhZHkgY2FsbHMgYSByYWNlOiBhIGNvbXBvbmVudCB0aGF0IGJvb3RlZCBpbnNpZGUgdGhlXG4gICAgICAgIC8vIGF3YWl0IGFubm91bmNlZCBpbnRvIGFuIGVtcHR5IGxpc3QsIGl0cyBJbml0UmVxdWVzdCB3YXMgZHJvcHBlZCwgYW5kIG5vdGhpbmdcbiAgICAgICAgLy8gZXZlciBzZW50IHRoZSBJbml0TWVzc2FnZSBpdCB3YXMgYmxvY2tlZCBvbiAtLSBpbml0aWF0ZWQoKSB0aGVuIHJlamVjdGVkIHdpdGhcbiAgICAgICAgLy8gdGltZW91dF88bXM+LiBNaW5pZmljYXRpb24gbWFkZSB0aGF0IGNvbW1vbiBieSBib290aW5nIGZyYW1lcyBzb29uZXIuIFJlcG9ydGVkXG4gICAgICAgIC8vIGJ5IFBpYy1UaW1lIDIwMjYtMTAtMTcuIFNlbmRpbmcgaGVyZSBjbG9zZXMgdGhlIG9yZGVyaW5nIGhvbGUgaW5zdGVhZCBvZiBob3BpbmdcbiAgICAgICAgLy8gdG8gc3Vydml2ZSBpdC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVEhJUyBNVVNUIENPTUUgQUZURVIgYGNvbXBvbmVudHMucHVzaGAsIE5PVCBCRUZPUkUgSVQuIFRoZSB0d28gY29tcG9uZW50IGNsYXNzZXNcbiAgICAgICAgLy8gZG8gbm90IHNoYXJlIGEgdHJhbnNwb3J0OiBhbiBpZnJhbWUgaXMgbWVzc2FnZWQgd2l0aCBwb3N0TWVzc2FnZSwgd2hpY2ggaXNcbiAgICAgICAgLy8gYXN5bmMsIHNvIHJlZ2lzdHJhdGlvbiBhbHdheXMgd29uIHRoZSByYWNlIGJ5IGx1Y2suIEEgd2ViIGNvbXBvbmVudCBpcyBtZXNzYWdlZFxuICAgICAgICAvLyB3aXRoIGEgU1lOQ0hST05PVVMgY3VzdG9tRWxlbWVudC5kaXNwYXRjaEV2ZW50LCBzbyBpdCByZWdpc3RlcnMgYW5kIHJlcGxpZXMgd2l0aFxuICAgICAgICAvLyBJbml0UmVzcG9uc2UgKmluc2lkZSogdGhpcyBjYWxsIC0tIGFuZCB0aGUgSW5pdFJlc3BvbnNlIGhhbmRsZXIgcmVzb2x2ZXMgdGhlXG4gICAgICAgIC8vIGNvbXBvbmVudCBvdXQgb2YgYHRoaXMuY29tcG9uZW50c2AuIFNlbmRpbmcgd2hpbGUgdGhhdCBhcnJheSB3YXMgc3RpbGwgbWlzc2luZ1xuICAgICAgICAvLyB0aGUgY29tcG9uZW50IG1lYW50IHRoZSBsb29rdXAgZm91bmQgbm90aGluZywgc2V0SW5pdGlhdGVkKCkgbmV2ZXIgcmFuLCBhbmRcbiAgICAgICAgLy8gc2luY2UgY29tcG9uZW50czJpbml0IGhhZCBhbHJlYWR5IGJlZW4gZmlsdGVyZWQgdGhlIGNvbXBvbmVudCBjb3VsZCBuZXZlciBiZVxuICAgICAgICAvLyByZWNvdmVyZWQ6IGV2ZXJ5IHdlYiBjb21wb25lbnQgaHVuZyB1bnRpbCB0aW1lb3V0LiBDYXVnaHQgYnlcbiAgICAgICAgLy8gdGVzdC9pbml0LXdlYmNvbXBvbmVudC5lMmUubWpzLlxuICAgICAgICAvL1xuICAgICAgICAvLyBBIGZyYW1lIHRoYXQgaGFzIG5vdCBib290ZWQgeWV0IGhhcyBhIG51bGwgY29udGVudFdpbmRvdywgc28gYHNlbmRgIGlzIGEgbm8tb3BcbiAgICAgICAgLy8gKGl0IGlzIG9wdGlvbmFsLWNoYWluZWQpIGFuZCB0aGF0IGNvbXBvbmVudCdzIG93biBJbml0UmVxdWVzdCBpcyBhbnN3ZXJlZFxuICAgICAgICAvLyBub3JtYWxseSAtLSB3ZSBhcmUgcmVnaXN0ZXJlZCBieSB0aGVuLlxuICAgICAgICBpZiAoIWNvbXBvbmVudC5pc0luaXRpYXRlZCkge1xuICAgICAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IEluaXRNZXNzYWdlKGNvbXBvbmVudC5pZCkpXG4gICAgICAgIH1cblxuICAgICAgICAvLyB0cnVlIGJ5IGRlZmF1bHRcbiAgICAgICAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMuY29ubmVjdFByb3BzICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgLy9UT0RPIDogbWFrZSB0eXBlIGZpZWxkIGNvbmRpdGlvbmFsIHR5cGUgaW5mZXIgXCJzdHJpbmdcIiA+IHN0cmluZywgXCJudW1iZXJcIiA+IG51bWJlciwgZXRjLi4uXG4gICAgICAgICAgICBjb21wb25lbnQgPSBjb25uZWN0UHJvcHMoY29tcG9uZW50LCBjb21wb25lbnRDb25maWcudHlwZS5wcm9wcywgc2VsZWN0ZWRTa2luKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvL1RPRE8gOiBtYWtlIG9wdGlvbmFsP1xuICAgICAgICAgICAgLy9UT0RPIDogZml4IGlzc3VlcyB3aXRoIHRpbWVvdXQgYW5kIHdyb25nIHJlZiBuYW1lcyBmcm9tIGNvbmZpZyB2cyBjdXJyZW50IHNraW5cbiAgICAgICAgICAgIGF3YWl0IGNvbm5lY3RSZWZzKGNvbXBvbmVudCwgY29tcG9uZW50Q29uZmlnLCB0aGlzLmNvbXBvbmVudHMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vIFRPT0QgOiB0aHJvdyA/XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFvcHRpb25zPy5za2lwSW5pdClcbiAgICAgICAgICAgIGF3YWl0IGNvbXBvbmVudC5pbml0aWF0ZWQoKTtcblxuICAgICAgICByZXR1cm4gY29tcG9uZW50IGFzIFQ7XG4gICAgfVxuXG4gICAgcHVibGljIG5hdmlnYXRlID0gYXN5bmMgPFQgZXh0ZW5kcyBJTXlvcENvbXBvbmVudCA9IElNeW9wQ29tcG9uZW50Pihjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBuZXdDb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsIG9wdGlvbnM/OiBuYXZpZ2F0aW9uT3B0aW9ucykgPT4ge1xuICAgICAgICBpZiAoY29tcG9uZW50LnBhcmVudCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOYXZpZ2F0aW5nIG9uIHJlbW90ZSByZWYgY29tcG9uZW50cyBpcyBub3QgaW1wbGVtZW50ZWQgeWV0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICAvL2NvbXBvbmVudC5tYXJrZWRGb3JEaXNwb3NlZCA9IHRydWU7XG5cbiAgICAgICAgLy8gaWYgKG9wdGlvbnM/LmlucGxhY2UpIHtcbiAgICAgICAgLy8gICAgIGlmIChjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgICAvLyAgICAgICAgIGxldCBuZXdDb21wb25lbnQgPSBhd2FpdCB0aGlzLmxvYWRDb21wb25lbnQ8VD4obmV3Q29tcG9uZW50Q29uZmlnLCBjb21wb25lbnQuZWxlbWVudCk7XG4gICAgICAgIC8vICAgICAgICAgYXdhaXQgbmV3Q29tcG9uZW50LmluaXRpYXRlZCgpO1xuICAgICAgICAvL1xuICAgICAgICAvLyAgICAgICAgIGlmIChvcHRpb25zLmluaXQpXG4gICAgICAgIC8vICAgICAgICAgICAgIGF3YWl0IG9wdGlvbnMuaW5pdChuZXdDb21wb25lbnQpO1xuICAgICAgICAvL1xuICAgICAgICAvLyAgICAgICAgIHJldHVybiBuZXdDb21wb25lbnQ7XG4gICAgICAgIC8vICAgICB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgICAgIHRocm93IG5ldyBFcnJvcignLi4uJylcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5zdGFnZWQpIHtcbiAgICAgICAgICAgIC8vY29uc3Qgc2VsZWN0ZWRTa2luID0gdGhpcy5ydW5Ta2luU2VsZWN0b3IobmV3Q29tcG9uZW50Q29uZmlnKVxuICAgICAgICAgICAgbGV0IG5ld0NvbXBvbmVudCA9IGF3YWl0IHRoaXMubG9hZENvbXBvbmVudDxUPihuZXdDb21wb25lbnRDb25maWcsIGNvbXBvbmVudC5jb250YWluZXIsIHtcbiAgICAgICAgICAgICAgICBoaWRkZW46IHRydWUsXG4gICAgICAgICAgICAgICAgcmVsYXRpdmU6IHtkaXJlY3Rpb246ICdhZnRlcicsIGNoaWxkOiBjb21wb25lbnQuZWxlbWVudCF9LFxuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnNcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5pbml0KVxuICAgICAgICAgICAgICAgIGF3YWl0IG9wdGlvbnMuaW5pdChuZXdDb21wb25lbnQpO1xuXG4gICAgICAgICAgICBuZXdDb21wb25lbnQuc2hvdygpO1xuICAgICAgICAgICAgY29tcG9uZW50LmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHJldHVybiBuZXdDb21wb25lbnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0U2libGluZyA9IGNvbXBvbmVudC5lbGVtZW50IS5uZXh0U2libGluZztcblxuICAgICAgICAgICAgY29tcG9uZW50LmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRDb21wb25lbnQ8VD4obmV3Q29tcG9uZW50Q29uZmlnLCBjb21wb25lbnQuY29udGFpbmVyLCB7XG4gICAgICAgICAgICAgICAgcmVsYXRpdmU6IHtcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBcImJlZm9yZVwiLFxuICAgICAgICAgICAgICAgICAgICBjaGlsZDogbmV4dFNpYmxpbmcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgbmF2aWdhdGlvbk9wdGlvbnMgPSB7XG4gICAgc3RhZ2VkPzogYm9vbGVhbixcbiAgICAvL2lucGxhY2U/OiBib29sZWFuLFxuICAgIGluaXQ/OiAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCkgPT4gUHJvbWlzZTx2b2lkPlxuICAgIHNraXBJbml0PzogYm9vbGVhblxufSAmIGxvYWRlck9wdGlvbnNcblxudHlwZSByZWxhdGl2ZUxvYWRDb25maWdEaXJlY3Rpb24gPSAnYmVmb3JlJyB8ICdhZnRlcic7XG5cblxuZXhwb3J0IHR5cGUgbG9hZGVySG9va3MgPSB7XG4gICAgYWZ0ZXJTa2luU2VsZWN0ZWQ/OiAoc2VsZWN0ZWRTa2luOiBJU2tpbkNvbmZpZykgPT4gUHJvbWlzZTxJU2tpbkNvbmZpZz5cbn0gJlxuICAgIC8vIHNlZ21lbnRhdGlvbiBob29rc1xuICAgICh7IFtrZXk6IHN0cmluZ106ICgpID0+IFByb21pc2U8Ym9vbGVhbj4gfCBib29sZWFuIH0gfCB7fSlcblxuLy9UT0RPOiBzdXBwb3J0IHNlcmlhbGl6YWJsZSB2ZXJzaW9uIG9mIHRoYXQgb2JqZWN0XG5leHBvcnQgaW50ZXJmYWNlIHJlbGF0aXZlTG9hZENvbmZpZyB7XG4gICAgLy9JZiB0aGlzIGlzIG51bGwsIHRoZW4gbmV3Tm9kZSBpcyBpbnNlcnRlZCBhdCB0aGUgZW5kIG9mIG5vZGUncyBjaGlsZCBub2Rlcy5cbiAgICAvL2h0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Ob2RlL2luc2VydEJlZm9yZVxuICAgIGNoaWxkOiBDaGlsZE5vZGUgfCBudWxsXG4gICAgZGlyZWN0aW9uOiByZWxhdGl2ZUxvYWRDb25maWdEaXJlY3Rpb25cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRW52aXJvbm1lbnQge1xuICAgIFtrZXk6IHN0cmluZ106IGFueVxufVxuXG50eXBlIEVsZW1lbnRBdHRyaWJ1dGVzID0ge1xuICAgIFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCB1bmRlZmluZWQgfCBudWxsO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBsb2FkZXJPcHRpb25zIHtcbiAgICBpZD86IHN0cmluZ1xuICAgIGhpZGRlbj86IGJvb2xlYW5cbiAgICBjb25uZWN0UHJvcHM/OiBib29sZWFuXG4gICAgdGltZW91dD86IG51bWJlclxuICAgIHNraXBJbml0PzogYm9vbGVhblxuICAgIHJlbGF0aXZlPzogcmVsYXRpdmVMb2FkQ29uZmlnXG4gICAgaG9va3M/OiBsb2FkZXJIb29rc1xuICAgIGVsZW1lbnRBdHRyaWJ1dGVzPzogRWxlbWVudEF0dHJpYnV0ZXNcbiAgICBfZW52aXJvbm1lbnQ/OiBJRW52aXJvbm1lbnRcbiAgICBfaGFzUGFyZW50PzogYm9vbGVhblxuICAgIF9pbnNwZWN0aW9uPzogYm9vbGVhblxuICAgIGRhdGE/OiBhbnlcbiAgICAvKipcbiAgICAgKiBSYXcgQ1NTIGluamVjdGVkIGludG8gdGhlIGNvbXBvbmVudCdzIGlmcmFtZSBgPGhlYWQ+YCBiZWZvcmUgZmlyc3QgcGFpbnQuXG4gICAgICogQXBwZW5kZWQgbGFzdCBzbyBpdCBvdmVycmlkZXMgdGhlIGNvbXBvbmVudCdzIG93biBzdHlsZXMgdmlhIGNhc2NhZGUgb3JkZXIuXG4gICAgICogVXNlZnVsIGZvciB0aGVtaW5nIHYyIChIVE1MKSBjb21wb25lbnRzIFx1MjAxNCBjb2xvcnMsIGZvbnRzLCBzcGFjaW5nLCBldGMuXG4gICAgICovXG4gICAgaW5qZWN0Q3NzPzogc3RyaW5nXG4gICAgLyoqXG4gICAgICogQ29udHJvbCBpZnJhbWUgYXV0by1zaXppbmcgYmVoYXZpb3IuXG4gICAgICogLSB0cnVlIChkZWZhdWx0KTogaWZyYW1lIGF1dG8tc2l6ZXMgdG8gY29udGVudCBoZWlnaHQsIHdpZHRoIGZpbGxzIHBhcmVudC5cbiAgICAgKiAtIGZhbHNlOiBubyBzaXppbmcgbG9naWMgcnVucy4gTm8gb2JzZXJ2ZXJzLCBubyBtZWFzdXJlbWVudHMsIG5vIHN0eWxlIGNoYW5nZXMuXG4gICAgICogICBUaGUgaWZyYW1lIHN0YXlzIGF0IHBvc2l0aW9uOmFic29sdXRlIGZpbGxpbmcgdGhlIGNvbnRhaW5lci5cbiAgICAgKiAgIFRoZSBob3N0IGlzIGZ1bGx5IHJlc3BvbnNpYmxlIGZvciBjb250YWluZXIgZGltZW5zaW9ucy5cbiAgICAgKi9cbiAgICBhdXRvU2l6ZT86IGJvb2xlYW5cblxuICAgIC8qKlxuICAgICAqIFBlci1jYWxsIHJlbmRlciBwb2xpY3kuIFRha2VzIHByZWNlZGVuY2Ugb3ZlciBob3N0U0RLLnNldFJlbmRlclBvbGljeSBcdTIwMTQgbGV0cyBhblxuICAgICAqIGFwcCByZXN0cmljdCBnbG9iYWxseSBhbmQgYWxsb3cgKG9yIGZ1cnRoZXIgcmVzdHJpY3QpIHNwZWNpZmljIGxvYWRDb21wb25lbnQgY2FsbHMuXG4gICAgICovXG4gICAgcmVuZGVyUG9saWN5PzogUmVuZGVyUG9saWN5XG5cbiAgICAvKipcbiAgICAgKiBGb3JjZSBmdWxsIGlzb2xhdGlvbiBmb3IgYW4gaW5saW5lLUhUTUwgKGxvY2FsRnJhbWUpIGNvbXBvbmVudDogc2FuZGJveGVkLFxuICAgICAqIGNyb3NzLW9yaWdpbiBpZnJhbWUgd2l0aCBubyBob3N0LWRvY3VtZW50IGFjY2Vzcy4gQSByZW5kZXIgcG9saWN5IHJldHVybmluZ1xuICAgICAqICdpc29sYXRlZElmcmFtZScgaGFzIHRoZSBzYW1lIGVmZmVjdC5cbiAgICAgKi9cbiAgICBpc29sYXRpb24/OiBib29sZWFuXG59XG5cbmlmICghd2luZG93Lm15b3ApIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd2luZG93Lm15b3AgPSB7XG4gICAgICAgIF9fUk9PVF9TREtfUFVCTElDX1VSTF9fXG4gICAgfTtcbn1cblxuaWYgKCF3aW5kb3cubXlvcC5ob3N0U0RLKSB7XG4gICAgY29uc3QgX2hvc3RTREsgPSBuZXcgSG9zdFNESygpO1xuICAgIC8vVE9ETzogZW5hYmxlIGxhenkgaW5pdD9cbiAgICBfaG9zdFNESy5pbml0KCk7XG5cbiAgICBpZiAoIXdpbmRvdy5teW9wKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgd2luZG93Lm15b3AgPSB7XG4gICAgICAgICAgICBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfX1xuICAgICAgICB9O1xuICAgIH1cbiAgICB3aW5kb3cubXlvcC5ob3N0U0RLID0gX2hvc3RTREs7XG59XG5cbi8vIFRoZSBvcHQtaW4sIHJlYWNoYWJsZSB3aXRoIG5vIGltcG9ydCBhbmQgbm8gYnVpbGQgY2hhbmdlIG9uIHRoZSBob3N0IHBhZ2U6XG4vL1xuLy8gICBteW9wLmRlbGl2ZXJ5KHsgbWluaWZ5OiB0cnVlLCBjYWNoZTogdHJ1ZSB9KTsgICAvLyBsYW5lICsgdGhlIGNsaWVudCB3aW5kb3dcbi8vICAgbXlvcC5kZWxpdmVyeS5zdGF0cygpOyAgICAgICAgICAgICAgICAvLyB3aGF0IGFuc3dlcmVkLCBhbmQgaG93IG9mdGVuIGl0IGZlbGwgYmFja1xuLy8gICBteW9wLmRlbGl2ZXJ5Lm9mZigpOyAgICAgICAgICAgICAgICAgIC8vIGJhY2sgdG8gdG9kYXkncyBob3N0LCBubyByZWxvYWRcbi8vXG4vLyBBdHRhY2hlZCBoZXJlIHJhdGhlciB0aGFuIGV4cG9ydGVkIG9ubHkgYXMgYSBtb2R1bGUgZnVuY3Rpb24gYmVjYXVzZSB0aGUgaG9zdCBhcHAgdGhhdFxuLy8gb3B0cyBpbiBpcyBvZnRlbiBsb2FkaW5nIHRoZSBTREsgZnJvbSBhIHNjcmlwdCB0YWcsIHdoZXJlIGBpbXBvcnRgIGlzIG5vdCBhdmFpbGFibGUuXG5pZiAod2luZG93Lm15b3AgJiYgISh3aW5kb3cubXlvcCBhcyBhbnkpLmRlbGl2ZXJ5KSB7XG4gICAgY29uc3QgYXBpOiBhbnkgPSAob3B0cz86IHttaW5pZnk/OiBib29sZWFuOyBjYWNoZT86IGJvb2xlYW47IGZsb3c/OiBib29sZWFuOyBob3N0Pzogc3RyaW5nIHwgbnVsbH0pID0+IGRlbGl2ZXJ5KG9wdHMpO1xuICAgIGFwaS5zdGF0cyA9IGRlbGl2ZXJ5U3RhdHM7XG4gICAgYXBpLm9mZiA9IGRlbGl2ZXJ5T2ZmO1xuICAgIGFwaS5yZWZyZXNoID0gZGVsaXZlcnlSZWZyZXNoO1xuICAgICh3aW5kb3cubXlvcCBhcyBhbnkpLmRlbGl2ZXJ5ID0gYXBpO1xufVxuXG4vLyBTYW1lIHJlYXNvbjogYSB2MSBob3N0IHRoYXQgcmVuZGVyZWQgdGhlIGlmcmFtZSBvbiBpdHMgc2VydmVyIHNlZWRzIHRoZSBjb25maWcgaXQgZmV0Y2hlZFxuLy8gdGhlcmUsIGZyb20gYSBwbGFpbiA8c2NyaXB0PjogIG15b3AuaHlkcmF0ZVYxKHsgW2NvbXBvbmVudElkXTogZmxvd0pzb24gfSk7XG5pZiAod2luZG93Lm15b3AgJiYgISh3aW5kb3cubXlvcCBhcyBhbnkpLmh5ZHJhdGVWMSkge1xuICAgICh3aW5kb3cubXlvcCBhcyBhbnkpLmh5ZHJhdGVWMSA9IGh5ZHJhdGVWMUNvbXBvbmVudHM7XG59XG5cbi8vIEB0cy1pZ25vcmVcbmV4cG9ydCBjb25zdCBob3N0U0RLOiBIb3N0U0RLID0gd2luZG93Lm15b3AuaG9zdFNESztcblxuZGVmaW5lRHluYW1pY0ltcG9ydCgnaG9zdFNESycsIGhvc3RTREspO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gICAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgICAgIG15b3A6IHtcbiAgICAgICAgICAgIF9fUk9PVF9TREtfUFVCTElDX1VSTF9fOiBzdHJpbmcsXG4gICAgICAgICAgICBob3N0U0RLOiBIb3N0U0RLLFxuICAgICAgICAgICAgSWZyYW1lU0RLOiBJbnN0YW5jZVR5cGU8dHlwZW9mIElmcmFtZVNESz5cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyLCBJRWxlbWVudFJlZiwgTXlvcEVsZW1lbnRSZWZ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7RGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UsIERldGVjdE15b3BSZWZzTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5cbmV4cG9ydCBjbGFzcyBEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPERldGVjdE15b3BSZWZzTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuRGV0ZWN0TXlvcFJlZnNNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAobWVzc2FnZTogRGV0ZWN0TXlvcFJlZnNNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGFsbE15b3BJdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYFske215b3BBdHRyaWJ1dGVzLmlkfV1gKTtcbiAgICAgICAgLy9jb25zdCBhbGxNeW9wSXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGAqYCk7XG5cbiAgICAgICAgbGV0IG15b3BSZWZzOiBJRWxlbWVudFJlZltdID0gW107XG5cbiAgICAgICAgLy9sZXQgY291bnRlcnM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcblxuICAgICAgICBhbGxNeW9wSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcblxuICAgICAgICAgICAgY29uc3QgbXlvcElkID0gaXRlbS5nZXRBdHRyaWJ1dGUobXlvcEF0dHJpYnV0ZXMuaWQpO1xuICAgICAgICAgICAgaWYgKG15b3BJZCkge1xuICAgICAgICAgICAgICAgIG15b3BSZWZzLnB1c2gobmV3IE15b3BFbGVtZW50UmVmKG15b3BJZCwgaXRlbS50YWdOYW1lLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSlcbiAgICAgICAgICAgIH0gLy9lbHNlIHtcbiAgICAgICAgICAgIC8vICAgICBpZiAoIWNvdW50ZXJzW2l0ZW0udGFnTmFtZV0pIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgY291bnRlcnNbaXRlbS50YWdOYW1lXSA9IDA7XG4gICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgLy8gICAgIGNvdW50ZXJzW2l0ZW0udGFnTmFtZV0gPSBjb3VudGVyc1tpdGVtLnRhZ05hbWVdICsgMTtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyAgICAgbXlvcFJlZnMucHVzaChuZXcgWFBhdGhFbGVtZW50UmVmKGAke2l0ZW0udGFnTmFtZX0oJHtjb3VudGVyc1tpdGVtLnRhZ05hbWVdfSlgLCBpdGVtLnRhZ05hbWUsIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpKVxuICAgICAgICAgICAgLy8gfVxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UobWVzc2FnZS5oYW5kbGVyVW5pcXVlSWQsIG15b3BSZWZzKSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtCaW5kQ2xpY2tNZXNzYWdlLCBDbGlja1JlcGxheU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBCaW5kT25DbGlja0hhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8QmluZENsaWNrTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQmluZENsaWNrTWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBCaW5kQ2xpY2tNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFudXBUYXNrczogKCgpID0+IHZvaWQpW10gPSBbXTtcblxuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgQ2xpY2tSZXBsYXlNZXNzYWdlKCksIGV2ZW50KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlcik7XG5cbiAgICAgICAgICAgIGNvbnN0IGNsZWFuVXBUYXNrID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2xlYW51cFRhc2tzLnB1c2goY2xlYW5VcFRhc2spO1xuICAgICAgICB9KTtcblxuICAgICAgICAvL2NsZWFuIHVwXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MuZm9yRWFjaCh0YXNrID0+IHRhc2soKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgTXlvcE1lc3NhZ2VzIH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7Q2hhbmdlVGV4dE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlVGV4dEhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8Q2hhbmdlVGV4dE1lc3NhZ2U+IHtcbiAgXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQ2hhbmdlVGV4dE1lc3NhZ2U7XG4gICAgXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IENoYW5nZVRleHRNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIGRvY3VtZW50KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGl0ZW0udGV4dENvbnRlbnQgPSBldmVudC5jb250ZW50O1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXIsIFJvb3RSZWZ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdEhhbmRsZXJFeGVjdXRvcn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHNcIjtcblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVTY3JpcHRIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEV4ZWN1dGVTY3JpcHRNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuRXhlY3V0ZVNjcmlwdE1lc3NhZ2VcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBFeGVjdXRlU2NyaXB0TWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCByZXBsaWVyID0gKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgZGF0YSkpO1xuICAgICAgICB9O1xuXG4gICAgICAgIEV4ZWN1dGVTY3JpcHRIYW5kbGVyRXhlY3V0b3IoZXZlbnQsIHJlcGxpZXIsIG5ldyBSb290UmVmKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0FkZEV2ZW50TGlzdGVuZXJNZXNzYWdlLCBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uLy4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIEFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5BZGRFdmVudExpc3RlbmVyTWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKG1lc3NhZ2U6IEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlKSA9PiB7XG5cbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKG1lc3NhZ2UucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGNvbnN0IGNsZWFudXBUYXNrczogYW55W10gPSBbXTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcblxuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgLy9UT0RPOiB0aGluayBhYm91dCB0aGF0IHJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZShtZXNzYWdlLmhhbmRsZXJVbmlxdWVJZCwgbWFrZVNlcmlhbGl6YWJsZShlLCBtZXNzYWdlLnNlcmlhbGl6YWJsZVNrZWxldG9uKSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcihtZXNzYWdlLnR5cGUsIGhhbmRsZXIpXG4gICAgICAgICAgICBjbGVhbnVwVGFza3MucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbS5yZW1vdmVFdmVudExpc3RlbmVyKG1lc3NhZ2UudHlwZSwgaGFuZGxlcilcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5mb3JFYWNoKHRhc2sgPT4ge1xuICAgICAgICAgICAgICAgIHRhc2soKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NldEF0dHJpYnV0ZU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3Mgc2V0QXR0cmlidXRlSGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxTZXRBdHRyaWJ1dGVNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRBdHRyaWJ1dGVNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IFNldEF0dHJpYnV0ZU1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgZG9jdW1lbnQpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5zZXRBdHRyaWJ1dGUoZXZlbnQubmFtZSwgZXZlbnQudmFsdWUpXG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0c1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7SG9zdFNES30gZnJvbSBcIi4uLy4uL2hvc3QvaG9zdFNES1wiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLCBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UudHNcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi8uLi9ob3N0XCI7XG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgY3JlYXRlUmVmID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgLy9UT0RPIDogdXNlIHJlZiBoZWxwZXIgaGVyZVxuICAgICAgICAgICAgY29uc3QgYWxsSXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9PScke2V2ZW50LnJlZkNvbmZpZy5zZWxlY3Rvcn0nXWApO1xuICAgICAgICAgICAgaWYgKGFsbEl0ZW1zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhvc3RTREsgPSBIb3N0U0RLLkluc3RhbmNlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVmQ29tcG9uZW50ID0gYXdhaXQgaG9zdFNESy5sb2FkQ29tcG9uZW50KGV2ZW50Lm5lc3RlZENvbXBvbmVudENvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgYWxsSXRlbXMuaXRlbSgwKSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQub3B0aW9ucylcblxuICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgaXQgdG8gcGFzcyB0aGUgYXNzaWduZWQgaWRzXG4gICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkUmVmQ29uZmlnOiBhbnlbXSA9IFtdO1xuXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMocmVmQ29tcG9uZW50LnJlZnMpLmZvckVhY2gocmVmTmFtZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWYgPSByZWZDb21wb25lbnQucmVmc1tyZWZOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgcmVmID0gcmVmLl9fbm9uUHJveGllZCB8fCByZWY7XG5cbiAgICAgICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChyZWYgYXMgSU15b3BDb21wb25lbnQpLmNvbXBvbmVudERlZmluaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZFJlZkNvbmZpZy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudERlZmluaXRpb25JZDogKHJlZiBhcyBJTXlvcENvbXBvbmVudCkuY29tcG9uZW50RGVmaW5pdGlvbi5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG5cbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgbmVzdGVkUmVmQ29uZmlnKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIC0gRE9NIGVsZW1lbnQgbm90IGZvdW5kJylcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgW10sIHRydWUpKTtcbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNyZWF0ZVJlZigpLnRoZW4oKTtcbiAgICAgICAgLy9yZXR1cm5pbmcgdW5kZWZpbmVkIHNvIGl0IHdvbid0IGFjdCBhcyBhIGNsZWFudXBcbiAgICB9XG59XG4iLCAiLy8gQHRzLW5vY2hlY2tcbmV4cG9ydCBjb25zdCBvYnNlcnZlRE9NID0gKG9iajogSFRNTEVsZW1lbnQgfCBudWxsLCBjYWxsYmFjazogKG11dGF0aW9uUmVjb3Jkcz86IE11dGF0aW9uUmVjb3JkW10pID0+IHZvaWQpID0+IHtcbiAgICBpZiAoIW9iaikge1xuICAgICAgICBjb25zb2xlLmxvZygnbicpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBNdXRhdGlvbk9ic2VydmVyID0gd2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIgfHwgd2luZG93LldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG5cbiAgICBpZiAoIW9iaiB8fCBvYmoubm9kZVR5cGUgIT09IDEpIHJldHVybjtcblxuICAgIGlmIChNdXRhdGlvbk9ic2VydmVyKSB7XG4gICAgICAgIC8vIGRlZmluZSBhIG5ldyBvYnNlcnZlclxuICAgICAgICBjb25zdCBtdXRhdGlvbk9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spXG4gICAgICAgIC8vIGhhdmUgdGhlIG9ic2VydmVyIG9ic2VydmUgZm9yIGNoYW5nZXMgaW4gY2hpbGRyZW5cbiAgICAgICAgY29uc3QgY29uZmlnID0ge2F0dHJpYnV0ZXM6IHRydWUsIGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZX07XG4gICAgICAgIG11dGF0aW9uT2JzZXJ2ZXIub2JzZXJ2ZShvYmosIGNvbmZpZylcbiAgICAgICAgcmV0dXJuIG11dGF0aW9uT2JzZXJ2ZXJcbiAgICB9XG5cbiAgICAvLyBicm93c2VyIHN1cHBvcnQgZmFsbGJhY2tcbiAgICBlbHNlIGlmICh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICBvYmouYWRkRXZlbnRMaXN0ZW5lcignRE9NTm9kZUluc2VydGVkJywgY2FsbGJhY2ssIGZhbHNlKVxuICAgICAgICBvYmouYWRkRXZlbnRMaXN0ZW5lcignRE9NTm9kZVJlbW92ZWQnLCBjYWxsYmFjaywgZmFsc2UpXG4gICAgfVxufSIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge29ic2VydmVET019IGZyb20gXCIuLi8uLi9jb21tb24vdXRpbHMvZG9tT2JzZXJ2ZXJcIjtcblxuZXhwb3J0IGNsYXNzIFNldE11dGF0aW9uT2JzZXJ2ZXJIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEV4ZWN1dGVTY3JpcHRNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2VcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBFeGVjdXRlU2NyaXB0TWVzc2FnZSkgPT4ge1xuICAgICAgICBpZiAoZXZlbnQuc291cmNlKSB7XG4gICAgICAgICAgICBvYnNlcnZlRE9NKGRvY3VtZW50LmJvZHksICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlKClcbiAgICAgICAgICAgICAgICAgICAgLy8gIG5ldyBFbnZlbG9wZWRNZXNzYWdlKGV2ZW50LnNvdXJjZSEsIG5ldyBNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSgpKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlLCBGb3JtRGF0YUVudHJ5LCBHZXRFbGVtZW50VmFsdWVNZXNzYWdlLCBJbnB1dEVsZW1lbnRWYWx1ZSx9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5jb25zdCBnZXRJbnB1dFZhbHVlID0gKGVsZW1lbnQpOiBJbnB1dEVsZW1lbnRWYWx1ZSA9PiB7XG4gICAgaWYgKCFlbGVtZW50KSByZXR1cm4gbnVsbDtcblxuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBmb3JtXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ0ZPUk0nKSB7XG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBkYXRhT2JqZWN0OiBJbnB1dEVsZW1lbnRWYWx1ZSA9IHtcbiAgICAgICAgICAgIGZvcm1EYXRhOiB7fSxcbiAgICAgICAgICAgIHVubWFwcGVkRGF0YTogW11cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBNYW51YWxseSBhZGQgZWxlbWVudHMgd2l0aG91dCBuYW1lc1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEnKTtcbiAgICAgICAgbGV0IGF1dG9OYW1lSW5kZXhlciA9IC0xO1xuXG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXlvcElkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUobXlvcEF0dHJpYnV0ZXMuaWQpO1xuICAgICAgICAgICAgICAgIGxldCBrZXkgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnbmFtZScpO1xuXG4gICAgICAgICAgICAgICAgLy8gYF8keygrK2F1dG9OYW1lSW5kZXhlcil9YFxuXG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZURhdGE6IEZvcm1EYXRhRW50cnkgPSB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBlbGVtZW50LmlkLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBrZXksXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBnZXRJbnB1dFZhbHVlKGVsZW1lbnQpLFxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogZWxlbWVudC5yZXF1aXJlZCxcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRpdHk6IG1ha2VTZXJpYWxpemFibGUoZWxlbWVudC52YWxpZGl0eSwgdHJ1ZSksXG4gICAgICAgICAgICAgICAgICAgIG15b3BJZCxcbiAgICAgICAgICAgICAgICB9O1xuXG5cbiAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChub2RlRGF0YSk7XG4gICAgICAgICAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgICAgICAgICBpZighZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSB8fCAhZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XS52YWx1ZSB8fCBub2RlRGF0YS52YWx1ZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldID0gbm9kZURhdGFcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vIGlmICgha2V5KSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKG5vZGVEYXRhKTtcbiAgICAgICAgICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICAgICBpZiAoZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSkge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgaWYgKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChub2RlRGF0YSk7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0pO1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0gPSBub2RlRGF0YVxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSA9IG5vZGVEYXRhXG4gICAgICAgICAgICAgICAgLy8gICAgIH1cbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBkYXRhT2JqZWN0O1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBjaGVja2JveCBvciByYWRpbyBidXR0b25cbiAgICBpZiAoZWxlbWVudC50eXBlID09PSAnY2hlY2tib3gnIHx8IGVsZW1lbnQudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5jaGVja2VkID8gZWxlbWVudC52YWx1ZSA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGlucHV0IGFuZCB0ZXh0YXJlYSBlbGVtZW50c1xuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdJTlBVVCcgfHwgZWxlbWVudC50YWdOYW1lID09PSAnVEVYVEFSRUEnKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbHVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzZWxlY3QgZWxlbWVudHMgKGRyb3Bkb3ducylcbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnU0VMRUNUJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC52YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgZWRpdGFibGUgZGl2cyAoY29udGVudEVkaXRhYmxlKVxuICAgIGlmIChlbGVtZW50LmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmlubmVyVGV4dCB8fCBlbGVtZW50LnRleHRDb250ZW50O1xuICAgIH1cblxuICAgIC8vIElmIGl0J3MgYW4gdW5zdXBwb3J0ZWQgZWxlbWVudCB0eXBlXG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBjbGFzcyBHZXRFbGVtZW50VmFsdWVIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkdldEVsZW1lbnRWYWx1ZU1lc3NhZ2U7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogR2V0RWxlbWVudFZhbHVlTWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEVsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgZ2V0SW5wdXRWYWx1ZShpdGVtKVxuICAgICAgICAgICAgKSwgZXZlbnQpO1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0dldEF0dHJpYnV0ZU1lc3NhZ2UsIEdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtnZXRGaXJzdEVsZW1lbnRCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgR2V0QXR0cmlidXRlSGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxHZXRBdHRyaWJ1dGVNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5HZXRBdHRyaWJ1dGVNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IEdldEF0dHJpYnV0ZU1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbSA9IGdldEZpcnN0RWxlbWVudEJ5UmVmKGV2ZW50LnJlZiwgZG9jdW1lbnQpXG4gICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2UoaXRlbS5nZXRBdHRyaWJ1dGUoZXZlbnQubmFtZSkpLCBldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtSZXNpemVPYnNlcnZlck1lc3NhZ2UsIFNldFJlc2l6ZU9ic2VydmVyTWVzc2FnZX0gZnJvbSAnLi4vLi4vbWVzc2FnZXMnXG5pbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRSZXNpemVPYnNlcnZlckhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8U2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlXG5cbiAgICBleGVjdXRvciA9IChldmVudDogU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKSA9PiB7XG4gICAgICAgICAgICAvL1RPRE8gOiBwYXNzIHRoZSBoZWlnaHRcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgUmVzaXplT2JzZXJ2ZXJNZXNzYWdlKCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5KTtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NldElubmVySHRtbH0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRJbm5lckh0bWxIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPFNldElubmVySHRtbD4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0SW5uZXJIdG1sO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IFNldElubmVySHRtbCkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpdGVtLmlubmVySFRNTCA9IGV2ZW50LmNvbnRlbnQ7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKiBUaGUgSWZyYW1lIFNESyBpcyBpbnRlbmRlZCBmb3Igc2NlbmFyaW9zIHdoZXJlIGRldmVsb3BlcnMgd2lzaCB0byBpbXBsZW1lbnQgTXlvcCBjb21wb25lbnRzIGFzIHNlcGFyYXRlIHdlYiBhcHBsaWNhdGlvbnMgaG9zdGVkIHdpdGhpbiBpZnJhbWVzLjxici8+PGJyLz5cbiAqIEJ5IGltcG9ydGluZyB0aGUgSWZyYW1lIFNESywgZGV2ZWxvcGVycyBnYWluIGFjY2VzcyB0byB0b29scyBhbmQgdXRpbGl0aWVzIG5lY2Vzc2FyeSBmb3IgaGFuZGxpbmcgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZSBob3N0IGFwcGxpY2F0aW9uIGFuZCB0aGUgZW1iZWRkZWQgaWZyYW1lLWJhc2VkIE15b3AgY29tcG9uZW50czxici8+PGJyLz5cbiAqIFRoaXMgU0RLIGZhY2lsaXRhdGVzIHNlY3VyZSBpc29sYXRpb24sIGFsbG93aW5nIGNvbXBvbmVudHMgdG8gZnVuY3Rpb24gaW5kZXBlbmRlbnRseSB3aGlsZSBzdGlsbCBiZW5lZml0aW5nIGZyb20gdGhlIG92ZXJhbGwgc3RydWN0dXJlIGFuZCBtYW5hZ2VtZW50IGNhcGFiaWxpdGllcyBwcm92aWRlZCBieSB0aGUgaG9zdCBhcHBsaWNhdGlvbi48YnIvPjxici8+XG4gKlxuIE9uY2UgbG9hZGVkIHRoZSBgUm9vdFNES2AsIHlvdSBjYW4gbG9hZCB0aGUgYElmcmFtZVNES2BcbiBgYGBqc1xuIGNvbnN0IHtJZnJhbWVTREt9ID0gKGF3YWl0IHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0SWZyYW1lTW9kdWxlKCkpO1xuIGBgYFxuIG9yXG4gYGBgdHNcbiBpbXBvcnQge2dldElmcmFtZU1vZHVsZX0gZnJvbSAnQG15b3Avc2RrJztcbiBjb25zdCB7SWZyYW1lU0RLfSA9IChhd2FpdCBnZXRJZnJhbWVNb2R1bGUoKSk7XG4gYGBgXG4gb3JcbiBgYGB0c1xuIGltcG9ydCB7SWZyYW1lU0RLfSBmcm9tICdAbXlvcC9zZGsvaWZyYW1lJztcbiBgYGBcbiAqXG4gKi9cbmltcG9ydCB7QmFzZU15b3BTREt9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7QmluZE9uQ2xpY2tIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvYmluZE9uQ2xpY2tIYW5kbGVyXCI7XG5pbXBvcnQge0NoYW5nZVRleHRIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvY2hhbmdlVGV4dEhhbmRsZXJcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9leGVjdXRlU2NyaXB0SGFuZGxlclwiO1xuaW1wb3J0IHtkZWZpbmVEeW5hbWljSW1wb3J0fSBmcm9tIFwiLi4vZHluYW1pY0ltcG9ydC9kZWZpbmVEeW5hbWljSW1wb3J0XCI7XG5pbXBvcnQge0FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvYWRkRXZlbnRMaXN0ZW5lckhhbmRsZXJcIjtcbmltcG9ydCB7c2V0QXR0cmlidXRlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL3NldEF0dHJpYnV0ZUhhbmRsZXJcIjtcbmltcG9ydCB7XG4gICAgSW5pdFJlcXVlc3QsXG4gICAgTWVzc2FnZURpcmVjdGlvbixcbiAgICBNeW9wQmluZE1lc3NhZ2UsXG4gICAgTXlvcEJpbmRSZXBsYXlNZXNzYWdlXG59IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge1NldE11dGF0aW9uT2JzZXJ2ZXJIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvU2V0TXV0YXRpb25PYnNlcnZlckhhbmRsZXJcIjtcbmltcG9ydCB7R2V0RWxlbWVudFZhbHVlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0dldEVsZW1lbnRWYWx1ZUhhbmRsZXIudHNcIjtcbi8vIEB0cy1pZ25vcmUgaGFuZGxlZCBieSBjdXN0b20gZXNidWlsZCBwbHVnaW5cbmltcG9ydCB2ZXJzaW9uIGZyb20gXCJteW9wLXNkay12ZXJzaW9uXCI7XG5pbXBvcnQge0dldEF0dHJpYnV0ZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9nZXRBdHRyaWJ1dGVIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NldFJlc2l6ZU9ic2VydmVySGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL1NldFJlc2l6ZU9ic2VydmVySGFuZGxlci50c1wiO1xuaW1wb3J0IHtTZXRJbm5lckh0bWxIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvc2V0SW5uZXJIdG1sSGFuZGxlci50c1wiO1xuXG4vKipcbiBUaGUgSWZyYW1lIFNESyBpcyBpbnRlbmRlZCBmb3Igc2NlbmFyaW9zIHdoZXJlIGRldmVsb3BlcnMgd2lzaCB0byBpbXBsZW1lbnQgTXlvcCBjb21wb25lbnRzIGFzIHNlcGFyYXRlIHdlYiBhcHBsaWNhdGlvbnMgaG9zdGVkIHdpdGhpbiBpZnJhbWVzLjxici8+PGJyLz5cbiBCeSBpbXBvcnRpbmcgdGhlIElmcmFtZSBTREssIGRldmVsb3BlcnMgZ2FpbiBhY2Nlc3MgdG8gdG9vbHMgYW5kIHV0aWxpdGllcyBuZWNlc3NhcnkgZm9yIGhhbmRsaW5nIGNvbW11bmljYXRpb24gYmV0d2VlbiB0aGUgaG9zdCBhcHBsaWNhdGlvbiBhbmQgdGhlIGVtYmVkZGVkIGlmcmFtZS1iYXNlZCBNeW9wIGNvbXBvbmVudHM8YnIvPjxici8+XG4gVGhpcyBTREsgZmFjaWxpdGF0ZXMgc2VjdXJlIGlzb2xhdGlvbiwgYWxsb3dpbmcgY29tcG9uZW50cyB0byBmdW5jdGlvbiBpbmRlcGVuZGVudGx5IHdoaWxlIHN0aWxsIGJlbmVmaXRpbmcgZnJvbSB0aGUgb3ZlcmFsbCBzdHJ1Y3R1cmUgYW5kIG1hbmFnZW1lbnQgY2FwYWJpbGl0aWVzIHByb3ZpZGVkIGJ5IHRoZSBob3N0IGFwcGxpY2F0aW9uLjxici8+PGJyLz5cblxuIE9uY2UgbG9hZGVkIHRoZSBgUm9vdFNES2AsIHlvdSBjYW4gbG9hZCB0aGUgYElmcmFtZVNES2BcbiBgYGBqc1xuIGNvbnN0IHtJZnJhbWVTREt9ID0gKGF3YWl0IHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0SWZyYW1lTW9kdWxlKCkpO1xuIGBgYFxuIG9yXG4gYGBgdHNcbiBpbXBvcnQge2dldElmcmFtZU1vZHVsZX0gZnJvbSAnQG15b3Avc2RrJztcbiBjb25zdCB7SWZyYW1lU0RLfSA9IChhd2FpdCBnZXRJZnJhbWVNb2R1bGUoKSk7XG4gYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBJZnJhbWVTREsgZXh0ZW5kcyBCYXNlTXlvcFNESyB7XG5cbiAgICBwdWJsaWMgdmVyc2lvbiA9IHZlcnNpb247XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAoIXdpbmRvdy5teW9wKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB3aW5kb3cubXlvcCA9IHt9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB3aW5kb3cubXlvcC5JZnJhbWVTREsgPSB0aGlzO1xuICAgIH1cblxuICAgIG1lc3NhZ2VUb0hvc3QgPSAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4ge1xuICAgICAgICBpZiAoIW1lc3NhZ2UucmVwbGF5VG9IYW5kbGVyICYmIHJlcGxheVRvPy5oYW5kbGVyVW5pcXVlSWQpXG4gICAgICAgICAgICBtZXNzYWdlLnJlcGxheVRvSGFuZGxlciA9IHJlcGxheVRvLmhhbmRsZXJVbmlxdWVJZFxuXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudElkcyA9IE9iamVjdC5rZXlzKHRoaXMuY29tcG9uZW50cyk7XG5cbiAgICAgICAgaWYgKCFtZXNzYWdlLmRlc3RpbmF0aW9uKSB7XG4gICAgICAgICAgICBpZiAocmVwbGF5VG8/LnJvdXRlKSB7XG4gICAgICAgICAgICAgICAgLy8gdGFraW5nIHRoZSBmaXJzdCBjb21wb25lbnQgdGhhdCBpbml0aWF0ZWQgdGhhdCBjeWNsZVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGVzdGluYXRpb24gPSByZXBsYXlUby5yb3V0ZVtyZXBsYXlUby5yb3V0ZS5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZS5kZXN0aW5hdGlvbiA9IGNvbXBvbmVudElkc1swXVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghbWVzc2FnZS5zb3VyY2UpXG4gICAgICAgICAgICBtZXNzYWdlLnNvdXJjZSA9IGNvbXBvbmVudElkc1swXTtcblxuICAgICAgICBtZXNzYWdlLmRpcmVjdGlvbiA9IE1lc3NhZ2VEaXJlY3Rpb24udXA7XG5cbiAgICAgICAgLy8gYGhvc3RXaW5kb3dgLCBub3QgYHdpbmRvdy5wYXJlbnRgIC0tIHNlZSB0aGUgZmllbGQncyBjb21tZW50LiBGb3IgYSBjb21wb25lbnRcbiAgICAgICAgLy8gbW91bnRlZCBpbnRvIGFub3RoZXIgY29tcG9uZW50J3MgZG9jdW1lbnQgdGhlIHBhcmVudCBpcyBhbiBpbnRlcm1lZGlhdGUgZnJhbWVcbiAgICAgICAgLy8gdGhhdCBkcm9wcyBjaGlsZCBtZXNzYWdlcywgc28gYW4gSW5pdFJlc3BvbnNlIHNlbnQgdGhlcmUgbmV2ZXIgcmVhY2hlcyB0aGUgaG9zdFxuICAgICAgICAvLyBhbmQgdGhlIGNvbXBvbmVudCBzdGF5cyBwZW5kaW5nIHVudGlsIGl0IHRpbWVzIG91dC5cbiAgICAgICAgKHRoaXMuaG9zdFdpbmRvdyA/PyB3aW5kb3cucGFyZW50KT8ucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgLi4ubWVzc2FnZVxuICAgICAgICB9LCAnKicpO1xuICAgIH1cblxuICAgIHN1cHBvcnRlZEhhbmRsZXJzOiBCYXNlTWVzc2FnZUhhbmRsZXJbXSA9IFtcbiAgICAgICAgbmV3IENoYW5nZVRleHRIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBTZXRJbm5lckh0bWxIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBCaW5kT25DbGlja0hhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IERldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IEV4ZWN1dGVTY3JpcHRIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBBZGRFdmVudExpc3RlbmVySGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgc2V0QXR0cmlidXRlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgR2V0RWxlbWVudFZhbHVlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgU2V0TXV0YXRpb25PYnNlcnZlckhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IFNldFJlc2l6ZU9ic2VydmVySGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgR2V0QXR0cmlidXRlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuXG4gICAgICAgIC8vY29tcG9zaXRlIHN1cHBvcnQgbWVzc2FnZXMgOlxuICAgICAgICBuZXcgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KVxuICAgIF07XG5cbiAgICAvKipcbiAgICAgKiBUaGUgd2luZG93IHRoaXMgZnJhbWUgYW5zd2VycyB0by4gRGVmYXVsdHMgdG8gdGhlIHBhcmVudCwgd2hpY2ggaXMgY29ycmVjdCBmb3IgYVxuICAgICAqIGNvbXBvbmVudCBtb3VudGVkIGRpcmVjdGx5IGJ5IHRoZSBwYWdlJ3Mgb3duIGhvc3QuXG4gICAgICpcbiAgICAgKiBJVCBJUyBOT1QgQUxXQVlTIFRIRSBQQVJFTlQuIEEgaG9zdCBjYW4gbW91bnQgYSBjb21wb25lbnQgaW50byBhIGNvbnRhaW5lciB0aGF0XG4gICAgICogbGl2ZXMgaW5zaWRlIEFOT1RIRVIgY29tcG9uZW50J3MgZG9jdW1lbnQgLS0gUGljLVRpbWUncyByZWVsIHRlbXBsYXRlcyBhcmUgbW91bnRlZFxuICAgICAqIGJ5IHRoZSB0b3AtbGV2ZWwgaG9zdCBpbnRvIGAjcmVlbFNsb3RgIGluc2lkZSB0aGUgcmVlbCBkaWFsb2cncyBmcmFtZS4gVGhlIHJlYWwgaG9zdFxuICAgICAqIGlzIHRoZW4gYSBHUkFORHBhcmVudCwgYW5kIGB3aW5kb3cucGFyZW50YCBpcyBhIGZyYW1lIHRoYXQga25vd3Mgbm90aGluZyBhYm91dCB0aGlzXG4gICAgICogY29tcG9uZW50OiBpdHMgbmVzdGVkIGhvc3RTREsgaGFzIG5vIGVudHJ5IGZvciBpdCBhbmQgaXRzIElmcmFtZVNESyBkcm9wcyBtZXNzYWdlc1xuICAgICAqIGZyb20gYSBjaGlsZC4gUmVwbGllcyBzZW50IHRvIHRoZSBwYXJlbnQgYXJlIHNpbXBseSBsb3N0LlxuICAgICAqXG4gICAgICogU28gd2UgYWRvcHQgd2hvZXZlciBhY3R1YWxseSB0YWxrcyB0byB1cywgdGhlIGZpcnN0IHRpbWUgYW4gYW5jZXN0b3IgZG9lcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGhvc3RXaW5kb3c6IFdpbmRvdyB8IG51bGwgPSB3aW5kb3cucGFyZW50O1xuXG4gICAgLyoqXG4gICAgICogQ29tbWFuZHMgKGluY2x1ZGluZyBFeGVjdXRlU2NyaXB0KSBtdXN0IGNvbWUgZnJvbSBhIHdpbmRvdyB0aGlzIGZyYW1lIGlzIGFjdHVhbGx5XG4gICAgICogbmVzdGVkIGluc2lkZSAtLSBuZXZlciBmcm9tIGFuIG9wZW5lciBvciBhIHNpYmxpbmcgdGhhdCBtZXJlbHkgaG9sZHMgYSByZWZlcmVuY2UuXG4gICAgICpcbiAgICAgKiBUSElTIFVTRUQgVE8gQ09NUEFSRSBBR0FJTlNUIGB3aW5kb3cucGFyZW50YCBBTE9ORSwgYW5kIHRoYXQgd2FzIGEgcmVncmVzc2lvbiBJXG4gICAgICogc2hpcHBlZCBpbiAwLjQuMC1iZXRhOiBpdCBzaWxlbnRseSBkcm9wcGVkIHRoZSBob3N0J3MgSW5pdE1lc3NhZ2UgZm9yIGFueSBjb21wb25lbnRcbiAgICAgKiBtb3VudGVkIGNyb3NzLWRvY3VtZW50LCBiZWNhdXNlIHRoZSBob3N0IGlzIGEgZ3JhbmRwYXJlbnQgdGhlcmUuIFRoZSBmcmFtZSB0aGVuXG4gICAgICogYW5ub3VuY2VkIGZvciBpdHMgZnVsbCAxMHMgYnVkZ2V0IGludG8gYSBwYXJlbnQgdGhhdCBuZXZlciBhbnN3ZXJzIGFuZCByZWplY3RlZCB3aXRoXG4gICAgICogdGltZW91dF8xMDAwMCBoYXZpbmcgcmVnaXN0ZXJlZCBub3RoaW5nLiBSZXByb2R1Y2VkIGxpdmUgb24gUGljLVRpbWUncyBRQSBwYWdlXG4gICAgICogMjAyNi0xMC0xNzogMTUgSW5pdFJlcXVlc3RzLCAwIEluaXRSZXNwb25zZXMsIGBJZnJhbWVTREsuY29tcG9uZW50c2AgZW1wdHkuXG4gICAgICogMC4zLjM2IGhhZCBubyBndWFyZCBhdCBhbGwsIHdoaWNoIGlzIHdoeSBpdCB3b3JrZWQuXG4gICAgICpcbiAgICAgKiBXYWxraW5nIHRoZSBhbmNlc3RvciBjaGFpbiBrZWVwcyB0aGUgc2VjdXJpdHkgcHJvcGVydHkgLS0gYW4gb3BlbmVyIG9yIGEgc2libGluZyBpc1xuICAgICAqIG5vdCBhbiBhbmNlc3RvciAtLSB3aGlsZSBhbGxvd2luZyBhIGhvc3QgYW55IG51bWJlciBvZiBmcmFtZXMgdXAuIFRoZSB3YWxrIGlzXG4gICAgICogYm91bmRlZCwgYW5kIHJlYWRpbmcgYC5wYXJlbnRgIGFjcm9zcyBvcmlnaW5zIGlzIGFsbG93ZWQgKG9ubHkgdGhlIHJlZmVyZW5jZSBpc1xuICAgICAqIGNvbXBhcmVkLCBuZXZlciB0b3VjaGVkKS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGlzRnJvbUhvc3RDaGFpbiA9IChzb3VyY2U6IE1lc3NhZ2VFdmVudFNvdXJjZSB8IG51bGwpOiBib29sZWFuID0+IHtcbiAgICAgICAgaWYgKCFzb3VyY2UpIHJldHVybiB0cnVlOyAgICAgICAgICAgICAvLyBzeW50aGV0aWMgZGlzcGF0Y2ggY2FycmllcyBubyBzb3VyY2VcbiAgICAgICAgaWYgKHNvdXJjZSA9PT0gd2luZG93KSByZXR1cm4gdHJ1ZTtcblxuICAgICAgICBsZXQgY3VycmVudDogV2luZG93ID0gd2luZG93O1xuICAgICAgICBmb3IgKGxldCBkZXB0aCA9IDA7IGRlcHRoIDwgMzI7IGRlcHRoKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IGN1cnJlbnQucGFyZW50O1xuICAgICAgICAgICAgaWYgKCFwYXJlbnQgfHwgcGFyZW50ID09PSBjdXJyZW50KSByZXR1cm4gZmFsc2U7ICAgLy8gcmVhY2hlZCB0aGUgdG9wXG4gICAgICAgICAgICBpZiAoc291cmNlID09PSBwYXJlbnQpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgY3VycmVudCA9IHBhcmVudDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGluaXQgPSAoKSA9PiB7XG4gICAgICAgIHdpbmRvdy5vbm1lc3NhZ2UgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzRnJvbUhvc3RDaGFpbihldmVudC5zb3VyY2UpKSByZXR1cm47XG5cbiAgICAgICAgICAgIC8vIEFET1BUIE9OTFkgT04gSW5pdE1lc3NhZ2UsIE5PVCBPTiBBTlkgQU5DRVNUT1IgTUVTU0FHRS5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBJbml0TWVzc2FnZSBpcyB0aGUgb25lIG1lc3NhZ2UgdGhhdCBlc3RhYmxpc2hlcyB3aG8gb3ducyB0aGlzIGNvbXBvbmVudCwgc29cbiAgICAgICAgICAgIC8vIGl0IGlzIHRoZSBvbmx5IHNhZmUgc2lnbmFsLiBBZG9wdGluZyBvbiBhbnkgYWNjZXB0ZWQgbWVzc2FnZSBsZXQgYW5cbiAgICAgICAgICAgIC8vIGludGVybWVkaWF0ZSBhbmNlc3RvciAtLSB0aGUgcmVlbCBkaWFsb2csIHdoaWNoIGlzIGl0c2VsZiBhIGNvbXBvbmVudCBhbmRcbiAgICAgICAgICAgIC8vIG1heSBsZWdpdGltYXRlbHkgcG9zdCB0byBpdHMgb3duIHN1YnRyZWUgLS0gYmVjb21lIGBob3N0V2luZG93YCBhbmQgc2lsZW50bHlcbiAgICAgICAgICAgIC8vIHRha2Ugb3ZlciB0aGUgcmVwbHkgY2hhbm5lbCwgcHV0dGluZyB1cyBiYWNrIHRvIEluaXRSZXNwb25zZXMgZ29pbmcgdG8gYVxuICAgICAgICAgICAgLy8gZnJhbWUgdGhhdCBkcm9wcyB0aGVtLlxuICAgICAgICAgICAgaWYgKGV2ZW50LnNvdXJjZVxuICAgICAgICAgICAgICAgICYmIGV2ZW50LnNvdXJjZSAhPT0gd2luZG93XG4gICAgICAgICAgICAgICAgJiYgZXZlbnQuZGF0YT8ubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbml0TWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaG9zdFdpbmRvdyA9IGV2ZW50LnNvdXJjZSBhcyBXaW5kb3c7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaGFuZGxlSW5jb21lTWVzc2FnZXMoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgSW5pdFJlcXVlc3QoKSk7XG4gICAgfVxuXG59XG5cbmRlZmluZUR5bmFtaWNJbXBvcnQoJ0lmcmFtZVNESycsIElmcmFtZVNESyk7XG4iLCAiaW1wb3J0ICogYXMgYWxsIGZyb20gJy4vaW5kZXgnXG5pbXBvcnQge2RlZmluZUR5bmFtaWNJbXBvcnR9IGZyb20gXCIuLi9keW5hbWljSW1wb3J0L2RlZmluZUR5bmFtaWNJbXBvcnRcIjtcblxuY29uc3QgTXlvcE1lc3NhZ2VzID0ge1xuICAgIC4uLmFsbFxufVxuXG5kZWZpbmVEeW5hbWljSW1wb3J0KCdNeW9wTWVzc2FnZXMnLCBNeW9wTWVzc2FnZXMpO1xuIiwgImltcG9ydCB7ZGVmaW5lRHluYW1pY0ltcG9ydH0gZnJvbSBcIi4uL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydC50c1wiO1xuaW1wb3J0ICogYXMgTXlvcEhlbHBlcnMgZnJvbSBcIi4vaW5kZXgudHNcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vaW5kZXgudHNcIjtcblxuZGVmaW5lRHluYW1pY0ltcG9ydCgnTXlvcEhlbHBlcnMnLCBNeW9wSGVscGVycyk7XG4iLCAiLy8gQHRzLW5vY2hlY2tcbmltcG9ydCB7bW9kdWxlSW5zdGFuY2VLZXksIG9uTG9hZEtleX0gZnJvbSBcIi4vZGVmaW5lRHluYW1pY0ltcG9ydFwiO1xuXG5pZiAoIXdpbmRvd1snX19mZWRlcmF0aW9uX18nXSkge1xuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IHNjcmlwdFNyYyA9IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQ/LnNyYztcbiAgICBjb25zdCBfX3B1YmxpY19hdXRvX3BhdGhfXyA9IHNjcmlwdFNyYyA/IHNjcmlwdFNyYy5zcGxpdCgnLycpLnNsaWNlKDAsIC0xKS5qb2luKCcvJykgOiAnJztcblxuICAgIHdpbmRvd1snX19mZWRlcmF0aW9uX18nXSA9IHtcbiAgICAgICAgX19wdWJsaWNfYXV0b19wYXRoX18sXG4gICAgICAgIF9fdXNlX3B1YmxpY19hdXRvX3BhdGhfXzogdHJ1ZSxcbiAgICAgICAgX19wdWJsaWNfcGF0aF9fOiB1bmRlZmluZWQsXG4gICAgICAgIF9fbG9hZGluZ190aW1lb3V0X18gOiA1ICogMTAwMFxuICAgIH07XG59IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKCdfX2ZlZGVyYXRpb25fXyBsb2FkZWQgbW9yZSB0aGFuIG9uY2UuJyk7XG59XG5cbndpbmRvd1snX19mZWRlcmF0aW9uX18nXVsnbG9hZF9fZmVkZXJhdGlvbl9fJ10gPSAoc2NyaXB0RmlsZVBhdGgsIG1vZHVsZU5hbWUsIG9uTG9hZCkgPT4ge1xuXG4gICAgaWYgKCF3aW5kb3dbJ19fZmVkZXJhdGlvbl9fJ11bbW9kdWxlTmFtZV0pIHtcbiAgICAgICAgbGV0IHNjcmlwdFRhZztcblxuICAgICAgICAvLyBDYWxsZXJzIHRoYXQgYXJyaXZlIHdoaWxlIHRoZSBjaHVuayBpcyBzdGlsbCBsb2FkaW5nIHdhaXQgaGVyZS4gV2l0aG91dCB0aGlzIHF1ZXVlIGFcbiAgICAgICAgLy8gc2Vjb25kIGNvbmN1cnJlbnQgZ2V0WE1vZHVsZSgpIHJlc29sdmVkIHdpdGggYHVuZGVmaW5lZGAgKHRoZSBpbnN0YW5jZSBpcyBub3Qgc2V0IHlldCkuXG4gICAgICAgIGNvbnN0IHBlbmRpbmcgPSBbb25Mb2FkXTtcblxuICAgICAgICB3aW5kb3dbJ19fZmVkZXJhdGlvbl9fJ11bbW9kdWxlTmFtZV0gPSB7cGVuZGluZ307XG4gICAgICAgIHdpbmRvd1snX19mZWRlcmF0aW9uX18nXVttb2R1bGVOYW1lXVtvbkxvYWRLZXldID0gKG1vZHVsZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHNjcmlwdFRhZykge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmhlYWQucmVtb3ZlQ2hpbGQoc2NyaXB0VGFnKTtcbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBjaGVjayB0aGF0OlxuICAgICAgICAgICAgICAgIHNjcmlwdFRhZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ3NjcmlwdCByZW1vdmVkLi4uICcpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKG1vZHVsZSk7XG5cbiAgICAgICAgICAgIHdpbmRvd1snX19mZWRlcmF0aW9uX18nXVttb2R1bGVOYW1lXVttb2R1bGVJbnN0YW5jZUtleV0gPSBtb2R1bGU7XG4gICAgICAgICAgICBwZW5kaW5nLnNwbGljZSgwKS5mb3JFYWNoKChjYikgPT4gY2IobW9kdWxlKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2FkU2NyaXB0ID0gKHNyYykgPT4ge1xuICAgICAgICAgICAgc2NyaXB0VGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgICAgICBzY3JpcHRUYWcudHlwZSA9ICdtb2R1bGUnO1xuICAgICAgICAgICAgc2NyaXB0VGFnLnNyYyA9IHNyYztcbiAgICAgICAgICAgIHNjcmlwdFRhZy5hc3luYyA9IHRydWU7XG5cbiAgICAgICAgICAgIC8vIEZhbGxiYWNrIHRvIENETiBpZiB0aGUgc2NyaXB0IGZhaWxzIHRvIGxvYWQgKGUuZy4gY2FjaGluZyBwcm94aWVzIGxpa2UgTGl0ZVNwZWVkXG4gICAgICAgICAgICAvLyByZWxvY2F0ZSB0aGUgcm9vdCBTREsgYnV0IGRvbid0IGhhdmUgdGhlIGNodW5rIGZpbGVzKVxuICAgICAgICAgICAgc2NyaXB0VGFnLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2RuQmFzZSA9IHdpbmRvdy5teW9wPy5fX1JPT1RfU0RLX1BVQkxJQ19VUkxfXz8uc3BsaXQoJy8nKS5zbGljZSgwLCAtMSkuam9pbignLycpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNodW5rRmlsZU5hbWUgPSBzcmMuc3BsaXQoJy8nKS5wb3AoKTtcbiAgICAgICAgICAgICAgICBpZiAoY2RuQmFzZSAmJiAhc3JjLnN0YXJ0c1dpdGgoY2RuQmFzZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBbbXlvcF0gY2h1bmsgbG9hZCBmYWlsZWQgZnJvbSAke3NyY30sIHJldHJ5aW5nIGZyb20gQ0ROYCk7XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmhlYWQucmVtb3ZlQ2hpbGQoc2NyaXB0VGFnKTtcbiAgICAgICAgICAgICAgICAgICAgbG9hZFNjcmlwdChgJHtjZG5CYXNlfS8ke2NodW5rRmlsZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHRUYWcpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGxvYWRTY3JpcHQoc2NyaXB0RmlsZVBhdGgpO1xuXG4gICAgICAgIC8vIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGlua1wiKTtcbiAgICAgICAgLy8gbGluay50eXBlID0gXCJ0ZXh0L2Nzc1wiO1xuICAgICAgICAvLyBsaW5rLnJlbCA9IFwic3R5bGVzaGVldFwiO1xuICAgICAgICAvLyBsaW5rLmhyZWYgPSBmaWxlTmFtZS5yZXBsYWNlKCcuanMnLCAnLmNzcycpO1xuICAgICAgICAvLyBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmspO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZW50cnkgPSB3aW5kb3dbJ19fZmVkZXJhdGlvbl9fJ11bbW9kdWxlTmFtZV07XG4gICAgICAgIGlmIChlbnRyeVttb2R1bGVJbnN0YW5jZUtleV0pIHtcbiAgICAgICAgICAgIG9uTG9hZChlbnRyeVttb2R1bGVJbnN0YW5jZUtleV0pO1xuICAgICAgICB9IGVsc2UgaWYgKGVudHJ5LnBlbmRpbmcpIHtcbiAgICAgICAgICAgIGVudHJ5LnBlbmRpbmcucHVzaChvbkxvYWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYF9fZmVkZXJhdGlvbl9fIG1vZHVsZSAke21vZHVsZU5hbWV9IGFscmVhZHkgbG9hZGVkLmApXG4gICAgICAgICAgICBvbkxvYWQoZW50cnlbbW9kdWxlSW5zdGFuY2VLZXldKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQgJy4vZHluYW1pY0ltcG9ydC9sb2FkX19mZWRlcmF0aW9uX18nO1xuLy8gQHRzLWlnbm9yZSBoYW5kbGVkIGJ5IGN1c3RvbSBlc2J1aWxkIHBsdWdpblxuaW1wb3J0IHZlcnNpb24gZnJvbSBcIm15b3Atc2RrLXZlcnNpb25cIjtcblxuY29uc29sZS5sb2coJ215b3Agcm9vdCBzZGsgLSBsb2FkZWQnLCBkb2N1bWVudC5sb2NhdGlvbi5vcmlnaW4pO1xuXG4vLyBUT0RPIDogcmVhZCB2YWx1ZSBmcm9tIHdpbmRvd1snX19mZWRlcmF0aW9uX18nXSA/XG4vL2NvbnN0IF9fUk9PVF9TREtfUFVCTElDX1VSTF9fID0gJ2h0dHBzOi8vZGZkbGsycDFtMTg3di5jbG91ZGZyb250Lm5ldC9teW9wX3Nkay5taW4uanMnXG5jb25zdCBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfXyA9ICdodHRwczovL2Nkbi5teW9wLmRldi9zZGsvbmV4dC9teW9wX3Nkay5taW4uanMnXG5cbmNvbnN0IGdldEhvc3RNb2R1bGUgPSAoKSA9PiBpbXBvcnQoJy4vaG9zdC9ob3N0U0RLJylcbmNvbnN0IGdldElmcmFtZU1vZHVsZSA9ICgpID0+IGltcG9ydCgnLi9JZnJhbWUvSWZyYW1lU0RLJylcbmNvbnN0IGdldFdlYmNvbXBvbmVudE1vZHVsZSA9ICgpID0+IGltcG9ydCgnLi93ZWJjb21wb25lbnQvV2ViQ29tcG9uZW50U0RLJylcbmNvbnN0IGdldE15b3BNZXNzYWdlcyA9ICgpID0+IGltcG9ydCgnLi9tZXNzYWdlcy9NeW9wTWVzc2FnZXMnKVxuY29uc3QgZ2V0TXlvcEhlbHBlcnMgPSAoKSA9PiBpbXBvcnQoJy4vaGVscGVycy9NeW9wSGVscGVycycpXG5cbi8vIFRoZSBzcGxpdCBidWlsZCAoZGlzdC9janMpIHJlc29sdmVzIGVhY2ggaW1wb3J0IHRvIGEgZmVkZXJhdGlvbiBzdHViIHdob3NlIGBnZXQoKWAgbG9hZHMgdGhlXG4vLyBjaHVuay4gVGhlIHNpbmdsZS1maWxlIGJ1aWxkIChkaXN0L2Nqcy1idW5kbGVkKSBpbmxpbmVzIHRoZSByZWFsIG1vZHVsZSwgd2hpY2ggaGFzIG5vIGBnZXRgLlxuY29uc3QgZXhwb3NlR2xvYmFsbHkgPSAoaW1wb3J0RnVuY3Rpb246ICgpID0+IFByb21pc2U8YW55PikgPT4ge1xuICAgIHJldHVybiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1vZCA9IGF3YWl0IGltcG9ydEZ1bmN0aW9uKCk7XG4gICAgICAgIHJldHVybiB0eXBlb2YgbW9kLmdldCA9PT0gJ2Z1bmN0aW9uJyA/IG1vZC5nZXQoKSA6IG1vZDtcbiAgICB9XG59XG5cbi8vIEZvciBzY3JpcHQvZ2xvYmFsIHVzYWdlIDpcbmNvbnN0IHJvb3RTREsgPSB7XG4gICAgdmVyc2lvbiA6IHZlcnNpb24sXG4gICAgZ2V0SG9zdE1vZHVsZTogZXhwb3NlR2xvYmFsbHkoZ2V0SG9zdE1vZHVsZSksXG4gICAgZ2V0SWZyYW1lTW9kdWxlOiBleHBvc2VHbG9iYWxseShnZXRJZnJhbWVNb2R1bGUpLFxuICAgIGdldFdlYmNvbXBvbmVudE1vZHVsZTogZXhwb3NlR2xvYmFsbHkoZ2V0V2ViY29tcG9uZW50TW9kdWxlKSxcbiAgICBnZXRNeW9wTWVzc2FnZXM6IGV4cG9zZUdsb2JhbGx5KGdldE15b3BNZXNzYWdlcyksXG4gICAgZ2V0TXlvcEhlbHBlcnM6IGV4cG9zZUdsb2JhbGx5KGdldE15b3BIZWxwZXJzKVxufTtcblxuLy8gQHRzLWlnbm9yZVxuaWYgKCF3aW5kb3cubXlvcCkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB3aW5kb3cubXlvcCA9IHtcbiAgICAgICAgX19ST09UX1NES19QVUJMSUNfVVJMX19cbiAgICB9XG59XG5cbi8vIEB0cy1pZ25vcmVcbmlmICghd2luZG93Lm15b3Aucm9vdFNESykge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB3aW5kb3cubXlvcCA9IHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByb290U0RLLFxuICAgICAgICAuLi53aW5kb3cubXlvcFxuICAgIH07XG59IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKFwibXlvcCByb290IGhvc3QgbG9hZGVkIG1vcmUgdGhhbiBvbmNlLlwiKTtcbn1cblxuLy8gRm9yIGJ1bmRsZXJzIHVzYWdlIDpcbmNvbnN0IHNka01vZHVsZSA9IHtcbiAgICBnZXRIb3N0TW9kdWxlLFxuICAgIGdldElmcmFtZU1vZHVsZSxcbiAgICBnZXRXZWJjb21wb25lbnRNb2R1bGUsXG4gICAgZ2V0TXlvcE1lc3NhZ2VzLFxuICAgIGdldE15b3BIZWxwZXJzXG59XG5leHBvcnQgdHlwZSByb290U0RLVHlwZSA9IHR5cGVvZiBzZGtNb2R1bGU7XG5cbmV4cG9ydCB7XG4gICAgZ2V0SG9zdE1vZHVsZSxcbiAgICBnZXRJZnJhbWVNb2R1bGUsXG4gICAgZ2V0V2ViY29tcG9uZW50TW9kdWxlLFxuICAgIGdldE15b3BNZXNzYWdlcyxcbiAgICBnZXRNeW9wSGVscGVyc1xufVxuXG4vLyBkZWNsYXJlIGdsb2JhbCB7XG4vLyAgICAgaW50ZXJmYWNlIFdpbmRvdyB7XG4vLyAgICAgICAgIG15b3A6IHtcbi8vICAgICAgICAgICAgIHJvb3RTREs6IHR5cGVvZiByb290U0RLXG4vLyAgICAgICAgIH1cbi8vICAgICB9XG4vLyB9XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLElBQWEsZ0JBQ0EsV0FDQSxtQkFFQTtBQUpiO0FBQUE7QUFBQTtBQUFPLElBQU0saUJBQWlCO0FBQ3ZCLElBQU0sWUFBWTtBQUNsQixJQUFNLG9CQUFvQjtBQUUxQixJQUFNLHNCQUFzQixDQUFDLFlBQW9CLFdBQWdCO0FBRXBFLFVBQUksT0FBTyxjQUFjLEtBQUssT0FBTyxjQUFjLEVBQUUsVUFBVSxLQUFLLE9BQU8sY0FBYyxFQUFFLFVBQVUsRUFBRSxTQUFTLEdBQUc7QUFFL0csZUFBTyxjQUFjLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxFQUFDLENBQUMsVUFBVSxHQUFHLE9BQU0sQ0FBQztBQUFBLE1BQ3hFLE9BQU87QUFBQSxNQUVQO0FBQUEsSUFDSjtBQUFBO0FBQUE7OztBQ1pBLElBQU87QUFBUDtBQUFBO0FBQUEsSUFBTywyQkFBUTtBQUFBO0FBQUE7OztBQ0FmLElBSWE7QUFKYjtBQUFBO0FBQUE7QUFJTyxJQUFNLGVBQWU7QUFBQTtBQUFBLE1BRXhCLGVBQWU7QUFBQSxNQUNmLGdCQUFnQjtBQUFBLE1BQ2hCLGVBQWU7QUFBQSxNQUNmLGtCQUFrQjtBQUFBLE1BRWxCLHFCQUFxQjtBQUFBLE1BQ3JCLG9CQUFvQjtBQUFBLE1BQ3BCLHlCQUF5QjtBQUFBLE1BRXpCLHdCQUF3QjtBQUFBLE1BRXhCLDJCQUEyQjtBQUFBLE1BQzNCLHVCQUF1QjtBQUFBLE1BRXZCLDZCQUE2QjtBQUFBLE1BQzdCLG9CQUFvQjtBQUFBLE1BRXBCLDBCQUEwQjtBQUFBLE1BQzFCLHVCQUF1QjtBQUFBLE1BRXZCLGdCQUFnQjtBQUFBO0FBQUEsTUFHaEIsMEJBQTBCO0FBQUEsTUFDMUIsOEJBQThCO0FBQUEsTUFDOUIsNEJBQTRCO0FBQUEsTUFFNUIsa0JBQWtCO0FBQUE7QUFBQSxNQUdsQixJQUFJO0FBQUEsUUFDQSwyQkFBMkI7QUFBQSxRQUMzQixzQkFBc0I7QUFBQSxRQUN0Qiw2QkFBNkI7QUFBQSxRQUU3QixnQ0FBZ0M7QUFBQSxRQUNoQyw2QkFBNkI7QUFBQSxRQUU3Qiw2QkFBNkI7QUFBQSxRQUM3Qiw4QkFBOEI7QUFBQSxRQUM5QixvQkFBb0I7QUFBQSxRQUVwQiwyQkFBMkI7QUFBQSxRQUMzQix3QkFBd0I7QUFBQSxRQUN4Qix5QkFBeUI7QUFBQSxNQUM3QjtBQUFBLElBQ0o7QUFBQTtBQUFBOzs7QUNwREEsSUFHYSxRQWNBLGFBa0JBLGlCQWNBO0FBakRiO0FBQUE7QUFBQTtBQUdPLElBQU0sU0FBUyxNQUFNO0FBQ3hCLGFBQU8sdUNBQXVDO0FBQUEsUUFBUTtBQUFBLFFBQVUsUUFDM0QsQ0FBQyxJQUFJLE9BQU8sZ0JBQWdCLElBQUksV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksR0FBRyxTQUFTLEVBQUU7QUFBQSxNQUNsRjtBQUFBLElBQ0o7QUFVTyxJQUFNLGNBQWMsQ0FBQyxVQUE4QjtBQUN0RCxZQUFNLE1BQU0sQ0FBQyxHQUFHLEtBQUssRUFBRSxJQUFJLE9BQUssRUFBRSxTQUFTLEVBQUUsRUFBRSxTQUFTLEdBQUcsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFO0FBQ3hFLGFBQU87QUFBQSxRQUNILElBQUksTUFBTSxHQUFHLENBQUM7QUFBQSxRQUNkLElBQUksTUFBTSxHQUFHLEVBQUU7QUFBQSxRQUNmLElBQUksTUFBTSxJQUFJLEVBQUU7QUFBQSxRQUNoQixJQUFJLE1BQU0sSUFBSSxFQUFFO0FBQUEsUUFDaEIsSUFBSSxNQUFNLEVBQUU7QUFBQSxNQUNoQixFQUFFLEtBQUssR0FBRztBQUFBLElBQ2Q7QUFTTyxJQUFNLGtCQUFrQixDQUFDLFFBQTRCO0FBQ3hELFVBQUksU0FBUyxJQUFJLFFBQVEsTUFBTSxHQUFHLEVBQUUsUUFBUSxNQUFNLEdBQUc7QUFDckQsYUFBTyxPQUFPLFNBQVMsRUFBRyxXQUFVO0FBQ3BDLFlBQU0sU0FBUyxLQUFLLE1BQU07QUFDMUIsYUFBTyxXQUFXLEtBQUssUUFBUSxVQUFRLEtBQUssV0FBVyxDQUFDLENBQUM7QUFBQSxJQUM3RDtBQVNPLElBQU0sa0JBQWtCLENBQUMsWUFBOEI7QUFDMUQsWUFBTSxRQUFRLGdCQUFnQixPQUFPO0FBQ3JDLFVBQUksTUFBTSxTQUFTLE9BQU8sRUFBRyxPQUFNLElBQUksTUFBTSxzQkFBc0I7QUFFbkUsWUFBTSxRQUFrQixDQUFDO0FBQ3pCLGVBQVMsSUFBSSxHQUFHLElBQUksTUFBTSxRQUFRLEtBQUssSUFBSTtBQUN2QyxjQUFNLEtBQUssWUFBWSxNQUFNLE1BQU0sR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQUEsTUFDbEQ7QUFDQSxhQUFPO0FBQUEsSUFDWDtBQUFBO0FBQUE7OztBQzFEQSxJQUVhO0FBRmI7QUFBQTtBQUFBO0FBQUE7QUFFTyxJQUFNLE9BQU8sQ0FBQyxPQUFlO0FBQ2hDLGFBQU8sSUFBSSxRQUFRLGFBQVcsV0FBVyxTQUFTLEVBQUUsQ0FBQztBQUFBLElBQ3pEO0FBQUE7QUFBQTs7O0FDSkEsSUFLYSxrQkFPUyxpQkFzQ0Esb0JBTUEsdUJBTUEsaUJBV1Q7QUF6RWI7QUFBQTtBQUFBO0FBQ0E7QUFJTyxJQUFNLG1CQUFOLE1BQXVCO0FBQUEsSUFHOUI7QUFGSSxrQkFEUyxrQkFDRixRQUFPO0FBQ2Qsa0JBRlMsa0JBRUYsTUFBSztBQUtULElBQWUsa0JBQWYsTUFBd0M7QUFBQSxNQVczQyxjQUFjO0FBVmQsa0NBQUssT0FBTztBQWNaLG9DQUFPO0FBSVA7QUFHQTtBQUFBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQSx5Q0FBcUI7QUFBQSxNQWxCckI7QUFBQSxNQVZBLE9BQU8sVUFFQSxNQUNzQjtBQUV6QixlQUFPLElBQUksS0FBSyxHQUFHLElBQUk7QUFBQSxNQUMzQjtBQUFBLE1Bd0JBLFNBQVMsS0FBK0I7QUFDcEMsZUFBTyxJQUFJLGdCQUFnQixLQUFLO0FBQUEsTUFDcEM7QUFBQSxJQUNKO0FBRU8sSUFBZSxxQkFBZixjQUFtRCxnQkFBbUI7QUFBQSxNQUN6RSxZQUFtQixLQUFVO0FBQ3pCLGNBQU07QUFEUztBQUFBLE1BRW5CO0FBQUEsSUFDSjtBQUVPLElBQWUsd0JBQWYsY0FBc0QsZ0JBQW1CO0FBQUEsTUFDNUUsWUFBbUIsaUJBQTBCO0FBQ3pDLGNBQU07QUFEUztBQUFBLE1BRW5CO0FBQUEsSUFDSjtBQUVPLElBQWUsa0JBQWYsY0FBdUYsZ0JBQW1CO0FBQUEsTUFNN0csWUFBbUIsU0FBK0I7QUFDOUMsY0FBTTtBQURTO0FBRm5CLDRCQUFPLG1CQUFrQixPQUFPO0FBQUEsTUFJaEM7QUFBQSxJQUNKO0FBRU8sSUFBTSxNQUFOLE1BQU0sS0FBSTtBQUFBLE1Bc0JiLFlBQW1CLFdBQThCLFdBQTRCO0FBQTFEO0FBQThCO0FBckJqRCw0QkFBTyxRQUFPO0FBRWQsNEJBQU87QUFvQkgsYUFBSyxlQUFlLGlDQUNiLE9BRGE7QUFBQSxVQUVoQixXQUFXO0FBQUE7QUFBQSxRQUNmO0FBQUEsTUFDSjtBQUFBLE1BdEJBLE9BQU8sT0FBTyxVQUFrQixXQUF3QixXQUE0QjtBQUNoRixZQUFJLGFBQWE7QUFDakIsWUFBSSxDQUFDLFlBQVk7QUFDYix1QkFBYTtBQUFBLFlBQ1QsSUFBSTtBQUFBLFlBQ0osTUFBTTtBQUFBLFlBQ04sYUFBYTtBQUFBLFlBQ2IsY0FBYztBQUFBLFlBQ2Q7QUFBQSxZQUNBLFVBQVU7QUFBQSxjQUNOLE1BQU07QUFBQSxZQUNWO0FBQUEsVUFDSjtBQUFBLFFBQ0o7QUFDQSxlQUFPLElBQUksS0FBSSxZQUFZLFNBQVM7QUFBQSxNQUN4QztBQUFBLElBUUo7QUFBQTtBQUFBOzs7QUNyR0EsSUFHTSxrQkFFTyxrQkFVQTtBQWZiO0FBQUE7QUFBQTtBQUFBO0FBR0EsSUFBTSxtQkFBbUI7QUFFbEIsSUFBTSxtQkFBTixjQUErQixnQkFBMEM7QUFBQSxNQUs1RSxZQUFtQixLQUFVLFNBQWdEO0FBQ3pFLGNBQU0sT0FBTztBQURFO0FBSm5CLCtDQUFrQztBQUNsQywyQ0FBYztBQUNkLHlDQUFZO0FBQUEsTUFJWjtBQUFBLElBQ0o7QUFFTyxJQUFNLHFCQUFOLGNBQWlDLHNCQUFzQjtBQUFBLE1BQXZEO0FBQUE7QUFDSCwyQ0FBYztBQUFBO0FBQUEsSUFDbEI7QUFBQTtBQUFBOzs7QUNqQkEsSUFFYTtBQUZiO0FBQUE7QUFBQTtBQUFBO0FBRU8sSUFBTSxvQkFBTixjQUFnQyxnQkFBd0I7QUFBQSxNQUkzRCxZQUFtQixLQUFVLE1BQWM7QUFDdkMsY0FBTTtBQURTO0FBRm5CLDJDQUFjO0FBSVYsYUFBSyxVQUFVO0FBQUEsTUFDbkI7QUFBQSxJQUNKO0FBQUE7QUFBQTs7O0FDVkEsSUFLTUEsbUJBRUEsbUJBQ0EscUJBRU8sZUEwQkEsc0JBb0JBO0FBeERiO0FBQUE7QUFBQTtBQUFBO0FBS0EsSUFBTUEsb0JBQW1CO0FBRXpCLElBQU0sb0JBQW9CO0FBQzFCLElBQU0sc0JBQXNCO0FBRXJCLElBQU0sZ0JBQWdCLENBQUMsWUFBb0I7QUFDOUMsVUFBSSxRQUFRLFFBQVEsTUFBTSxpQkFBaUI7QUFDM0MsVUFBSSxPQUFPO0FBQ1AsZUFBTyxNQUFNLENBQUMsS0FBSyxNQUFNLENBQUM7QUFBQSxNQUM5QixPQUFPO0FBQ0gsWUFBSUMsU0FBUSxRQUFRLE1BQU0sbUJBQW1CO0FBQzdDLFlBQUlBO0FBQ0EsaUJBQU9BLE9BQU0sQ0FBQyxFQUFFLEtBQUs7QUFBQSxNQUM3QjtBQUFBLElBQ0o7QUFpQk8sSUFBTSx1QkFBTixjQUEwRSxnQkFBc0Q7QUFBQSxNQVNuSSxZQUFZLFFBQStDLFVBQTJELE1BQU07QUFBQSxNQUM1SCxHQUFVQyxlQUFrQjtBQUN4QixjQUFNLE9BQU87QUFEUCw0QkFBQUE7QUFSViwrQ0FBa0NGO0FBQ2xDLDJDQUFjO0FBQ2Qsc0NBQWlCO0FBUWIsYUFBSyxTQUFTLE9BQU8sU0FBUztBQUc5QixhQUFLLFVBQVUsT0FBTyxTQUFTO0FBQy9CLGFBQUssVUFBVSxjQUFjLEtBQUssT0FBTztBQUFBLE1BQzdDO0FBQUEsSUFDSjtBQVpJLGtCQU5TLHNCQU1GLGNBQWE7QUFDcEIsa0JBUFMsc0JBT0YscUJBQW9CO0FBYXhCLElBQU0sNEJBQU4sY0FBaUQsc0JBQXlCO0FBQUEsTUFJN0UsWUFBbUIsaUJBQWdDLFNBQVk7QUFDM0QsY0FBTSxlQUFlO0FBRE47QUFBZ0M7QUFGbkQsMkNBQWNBO0FBQUEsTUFJZDtBQUFBLElBQ0o7QUFBQTtBQUFBOzs7QUMvREEsSUFjYTtBQWRiO0FBQUE7QUFBQTtBQUFBO0FBY08sSUFBTSxtQkFBTixjQUF3RixxQkFBbUQ7QUFBQSxNQUU5SSxZQUFZLFFBQ09HLGVBQ1AsVUFBMkQsTUFBTTtBQUFBLE1BQ2pFLEdBQUc7QUFJWCxjQUFNLENBQUMsRUFBQyxTQUFTLFdBQVcsU0FBUyxlQUFjLE1BQU07QUFDckQsZ0JBQU0sUUFBUSxRQUFRLGNBQWMsUUFBUSxXQUFXLGlCQUFpQixJQUFJLFNBQVMsS0FBSyxTQUFTLElBQUk7QUFDdkcsY0FBSSxLQUFLLFFBQVE7QUFPYiwyQkFBZSxNQUFNLEtBQUssQ0FBQztBQUUzQixrQkFBTSxrQkFBa0IsSUFBSSxTQUFTLFdBQVcsT0FBTyxpQkFBaUI7QUFDeEUsbUJBQU8sZ0JBQWdCLGNBQWM7QUFBQSxVQUl6QztBQUNBLGlCQUFPO0FBQUEsUUFDWCxHQUFHLE9BQU87QUF4QkssNEJBQUFBO0FBMEJmLGFBQUssZUFBZSxpQ0FDYkEsZ0JBRGE7QUFBQTtBQUFBLFVBR2hCLFNBQVMsT0FBTyxTQUFTO0FBQUEsUUFDN0I7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBO0FBQUE7OztBQ2pEQSxJQUlNQyxtQkFFTyx5QkFpQkE7QUF2QmI7QUFBQTtBQUFBO0FBQUE7QUFJQSxJQUFNQSxvQkFBbUI7QUFFbEIsSUFBTSwwQkFBTixjQUF1RyxnQkFBZ0I7QUFBQTtBQUFBLE1BTzFILFlBQW1CLEtBQWlCLE1BQWdCLFNBQTBEO0FBQzFHLGNBQU0sT0FBTztBQURFO0FBQWlCO0FBQWdCO0FBTHBELCtDQUFrQ0E7QUFDbEMsMkNBQWM7QUFDZCx5Q0FBWTtBQUNaLG9EQUFxRTtBQUFBLE1BSXJFO0FBQUEsTUFFQSx5QkFBeUIsc0JBQW9FO0FBQ3pGLGFBQUssdUJBQXVCO0FBQzVCLGVBQU87QUFBQSxNQUNYO0FBQUEsSUFDSjtBQUVPLElBQU0sK0JBQU4sY0FBMkMsc0JBQXNCO0FBQUEsTUFHcEUsWUFBbUIsaUJBQWdDLEdBQXdCO0FBQ3ZFLGNBQU0sZUFBZTtBQUROO0FBQWdDO0FBRm5ELDJDQUFjQTtBQUlWLGFBQUssVUFBVTtBQUFBLFVBQ1g7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQTtBQUFBOzs7QUNoQ0EsSUFHYTtBQUhiO0FBQUE7QUFBQTtBQUFBO0FBR08sSUFBTSxzQkFBTixjQUFrQyxnQkFBZ0I7QUFBQSxNQUlyRCxZQUFtQixLQUFpQixNQUFxQixPQUFlO0FBQ3BFLGNBQU07QUFEUztBQUFpQjtBQUFxQjtBQUZ6RCwyQ0FBYztBQUFBLE1BSWQ7QUFBQSxJQUNKO0FBQUE7QUFBQTs7O0FDVkEsSUFJTUMsbUJBRU8sd0JBeUJBO0FBL0JiO0FBQUE7QUFBQTtBQUFBO0FBSUEsSUFBTUEsb0JBQW1CO0FBRWxCLElBQU0seUJBQU4sY0FBcUMsZ0JBQWlEO0FBQUEsTUFJekYsWUFBbUIsS0FBVSxTQUF1RDtBQUNoRixjQUFNLE9BQU87QUFERTtBQUhuQiwrQ0FBa0NBO0FBQ2xDLDJDQUFjO0FBQUEsTUFJZDtBQUFBLElBQ0o7QUFrQk8sSUFBTSw0QkFBTixjQUF3QyxzQkFBc0I7QUFBQSxNQUdqRSxZQUFtQixTQUE0QjtBQUMzQyxjQUFNO0FBRFM7QUFGbkIsMkNBQWNBO0FBQUEsTUFJZDtBQUFBLElBQ0o7QUFBQTtBQUFBOzs7QUNyQ0EsSUFFYTtBQUZiO0FBQUE7QUFBQTtBQUFBO0FBRU8sSUFBTSxlQUFOLGNBQTJCLGdCQUF3QjtBQUFBLE1BSXRELFlBQW1CLEtBQVUsV0FBbUI7QUFDNUMsY0FBTTtBQURTO0FBRm5CLDJDQUFjO0FBSVYsYUFBSyxVQUFVO0FBQUEsTUFDbkI7QUFBQSxJQUNKO0FBQUE7QUFBQTs7O0FDVkEsSUFHYSxhQWNBLGNBS0E7QUF0QmI7QUFBQTtBQUFBO0FBQUE7QUFHTyxJQUFNLGNBQU4sY0FBMEIsZ0JBQWdDO0FBQUEsTUFHN0QsWUFBWSxJQUFZO0FBQ3BCLGNBQU07QUFIViwyQ0FBYztBQUlWLGFBQUssVUFBVSxFQUFFLEdBQUc7QUFBQSxNQUN4QjtBQUFBLE1BRUEsU0FBUyxLQUErQjtBQUNwQyxlQUFPLElBQUksZ0JBQWdCLEtBQUs7QUFBQSxNQUNwQztBQUFBLElBQ0o7QUFHTyxJQUFNLGVBQU4sY0FBMkIsWUFBWTtBQUFBLE1BQXZDO0FBQUE7QUFDSCwyQ0FBYztBQUFBO0FBQUEsSUFDbEI7QUFHTyxJQUFNLGNBQU4sY0FBMEIsZ0JBQWdCO0FBQUEsTUFBMUM7QUFBQTtBQUNILDJDQUFjO0FBQUE7QUFBQSxJQUNsQjtBQUFBO0FBQUE7OztBQ3hCQSxJQUtNQyxtQkFFTywyQkFtQkE7QUExQmI7QUFBQTtBQUFBO0FBQUE7QUFLQSxJQUFNQSxvQkFBbUI7QUFFbEIsSUFBTSw0QkFBTixjQUF3QyxnQkFBa0Q7QUFBQSxNQUk3RixZQUFtQixXQUNBLHVCQUNBLFNBQ1AsU0FDVjtBQUNFLGNBQU0sT0FBTztBQUxFO0FBQ0E7QUFDQTtBQUxuQiwrQ0FBa0NBO0FBQ2xDLDJDQUFjO0FBQUEsTUFTZDtBQUFBLElBQ0o7QUFPTyxJQUFNLDZCQUFOLGNBQXlDLHNCQUFzQjtBQUFBLE1BR2xFLFlBQW1CLGlCQUFnQyxZQUFnQyxRQUFrQjtBQUNqRyxjQUFNLGVBQWU7QUFETjtBQUFnQztBQUFnQztBQUZuRiwyQ0FBY0E7QUFBQSxNQUlkO0FBQUEsSUFDSjtBQUFBO0FBQUE7OztBQ2hDQSxJQUVhO0FBRmI7QUFBQTtBQUFBO0FBQUE7QUFFTyxJQUFNLG1CQUFOLGNBQStCLGdCQUFnQjtBQUFBLE1BR2xELFlBQW1CLGFBQTRCLFNBQTBCO0FBQ3JFLGNBQU07QUFEUztBQUE0QjtBQUYvQywyQ0FBYztBQUtWLGNBQU0sd0JBQXlCO0FBQy9CLGFBQUssUUFBUSxDQUFDLGFBQWEsR0FBRyxzQkFBc0IsUUFBUSxzQkFBc0IsUUFBUSxDQUFDLENBQUM7QUFBQSxNQUNoRztBQUFBLElBQ0o7QUFBQTtBQUFBOzs7QUNYQSxJQUdNQyxtQkFFTyx1QkFLQTtBQVZiO0FBQUE7QUFBQTtBQUFBO0FBR0EsSUFBTUEsb0JBQW1CO0FBRWxCLElBQU0sd0JBQU4sY0FBb0MsZ0JBQThDO0FBQUEsTUFBbEY7QUFBQTtBQUNILDJDQUFjO0FBQ2QsK0NBQWtCQTtBQUFBO0FBQUEsSUFDdEI7QUFFTyxJQUFNLDBCQUFOLGNBQXNDLHNCQUFxQztBQUFBLE1BSTlFLFlBQW1CLGlCQUF5QixpQkFBZ0M7QUFDeEUsY0FBTSxlQUFlO0FBRE47QUFGbkIsMkNBQWNBO0FBSVYsYUFBSyxVQUFVO0FBQUEsTUFDbkI7QUFBQSxNQUVBLFNBQVMsS0FBb0M7QUFDekMsZUFBTyxJQUFJLGdCQUFnQixLQUFLO0FBQUEsTUFDcEM7QUFBQSxJQUNKO0FBQUE7QUFBQTs7O0FDdEJBLElBR01DLG1CQUVPLHFCQVNBO0FBZGI7QUFBQTtBQUFBO0FBQUE7QUFHQSxJQUFNQSxvQkFBbUI7QUFFbEIsSUFBTSxzQkFBTixjQUFrQyxnQkFBaUQ7QUFBQSxNQUl0RixZQUFtQixLQUFpQixNQUFjLFNBQXVEO0FBQ3JHLGNBQU0sT0FBTztBQURFO0FBQWlCO0FBSHBDLCtDQUFrQ0E7QUFDbEMsMkNBQWM7QUFBQSxNQUlkO0FBQUEsSUFDSjtBQUVPLElBQU0sNEJBQU4sY0FBd0Msc0JBQXNCO0FBQUEsTUFHakUsWUFBbUIsU0FBd0I7QUFDdkMsY0FBTTtBQURTO0FBRm5CLDJDQUFjQTtBQUFBLE1BSWQ7QUFBQSxJQUNKO0FBQUE7QUFBQTs7O0FDcEJBLElBWWE7QUFaYjtBQUFBO0FBQUE7QUFBQTtBQVlPLElBQU0seUJBQU4sY0FBcUMsZ0JBQWdCO0FBQUEsTUFHeEQsWUFBbUIsUUFBc0M7QUFDckQsY0FBTTtBQURTO0FBRm5CLDJDQUFjO0FBQUEsTUFJZDtBQUFBLElBQ0o7QUFBQTtBQUFBOzs7QUNsQkEsSUFFYSw0QkFJQTtBQU5iO0FBQUE7QUFBQTtBQUFBO0FBRU8sSUFBTSw2QkFBTixjQUF5QyxnQkFBZ0I7QUFBQSxNQUF6RDtBQUFBO0FBQ0gsMkNBQWM7QUFBQTtBQUFBLElBQ2xCO0FBRU8sSUFBTSwwQkFBTixjQUFzQyxnQkFBZ0I7QUFBQSxNQUF0RDtBQUFBO0FBQ0gsMkNBQWM7QUFBQTtBQUFBLElBQ2xCO0FBQUE7QUFBQTs7O0FDUkEsSUFHTUMsbUJBRU8sZ0JBU0E7QUFkYjtBQUFBO0FBQUE7QUFBQTtBQUdBLElBQU1BLG9CQUFtQjtBQUVsQixJQUFNLGlCQUFOLGNBQTZCLGdCQUE0QztBQUFBLE1BSTVFLFlBQW1CLHFCQUE2QixTQUFrRDtBQUM5RixjQUFNLE9BQU87QUFERTtBQUhuQiwrQ0FBa0NBO0FBQ2xDLDJDQUFjO0FBQUEsTUFJZDtBQUFBLElBQ0o7QUFFTyxJQUFNLHVCQUFOLGNBQW1DLHNCQUFzQjtBQUFBLE1BRzVELFlBQW1CLGVBQXdCO0FBQ3ZDLGNBQU07QUFEUztBQUZuQiwyQ0FBY0E7QUFBQSxNQUlkO0FBQUEsSUFDSjtBQUFBO0FBQUE7OztBQ3BCQSxJQUVhO0FBRmI7QUFBQTtBQUFBO0FBQUE7QUFFTyxJQUFNLGlCQUFOLGNBQTZCLGdCQUFnQjtBQUFBLE1BQTdDO0FBQUE7QUFDSCwyQ0FBYztBQUFBO0FBQUEsSUFDbEI7QUFBQTtBQUFBOzs7QUNKQSxJQUVhLDBCQUtBO0FBUGI7QUFBQTtBQUFBO0FBQUE7QUFFTyxJQUFNLDJCQUFOLGNBQXVDLGdCQUFnQjtBQUFBLE1BQXZEO0FBQUE7QUFDSCx5Q0FBWTtBQUNaLDJDQUFjO0FBQUE7QUFBQSxJQUNsQjtBQUVPLElBQU0sd0JBQU4sY0FBb0MsZ0JBQWdCO0FBQUEsTUFBcEQ7QUFBQTtBQUNILDJDQUFjO0FBQUE7QUFBQSxJQUNsQjtBQUFBO0FBQUE7OztBQ1RBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7OztBQ3hCQSxJQXVJc0I7QUF2SXRCO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFRQTtBQThITyxJQUFlLG9CQUFmLE1BQXNHO0FBQUEsTUFPL0YsWUFBbUIscUJBQXdELFdBQXdCLFNBQXlCO0FBQXpHO0FBQXdEO0FBTnJGLGtDQUFhO0FBRWIsK0NBQXlELENBQUM7QUFFMUQ7QUFzQ0Esa0RBQThCO0FBb0I5QjtBQUFBLG9DQUFPLENBQTRCLGFBQXFCLFlBQXFDO0FBQ3pGLGNBQUksQ0FBQyxLQUFLLGdCQUFnQixXQUFXLEdBQUc7QUFDcEMsaUJBQUssZ0JBQWdCLFdBQVcsSUFBSSxDQUFDO0FBQUEsVUFDekM7QUFHQSxjQUFJLENBQUMsS0FBSyxnQkFBZ0IsV0FBVyxFQUFFLFNBQVMsT0FBTyxHQUFHO0FBQ3RELGlCQUFLLGdCQUFnQixXQUFXLEVBQUUsS0FBSyxPQUFPO0FBQUEsVUFDbEQ7QUFBQSxRQUNKO0FBRUEsd0NBQVcsQ0FBNEIsYUFBcUIsV0FBb0MsWUFBa0Q7QUFDOUksY0FBSSxDQUFDLFNBQVM7QUFDVixrQkFBTSxJQUFJLE1BQU0saURBQWtEO0FBQUEsVUFDdEU7QUFFQSxjQUFJLENBQUMsS0FBSyxnQkFBZ0IsV0FBVyxHQUFHO0FBQ3BDLGlCQUFLLGdCQUFnQixXQUFXLElBQUksQ0FBQztBQUFBLFVBQ3pDO0FBRUEsZ0JBQU0sV0FBVyxLQUFLLGdCQUFnQixXQUFXO0FBRWpELGdCQUFNLDBCQUEwQixDQUFDLE1BQVM7QUFDdEMsZ0JBQUksVUFBVSxDQUFDLEdBQUc7QUFDZCxzQkFBUSxDQUFDO0FBQ1QscUJBQU87QUFBQSxZQUNYO0FBQ0EsbUJBQU87QUFBQSxVQUNYO0FBR0EsbUJBQVMsS0FBSyx1QkFBdUI7QUFFckMsaUJBQU8sTUFBTTtBQUNULGtCQUFNLFFBQVEsU0FBUyxRQUFRLHVCQUF1QjtBQUN0RCxnQkFBSSxRQUFRLElBQUk7QUFDWix1QkFBUyxPQUFPLE9BQU8sQ0FBQztBQUFBLFlBQzVCO0FBQUEsVUFDSjtBQUFBLFFBQ0o7QUFpQ0EsNENBQWUsTUFBTTtBQUNqQixlQUFLLGNBQWM7QUFFbkIsY0FBSSxLQUFLO0FBQ0wsaUJBQUssc0JBQXNCO0FBQUEsUUFDbkM7QUFFQSwyQ0FBdUI7QUFFdkI7QUFDQTtBQUVBLDhDQUErQixJQUFJLFFBQVEsQ0FBQyxTQUFTLFdBQVc7QUFDNUQsZUFBSyx3QkFBd0I7QUFDN0IsZUFBSyx1QkFBdUI7QUFBQSxRQUNoQyxDQUFDO0FBRUQseUNBQVksTUFBTTtBQUNkLGlCQUFPLEtBQUs7QUFBQSxRQUNoQjtBQWdJQSxxQ0FBVyxDQUFDO0FBQ1osb0NBQVUsQ0FBQztBQW5SUCxhQUFLLE1BQUssbUNBQVMsT0FBTSxRQUFRLFNBQVMsRUFBRSxTQUFTLG1CQUFtQjtBQUN4RSxjQUFNLFdBQVUsbUNBQVMsV0FBVSxtQ0FBUyxVQUFVLElBQUk7QUFDMUQsbUJBQVcsTUFBTTtBQUNiLGNBQUksQ0FBQyxLQUFLLGVBQWUsS0FBSyx3QkFBd0IsQ0FBQyxLQUFLLG9CQUFvQjtBQUM1RSxpQkFBSyxxQkFBcUIsV0FBVyxPQUFPLElBQUksS0FBSyxFQUFFLEVBQUU7QUFjekQsaUJBQUssUUFBUTtBQUFBLFVBQ2pCO0FBQUEsUUFDSixHQUFHLE9BQU87QUFHVixhQUFLLFVBQVUsRUFBRSxLQUFLLE1BQU07QUFFeEIsY0FBSSxPQUFPLEtBQUssUUFBUSxXQUFXO0FBQy9CLGlCQUFLLFFBQVE7QUFBQSxVQUNqQjtBQUFBLFFBQ0osQ0FBQztBQUFBLE1BQ0w7QUFBQSxNQUVBLElBQUksU0FBbUI7QUE5SzNCLFlBQUFDO0FBK0tRLGlCQUFPQSxNQUFBLEtBQUssd0JBQUwsZ0JBQUFBLElBQTBCLFdBQVUsQ0FBQztBQUFBLE1BQ2hEO0FBQUEsTUFJQSxJQUFJLG9CQUE2QjtBQUM3QixlQUFPLEtBQUs7QUFBQSxNQUNoQjtBQUFBLE1BRUEsSUFBSSxrQkFBa0IsT0FBZ0I7QUFDbEMsWUFBSSxLQUFLLG9CQUFvQjtBQUN6QixnQkFBTSxJQUFJLE1BQU0sbUxBQW1MO0FBQUEsUUFDdk07QUFDQSxhQUFLLHFCQUFxQjtBQUFBLE1BQzlCO0FBQUEsTUFrREEsa0JBQWtCLGVBQXlDO0FBR3ZELFlBQUksY0FBYyxnQkFBZ0IsYUFBYSx3QkFBd0I7QUFDbkUsZ0JBQU0sZUFBZ0I7QUFHdEIsY0FBSyxLQUFhLGFBQWEsTUFBTSxHQUFHO0FBQ3BDLFlBQUMsS0FBYSxhQUFhLE1BQU0sRUFBRSxhQUFhLE9BQU87QUFBQSxVQUMzRCxPQUFPO0FBQ0gsb0JBQVEsSUFBSSxvQkFBb0IsYUFBYSxNQUFNLGlCQUFpQixJQUFJO0FBQUEsVUFDNUU7QUFFQSxpQkFBTztBQUFBLFFBQ1g7QUFFQSxjQUFNLFdBQVcsS0FBSyxnQkFBZ0IsY0FBYyxXQUFXO0FBQy9ELFlBQUksWUFBWSxTQUFTLFFBQVE7QUFDN0IsY0FBSSxVQUFVO0FBRWQsbUJBQVMsUUFBUSxhQUFXO0FBQ3hCLHNCQUFVLFdBQVcsUUFBUSxhQUFhO0FBQUEsVUFDOUMsQ0FBQztBQUNELGlCQUFPO0FBQUEsUUFDWCxPQUFPO0FBQUEsUUFHUDtBQUNBLGVBQU87QUFBQSxNQUNYO0FBQUEsTUF1QlEsbUJBQW1CLFNBQStCO0FBQ3RELGdCQUFRLFNBQVMsS0FBSztBQUN0QixnQkFBUSxjQUFjLEtBQUs7QUFDM0IsZ0JBQVEsWUFBWSxpQkFBaUI7QUFFckMsY0FBTSxpQkFBaUIsS0FBSyxTQUFTLFFBQVEsaUJBQWlCLENBQUMsUUFBK0I7QUFDMUYsaUJBQU8sSUFBSSxvQkFBb0IsUUFBUTtBQUFBLFFBQzNDLEdBQUcsQ0FBQyxNQUE0QjtBQUM1QixrQkFBUSxRQUFRLENBQUM7QUFDakIseUJBQWU7QUFBQSxRQUNuQixDQUFDO0FBRUQsY0FBTSxVQUFVLFFBQVE7QUFFeEIsZUFBTyxRQUFRO0FBRWYsYUFBSyxLQUFLLE9BQU87QUFFakIsZ0JBQVEsVUFBVTtBQUFBLE1BQ3RCO0FBQUEsTUFFQSxLQUFLLFNBQTBDO0FBRTNDLFlBQUksQ0FBQyxRQUFRO0FBQ1Qsa0JBQVEsU0FBUyxLQUFLO0FBRTFCLFlBQUksQ0FBQyxRQUFRO0FBQ1Qsa0JBQVEsY0FBYyxLQUFLO0FBRS9CLGdCQUFRLFlBQVksaUJBQWlCO0FBRXJDLFlBQUk7QUFJSixZQUFJLFFBQVEsU0FBUztBQUNqQixnQkFBTSxlQUFnQjtBQUN0QiwyQkFBaUIsS0FBSyxTQUFTLGFBQWEsaUJBQWlCLENBQUMsUUFBK0I7QUFDekYsbUJBQU8sSUFBSSxvQkFBb0IsYUFBYTtBQUFBLFVBQ2hELEdBQUcsYUFBYSxPQUFPO0FBR3ZCLGlCQUFPLFFBQVE7QUFBQSxRQUNuQjtBQUdBLFlBQUksUUFBUSxLQUFLO0FBRWIsa0JBQVEsTUFBTSxRQUFRLElBQUksZ0JBQWdCLFFBQVE7QUFBQSxRQUN0RDtBQUVBLFlBQUksUUFBUSxXQUFXO0FBQ25CLGlCQUFPLE1BQU07QUFDVCxpQkFBSyxtQkFBbUIsSUFBSSxlQUFlLFFBQVEsSUFBSSxDQUFDLFdBQVc7QUFBQSxZQUVuRSxDQUFDLENBQUM7QUFFRixnQkFBSSxnQkFBZ0I7QUFDaEIsNkJBQWU7QUFBQSxZQUNuQjtBQUFBLFVBQ0o7QUFBQSxRQUNKLE9BQU87QUFDSCxpQkFBTyxNQUFNO0FBQUEsVUFDYjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUE7QUFBQTtBQUFBLE1BSVEscUJBQTJCO0FBQy9CLGNBQU0sb0JBQW9CLEtBQUssZ0JBQWdCLFdBQVc7QUFDMUQsWUFBSSxtQkFBbUI7QUFDbkIsNEJBQWtCLFFBQVEsb0JBQWtCO0FBRXhDLDJCQUFlLElBQUk7QUFBQSxVQUN2QixDQUFDO0FBQUEsUUFDTDtBQUFBLE1BQ0o7QUFBQSxNQUVBLFVBQWdCO0FBQ1osYUFBSyxvQkFBb0I7QUFFekIsWUFBSSxDQUFDLEtBQUssYUFBYTtBQWtCbkIsZUFBSyxtQkFBbUI7QUFDeEIsZUFBSyxrQkFBa0IsQ0FBQztBQUN4QixlQUFLLE1BQU07QUFDWDtBQUFBLFFBQ0o7QUFDQSxnQkFBUSxJQUFJLHVCQUF1QixLQUFLLEVBQUU7QUFVMUMsYUFBSyxLQUFLLElBQUksZUFBZSxDQUFDO0FBRTlCLGFBQUssbUJBQW1CO0FBSXhCLGFBQUssa0JBQWtCLENBQUM7QUFDeEIsYUFBSyxNQUFNO0FBQ1gsYUFBSyxjQUFjO0FBQUEsTUFDdkI7QUFBQSxJQUlKO0FBQUE7QUFBQTs7O0FDbmFBLElBcUJhO0FBckJiO0FBQUE7QUFBQTtBQXFCTyxJQUFNLGlCQUFOLE1BQTRDO0FBQUEsTUFDL0MsWUFBbUIsUUFDQSxhQUNBLGNBQ0EsV0FDQSxZQUFxQjtBQUpyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSW5CLDRCQUFnQixRQUFlO0FBQUEsTUFGL0I7QUFBQSxJQUdKO0FBQUE7QUFBQTs7O0FDL0JBLElBTWEsb0JBMEJTLG9CQVlBO0FBNUN0QjtBQUFBO0FBQUE7QUFNTyxJQUFNLHFCQUFxQixDQUFPLFNBQWtDO0FBQ3ZFLFVBQUksT0FBTyxTQUFTLFlBQVk7QUFFNUIsYUFBSztBQUFBLE1BQ1QsV0FBVyxnQkFBZ0IsU0FBUztBQUVoQyxjQUFNLFNBQVMsTUFBTTtBQUVyQixZQUFJLE9BQU8sV0FBVyxZQUFZO0FBRTlCLGlCQUFPO0FBQUEsUUFDWDtBQUFBLE1BQ0o7QUFBQSxJQUVKO0FBWU8sSUFBZSxxQkFBZixNQUFpRztBQUFBO0FBQUEsTUFJcEcsWUFBbUIsZUFBcUY7QUFBckY7QUFBQSxNQUVuQjtBQUFBLElBSUo7QUFFTyxJQUFlLDRCQUFmLGNBQTJGLG1CQUFzQjtBQUFBLE1BQ3BILFlBQW1CLGVBQTRGLFNBQWE7QUFDeEgsY0FBTSxhQUFhO0FBREo7QUFBNEY7QUFBQSxNQUUvRztBQUFBLElBQ0o7QUFBQTtBQUFBOzs7QUNoREEsSUFZYSxpQkE4QlM7QUExQ3RCO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQVNPLElBQU0sa0JBQU4sTUFBK0I7QUFBQTtBQUFBLE1BT2xDLFlBQW1CLElBQW1CLFNBQWE7QUFBaEM7QUFBbUI7QUFOdEMsb0NBQU8sQ0FBQyxZQUE2QjtBQUFBLFFBRXJDO0FBQUEsTUFNQTtBQUFBLElBQ0o7QUFvQk8sSUFBZSxjQUFmLE1BQStDO0FBQUEsTUFBL0M7QUFNSCx3REFBOEMsQ0FBQztBQUUvQywwQ0FBOEMsQ0FBQztBQUUvQyx5REFBcUM7QUFFckMsbURBQWdHLENBQUM7QUFBQTtBQUFBLE1BRWpHLHFCQUFxQixPQUFZO0FBQzdCLGNBQU0sZUFBZSxNQUFNLE9BQU8sTUFBTSxPQUFPLE1BQU07QUFFckQsWUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsTUFBTTtBQUVyQztBQUFBLFFBQ0osT0FBTztBQUNILGNBQUksVUFBVTtBQUVkLGNBQUksUUFBUSxjQUFjLGlCQUFpQixNQUFNO0FBRTdDO0FBQUEsVUFDSjtBQVNBLGNBQUksUUFBUSxnQkFBZ0IsYUFBYSxnQkFBZ0I7QUFJckQsZ0JBQUksUUFBUTtBQUNSLHFCQUFPLEtBQUssV0FBVyxRQUFRLFdBQVc7QUFDOUM7QUFBQSxVQUNKO0FBR0EsY0FBSSxRQUFRLGdCQUFnQixhQUFhLGFBQWE7QUFHbEQsa0JBQU0saUJBQWtCLFFBQXdCLFFBQVE7QUFFeEQsZ0JBQUksS0FBSyxXQUFXLGNBQWMsR0FBRztBQUdqQztBQUFBLFlBQ0o7QUFFQSxpQkFBSyxXQUFXLGNBQWMsSUFBSSxJQUFJLGdCQUFnQixjQUFjO0FBQ3BFLGlCQUFLLGNBQWMsSUFBSSxhQUFhLGNBQWMsQ0FBQztBQUduRDtBQUFBLFVBQ0o7QUFJQSxjQUFJLFFBQVEsZ0JBQWdCLGFBQWEsa0JBQWtCO0FBQ3ZELGtCQUFNLG1CQUFvQjtBQUMxQixrQkFBTSxlQUFlLGlCQUFpQjtBQUN0QyxzQkFBVTtBQUVWLGdCQUFJLEtBQUssNkJBQTZCLEtBQUssV0FBVyxRQUFRLFdBQVksR0FBRztBQUV6RSxvQkFBTSx1QkFBdUIsS0FBSyxRQUFRLFdBQVcsS0FBSyxPQUFLLEVBQUUsT0FBTyxhQUFhLFdBQVc7QUFDaEcsa0JBQUksc0JBQXNCO0FBQ3RCLHFDQUFxQixLQUFLLFlBQVk7QUFDdEM7QUFBQSxjQUNKO0FBR0Esb0JBQU0sZ0NBQWdDLEtBQUssUUFBUSxXQUFXLEtBQUssT0FBSyxFQUFFLE9BQU8saUJBQWlCLFdBQVc7QUFDN0csa0JBQUksK0JBQStCO0FBQy9CLDhDQUE4QixLQUFLLFlBQVk7QUFDL0M7QUFBQSxjQUNKO0FBQUEsWUFDSixPQUFPO0FBQ0g7QUFBQSxZQUNKO0FBQUEsVUFDSjtBQU1BLGNBQUksUUFBUSxhQUFhO0FBRXJCLGdCQUFJLFFBQVEsZ0JBQWdCLGFBQWEsZ0JBQWdCO0FBQ3JELG9CQUFNLGVBQWU7QUFDckIsb0JBQU0sVUFBVSxLQUFLLG9CQUFvQixhQUFhLG1CQUFtQjtBQUV6RSxvQkFBTSxpQkFBaUIsSUFBSSxxQkFBcUIsQ0FBQyxDQUFDLE9BQU87QUFDekQsNkJBQWUsY0FBYyxRQUFRO0FBRXJDLGtCQUFJLENBQUMsQ0FBQyxTQUFTO0FBQ1gsdUJBQU8sS0FBSyxvQkFBb0IsYUFBYSxtQkFBbUI7QUFDaEUsbUNBQW1CLE9BQU8sRUFBRSxLQUFLLE1BQU07QUFDbkMsdUJBQUssY0FBYyxnQkFBZ0IsWUFBWTtBQUFBLGdCQUNuRCxDQUFDLEVBQUUsTUFBTSxNQUFNO0FBQUEsZ0JBRWYsQ0FBQztBQUFBLGNBQ0wsT0FBTztBQUNILHFCQUFLLGNBQWMsZ0JBQWdCLFlBQVk7QUFBQSxjQUNuRDtBQUNBO0FBQUEsWUFDSjtBQUVBLGdCQUFJLHFCQUFxQjtBQUV6QixpQkFBSyxrQkFBa0IsUUFBUSxhQUFXO0FBQ3RDLGtCQUFJLFFBQVEsZ0JBQWdCLFFBQVEsYUFBYTtBQUM3QyxxQ0FBcUI7QUFDckIsc0JBQU0sVUFBVSxRQUFRLFNBQVMsT0FBTztBQUV4QyxvQkFBSSxRQUFRLGFBQWEsU0FBUztBQUM5Qix1QkFBSyxvQkFBb0IsUUFBUSxFQUFFLElBQUk7QUFBQSxnQkFDM0M7QUFFQSxvQkFBSSxXQUFXLENBQUMsUUFBUSxXQUFXO0FBQy9CLHdCQUFNLElBQUksTUFBTTtBQUFBLGdCQUM1QixRQUFRLFdBQVcsNEJBQTRCLFFBQVEsUUFBUTtBQUFBO0FBQUE7QUFBQSw2SEFHOEM7QUFBQSxnQkFDckc7QUFFQSxvQkFBSSxDQUFDLFdBQVcsUUFBUSxXQUFXO0FBQy9CLHdCQUFNLElBQUksTUFBTTtBQUFBLGdCQUM1QixRQUFRLFdBQVcsNEJBQTRCLFFBQVEsUUFBUTtBQUFBO0FBQUE7QUFBQSw2SEFHOEM7QUFBQSxnQkFDckc7QUFBQSxjQUNKO0FBQUEsWUFDSixDQUFDO0FBRUQsZ0JBQUksQ0FBQyxvQkFBb0I7QUFBQSxZQUd6QjtBQUFBLFVBQ0osT0FBTztBQUNILG9CQUFRLElBQUksMEJBQTBCO0FBQUEsVUFDMUM7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBR0o7QUFBQTtBQUFBOzs7QUNyTUEsSUFZYSxhQWlDQSxvQkFxSEEseUJBbUNBLGlCQXFNQSxtQkFpRUEsaUJBb0VBO0FBL2dCYjtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFRTyxJQUFNLGNBQWM7QUFBQSxNQUN2QixnQkFBZ0I7QUFBQSxNQUNoQixzQkFBc0I7QUFBQSxNQUN0QixjQUFjO0FBQUEsTUFDZCxtQkFBbUI7QUFBQSxJQUN2QjtBQTRCTyxJQUFNLHFCQUFxQjtBQUFBLE1BQzlCLFFBQVE7QUFBQSxNQUNSLFVBQVU7QUFBQSxNQUNWLFFBQVE7QUFBQSxNQUNSLGNBQWM7QUFBQSxJQUNsQjtBQWdITyxJQUFNLDBCQUEwQjtBQUFBLE1BQ25DLFdBQVc7QUFBQSxNQUNYLFFBQVE7QUFBQSxJQUNaO0FBZ0NPLElBQU0sa0JBQU4sTUFBc0I7QUFBQSxJQUc3QjtBQUZJLGtCQURTLGlCQUNGLFFBQU87QUFDZCxrQkFGUyxpQkFFRixhQUFZO0FBbU1oQixJQUFNLG9CQUFvQjtBQUFBLE1BQzdCLGFBQWE7QUFBQSxNQUNiLGFBQWE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQVFiLFdBQVc7QUFBQSxJQUNmO0FBc0RPLElBQU0sa0JBQWtCO0FBQUEsTUFDM0IsV0FBVztBQUFBLE1BQ1gsU0FBUztBQUFBLE1BQ1QsTUFBTTtBQUFBLElBQ1Y7QUFnRU8sSUFBTSxVQUFOLE1BQWM7QUFBQSxNQUNqQixZQUFtQixXQUErQixZQUF5QjtBQUF4RDtBQUErQjtBQUlsRCwwQ0FBYSxNQUFNO0FBQ2Ysa0JBQVEsS0FBSyxjQUFjLEtBQUssV0FBVyxjQUFjLEtBQUs7QUFBQSxRQUNsRTtBQUVBLHVDQUFVLE1BQU07QUFDWixpQkFBUSxLQUFLLGNBQWMsS0FBSztBQUFBLFFBQ3BDO0FBQUEsTUFSQTtBQUFBLElBU0o7QUFBQTtBQUFBOzs7QUMzaEJBLElBT00sYUFJQSxZQUlPLHdCQW9DQTtBQW5EYjtBQUFBO0FBQUE7QUFPQSxJQUFNLGNBQWMsQ0FBQyxVQUFVO0FBQzNCLGFBQU8sVUFBVSxPQUFPLEtBQUs7QUFBQSxJQUNqQztBQUVBLElBQU0sYUFBYSxDQUFDLFVBQVU7QUFDMUIsYUFBTyxPQUFPLFVBQVU7QUFBQSxJQUM1QjtBQUVPLElBQU0seUJBQXlCLENBQUMsUUFBUTtBQUMzQyxVQUFJLFlBQVksR0FBRyxHQUFHO0FBQ2xCLGVBQU87QUFBQSxNQUNYO0FBRUEsVUFBSSxXQUFXLEdBQUcsR0FBRztBQUNqQixlQUFPO0FBQUEsTUFDWDtBQUVBLFVBQUksT0FBTyxlQUFlLEdBQUcsR0FBRztBQUM1QixlQUFPO0FBQUEsTUFDWDtBQUVBLGlCQUFXLE9BQU8sS0FBSztBQUNuQixjQUFNLFFBQVEsSUFBSSxHQUFHO0FBQ3JCLFlBQUksT0FBTyxVQUFVLFVBQVU7QUFFM0IsY0FBSSxDQUFDLHVCQUF1QixLQUFLLEdBQUc7QUFDaEMsbUJBQU87QUFBQSxVQUNYO0FBQUEsUUFDSixXQUFXLFlBQVksS0FBSyxHQUFHO0FBQzNCO0FBQUEsUUFDSixPQUFPO0FBQ0gsaUJBQU87QUFBQSxRQUNYO0FBQUEsTUFDSjtBQUVBLGFBQU87QUFBQSxJQUNYO0FBUU8sSUFBTSxtQkFBbUIsQ0FDNUIsS0FDQSxXQUFvQyxDQUFDLEdBQ3JDLG1CQUE0QixNQUM1QkMsUUFBMkMsb0JBQUksUUFBUSxNQUNyQztBQUVsQixVQUFJLFlBQVksR0FBRyxHQUFHO0FBQ2xCLGVBQU87QUFBQSxNQUNYO0FBRUEsVUFBSSxNQUFNLFFBQVEsR0FBRyxHQUFHO0FBQ3BCLFlBQUlBLE1BQUssSUFBSSxHQUFHLEdBQUc7QUFDZixpQkFBT0EsTUFBSyxJQUFJLEdBQUc7QUFBQSxRQUN2QjtBQUdBLGNBQU0sb0JBQXlDLENBQUM7QUFDaEQsUUFBQUEsTUFBSyxJQUFJLEtBQUssaUJBQWlCO0FBRS9CLGlCQUFTLFFBQVEsR0FBRyxRQUFRLElBQUksUUFBUSxTQUFTO0FBQzdDLGdCQUFNLFVBQVUsSUFBSSxLQUFLO0FBQ3pCLDRCQUFrQixLQUFLLElBQUksaUJBQWlCLFNBQVMsVUFBVSxrQkFBa0JBLEtBQUk7QUFBQSxRQUN6RjtBQUNBLGVBQU87QUFBQSxNQUNYO0FBRUEsVUFBSSxRQUFRLFFBQVEsT0FBTyxRQUFRLFVBQVU7QUFFekMsWUFBSUEsTUFBSyxJQUFJLEdBQUcsR0FBRztBQUNmLGlCQUFPQSxNQUFLLElBQUksR0FBRztBQUFBLFFBQ3ZCO0FBQ0EsY0FBTSxxQkFBK0MsQ0FBQztBQUN0RCxRQUFBQSxNQUFLLElBQUksS0FBSyxrQkFBa0I7QUFFaEMsbUJBQVcsT0FBTyxLQUFLO0FBR25CLGdCQUFNLGdCQUFnQixPQUFPLFlBQVksWUFBWSxXQUFXLFNBQVMsR0FBRztBQUU1RSxjQUFJLGVBQWU7QUFDZixnQkFBSSxrQkFBa0IsTUFBTTtBQUV4QixrQkFBSSxtQkFBbUIsSUFBSSxHQUFHLE1BQU0sU0FBWSxJQUFJLEdBQUcsR0FBRztBQUV0RCxtQ0FBbUIsR0FBRyxJQUFJLGlCQUFpQixJQUFJLEdBQUcsR0FBRyxNQUFNLGtCQUFrQkEsS0FBSTtBQUFBLGNBQ3JGO0FBQUEsWUFDSixXQUFXLE9BQU8sa0JBQWtCLFVBQVU7QUFHMUMsaUNBQW1CLEdBQUcsSUFBSSxpQkFBaUIsSUFBSSxHQUFHLEdBQUcsZUFBZSxrQkFBa0JBLEtBQUk7QUFBQSxZQUM5RjtBQUFBLFVBQ0o7QUFBQSxRQUNKO0FBQ0EsZUFBTztBQUFBLE1BQ1g7QUFFQSxhQUFPLENBQUM7QUFBQSxJQUNaO0FBQUE7QUFBQTs7O0FDN0dBLElBQWE7QUFBYjtBQUFBO0FBQUE7QUFBTyxJQUFNLFNBQVM7QUFBQSxNQUNsQix3QkFBd0IsQ0FBQyxNQUFNLFFBQVE7QUFDbkMsY0FBTSxJQUFJLE1BQU07QUFBQSx5QkFDQyxLQUFLLFNBQVMsQ0FBQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVl0QyxHQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUEsa0VBSTZELEtBQUssU0FBUyxDQUFDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsQ0FhaEY7QUFBQSxNQUNHO0FBQUEsSUFDSjtBQUFBO0FBQUE7OztBQ2xDQSxJQU1hO0FBTmI7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBR08sSUFBTSxtQkFBTixjQUErQixrQkFBa0I7QUFBQSxNQUVwRCxZQUFtQixxQkFBd0QsUUFBd0IsU0FBeUI7QUFFeEgsY0FBTSxxQkFBcUIsT0FBTyxXQUFXLE9BQU87QUFGckM7QUFBd0Q7QUF3QzNFLG9DQUFPLENBQUMsWUFBNkI7QUFHakMsZ0JBQU0sVUFBVSxRQUFRO0FBQ3hCLGdCQUFNLGlCQUFpQixNQUFNLEtBQUssT0FBTztBQUd6QyxlQUFLLE9BQU8sS0FBSyxJQUFJLGlCQUFpQixLQUFLLElBQUksT0FBTyxDQUFDO0FBR3ZELGtCQUFRLFVBQVU7QUFDbEIsaUJBQU87QUFBQSxRQUNYO0FBRUEsdUNBQVUsTUFBTTtBQUNaLGNBQUksS0FBSztBQUNMLGlCQUFLLEtBQUssSUFBSSx1QkFBdUIsU0FBUyxDQUFDO0FBQ25ELGdCQUFNLFFBQVE7QUFBQSxRQUNsQjtBQUFBLE1BdkRBO0FBQUEsTUFFQSxPQUFPO0FBRUgsYUFBSyxLQUFLLElBQUksdUJBQXVCLE1BQU0sQ0FBQztBQUFBLE1BQ2hEO0FBQUEsTUFFQSxPQUFPO0FBQ0gsYUFBSyxLQUFLLElBQUksdUJBQXVCLE1BQU0sQ0FBQztBQUFBLE1BQ2hEO0FBQUEsTUFFQSxVQUFVO0FBR04sZUFBTyxLQUFLLEtBQUssSUFBSSx1QkFBdUIsU0FBUyxDQUFDO0FBQUEsTUFDMUQ7QUFBQSxNQUVBLGtDQUFrQztBQUU5QixhQUFLLEtBQUssSUFBSSx1QkFBdUIsaUNBQWlDLENBQUM7QUFBQSxNQUMzRTtBQUFBLE1BRUEsK0JBQStCO0FBRTNCLGFBQUssS0FBSyxJQUFJLHVCQUF1Qiw4QkFBOEIsQ0FBQztBQUFBLE1BQ3hFO0FBQUEsTUFFQSxrQkFBa0IsZUFBeUM7QUFNdkQsZUFBTyxNQUFNLGtCQUFrQixhQUFhO0FBQUEsTUFDaEQ7QUFBQSxJQXNCSjtBQUFBO0FBQUE7OztBQ25FQSxJQWFhO0FBYmI7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQVVPLElBQU0sNEJBQU4sY0FBd0Msa0JBQWtCO0FBQUEsTUFtQjdELFlBQ0kscUJBQ0EsTUFDTyxXQUNDLGVBQ0EsU0FDUixTQUNGO0FBQ0UsY0FBTSxxQkFBcUIsV0FBVyxPQUFPO0FBTHRDO0FBQ0M7QUFDQTtBQXZCWiw0QkFBUTtBQUNSLDRCQUFRO0FBQ1IsNEJBQVEsYUFBdUQsQ0FBQztBQU1oRTtBQUFBO0FBQUE7QUFBQTtBQUFBLDRCQUFRLGdCQUFlLENBQUMsTUFBYTtBQUNqQyxnQkFBTSxTQUFVLEVBQWtCO0FBQ2xDLGNBQUksRUFBQyxpQ0FBUSxRQUFRO0FBQ3JCLGNBQUksS0FBSyxlQUFlLENBQUMsS0FBSyxtQkFBbUI7QUFDN0MsaUJBQUssWUFBWSxPQUFPLFFBQVEsT0FBTyxPQUFPO0FBQUEsVUFDbEQsV0FBVyxDQUFDLEtBQUssYUFBYTtBQUMxQixpQkFBSyxVQUFVLEtBQUssRUFBRSxRQUFRLE9BQU8sUUFBUSxTQUFTLE9BQU8sUUFBUSxDQUFDO0FBQUEsVUFDMUU7QUFBQSxRQUNKO0FBcUJBLDRCQUFRO0FBdUJSO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLCtDQUFrQixDQUFDLFlBQThDO0FBQzdELGVBQUssbUJBQW1CO0FBQ3hCLGdCQUFNLEtBQUssS0FBSztBQUVoQixjQUFJO0FBQ0EsZ0JBQUksaUJBQWlCLEVBQUUsRUFBRSxZQUFZLFNBQVUsSUFBRyxNQUFNLFVBQVU7QUFBQSxVQUN0RSxTQUFRO0FBQUEsVUFBNEU7QUFFcEYsZ0JBQU0sUUFBUSxDQUFDLE1BQXVEO0FBQ2xFLGdCQUFJLE1BQU0sT0FBVyxRQUFPO0FBQzVCLGdCQUFJLE9BQU8sTUFBTSxTQUFVLFFBQU87QUFDbEMsa0JBQU0sSUFBSSxXQUFXLENBQUM7QUFDdEIsbUJBQU8sTUFBTSxDQUFDLElBQUksU0FBWTtBQUFBLFVBQ2xDO0FBQ0EsZ0JBQU0sUUFBUSxDQUFDLEdBQVcsS0FBYyxRQUNwQyxRQUFRLFVBQWEsSUFBSSxNQUFNLE1BQU8sUUFBUSxVQUFhLElBQUksTUFBTSxNQUFNO0FBRS9FLGdCQUFNLFNBQVMsTUFBTTtBQTNGN0IsZ0JBQUFDO0FBNEZZLGtCQUFNLE9BQU8sS0FBSztBQUNsQixrQkFBTSxPQUFPLEdBQUcsc0JBQXNCO0FBQ3RDLGtCQUFNLGNBQWEsNkJBQU0sb0JBQW1CO0FBQzVDLGFBQUFBLE1BQUEsNkJBQU0saUJBQU4sZ0JBQUFBLElBQUEsV0FBcUI7QUFBQSxjQUNqQixPQUFPLEtBQUs7QUFBQSxjQUNaLFFBQVEsYUFDRixNQUFNLEtBQUssUUFBUSxNQUFNLDZCQUFNLFNBQVMsR0FBRyxNQUFNLDZCQUFNLFNBQVMsQ0FBQyxJQUNqRSxLQUFLO0FBQUEsY0FDWCxpQkFBaUI7QUFBQTtBQUFBLGNBQ2pCLGtCQUFrQjtBQUFBLFlBQ3RCO0FBQUEsVUFDSjtBQUVBLGNBQUk7QUFDSixjQUFJO0FBQ0EsaUJBQUssSUFBSSxlQUFlLE1BQU0sT0FBTyxDQUFDO0FBQ3RDLGVBQUcsUUFBUSxFQUFFO0FBQUEsVUFDakIsU0FBUTtBQUFBLFVBQTZFO0FBSXJGLGlCQUFPO0FBRVAsaUJBQU8sTUFBTTtBQUFFLHFDQUFJO0FBQWMsaUJBQUssbUJBQW1CO0FBQUEsVUFBVztBQUFBLFFBQ3hFO0FBRUEsOENBQWlDLE1BQU07QUFBQSxRQUFDO0FBcUV4QztBQUFBO0FBQUE7QUFBQTtBQUFBLG9DQUFPLENBQUMsWUFBa0M7QUFHdEMsZ0JBQU0saUJBQWlCLE1BQU0sS0FBSyxPQUFPO0FBR3pDLGtCQUFRLE1BQU0scUZBQXFGLE9BQU87QUFFMUcsaUJBQU87QUFBQSxRQUNYO0FBRUEsdUNBQVUsTUFBTTtBQXRNcEIsY0FBQUE7QUF1TVEsY0FBSSxLQUFLLFlBQVk7QUFDakIsaUJBQUssV0FBVztBQUFBLFVBQ3BCO0FBQ0EsZ0JBQU0sUUFBUTtBQUNkLFdBQUFBLE1BQUEsS0FBSyxjQUFjLGVBQW5CLGdCQUFBQSxJQUErQixZQUFZLEtBQUs7QUFBQSxRQUNwRDtBQW5LSSxhQUFLLFVBQVU7QUFHZixhQUFLLGNBQWMsaUJBQWlCLFlBQVksS0FBSyxZQUFZO0FBQ2pFLGFBQUssYUFBYSxNQUFNLEtBQUssY0FBYyxvQkFBb0IsWUFBWSxLQUFLLFlBQVk7QUFHNUYsYUFBSyxhQUFhO0FBQUEsTUFDdEI7QUFBQSxNQXVFQSxVQUFVO0FBQ04sYUFBSyxpQkFBaUIsY0FBYyxLQUFLLElBQUksNkJBQTZCLEdBQUcsS0FBSyxXQUFXLEtBQUssZUFBZSxLQUFLLG1CQUFtQjtBQUN6SSxlQUFPLEtBQUs7QUFBQSxNQUNoQjtBQUFBLE1BRUEsT0FBTztBQUNILGFBQUssY0FBYyxNQUFNLFVBQVU7QUFDbkMsYUFBSyxjQUFjLE1BQU0sV0FBVztBQUNwQyxhQUFLLGNBQWMsTUFBTSxnQkFBZ0I7QUFDekMsYUFBSyxjQUFjLE1BQU0sYUFBYTtBQUN0QyxhQUFLLGNBQWMsTUFBTSxTQUFTO0FBQ2xDLGFBQUssY0FBYyxNQUFNLFFBQVE7QUFBQSxNQUNyQztBQUFBLE1BRUEsT0FBTztBQUNILGFBQUssY0FBYyxNQUFNLFVBQVU7QUFDbkMsYUFBSyxjQUFjLE1BQU0sV0FBVztBQUNwQyxhQUFLLGNBQWMsTUFBTSxnQkFBZ0I7QUFDekMsYUFBSyxjQUFjLE1BQU0sYUFBYTtBQUN0QyxhQUFLLGNBQWMsTUFBTSxTQUFTO0FBQ2xDLGFBQUssY0FBYyxNQUFNLFFBQVE7QUFBQSxNQUNyQztBQUFBO0FBQUE7QUFBQTtBQUFBLE1BS0EsYUFBYSxNQUFxQjtBQUM5QixZQUFJLE9BQVEsS0FBSyxjQUFzQix3QkFBd0IsWUFBWTtBQUN2RSxVQUFDLEtBQUssY0FBc0Isb0JBQW9CLElBQUk7QUFBQSxRQUN4RDtBQUFBLE1BQ0o7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQUtBLFVBQW1CO0FBQ2YsWUFBSSxPQUFRLEtBQUssY0FBc0Isd0JBQXdCLFlBQVk7QUFDdkUsaUJBQVEsS0FBSyxjQUFzQixvQkFBb0I7QUFBQSxRQUMzRDtBQUNBLGVBQU87QUFBQSxNQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQU1BLGNBQWMsU0FBMkQ7QUFJckUsYUFBSyxjQUFjO0FBRW5CLFlBQUksS0FBSyxVQUFVLFNBQVMsR0FBRztBQUMzQixnQkFBTSxRQUFRLENBQUMsR0FBRyxLQUFLLFNBQVM7QUFDaEMsZUFBSyxZQUFZLENBQUM7QUFDbEIsZ0JBQU0sUUFBUSxVQUFRO0FBQ2xCLGdCQUFJLENBQUMsS0FBSyxtQkFBbUI7QUFDekIsc0JBQVEsS0FBSyxRQUFRLEtBQUssT0FBTztBQUFBLFlBQ3JDO0FBQUEsVUFDSixDQUFDO0FBQUEsUUFDTDtBQUFBLE1BQ0o7QUFBQSxJQXdCSjtBQUFBO0FBQUE7OztBQzdNQSxJQW9CTSxrQkFnQk8sZUFxQlAsYUFpQkEsbUJBWU8sY0F1TUEsZ0JBMkVBLG9CQTZJQTtBQXJmYjtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0EsSUFBTSxtQkFBbUIsQ0FBQyxNQUFjLEtBQWEsOEJBQTBEO0FBQzNHLFlBQU0sVUFBVSxTQUFTLGNBQWMsR0FBRztBQUMxQyxjQUFRLGNBQWM7QUFDdEIsY0FBUSxNQUFNLFdBQVc7QUFDekIsY0FBUSxNQUFNLFVBQVU7QUFDeEIsY0FBUSxNQUFNLFdBQVc7QUFDekIsY0FBUSxNQUFNLEtBQUssSUFBSTtBQUN2QixjQUFRLE1BQU0sTUFBTSxHQUFHLEdBQUc7QUFFMUIsY0FBUSxNQUFNLFlBQVk7QUFDMUIsY0FBUSxTQUFTO0FBQ2pCLGNBQVEsT0FBTyxrREFBa0QsMEJBQTBCLEVBQUU7QUFFN0YsYUFBTztBQUFBLElBQ1g7QUFFTyxJQUFNLGdCQUFnQixDQUFDLElBQ0EsTUFDQSxLQUNBLFdBQ0Esa0JBQ0EsOEJBQ1Q7QUFJakIsWUFBTSxVQUFVLGlCQUFpQixHQUFHLDBCQUEwQixJQUFJLE1BQU0sSUFBSSxJQUFJLEtBQUsseUJBQXlCO0FBQzlHLGdCQUFVLGFBQWEsU0FBUyxnQkFBZ0I7QUFDaEQsdUJBQWlCLE1BQU0sU0FBUztBQUNoQyx1QkFBaUIsTUFBTSxVQUFVO0FBRWpDLGFBQU8sTUFBTTtBQUNULHlCQUFpQixNQUFNLFNBQVM7QUFDaEMsa0JBQVUsWUFBWSxPQUFPO0FBQUEsTUFDakM7QUFBQSxJQUNKO0FBRUEsSUFBTSxjQUFjLENBQUMsWUFBeUIsVUFBa0IsY0FBd0M7QUFDcEcsVUFBSSxDQUFDLFlBQVk7QUFFYixnQkFBUTtBQUFBO0FBQUEsVUFFSjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsYUFHYyxRQUFRO0FBQUEsYUFDUixVQUFVLG9CQUFvQixJQUFJLFNBQVMsVUFBVSxvQkFBb0IsRUFBRTtBQUFBO0FBQUEsbUdBQ1csVUFBVSxvQkFBb0IsRUFBRTtBQUFBLFFBQ3hJO0FBQ0EsZUFBTztBQUFBLE1BQ1g7QUFDQSxhQUFPO0FBQUEsSUFDWDtBQUVBLElBQU0sb0JBQW9CLENBQUMsWUFBeUIsVUFBa0IsY0FBd0M7QUFDMUcsY0FBUTtBQUFBLFFBQ0o7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxhQUljLFFBQVE7QUFBQSxhQUNSLFVBQVUsb0JBQW9CLElBQUksU0FBUyxVQUFVLG9CQUFvQixFQUFFO0FBQUE7QUFBQSxtR0FDVyxVQUFVLG9CQUFvQixFQUFFO0FBQUEsTUFDeEk7QUFBQSxJQUNKO0FBRU8sSUFBTSxlQUFlLENBQXFDLFdBQTJCLGFBQTRCLGlCQUE4QjtBQUVsSixZQUFNLFdBQVcsWUFBWSxPQUFPLENBQUMsZUFBZSxpQkFBaUI7QUFDakUsZUFBTyxpQ0FDQSxnQkFEQTtBQUFBLFVBRUgsQ0FBQyxhQUFhLElBQUksR0FBRyxtQkFBSTtBQUFBLFFBQzdCO0FBQUEsTUFDSixHQUFHLENBQUMsQ0FBQztBQUVMLFlBQU0sZUFBZTtBQUFBLFFBQ2pCLEtBQUssQ0FBQyxHQUFtQixTQUFpQjtBQUV0QyxnQkFBTSxhQUFhLFNBQVMsSUFBSTtBQUVoQyxjQUFJLFlBQVksWUFBWSxNQUFNLFNBQVMsR0FBRztBQUMxQyxtQkFBTztBQUFBLFVBQ1g7QUFFQSxjQUFJLFdBQVcsU0FBUyxTQUFTLHdCQUF3QixNQUFNO0FBRTNELGdCQUFJLHFCQUFxQiwyQkFBMkI7QUFDaEQsb0JBQU0sb0JBQW9CLFdBQVc7QUFDckMsb0JBQU0sV0FBVyxrQkFBa0IsU0FBUztBQUU1QyxrQkFBSSxhQUFhLHVCQUF1QjtBQUVwQyx1QkFBTyxDQUFDLFNBQW1CO0FBQ3ZCLHNCQUFJLFNBQVMsUUFBVztBQUNwQiwyQkFBTyxVQUFVLFFBQVE7QUFBQSxrQkFDN0I7QUFDQSw0QkFBVSxhQUFhLElBQUk7QUFBQSxnQkFDL0I7QUFBQSxjQUNKO0FBR0EscUJBQU87QUFBQSxZQUNYO0FBSUEsZ0JBQUkscUJBQXFCLHVCQUF1QixVQUFVLFVBQVU7QUFDaEUsb0JBQU0sb0JBQW9CLFdBQVc7QUFDckMsb0JBQU0sV0FBVyxrQkFBa0IsU0FBUztBQUM1QyxrQkFBSSxhQUFhLHVCQUF1QjtBQUNwQyx1QkFBTyxDQUFDLFNBQW1CO0FBQ3ZCLHNCQUFJLFNBQVMsT0FBVyxRQUFPLFVBQVUsUUFBUTtBQUNqRCw0QkFBVSxhQUFhLElBQUk7QUFBQSxnQkFDL0I7QUFBQSxjQUNKO0FBQ0EscUJBQU87QUFBQSxZQUNYO0FBR0EsZ0JBQUksYUFBYSxPQUFPLFNBQVMsWUFBWSxZQUFZO0FBQ3JELG9CQUFNLGNBQWMsYUFBYTtBQUNqQyxrQkFBSSxZQUFZLG1CQUFtQixtQkFBbUIsWUFBWTtBQUM5RCxzQkFBTSxvQkFBb0IsV0FBVztBQUVyQyx1QkFBTyxVQUFVLFFBQVEsY0FBYyxrQkFBa0IsU0FBUyxJQUFJO0FBQUEsY0FDMUU7QUFBQSxZQUNKO0FBRUEsOEJBQWtCLFlBQVksTUFBTSxTQUFTO0FBQzdDLG1CQUFPO0FBQUEsVUFDWDtBQUVBLGNBQUksV0FBVyxTQUFTLFVBQVU7QUFDOUIsbUJBQU8sSUFBSSxRQUFRLENBQUMsWUFBWTtBQUM1QixvQkFBTSxnQkFBdUIsQ0FBQztBQUU5QixrQkFBSSxXQUFXLFNBQVMsS0FBSztBQUN6Qiw4QkFBYyxLQUFLLElBQUksT0FBTyxXQUFXLFNBQVMsR0FBRyxDQUFDO0FBQUEsY0FDMUQ7QUFFQSw0QkFBYyxLQUFLLENBQUMsU0FBYztBQUM5Qix3QkFBUSxJQUFJO0FBQUEsY0FDaEIsQ0FBQztBQUVELGtCQUFJLFdBQVcsU0FBUyxRQUFRO0FBQzVCLDhCQUFjLEtBQUssR0FBRyxXQUFXLFNBQVMsTUFBTTtBQUFBLGNBQ3BEO0FBR0Esb0JBQU0sY0FBYyxpQkFBUyxXQUFXLFNBQVMsT0FBTztBQUV4RCx3QkFBVSxLQUFLLElBQUksWUFBWSxHQUFHLGFBQWEsQ0FBQztBQUFBLFlBQ3BELENBQUM7QUFBQSxVQUNMO0FBQ0EsaUJBQU87QUFBQSxRQUNYO0FBQUEsUUFDQSxLQUFLLENBQUMsR0FBbUIsTUFBYyxVQUFlO0FBRWxELGdCQUFNLGFBQWEsU0FBUyxJQUFJO0FBRWhDLGNBQUksWUFBWSxZQUFZLE1BQU0sU0FBUyxHQUFHO0FBQzFDLG1CQUFPO0FBQUEsVUFDWDtBQUVBLGNBQUksV0FBVyxTQUFTLFNBQVMsd0JBQXdCLE1BQU07QUFJM0QsZ0JBQUkscUJBQXFCLDJCQUEyQjtBQUNoRCxvQkFBTSxvQkFBb0IsV0FBVztBQUNyQyxvQkFBTSxXQUFXLGtCQUFrQixTQUFTO0FBRTVDLGtCQUFJLGFBQWEsb0JBQW9CO0FBQ2pDLDBCQUFVLGNBQWMsS0FBSztBQUM3Qix1QkFBTztBQUFBLGNBQ1g7QUFFQSxrQkFBSSxhQUFhLHVCQUF1QjtBQUNwQywwQkFBVSxhQUFhLEtBQUs7QUFDNUIsdUJBQU87QUFBQSxjQUNYO0FBQUEsWUFDSjtBQUdBLGdCQUFJLHFCQUFxQix1QkFBdUIsVUFBVSxVQUFVO0FBQ2hFLG9CQUFNLG9CQUFvQixXQUFXO0FBQ3JDLG9CQUFNLFdBQVcsa0JBQWtCLFNBQVM7QUFDNUMsa0JBQUksYUFBYSxvQkFBb0I7QUFBRSwwQkFBVSxjQUFjLEtBQUs7QUFBRyx1QkFBTztBQUFBLGNBQU07QUFDcEYsa0JBQUksYUFBYSx1QkFBdUI7QUFBRSwwQkFBVSxhQUFhLEtBQUs7QUFBRyx1QkFBTztBQUFBLGNBQU07QUFBQSxZQUMxRjtBQUdBLGdCQUFJLGFBQWEsT0FBTyxTQUFTLFlBQVksWUFBWTtBQUNyRCxvQkFBTSxjQUFjLGFBQWE7QUFDakMsa0JBQUksWUFBWSxtQkFBbUIsbUJBQW1CLFlBQVk7QUFDOUQsc0JBQU0sb0JBQW9CLFdBQVc7QUFDckMsc0JBQU0sZ0JBQWlCLFVBQVUsUUFBOEI7QUFDL0Qsc0JBQU0sV0FBVyxrQkFBa0IsU0FBUztBQUc1Qyw4QkFBYyxRQUFRLElBQUk7QUFHMUIsb0JBQUksYUFBYSxzQkFBc0IsY0FBYyxrQkFBa0I7QUFDbkUsd0JBQU0sUUFBUSxjQUFjO0FBQzVCLGdDQUFjLG1CQUFtQjtBQUNqQyx3QkFBTSxRQUFRLENBQUMsU0FBeUM7QUFFcEQsd0JBQUksVUFBVSxrQkFBbUI7QUFDakMsMEJBQU0sS0FBSyxRQUFRLEtBQUssT0FBTztBQUFBLGtCQUNuQyxDQUFDO0FBQUEsZ0JBQ0w7QUFFQSx1QkFBTztBQUFBLGNBQ1g7QUFBQSxZQUNKO0FBRUEsOEJBQWtCLFlBQVksTUFBTSxTQUFTO0FBQzdDLG1CQUFPO0FBQUEsVUFDWCxPQUFPO0FBRUgsZ0JBQUksV0FBVyxTQUFTLFNBQVM7QUFHN0Isa0JBQUksV0FBVyxTQUFTLFNBQVMsV0FBVztBQUN4QyxzQkFBTSxnQkFBdUIsQ0FBQztBQUU5QixvQkFBSSxXQUFXLFNBQVMsS0FBSztBQUN6QixnQ0FBYyxLQUFLLElBQUksT0FBTyxXQUFXLFNBQVMsR0FBRyxDQUFDO0FBQUEsZ0JBQzFEO0FBQ0EsOEJBQWMsS0FBSyxLQUFLO0FBQ3hCLG9CQUFJLFdBQVcsU0FBUyxRQUFRO0FBQzVCLGdDQUFjLEtBQUssR0FBRyxXQUFXLFNBQVMsTUFBTTtBQUFBLGdCQUNwRDtBQUdBLHNCQUFNLGNBQWMsaUJBQVMsV0FBVyxTQUFTLE9BQU87QUFDeEQsMEJBQVUsS0FBSyxJQUFJLFlBQVksR0FBRyxhQUFhLENBQUM7QUFDaEQsdUJBQU87QUFBQSxjQUNYLE9BQU87QUFDSCxzQkFBTSxJQUFJO0FBQUEsa0JBQ047QUFBQTtBQUFBO0FBQUEsYUFFYyxVQUFVLG9CQUFvQixJQUFJLFNBQVMsVUFBVSxvQkFBb0IsRUFBRTtBQUFBO0FBQUEsYUFDM0UsSUFBSTtBQUFBLGtCQUNDLFdBQVcsU0FBUyxJQUFJO0FBQUE7QUFBQTtBQUFBLGdCQUUvQztBQUVBLHVCQUFPO0FBQUEsY0FDWDtBQUFBLFlBQ0o7QUFBQSxVQUNKO0FBQ0EsaUJBQU87QUFBQSxRQUNYO0FBQUEsTUFDSjtBQUVBLGdCQUFVLFFBQVEsQ0FBQztBQUNuQixnQkFBVSxRQUFRLElBQUksTUFBTSxVQUFVLE9BQU8sWUFBWTtBQUV6RCxhQUFPO0FBQUEsSUFHWDtBQUVPLElBQU0saUJBQWlCLENBQUMsUUFBYSxjQUE4QjtBQUN0RSxhQUFPLElBQUksTUFBTSxRQUFRO0FBQUEsUUFDckIsSUFBSUMsU0FBUSxNQUFNO0FBT2QsY0FBSUEsUUFBTyxJQUFJLEdBQUc7QUFFZCxtQkFBT0EsUUFBTyxJQUFJO0FBQUEsVUFDdEI7QUFHQSxnQkFBTSxpQkFBaUIsSUFBSSxTQUFTO0FBQ2hDLG1CQUFPLElBQUksUUFBUSxDQUFDLFlBQVk7QUFDNUIsbUJBQUssUUFBUSxTQUFPO0FBQ2hCLG9CQUFJLENBQUMsdUJBQXVCLEdBQUcsR0FBRztBQUM5Qix5QkFBTyx1QkFBdUIsTUFBTSxHQUFHO0FBQUEsZ0JBQzNDO0FBQUEsY0FDSixDQUFDO0FBQ0Qsd0JBQVUsS0FBSyxJQUFJO0FBQUEsZ0JBQWlCLENBQUMsRUFBQyxLQUFLLFVBQVUsY0FBYyxrQkFBQUMsa0JBQWdCLE1BQU07QUFDakYsc0JBQUksS0FBSztBQUVMLDBCQUFNLFFBQVEsSUFBSSxRQUFRO0FBQzFCLHdCQUFJLE9BQU8sVUFBVSxZQUFZO0FBRTdCLDZCQUFPQSxrQkFBaUIsSUFBSSxRQUFRLEVBQUUsR0FBRyxZQUFZLEdBQUcsSUFBSTtBQUFBLG9CQUNoRSxPQUFPO0FBRUgsNkJBQU9BLGtCQUFpQixPQUFPLElBQUk7QUFBQSxvQkFDdkM7QUFBQSxrQkFDSjtBQUNBLHlCQUFPO0FBQUEsZ0JBQ1g7QUFBQSxnQkFDQTtBQUFBO0FBQUEsa0JBRUksV0FBV0QsUUFBTyxVQUFVO0FBQUEsa0JBQzVCLFVBQVU7QUFBQSxrQkFDVixjQUFjO0FBQUEsZ0JBQ2xCO0FBQUEsZ0JBQ0EsQ0FBQyxRQUFRO0FBQ0wsMEJBQVEsSUFBSSxPQUFPO0FBQUEsZ0JBQ3ZCO0FBQUEsY0FBQyxDQUFDO0FBQUEsWUFDVixDQUFDO0FBQUEsVUFDTDtBQUtBLGlCQUFPO0FBQUEsUUFHWDtBQUFBLFFBQ0EsSUFBSUEsU0FBUSxNQUFjLE9BQU87QUFDN0Isb0JBQVUsS0FBSyxJQUFJO0FBQUEsWUFBaUIsQ0FBQyxFQUFDLEtBQUssVUFBVSxVQUFTLE1BQU07QUFDNUQsa0JBQUk7QUFFQSxvQkFBSSxRQUFRLElBQUk7QUFBQSxZQUN4QjtBQUFBLFlBQ0E7QUFBQTtBQUFBLGNBRUksV0FBV0EsUUFBTyxVQUFVO0FBQUEsY0FDNUIsV0FBVztBQUFBLGNBQ1gsVUFBVTtBQUFBLFlBQ2Q7QUFBQSxZQUNBLENBQUMsUUFBUTtBQUFBLFlBRVQ7QUFBQSxVQUFDLENBQUM7QUFDTixpQkFBTztBQUFBLFFBQ1g7QUFBQSxNQUNKLENBQUM7QUFBQSxJQUNMO0FBRU8sSUFBTSxxQkFBcUIsQ0FBa0QsS0FBVSxpQkFBbUMsWUFBOEIsWUFBd0M7QUFDbk0sWUFBTSxZQUFZLElBQUk7QUFDdEIsVUFBSSxDQUFDO0FBQ0QsY0FBTSxJQUFJLE1BQU0sMkNBQTJDO0FBSS9ELGFBQU8sSUFBSSxRQUFRLENBQU8sU0FBUyxXQUFXO0FBQzFDLGNBQU0sZUFBZSxJQUFJLGlCQUFpQixnQkFBZ0IsTUFBTSxXQUFXLE9BQU87QUFDbEYsbUJBQVcsS0FBSyxZQUFZO0FBWTVCLGNBQU0sYUFBYSxNQUFNO0FBQ3JCLGdCQUFNLEtBQUssV0FBVyxRQUFRLFlBQVk7QUFDMUMsY0FBSSxPQUFPLEdBQUksWUFBVyxPQUFPLElBQUksQ0FBQztBQUFBLFFBQzFDO0FBSUEsY0FBTSxVQUFVLFVBQVU7QUFJMUIsY0FBTSxVQUFVLFdBQVcsTUFBTTtBQUU3QixxQkFBVztBQUNYLGlCQUFPLFNBQVM7QUFBQSxRQUNwQixHQUFHLEdBQUk7QUFFUCxrQkFBVSxLQUFLLElBQUk7QUFBQSxVQUEwQixJQUFJO0FBQUEsVUFDN0M7QUFBQSxVQUNBLGlDQUNPLFVBQVUsVUFBVSxDQUFDLElBRDVCO0FBQUEsWUFFSSxJQUFJLGFBQWE7QUFBQSxZQUNqQixZQUFZO0FBQUEsVUFDaEI7QUFBQSxVQUNBLENBQU8sWUFBWTtBQUdmLHlCQUFhLE9BQU87QUFFcEIsZ0JBQUksUUFBUSxRQUFRO0FBRWhCLHlCQUFXO0FBQ1gscUJBQU8sa0NBQWtDO0FBQ3pDO0FBQUEsWUFDSjtBQUVBLGtCQUFNLDBCQUEwQixXQUFXLEtBQUssT0FBSyxFQUFFLE1BQU0sYUFBYSxFQUFFO0FBRzVFLGdCQUFJLDJCQUEyQiw0QkFBNEIsY0FBYztBQVNyRSx5QkFBVztBQUVYLHdCQUFVLEtBQUssSUFBSSxVQUFVLElBQUksSUFBSTtBQUNyQyxzQkFBUSx1QkFBdUM7QUFDL0M7QUFBQSxZQUNKLE9BQU87QUFVSCwyQkFBYSxhQUFhO0FBQzFCLHdCQUFVLEtBQUssSUFBSSxVQUFVLElBQUksSUFBSTtBQUFBLFlBQ3pDO0FBbUJBLG9CQUFRLFdBQVcsUUFBUSxxQkFBbUI7QUFDMUMsb0JBQU0sNEJBQTRCLGdCQUFnQixTQUFTLHlCQUEwQixLQUFLLE9BQUssRUFBRSxLQUFLLE9BQU8sZ0JBQWdCLHFCQUFxQixFQUFHO0FBU3JKLG9CQUFNLGtCQUFrQixJQUFJLGlCQUFpQiwyQkFBMkIsWUFBWTtBQUNwRiw4QkFBZ0IsYUFBYTtBQUM3QiwyQkFBYSxLQUFLLGdCQUFnQixPQUFPLElBQUk7QUFDN0MseUJBQVcsS0FBSyxlQUFlO0FBQUEsWUFDbkMsQ0FBQztBQUdELGdCQUFJO0FBQ0Esb0JBQU0sWUFBWSxjQUFjLGlCQUFpQixZQUFZLElBQUk7QUFJakUsa0JBQUksVUFBVTtBQUVWLDBCQUFVLDZCQUE2QjtBQUUzQyxzQkFBUSxZQUE0QjtBQUFBLFlBQ3hDLFNBQVMsR0FBRztBQUVSLHFCQUFPLENBQUM7QUFBQSxZQUVaO0FBQUEsVUFDSjtBQUFBLFFBQUMsQ0FBQztBQUFBLE1BQ1YsRUFBQztBQUFBLElBQ0w7QUFFTyxJQUFNLGNBQWMsQ0FBTyxXQUEyQixpQkFBbUMsWUFBOEIsdUJBQWdDLFVBQVU7QUFFcEssVUFBSSxDQUFDLFVBQVU7QUFDWCxrQkFBVSxPQUFPLENBQUM7QUFFdEIsWUFBTSxVQUFVLE9BQU8sT0FBTyxVQUFVLG9CQUFvQixJQUFJLEVBQUUsSUFBSSxTQUFPO0FBQ3pFLGVBQU8sSUFBSSxRQUFjLENBQU8sU0FBUyxXQUFXO0FBM2Y1RCxjQUFBRTtBQTRmWSxjQUFJLElBQUksU0FBUyxRQUFRLGdCQUFnQixXQUFXO0FBR2hELGdCQUFJLHNCQUFzQjtBQUN0QixzQkFBUTtBQUNSO0FBQUEsWUFDSjtBQUlBLGdCQUFJLGlCQUFrQixJQUFJLFNBQW1DO0FBQzdELGdCQUFJLENBQUM7QUFDRCwrQkFBa0IsSUFBSSxTQUFtQyxTQUFTO0FBZXRFLGtCQUFNLHlCQUF3QkEsTUFBQSxnQkFBZ0IsU0FBUyw2QkFBekIsZ0JBQUFBLElBQW1ELEtBQUsscUJBQW1CLGdCQUFnQixLQUFLLE9BQU87QUFFckksZ0JBQUksQ0FBQyx1QkFBdUI7QUFDeEIsb0JBQU0sSUFBSSxNQUFNLGdGQUFnRjtBQUNoRztBQUFBLFlBQ0o7QUFnQkEsa0JBQU0sT0FBTyxJQUFJLE9BQU8sSUFBSSxLQUFLLFNBQVM7QUFFMUMsZ0JBQUk7QUFFQSxvQkFBTSxrQkFBa0IsTUFBTSxtQkFBbUIsTUFBTSx1QkFBd0IsVUFBVTtBQUl6Rix3QkFBVSxLQUFLLElBQUksSUFBSSxJQUFJO0FBRTNCLHNCQUFRO0FBQUEsWUFDWixTQUFTLEdBQUc7QUFDUixxQkFBTyxDQUFDO0FBQUEsWUFDWjtBQUFBLFVBQ0osT0FBTztBQUNILGdCQUFJO0FBQ0Esb0JBQU0sZUFBZSxJQUFJLE9BQU8sSUFBSSxLQUFLLFNBQVM7QUFDbEQsd0JBQVUsS0FBSyxJQUFJLElBQUksSUFBSSxlQUFlLGNBQWMsU0FBUztBQUNqRSxzQkFBUTtBQUFBLFlBQ1osU0FBUyxHQUFHO0FBQUEsWUFFWjtBQUFBLFVBQ0o7QUFBQSxRQUNKLEVBQUM7QUFBQSxNQUNMLENBQUM7QUFDRCxVQUFJO0FBQ0EsY0FBTSxRQUFRLElBQUksT0FBTztBQUFBLE1BQzdCLFNBQVMsR0FBRztBQUVSLGNBQU07QUFBQSxNQUNWO0FBQUEsSUFFSjtBQUFBO0FBQUE7OztBQzVrQkEsSUFXYTtBQVhiO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFNQTtBQUNBO0FBR08sSUFBTSxzQkFBTixjQUFrQyxrQkFBa0I7QUFBQTtBQUFBLE1BZ0J2RCxZQUFtQixpQkFBNkMsTUFBMEIsV0FBZ0MsZUFBa0MsU0FBeUI7QUFDakwsY0FBTSxpQkFBaUIsV0FBVyxPQUFPO0FBRDFCO0FBQXVFO0FBQWdDO0FBZDFILDRCQUFRO0FBQ1IsNEJBQVE7QUFDUiw0QkFBUTtBQUdSO0FBQUEsNEJBQU8sWUFBVztBQUNsQiw0QkFBUTtBQUNSO0FBQUEsNEJBQVE7QUFDUiw0QkFBUSxhQUF5RCxDQUFDO0FBQ2xFLDRCQUFRO0FBQ1IsNEJBQVE7QUFDUiw0QkFBUSxnQkFBZTtBQUN2QjtBQUFBLDRCQUFRO0FBYVI7QUFrRUE7QUE2QkEsK0RBQWtDLE1BQU07QUFDcEMsZ0JBQU0saUJBQWlCLEtBQUssS0FBSyxJQUFJLHFCQUFxQixNQUFNO0FBQzVELG1CQUFPLE9BQU8sU0FBUyxnQkFBZ0I7QUFBQSxVQUMzQyxHQUFHLENBQUMsUUFBUTtBQUNSLGlCQUFLLGNBQWMsTUFBTSxTQUFTLEdBQUcsSUFBSSxPQUFPO0FBQ2hELDJCQUFlO0FBQUEsVUFDbkIsQ0FBQyxDQUFDO0FBQUEsUUFDTjtBQUVBLGlFQUFvQyxNQUFNO0FBQ3RDLGdCQUFNLGlCQUFpQixLQUFLLEtBQUssSUFBSSxxQkFBcUIsQ0FBQyxFQUFDLEtBQUksTUFBTTtBQUNsRSxrQkFBTSxFQUFDLFFBQVEsTUFBSyxJQUFJLFNBQVMsZ0JBQWdCLHNCQUFzQjtBQUV2RSxrQkFBTSxXQUFXLElBQUksZUFBZSxNQUFNO0FBQ3RDLG9CQUFNLEVBQUMsUUFBQUMsU0FBUSxPQUFBQyxPQUFLLElBQUksU0FBUyxnQkFBZ0Isc0JBQXNCO0FBQ3ZFLG1CQUFLLEVBQUMsUUFBQUQsU0FBUSxPQUFBQyxPQUFLLENBQUM7QUFBQSxZQUN4QixDQUFDO0FBQ0QscUJBQVMsUUFBUSxTQUFTLGVBQWU7QUFDekMscUJBQVMsUUFBUSxTQUFTLElBQUk7QUFFOUIsbUJBQU8sRUFBQyxRQUFRLE1BQUs7QUFBQSxVQUN6QixHQUFHLENBQUMsUUFBUTtBQUNSLGlCQUFLLGNBQWMsTUFBTSxRQUFRLEdBQUcsSUFBSSxRQUFRLEtBQUs7QUFDckQsaUJBQUssY0FBYyxNQUFNLFNBQVMsR0FBRyxJQUFJLFFBQVEsTUFBTTtBQUFBLFVBQzNELENBQUMsQ0FBQztBQUVGLGlCQUFPO0FBQUEsUUFDWDtBQWFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSwrQ0FBa0IsQ0FBQyxZQUE4QztBQUU3RCxlQUFLLG1CQUFtQjtBQUl4QixjQUFJLEtBQUssVUFBVTtBQUNmLGlCQUFLLGVBQWU7QUFDcEIsaUJBQUssZUFBZTtBQUdwQixnQkFBSSxLQUFLLGFBQWMsTUFBSyxjQUFjLEtBQUssYUFBYSxRQUFRLEtBQUssYUFBYSxLQUFLO0FBQzNGLG1CQUFPLE1BQU07QUFBRSxtQkFBSyxlQUFlO0FBQU8sbUJBQUssZUFBZTtBQUFBLFlBQVc7QUFBQSxVQUM3RTtBQUdBLGNBQUksS0FBSyxvQkFBb0IsS0FBSyxpQkFBaUI7QUFDL0MsaUJBQUssZ0JBQWdCO0FBQ3JCLG1CQUFPLEtBQUs7QUFBQSxVQUNoQjtBQUVBLGdCQUFNLFNBQVMsS0FBSztBQUNwQixnQkFBTSxNQUFNLE9BQU87QUFFbkIsY0FBSSxDQUFDLEtBQUs7QUFFTixtQkFBTyxLQUFLLHVCQUF1QjtBQUFBLFVBQ3ZDO0FBRUEsZ0JBQU0sUUFBUSxDQUFDLE9BQWUsS0FBYyxRQUF5QjtBQUNqRSxnQkFBSSxRQUFRLFVBQWEsUUFBUSxJQUFLLFFBQU87QUFDN0MsZ0JBQUksUUFBUSxVQUFhLFFBQVEsSUFBSyxRQUFPO0FBQzdDLG1CQUFPO0FBQUEsVUFDWDtBQUdBLGdCQUFNLFlBQVksQ0FBQyxVQUEyRDtBQUMxRSxnQkFBSSxVQUFVLE9BQVcsUUFBTztBQUNoQyxnQkFBSSxPQUFPLFVBQVUsU0FBVSxRQUFPO0FBQ3RDLGtCQUFNLFNBQVMsV0FBVyxLQUFLO0FBQy9CLG1CQUFPLE1BQU0sTUFBTSxJQUFJLFNBQVk7QUFBQSxVQUN2QztBQUVBLGdCQUFNLGFBQWEsTUFBTTtBQXhOakMsZ0JBQUFDLEtBQUE7QUF5Tlksa0JBQU0sYUFBYSxPQUFPO0FBQzFCLGdCQUFJLENBQUMsV0FBWTtBQUVqQixrQkFBTSxPQUFPLEtBQUs7QUFFbEIsa0JBQU0sV0FBVyxVQUFVLDZCQUFNLFFBQVE7QUFDekMsa0JBQU0sV0FBVyxVQUFVLDZCQUFNLFFBQVE7QUFDekMsa0JBQU0sWUFBWSxVQUFVLDZCQUFNLFNBQVM7QUFDM0Msa0JBQU0sWUFBWSxVQUFVLDZCQUFNLFNBQVM7QUFDM0Msa0JBQU0sbUJBQWtCQSxNQUFBLDZCQUFNLG9CQUFOLE9BQUFBLE1BQXlCO0FBT2pELGtCQUFNLHNCQUFvQixVQUFLLGFBQUwsbUJBQWUsV0FBVSxTQUFTLFNBQVM7QUFDckUsa0JBQU0sdUJBQXFCLFVBQUssYUFBTCxtQkFBZSxZQUFXLFNBQVMsU0FBUztBQUN2RSxrQkFBTSx5QkFBd0Isd0NBQU0sa0JBQU4sWUFBdUIsc0JBQXZCLFlBQTRDO0FBQzFFLGtCQUFNLDBCQUF5QixrQ0FBTSxtQkFBTixZQUF3QjtBQUN2RCxrQkFBTSxtQkFBbUIsMEJBQTBCO0FBQ25ELGtCQUFNLG9CQUFvQiwyQkFBMkI7QUFHckQsa0JBQU0sZ0JBQWdCLEtBQUssVUFBVSxzQkFBc0I7QUFDM0Qsa0JBQU0saUJBQWlCLGNBQWMsVUFBVTtBQUUvQyxrQkFBTSxrQkFBa0IsY0FBYyxXQUFXLEtBQUssY0FBYyxXQUFXO0FBSy9FLGtCQUFNLG1CQUFrQiw2QkFBTSxpQkFDeEIsQ0FBQyxtQkFDQSxrQkFBa0IsQ0FBQztBQUMxQixrQkFBTSxvQkFBbUIsNkJBQU0saUJBQ3pCLENBQUMsb0JBQ0EsbUJBQW1CLENBQUM7QUFHM0IsZ0JBQUksQ0FBQyxtQkFBbUIsQ0FBQyxrQkFBa0I7QUFDdkMscUJBQU8sTUFBTSxRQUFRLE9BQU8sMEJBQTBCLFdBQVcsR0FBRyxxQkFBcUIsT0FBTztBQUNoRyxxQkFBTyxNQUFNLFNBQVMsT0FBTywyQkFBMkIsV0FBVyxHQUFHLHNCQUFzQixPQUFPO0FBRW5HLGlEQUFNLGlCQUFOLDhCQUFxQjtBQUFBLGdCQUNqQixPQUFPLE9BQU8sMEJBQTBCLFdBQVcsd0JBQXdCO0FBQUEsZ0JBQzNFLFFBQVEsT0FBTywyQkFBMkIsV0FBVyx5QkFBeUI7QUFBQSxnQkFDOUUsaUJBQWlCO0FBQUEsZ0JBQ2pCLGtCQUFrQjtBQUFBLGNBQ3RCO0FBQ0E7QUFBQSxZQUNKO0FBTUEsa0JBQU0saUJBQWlCLE9BQU8sTUFBTTtBQUNwQyxrQkFBTSxZQUFZLEtBQUs7QUFDdkIsa0JBQU0sMEJBQTBCLFVBQVUsTUFBTTtBQUNoRCxtQkFBTyxNQUFNLGFBQWE7QUFDMUIsc0JBQVUsTUFBTSxhQUFhO0FBSzdCLGtCQUFNLHNCQUFzQixPQUFPLHNCQUFzQixFQUFFO0FBQzNELGtCQUFNLHFCQUFxQixPQUFPLHNCQUFzQixFQUFFO0FBQzFELGtCQUFNLGtCQUFrQixLQUFLLEtBQUssS0FBSyxJQUFJLFdBQVcsZ0JBQWdCLGNBQWMsV0FBVyxLQUFLLGNBQWMsV0FBVyxLQUFLLHNCQUFzQixFQUFFLE1BQU0sQ0FBQztBQUNqSyxrQkFBTSxpQkFBaUIsS0FBSyxLQUFLLEtBQUssSUFBSSxXQUFXLGdCQUFnQixhQUFhLFdBQVcsS0FBSyxhQUFhLFdBQVcsS0FBSyxzQkFBc0IsRUFBRSxLQUFLLENBQUM7QUFFN0osZ0JBQUksZUFBZTtBQUNuQixnQkFBSSxnQkFBZ0I7QUFFcEIsa0JBQU0sYUFBYSxvQkFBb0Isa0JBQWtCLHNCQUFzQjtBQUMvRSxrQkFBTSxZQUFZLG1CQUFtQixpQkFBaUIscUJBQXFCO0FBTzNFLGtCQUFNLHNCQUFzQixvQkFBb0IsQ0FBQztBQUNqRCxrQkFBTSxxQkFBcUIsbUJBQW1CLENBQUM7QUFFL0MsZ0JBQUksdUJBQXVCLG9CQUFvQjtBQUczQyxvQkFBTSxnQkFBZ0IsVUFBVSxNQUFNO0FBQ3RDLG9CQUFNLGVBQWUsVUFBVSxNQUFNO0FBQ3JDLGtCQUFJLG9CQUFxQixXQUFVLE1BQU0sWUFBWSxHQUFHLG1CQUFtQjtBQUMzRSxrQkFBSSxtQkFBb0IsV0FBVSxNQUFNLFdBQVcsR0FBRyxrQkFBa0I7QUFFeEUsa0JBQUksb0JBQXFCLFFBQU8sTUFBTSxTQUFTO0FBQy9DLGtCQUFJLG1CQUFvQixRQUFPLE1BQU0sUUFBUTtBQUU3Qyw2QkFBZSxLQUFLLEtBQUssS0FBSyxJQUFJLFdBQVcsZ0JBQWdCLGFBQWEsV0FBVyxLQUFLLGFBQWEsV0FBVyxLQUFLLHNCQUFzQixFQUFFLEtBQUssQ0FBQztBQUNySiw4QkFBZ0IsS0FBSyxLQUFLLEtBQUssSUFBSSxXQUFXLGdCQUFnQixjQUFjLFdBQVcsS0FBSyxjQUFjLFdBQVcsS0FBSyxzQkFBc0IsRUFBRSxNQUFNLENBQUM7QUFPekosb0JBQU0scUJBQXFCLHVCQUF1QixnQkFBZ0I7QUFDbEUsb0JBQU0sb0JBQW9CLHNCQUFzQixlQUFlO0FBQy9ELGtCQUFJLHNCQUFzQixtQkFBbUI7QUFDekMsc0JBQU0sZUFBZSxXQUFXLGNBQWMsT0FBTztBQUNyRCw2QkFBYSxLQUFLO0FBQ2xCLHNCQUFNLFFBQWtCLENBQUM7QUFDekIsb0JBQUksb0JBQW9CO0FBQ3BCLHdCQUFNLEtBQUssMkJBQTJCLDRCQUE0Qiw2QkFBNkI7QUFBQSxnQkFDbkc7QUFDQSxvQkFBSSxtQkFBbUI7QUFDbkIsd0JBQU0sS0FBSywwQkFBMEIsMkJBQTJCLDRCQUE0QjtBQUFBLGdCQUNoRztBQUNBLDZCQUFhLGNBQWMsNEJBQTRCLE1BQU0sS0FBSyxJQUFJLENBQUM7QUFDdkUsMkJBQVcsS0FBSyxZQUFZLFlBQVk7QUFFeEMsK0JBQWUsS0FBSyxLQUFLLEtBQUssSUFBSSxXQUFXLGdCQUFnQixhQUFhLFdBQVcsS0FBSyxhQUFhLFdBQVcsS0FBSyxzQkFBc0IsRUFBRSxLQUFLLENBQUM7QUFDckosZ0NBQWdCLEtBQUssS0FBSyxLQUFLLElBQUksV0FBVyxnQkFBZ0IsY0FBYyxXQUFXLEtBQUssY0FBYyxXQUFXLEtBQUssc0JBQXNCLEVBQUUsTUFBTSxDQUFDO0FBRXpKLDZCQUFhLE9BQU87QUFBQSxjQUN4QjtBQUdBLHdCQUFVLE1BQU0sWUFBWTtBQUM1Qix3QkFBVSxNQUFNLFdBQVc7QUFBQSxZQUMvQjtBQUVBLGtCQUFNLFFBQVEsTUFBTSxjQUFjLFVBQVUsUUFBUTtBQUNwRCxrQkFBTSxTQUFTLE1BQU0sZUFBZSxXQUFXLFNBQVM7QUFHeEQsZ0JBQUksaUJBQWlCO0FBQ2pCLHFCQUFPLE1BQU0sUUFBUSxHQUFHLEtBQUs7QUFBQSxZQUNqQyxPQUFPO0FBQ0gscUJBQU8sTUFBTSxRQUFRLE9BQU8sMEJBQTBCLFdBQVcsR0FBRyxxQkFBcUIsT0FBTztBQUFBLFlBQ3BHO0FBQ0EsZ0JBQUksa0JBQWtCO0FBQ2xCLHFCQUFPLE1BQU0sU0FBUyxHQUFHLE1BQU07QUFBQSxZQUNuQyxPQUFPO0FBQ0gscUJBQU8sTUFBTSxTQUFTLE9BQU8sMkJBQTJCLFdBQVcsR0FBRyxzQkFBc0IsT0FBTztBQUFBLFlBQ3ZHO0FBS0EsbUJBQU87QUFDUCxtQkFBTyxNQUFNLGFBQWE7QUFDMUIsc0JBQVUsTUFBTSxhQUFhO0FBSTdCLGtCQUFNLHFCQUFxQixtQkFBbUIsYUFBYSxVQUFhLGVBQWU7QUFDdkYsa0JBQU0sc0JBQXNCLG9CQUFvQixjQUFjLFVBQWEsZ0JBQWdCO0FBQzNGLHVCQUFXLGdCQUFnQixNQUFNLFlBQVkscUJBQXFCLFNBQVM7QUFDM0UsdUJBQVcsZ0JBQWdCLE1BQU0sWUFBWSxzQkFBc0IsU0FBUztBQUU1RSwrQ0FBTSxpQkFBTiw4QkFBcUI7QUFBQSxjQUNqQjtBQUFBLGNBQ0E7QUFBQSxjQUNBLGlCQUFpQjtBQUFBLGNBQ2pCLGtCQUFrQjtBQUFBLFlBQ3RCO0FBQUEsVUFDSjtBQUdBLHFCQUFXO0FBR1gsZUFBSyxrQkFBa0I7QUFJdkIsY0FBSTtBQUNKLGdCQUFNLGlCQUFpQixNQUFNO0FBQ3pCLGdCQUFJLFVBQVUsT0FBVztBQUN6QixvQkFBUSxzQkFBc0IsTUFBTTtBQUNoQyxzQkFBUTtBQUNSLHlCQUFXO0FBQUEsWUFDZixDQUFDO0FBQUEsVUFDTDtBQUdBLGdCQUFNLGlCQUFpQixJQUFJLGVBQWUsTUFBTSxlQUFlLENBQUM7QUFDaEUseUJBQWUsUUFBUSxJQUFJLElBQUk7QUFDL0IseUJBQWUsUUFBUSxJQUFJLGVBQWU7QUFNMUMsZ0JBQU0sbUJBQW1CLElBQUksaUJBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQ3BFLDJCQUFpQixRQUFRLElBQUksTUFBTSxFQUFFLFdBQVcsTUFBTSxTQUFTLE1BQU0sZUFBZSxNQUFNLFlBQVksS0FBSyxDQUFDO0FBRTVHLGdCQUFNLFVBQVUsTUFBTTtBQUNsQiwyQkFBZSxXQUFXO0FBQzFCLDZCQUFpQixXQUFXO0FBQzVCLGdCQUFJLFVBQVUsUUFBVztBQUNyQixtQ0FBcUIsS0FBSztBQUMxQixzQkFBUTtBQUFBLFlBQ1o7QUFDQSxpQkFBSyxrQkFBa0I7QUFDdkIsaUJBQUssbUJBQW1CO0FBQUEsVUFDNUI7QUFDQSxlQUFLLG1CQUFtQjtBQUN4QixpQkFBTztBQUFBLFFBQ1g7QUFFQSw0QkFBUTtBQU1SO0FBQUE7QUFBQTtBQUFBO0FBQUEsc0RBQXlCLE1BQXNCO0FBQzNDLGNBQUksS0FBSyxtQkFBb0IsUUFBTyxLQUFLO0FBRXpDLGNBQUk7QUFDSixjQUFJLFVBQVU7QUFDZCxnQkFBTSxVQUFVLE1BQU07QUFDbEIsc0JBQVU7QUFDVjtBQUNBLGlCQUFLLHFCQUFxQjtBQUFBLFVBQzlCO0FBQ0EsZUFBSyxxQkFBcUI7QUFFMUIsZUFBSyxVQUFVLEVBQUUsS0FBSyxNQUFNO0FBQ3hCLGdCQUFJLFdBQVcsS0FBSyxrQkFBbUI7QUFFdkMsaUJBQUssY0FBYyxNQUFNLFdBQVc7QUFDcEMsaUJBQUssY0FBYyxNQUFNLFFBQVE7QUFDakMsaUJBQUssY0FBYyxNQUFNLFFBQVE7QUFDakMsaUJBQUssNkJBQTZCO0FBQ2xDLDhCQUFrQixLQUFLLEtBQUssSUFBSSx5QkFBeUIsQ0FBQztBQUFBLFVBQzlELENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTTtBQU9aLG9CQUFRLEtBQUssaURBQWlELEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRTtBQUFBLFVBQ2pGLENBQUM7QUFFRCxpQkFBTztBQUFBLFFBQ1g7QUFFQSw2REFBZ0MsTUFBTTtBQUNsQyxnQkFBTSxpQkFBaUIsS0FBSyxLQUFLLElBQUkscUJBQXFCLE1BQU07QUFDNUQsa0JBQU0sRUFBQyxRQUFRLE1BQUssSUFBSSxTQUFTLGdCQUFnQixzQkFBc0I7QUFDdkUsbUJBQU8sRUFBQyxRQUFRLE1BQUs7QUFBQSxVQUN6QixHQUFHLENBQUMsUUFBUTtBQUNSLGlCQUFLLGNBQWMsTUFBTSxRQUFRLEdBQUcsSUFBSSxRQUFRLEtBQUs7QUFDckQsaUJBQUssY0FBYyxNQUFNLFNBQVMsR0FBRyxJQUFJLFFBQVEsTUFBTTtBQUN2RCwyQkFBZTtBQUFBLFVBQ25CLENBQUMsQ0FBQztBQUFBLFFBQ047QUFFQSw0REFBK0IsTUFBTTtBQUNqQyxnQkFBTSxpQkFBaUIsS0FBSyxLQUFLLElBQUkscUJBQXFCLE1BQU07QUFNNUQsa0JBQU0sT0FBTyxNQUFNO0FBRWYscUJBQU87QUFBQSxZQUNYO0FBRUEsZ0JBQUksSUFBSSxLQUFLO0FBQ2I7QUFDQTtBQUtBLG1CQUFPLEtBQUs7QUFBQSxjQUFJLEtBQUs7QUFBQSxnQkFDYixPQUFPLFNBQVMsS0FBSztBQUFBLGdCQUNyQixPQUFPLFNBQVMsS0FBSztBQUFBLGNBQVk7QUFBQSxjQUNuQyxPQUFPLFNBQVMsS0FBSztBQUFBLFlBQVksSUFBSSxJQUFJO0FBQUEsVUFFbkQsR0FBRyxDQUFDLFFBQVE7QUFDUixpQkFBSyxjQUFjLE1BQU0sU0FBUyxJQUFJO0FBQ3RDLDJCQUFlO0FBQUEsVUFDbkIsQ0FBQyxDQUFDO0FBQUEsUUFDTjtBQUVBLG9DQUFPLENBQUMsWUFBNkM7QUEzZnpELGNBQUFBLEtBQUE7QUE0ZlEsY0FBSSxXQUFXLG1CQUFJO0FBRW5CLGNBQUksU0FBUyxnQkFBZ0IsYUFBYSx3QkFBd0I7QUFDOUQsa0JBQU0sZUFBZ0I7QUFDdEIsaUJBQUssYUFBYSxNQUFNLEVBQUU7QUFDMUIsbUJBQU8sTUFBTTtBQUFBLFlBQ2I7QUFBQSxVQUNKO0FBTUEsbUJBQVMsWUFBWSxpQkFBaUI7QUFDdEMsZ0JBQU0saUJBQWlCLE1BQU0sS0FBSyxRQUFRO0FBQzFDLGlCQUFBQSxNQUFBLEtBQUssa0JBQUwsZ0JBQUFBLElBQW9CLGtCQUFwQixtQkFBbUMsWUFBWSxVQUFVO0FBS3pELGlCQUFPO0FBQUEsUUFDWDtBQWNBLHVDQUFVLE1BQU07QUEvaEJwQixjQUFBQSxLQUFBO0FBZ2lCUSxXQUFBQSxNQUFBLEtBQUssdUJBQUwsZ0JBQUFBLElBQUE7QUFDQSxjQUFJLEtBQUssa0JBQWtCO0FBQ3ZCLGlCQUFLLGlCQUFpQjtBQUN0QixpQkFBSyxtQkFBbUI7QUFBQSxVQUM1QjtBQUNBLGNBQUksS0FBSyxnQkFBZ0I7QUFDckIsbUJBQU8sb0JBQW9CLFdBQVcsS0FBSyxjQUFjO0FBQ3pELGlCQUFLLGlCQUFpQjtBQUFBLFVBQzFCO0FBQ0EsY0FBSSxLQUFLO0FBQ0wsaUJBQUssZUFBZTtBQUV4QixnQkFBTSxRQUFRO0FBSWQscUJBQUssY0FBYyxlQUFuQixtQkFBK0IsWUFBWSxLQUFLO0FBQUEsUUFDcEQ7QUFuaEJJLGFBQUssVUFBVSxLQUFLO0FBQ3BCLGFBQUssWUFBWSxtQ0FBUztBQUFBLE1BSzlCO0FBQUE7QUFBQTtBQUFBLE1BTUEsa0JBQWtCO0FBQ2QsYUFBSyxXQUFXO0FBR2hCLGFBQUssYUFBYTtBQUNsQixhQUFLLGlCQUFpQixDQUFDLE1BQW9CO0FBQ3ZDLGNBQUksRUFBRSxXQUFXLEtBQUssY0FBYyxjQUFlO0FBQ25ELGdCQUFNLElBQVMsRUFBRTtBQUNqQixjQUFJLENBQUMsS0FBSyxFQUFFLFdBQVcsS0FBTTtBQUM3QixjQUFJLEVBQUUsU0FBUyxZQUFZO0FBQ3ZCLGdCQUFJLEtBQUssZUFBZSxDQUFDLEtBQUssa0JBQW1CLE1BQUssWUFBWSxFQUFFLFFBQVEsRUFBRSxPQUFPO0FBQUEscUJBQzVFLENBQUMsS0FBSyxZQUFhLE1BQUssVUFBVSxLQUFLLEVBQUUsUUFBUSxFQUFFLFFBQVEsU0FBUyxFQUFFLFFBQVEsQ0FBQztBQUFBLFVBQzVGLFdBQVcsRUFBRSxTQUFTLGFBQWE7QUFDL0IsaUJBQUssY0FBYyxFQUFFLFFBQVEsRUFBRSxLQUFLO0FBQUEsVUFDeEM7QUFBQSxRQUNKO0FBQ0EsZUFBTyxpQkFBaUIsV0FBVyxLQUFLLGNBQWM7QUFBQSxNQUMxRDtBQUFBO0FBQUEsTUFHQSxhQUFhLE1BQXFCO0FBOUR0QyxZQUFBQSxLQUFBO0FBK0RRLGFBQUssWUFBWTtBQUNqQixlQUFBQSxNQUFBLEtBQUssa0JBQUwsZ0JBQUFBLElBQW9CLGtCQUFwQixtQkFBbUMsWUFBWSxFQUFFLFFBQVEsTUFBTSxNQUFNLGFBQWEsS0FBSyxHQUFHO0FBQUEsTUFDOUY7QUFBQTtBQUFBLE1BR0EsVUFBbUI7QUFDZixlQUFPLEtBQUs7QUFBQSxNQUNoQjtBQUFBO0FBQUEsTUFHQSxjQUFjLFNBQTJEO0FBQ3JFLGFBQUssY0FBYztBQUNuQixZQUFJLEtBQUssVUFBVSxTQUFTLEdBQUc7QUFDM0IsZ0JBQU0sUUFBUSxDQUFDLEdBQUcsS0FBSyxTQUFTO0FBQ2hDLGVBQUssWUFBWSxDQUFDO0FBQ2xCLGdCQUFNLFFBQVEsVUFBUTtBQUFFLGdCQUFJLENBQUMsS0FBSyxrQkFBbUIsU0FBUSxLQUFLLFFBQVEsS0FBSyxPQUFPO0FBQUEsVUFBRyxDQUFDO0FBQUEsUUFDOUY7QUFBQSxNQUNKO0FBQUEsTUFFUSxjQUFjLFFBQWdCLE9BQWdCO0FBbEYxRCxZQUFBQTtBQW1GUSxZQUFJLENBQUMsVUFBVSxPQUFPLE1BQU0sTUFBTSxFQUFHO0FBR3JDLGFBQUssZUFBZSxFQUFFLFFBQVEsTUFBTTtBQUVwQyxZQUFJLENBQUMsS0FBSyxhQUFjO0FBQ3hCLGNBQU0sT0FBTyxLQUFLO0FBQ2xCLGNBQU0sUUFBUSxDQUFDLE1BQ1gsTUFBTSxTQUFZLFNBQWEsT0FBTyxNQUFNLFdBQVcsSUFBSyxNQUFNLFdBQVcsQ0FBQyxDQUFDLElBQUksU0FBWSxXQUFXLENBQUM7QUFDL0csY0FBTSxNQUFNLE1BQU0sNkJBQU0sU0FBUyxHQUFHLE1BQU0sTUFBTSw2QkFBTSxTQUFTO0FBQy9ELFlBQUksSUFBSTtBQUNSLFlBQUksUUFBUSxVQUFhLElBQUksSUFBSyxLQUFJO0FBQ3RDLFlBQUksUUFBUSxVQUFhLElBQUksSUFBSyxLQUFJO0FBRXRDLGFBQUssY0FBYyxNQUFNLFdBQVc7QUFDcEMsYUFBSyxjQUFjLE1BQU0sUUFBUTtBQUNqQyxhQUFLLGNBQWMsTUFBTSxTQUFTLElBQUk7QUFDdEMsYUFBSyxjQUFjLE1BQU0sUUFBUTtBQUNqQyxTQUFBQSxNQUFBLDZCQUFNLGlCQUFOLGdCQUFBQSxJQUFBLFdBQXFCLEVBQUUsT0FBTyx3QkFBUyxLQUFLLGNBQWMsYUFBYSxRQUFRLEdBQUcsaUJBQWlCLE9BQU8sa0JBQWtCLEtBQUs7QUFBQSxNQUNySTtBQUFBLE1BSUEsVUFBVTtBQUVOLFlBQUksS0FBSyxnQkFBZ0I7QUFFckIsaUJBQU8sS0FBSztBQUFBLFFBQ2hCO0FBQ0EsYUFBSyxpQkFBaUIsY0FBYyxLQUFLLElBQUksdUJBQXVCLElBQUksS0FBSyxXQUFXLEtBQUssZUFBZSxLQUFLLG1CQUFtQjtBQUNwSSxlQUFPLE1BQU07QUFDVCxlQUFLLGVBQWdCO0FBQ3JCLGVBQUssaUJBQWlCO0FBQUEsUUFDMUI7QUFBQSxNQUNKO0FBQUEsTUFFQSxPQUFPO0FBQ0gsYUFBSyxjQUFjLE1BQU0sVUFBVTtBQUNuQyxhQUFLLGNBQWMsTUFBTSxXQUFXO0FBQ3BDLGFBQUssY0FBYyxNQUFNLGdCQUFnQjtBQUN6QyxhQUFLLGNBQWMsTUFBTSxhQUFhO0FBQUEsTUFDMUM7QUFBQSxNQUVBLE9BQU87QUFDSCxhQUFLLGNBQWMsTUFBTSxVQUFVO0FBQ25DLGFBQUssY0FBYyxNQUFNLFdBQVc7QUFDcEMsYUFBSyxjQUFjLE1BQU0sZ0JBQWdCO0FBQ3pDLGFBQUssY0FBYyxNQUFNLGFBQWE7QUFBQSxNQUMxQztBQUFBLE1BZ1pBLGtCQUFrQixlQUF5QztBQUN2RCxZQUFJLGNBQWMsZ0JBQWdCLGFBQWEsR0FBRywyQkFDM0MsY0FBYyxnQkFBZ0IsYUFBYSxHQUFHLHVCQUF1QjtBQUN4RSxlQUFLLDZCQUE2QjtBQUdsQyxpQkFBTztBQUFBLFFBQ1g7QUFFQSxlQUFPLE1BQU0sa0JBQWtCLGFBQWE7QUFBQSxNQUNoRDtBQUFBLElBcUJKO0FBQUE7QUFBQTs7O0FDbGpCQSxJQVNzQjtBQVR0QjtBQUFBO0FBQUE7QUFTTyxJQUFlLGlCQUFmLE1BQXFEO0FBQUEsTUFBckQ7QUFJSCwyQ0FBYyxDQUFDLFdBQXdCLFNBQXNCLFlBQTZCO0FBYjlGLGNBQUFDO0FBY1EsY0FBSSxtQ0FBUyxVQUFVO0FBQ25CLGdCQUFJLFFBQVEsU0FBUyxjQUFjLFVBQVU7QUFDekMscUJBQU8sVUFBVSxhQUFhLFNBQVMsUUFBUSxTQUFTLEtBQUs7QUFBQSxZQUNqRTtBQUVBLGdCQUFJLFFBQVEsU0FBUyxjQUFjLFNBQVM7QUFDeEMsb0JBQU0sZUFBY0EsTUFBQSxRQUFRLFNBQVMsVUFBakIsZ0JBQUFBLElBQXdCO0FBQzVDLHFCQUFPLFVBQVUsYUFBYSxTQUFTLGNBQWMsY0FBYyxJQUFJO0FBQUEsWUFDM0U7QUFBQSxVQUNKLE9BQU87QUFDSCxtQkFBTyxVQUFVLFlBQVksT0FBTztBQUFBLFVBQ3hDO0FBQUEsUUFDSjtBQUFBO0FBQUEsSUFDSjtBQUFBO0FBQUE7OztBQzNCQSxJQU1NLGVBaUJBLGVBWU87QUFuQ2I7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFFQSxJQUFNLGdCQUFnQixDQUFDLEtBQWEsT0FBZSxVQUFrQjtBQUVqRSxZQUFNLFNBQVMsSUFBSSxJQUFJLEdBQUc7QUFHMUIsYUFBTyxhQUFhLE9BQU8sT0FBTyxLQUFLO0FBR3ZDLGFBQU8sT0FBTyxTQUFTO0FBQUEsSUFDM0I7QUFRQSxJQUFNLGdCQUFnQixDQUFDLE9BQTBCLFFBQXlCO0FBQ3RFLFlBQU0sVUFBVSxNQUFNLGFBQWEsS0FBSztBQUN4QyxVQUFJLENBQUMsV0FBVyxDQUFDLElBQUssUUFBTztBQUM3QixZQUFNLE9BQU8sQ0FBQyxNQUFjO0FBQ3hCLGNBQU0sSUFBSSxJQUFJLElBQUksR0FBRyxTQUFTLE9BQU87QUFDckMsVUFBRSxPQUFPO0FBQ1QsWUFBSSxFQUFFLFNBQVMsU0FBUyxFQUFHLEdBQUUsV0FBVyxFQUFFLFNBQVMsUUFBUSxPQUFPLEVBQUU7QUFDcEUsZUFBTyxFQUFFO0FBQUEsTUFDYjtBQUNBLFVBQUk7QUFBRSxlQUFPLEtBQUssT0FBTyxNQUFNLEtBQUssR0FBRztBQUFBLE1BQUcsU0FBUTtBQUFFLGVBQU87QUFBQSxNQUFPO0FBQUEsSUFDdEU7QUFFTyxJQUFNLG1CQUFOLGNBQStCLGVBQWU7QUFBQSxNQUE5QztBQUFBO0FBQ0gsb0NBQU8sWUFBWTtBQUduQjtBQUFBLG9DQUFPLENBQU8scUJBQWlELE1BQW1CLFdBQXdCLFlBQTRCO0FBQ2xJLGNBQUk7QUFFSixnQkFBTSxvQkFBcUIsS0FBSztBQUVoQyxlQUFJLHVDQUFXLGNBQWEsVUFBVTtBQUNsQyw0QkFBaUI7QUFhakIsZ0JBQUksQ0FBQyxjQUFjLGVBQWUsa0JBQWtCLEdBQUcsR0FBRztBQUN0RCw0QkFBYyxNQUFNLGtCQUFrQjtBQUFBLFlBQzFDO0FBQUEsVUFDSixPQUFPO0FBQ0gsa0JBQU0sU0FBUyxPQUFPO0FBQ3RCLGtCQUFNLFFBQVEsYUFBYSxNQUFNO0FBRWpDLDRCQUFnQixTQUFTLGNBQWMsUUFBUTtBQUMvQywwQkFBYyxLQUFLO0FBR25CLGtCQUFNLGVBQWU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLDBCQUtQLGtCQUFrQixjQUFjLENBQUMsa0JBQWtCLFNBQVMsU0FBUyxrQkFBa0IsTUFBTTtBQUFBO0FBQUE7QUFBQTtBQUFBLDRCQUk1RixtQ0FBUyxVQUFTLE1BQU0sR0FBRztBQUFBLG1DQUNwQixtQ0FBUyxVQUFTLFNBQVMsS0FBSztBQUFBO0FBRXRELDBCQUFjLE1BQU0sVUFBVTtBQUc5QixnQkFBSSxtQ0FBUyxtQkFBbUI7QUFDNUIscUJBQU8sUUFBUSxRQUFRLGlCQUFpQixFQUFFLFFBQVEsQ0FBQyxDQUFDLEtBQUssS0FBSyxNQUFNO0FBQ2hFLG9CQUFJLFVBQVUsTUFBTSxVQUFVLFFBQVEsVUFBVSxRQUFXO0FBQ3ZELGdDQUFjLGFBQWEsS0FBSyxFQUFFO0FBQUEsZ0JBQ3RDLE9BQU87QUFDSCxnQ0FBYyxhQUFhLEtBQUssT0FBTyxLQUFLLENBQUM7QUFBQSxnQkFDakQ7QUFBQSxjQUNKLENBQUM7QUFBQSxZQUNMO0FBR0EsZ0JBQUksV0FBWSxLQUFLLE9BQStCO0FBQ3BELGdCQUFJLG1DQUFTO0FBQ1QseUJBQVcsY0FBYyxVQUFVLGNBQWMsTUFBTTtBQUUzRCwwQkFBYyxNQUFNO0FBR3BCLGdCQUFJLENBQUMsVUFBVSxjQUFjLG9CQUFvQjtBQUM3Qyx3QkFBVSxZQUFZO0FBRTFCLDRCQUFnQixLQUFLLFlBQVksV0FBVyxlQUFlLE9BQU87QUFBQSxVQUd0RTtBQUVBLGdCQUFNLFlBQVksSUFBSSxvQkFBb0IscUJBQXFCLE1BQU0sV0FBVyxlQUFlLE9BQU87QUFJdEcsY0FBSSxrQkFBa0IsZUFBYyxtQ0FBUyxjQUFhLE9BQU87QUFDN0Qsc0JBQVUsdUJBQXVCO0FBQUEsVUFDckM7QUFFQSxpQkFBTztBQUFBLFFBQ1g7QUFBQTtBQUFBLElBQ0o7QUFBQTtBQUFBOzs7QUN4SEEsSUFBYTtBQUFiO0FBQUE7QUFBQTtBQUFPLElBQU0seUJBQXlCO0FBQUEsTUFDbEMsMEJBQTBCO0FBQUEsSUFDOUI7QUFBQTtBQUFBOzs7QUNGQSxJQU9hO0FBUGI7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUdBO0FBR08sSUFBTSxtQkFBTixjQUErQixrQkFBa0I7QUFBQSxNQUVwRCxZQUFZLHFCQUFpRCxNQUEwQixXQUFnQyxlQUE0QixTQUF5QjtBQUN4SyxjQUFNLHFCQUFxQixXQUFZLE9BQU87QUFEcUM7QUFBZ0M7QUFLdkgsOENBQWlDLE1BQU07QUFBQSxRQUN2QztBQXlCQSxvQ0FBTyxDQUFDLFlBQWtDO0FBQ3RDLGNBQUksV0FBVyxtQkFBSTtBQUtuQixnQkFBTSxpQkFBaUIsTUFBTSxLQUFLLFFBQVE7QUFFMUMsZ0JBQU0sTUFBTSxJQUFJLFlBQTZCLHVCQUF1QiwwQkFBMEI7QUFBQTtBQUFBLFlBRTFGLFFBQVE7QUFBQTtBQUFBO0FBQUE7QUFBQSxVQUlaLENBQUM7QUFLRCxjQUFJO0FBQ0EsaUJBQUssY0FBYyxjQUFjLEdBQUc7QUFBQSxVQUt4QyxTQUFTLEdBQUc7QUFDUixvQkFBUSxJQUFJLHVDQUF1QyxDQUFDO0FBQUEsVUFDeEQ7QUFLQSxpQkFBTztBQUFBLFFBQ1g7QUFFQSx1Q0FBVSxNQUFNO0FBM0VwQixjQUFBQztBQTRFUSxnQkFBTSxRQUFRO0FBQ2QsV0FBQUEsTUFBQSxLQUFLLGNBQWMsZUFBbkIsZ0JBQUFBLElBQStCLFlBQVksS0FBSztBQUFBLFFBQ3BEO0FBbkVJLGFBQUssVUFBVTtBQUFBLE1BQ25CO0FBQUEsTUFLQSxVQUFVO0FBQ04sYUFBSyxpQkFBaUIsY0FBYyxLQUFLLElBQUksb0JBQW9CLEdBQUcsS0FBSyxXQUFXLEtBQUssZUFBZSxLQUFLLG1CQUFtQjtBQUNoSSxlQUFPLEtBQUs7QUFBQSxNQUNoQjtBQUFBLE1BRUEsT0FBTztBQUNILGFBQUssY0FBYyxNQUFNLFVBQVU7QUFDbkMsYUFBSyxjQUFjLE1BQU0sV0FBVztBQUNwQyxhQUFLLGNBQWMsTUFBTSxnQkFBZ0I7QUFDekMsYUFBSyxjQUFjLE1BQU0sYUFBYTtBQUN0QyxhQUFLLGNBQWMsTUFBTSxTQUFTO0FBQ2xDLGFBQUssY0FBYyxNQUFNLFFBQVE7QUFBQSxNQUNyQztBQUFBLE1BRUEsT0FBTztBQUNILGFBQUssY0FBYyxNQUFNLFVBQVU7QUFDbkMsYUFBSyxjQUFjLE1BQU0sV0FBVztBQUNwQyxhQUFLLGNBQWMsTUFBTSxnQkFBZ0I7QUFDekMsYUFBSyxjQUFjLE1BQU0sYUFBYTtBQUN0QyxhQUFLLGNBQWMsTUFBTSxTQUFTO0FBQ2xDLGFBQUssY0FBYyxNQUFNLFFBQVE7QUFBQSxNQUNyQztBQUFBLElBeUNKO0FBQUE7QUFBQTs7O0FDL0VBLElBTU0sTUFFTztBQVJiO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBRUEsSUFBTSxPQUFzQyxDQUFDO0FBRXRDLElBQU0scUJBQU4sY0FBaUMsZUFBZTtBQUFBLE1BQWhEO0FBQUE7QUFFSCxvQ0FBTyxZQUFZO0FBRW5CLG9DQUFPLENBQU8scUJBQWlELE1BQW1CLFdBQXdCLFlBQTRCO0FBRWxJLGdCQUFNLGVBQWdCLEtBQUs7QUFFM0IsY0FBSSxDQUFDLEtBQUssYUFBYSxHQUFHLEdBQUc7QUFHekIsaUJBQUssYUFBYSxHQUFHLElBQUksSUFBSSxRQUFRLENBQUMsU0FBUyxXQUFXO0FBQ3RELG9CQUFNLHNCQUFzQixhQUFhO0FBQ3pDLG9CQUFNLFNBQVMsU0FBUyxjQUFjLFFBQVE7QUFDOUMscUJBQU8sT0FBTztBQUNkLHFCQUFPLE1BQU07QUFDYixxQkFBTyxTQUFTLE1BQU07QUFDbEIsd0JBQVE7QUFBQSxjQUNaO0FBRUEscUJBQU8sVUFBVSxNQUFNO0FBQ25CLHVCQUFPO0FBQUEsY0FDWDtBQUNBLHVCQUFTLEtBQUssWUFBWSxNQUFNO0FBQUEsWUFDcEMsQ0FBQztBQUFBLFVBQ0wsT0FBTztBQUNILG9CQUFRLElBQUksNkNBQTZDO0FBQUEsVUFDN0Q7QUFFQSxnQkFBTSxLQUFLLGFBQWEsR0FBRztBQUszQixnQkFBTSxLQUFLLENBQUM7QUFFWixjQUFJLFFBQVEsYUFBYSxPQUFPLENBQUM7QUFDakMsZ0JBQU0sVUFBVSxTQUFTLGNBQWMsYUFBYSxHQUFHO0FBR3ZELGNBQUksQ0FBQyxVQUFVLGNBQWMsb0JBQW9CO0FBQzdDLHNCQUFVLFlBQVk7QUFHMUIsa0JBQVEsS0FBSztBQUViLGNBQUksbUNBQVMsUUFBUTtBQUNqQixvQkFBUSxNQUFNLFVBQVU7QUFDeEIsb0JBQVEsTUFBTSxXQUFXO0FBQ3pCLG9CQUFRLE1BQU0sU0FBUztBQUN2QixvQkFBUSxNQUFNLFFBQVE7QUFDdEIsb0JBQVEsTUFBTSxnQkFBZ0I7QUFDOUIsb0JBQVEsTUFBTSxhQUFhO0FBQUEsVUFDL0I7QUFVQSxjQUFHLG1DQUFTLGNBQWE7QUFFckIsb0JBQVEsbUJBQW1CLG1DQUFTO0FBQUEsVUFDeEM7QUFFQSxlQUFLLFlBQVksV0FBVyxTQUFTLE9BQU87QUFFNUMsaUJBQU8sSUFBSSxpQkFBaUIscUJBQXFCLE1BQU0sV0FBVyxTQUFTLE9BQU87QUFBQSxRQUN0RjtBQUFBO0FBQUEsSUFFSjtBQUFBO0FBQUE7OztBQ3RDQSxTQUFTLFNBQXNDO0FBQzNDLE1BQUksVUFBVyxRQUFPO0FBQ3RCLGNBQVksSUFBSSxRQUFRLENBQUMsWUFBWTtBQUNqQyxRQUFJO0FBQ0EsVUFBSSxPQUFPLGNBQWMsWUFBYSxRQUFPLFFBQVEsSUFBSTtBQUN6RCxZQUFNLE1BQU0sVUFBVSxLQUFLLFNBQVMsVUFBVTtBQUM5QyxVQUFJLGtCQUFrQixNQUFNO0FBQ3hCLGNBQU0sS0FBSyxJQUFJO0FBQ2YsWUFBSSxDQUFDLEdBQUcsaUJBQWlCLFNBQVMsS0FBSyxFQUFHLElBQUcsa0JBQWtCLE9BQU8sRUFBRSxTQUFTLE1BQU0sQ0FBQztBQUFBLE1BQzVGO0FBQ0EsVUFBSSxZQUFZLE1BQU0sUUFBUSxJQUFJLE1BQU07QUFDeEMsVUFBSSxVQUFVLE1BQU0sUUFBUSxJQUFJO0FBRWhDLFVBQUksWUFBWSxNQUFNLFFBQVEsSUFBSTtBQUFBLElBQ3RDLFNBQVE7QUFDSixjQUFRLElBQUk7QUFBQSxJQUNoQjtBQUFBLEVBQ0osQ0FBQztBQUNELFNBQU87QUFDWDtBQUVBLFNBQVMsR0FBTSxNQUEwQixJQUE4RDtBQUNuRyxTQUFPLE9BQU8sRUFBRSxLQUFLLFFBQU0sSUFBSSxRQUFrQixDQUFDLFlBQVk7QUFDMUQsUUFBSSxDQUFDLEdBQUksUUFBTyxRQUFRLElBQUk7QUFDNUIsUUFBSTtBQUNBLFlBQU0sSUFBSSxHQUFHLFlBQVksT0FBTyxJQUFJO0FBQ3BDLFlBQU0sTUFBTSxHQUFHLEVBQUUsWUFBWSxLQUFLLENBQUM7QUFDbkMsVUFBSSxZQUFZLE1BQU0sUUFBUSxJQUFJLE1BQVc7QUFDN0MsVUFBSSxVQUFVLE1BQU0sUUFBUSxJQUFJO0FBQ2hDLFFBQUUsVUFBVSxNQUFNLFFBQVEsSUFBSTtBQUFBLElBQ2xDLFNBQVE7QUFDSixjQUFRLElBQUk7QUFBQSxJQUNoQjtBQUFBLEVBQ0osQ0FBQyxDQUFDO0FBQ047QUFpQkEsU0FBUyxVQUFVLEtBQWEsS0FBb0IsV0FBbUI7QUFDbkUsTUFBSTtBQUFFLGlCQUFhLFFBQVEsY0FBYyxLQUFLLEtBQUssVUFBVSxFQUFFLEdBQUcsS0FBSyxHQUFHLFVBQVUsQ0FBQyxDQUFDO0FBQUEsRUFBRyxTQUNuRjtBQUFBLEVBQXlGO0FBQ25HO0FBRUEsU0FBUyxVQUFVLEtBQWE7QUFDNUIsTUFBSTtBQUFFLGlCQUFhLFdBQVcsY0FBYyxHQUFHO0FBQUEsRUFBRyxTQUFRO0FBQUEsRUFBaUI7QUFDL0U7QUFyR0EsSUFxQk0sU0FDQSxPQUNBLFlBa0JGLFdBbURFLGFBWUEsUUFFTztBQTFHYjtBQUFBO0FBQUE7QUFxQkEsSUFBTSxVQUFVO0FBQ2hCLElBQU0sUUFBUTtBQUNkLElBQU0sYUFBYTtBQWtCbkIsSUFBSSxZQUFnRDtBQW1EcEQsSUFBTSxjQUFjO0FBWXBCLElBQU0sU0FBUyxvQkFBSSxJQUF5QjtBQUVyQyxJQUFNLGdCQUFnQjtBQUFBLE1BQ3pCLElBQUksTUFBYyxhQUFxQixLQUFhLFNBQWtCLEtBQWE7QUFHL0UsZUFBTyxHQUFHLElBQUksSUFBSSxXQUFXLElBQUksR0FBRyxJQUFJLFVBQVUsWUFBWSxNQUFNLElBQUksT0FBTyxLQUFLO0FBQUEsTUFDeEY7QUFBQSxNQUVNLElBQUksS0FBMEM7QUFBQTtBQUNoRCxnQkFBTSxJQUFJLE9BQU8sSUFBSSxHQUFHO0FBQ3hCLGNBQUksRUFBRyxRQUFPO0FBQ2QsZ0JBQU0sSUFBSSxNQUFNLEdBQWdCLFlBQVksT0FBSyxFQUFFLElBQUksR0FBRyxDQUFDO0FBQzNELGNBQUksR0FBRztBQUNILG1CQUFPLElBQUksS0FBSyxDQUFDO0FBT2pCLHNCQUFVLEtBQUssRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLFFBQVE7QUFBQSxVQUNqRDtBQUNBLGlCQUFPO0FBQUEsUUFDWDtBQUFBO0FBQUEsTUFFTSxJQUFJLE9BQW1DO0FBQUE7QUFDekMsaUJBQU8sSUFBSSxNQUFNLEtBQUssS0FBSztBQUMzQixvQkFBVSxNQUFNLEtBQUssTUFBTSxLQUFLLE1BQU0sV0FBVyxNQUFNLFFBQVE7QUFDL0QsZ0JBQU0sR0FBRyxhQUFhLE9BQUssRUFBRSxJQUFJLEtBQUssQ0FBQztBQUFBLFFBQzNDO0FBQUE7QUFBQSxNQUVNLEtBQUssS0FBNEI7QUFBQTtBQUNuQyxpQkFBTyxPQUFPLEdBQUc7QUFDakIsb0JBQVUsR0FBRztBQUNiLGdCQUFNLEdBQUcsYUFBYSxPQUFLLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFBQSxRQUM1QztBQUFBO0FBQUE7QUFBQSxNQUdBLE1BQU0sR0FBZ0M7QUFDbEMsZUFBTyxDQUFDLENBQUMsS0FBTSxLQUFLLElBQUksSUFBSSxFQUFFLFdBQVksRUFBRTtBQUFBLE1BQ2hEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BT0EsV0FBVyxTQUEwQjtBQUNqQyxjQUFNLEtBQUssUUFBUSxJQUFJLGVBQWUsS0FBSztBQUMzQyxZQUFJLHFCQUFxQixLQUFLLEVBQUUsRUFBRyxRQUFPO0FBQzFDLGNBQU0sSUFBSSx3QkFBd0IsS0FBSyxFQUFFLEtBQUssdUJBQXVCLEtBQUssRUFBRTtBQUM1RSxZQUFJLENBQUMsRUFBRyxRQUFPO0FBQ2YsY0FBTSxRQUFRLE9BQU8sRUFBRSxDQUFDLENBQUM7QUFDekIsY0FBTSxNQUFNLE9BQU8sUUFBUSxJQUFJLEtBQUssS0FBSyxDQUFDO0FBQzFDLGVBQU8sS0FBSyxJQUFJLEdBQUksU0FBUyxNQUFNLEdBQUcsSUFBSSxJQUFJLElBQUssSUFBSTtBQUFBLE1BQzNEO0FBQUE7QUFBQSxNQUdNLFFBQXVCO0FBQUE7QUFDekIsaUJBQU8sTUFBTTtBQUNiLGNBQUk7QUFDQSxxQkFBUyxJQUFJLGFBQWEsU0FBUyxHQUFHLEtBQUssR0FBRyxLQUFLO0FBQy9DLG9CQUFNLElBQUksYUFBYSxJQUFJLENBQUM7QUFDNUIsa0JBQUksS0FBSyxFQUFFLFdBQVcsV0FBVyxFQUFHLGNBQWEsV0FBVyxDQUFDO0FBQUEsWUFDakU7QUFBQSxVQUNKLFNBQVE7QUFBQSxVQUFxRDtBQUM3RCxnQkFBTSxHQUFHLGFBQWEsT0FBSyxFQUFFLE1BQU0sQ0FBQztBQUFBLFFBQ3hDO0FBQUE7QUFBQSxJQUNKO0FBQUE7QUFBQTs7O0FDN0tBLElBYU0sbUNBbUVBLFlBRUEsZUFVQSxlQVNPLG1DQXFuQkE7QUExdEJiO0FBQUE7QUFBQTtBQUFBO0FBV0E7QUFFQSxJQUFNLG9DQUFvQyxDQUFDLFdBQWdEO0FBQ3ZGLGFBQU87QUFBQSxRQUNILFVBQVU7QUFBQSxVQUNOLElBQUk7QUFBQSxVQUNKLGFBQWEsT0FBTztBQUFBLFVBQ3BCLGVBQWUsT0FBTztBQUFBLFVBRXRCLGNBQWM7QUFBQSxZQUNWLE1BQU07QUFBQSxZQUNOLE1BQU07QUFBQSxjQUNGLElBQUk7QUFBQSxZQUNSO0FBQUEsVUFDSjtBQUFBLFFBRUo7QUFBQSxRQUNBLE1BQU07QUFBQSxVQUNGLElBQUksT0FBTztBQUFBLFVBQ1gsTUFBTSxPQUFPO0FBQUEsVUFDYixhQUFhLE9BQU87QUFBQSxVQUNwQixPQUFPO0FBQUEsWUFDSDtBQUFBLGNBQ0ksSUFBSTtBQUFBLGNBQ0osTUFBTTtBQUFBLGNBQ04sTUFBTTtBQUFBLGNBQ04sVUFBVTtBQUFBLGdCQUNOLE1BQU0sd0JBQXdCO0FBQUEsY0FDbEM7QUFBQSxZQUNKO0FBQUEsWUFFQTtBQUFBLGNBQ0ksSUFBSTtBQUFBLGNBQ0osTUFBTTtBQUFBLGNBQ04sTUFBTTtBQUFBLGNBQ04sVUFBVTtBQUFBLGdCQUNOLE1BQU0sd0JBQXdCO0FBQUEsY0FDbEM7QUFBQSxZQUNKO0FBQUEsVUFDSjtBQUFBLFVBQ0EsTUFBTSxDQUFDO0FBQUEsVUFDUCxPQUFPO0FBQUEsWUFDSDtBQUFBLGNBQ0ksSUFBSTtBQUFBLGNBQ0osTUFBTTtBQUFBLGNBQ04sYUFBYTtBQUFBO0FBQUE7QUFBQSxjQUdiLFFBQVEsT0FBTyxnQkFBZ0IsQ0FBQyxFQUFFO0FBQUEsWUFDdEM7QUFBQSxVQUNKO0FBQUEsVUFDQSxhQUFhO0FBQUE7QUFBQTtBQUFBLFVBR2IsUUFBUSxNQUFNLFFBQVEsT0FBTyxNQUFNLElBQUksT0FBTyxTQUFTLENBQUM7QUFBQSxRQUM1RDtBQUFBLFFBQ0EsTUFBTSxPQUFPO0FBQUEsTUFDakI7QUFBQSxJQUNKO0FBV0EsSUFBTSxhQUFhO0FBRW5CLElBQU0sZ0JBQWdCLE1BQW1DO0FBQ3JELFVBQUksT0FBTyxXQUFXLGFBQWE7QUFDL0IsZUFBUSxPQUFlLFVBQVU7QUFBQSxNQUNyQztBQUNBLFVBQUksT0FBTyxlQUFlLGFBQWE7QUFDbkMsZUFBUSxXQUFtQixVQUFVO0FBQUEsTUFDekM7QUFDQSxhQUFPO0FBQUEsSUFDWDtBQUVBLElBQU0sZ0JBQWdCLENBQUMsYUFBOEI7QUFDakQsVUFBSSxPQUFPLFdBQVcsYUFBYTtBQUMvQixRQUFDLE9BQWUsVUFBVSxJQUFJO0FBQUEsTUFDbEM7QUFDQSxVQUFJLE9BQU8sZUFBZSxhQUFhO0FBQ25DLFFBQUMsV0FBbUIsVUFBVSxJQUFJO0FBQUEsTUFDdEM7QUFBQSxJQUNKO0FBRU8sSUFBTSxtQkFBTixNQUFNLGlCQUFnQjtBQUFBLE1Ba0N6QixZQUFvQixXQUFXLDBCQUEwQjtBQUFyQztBQWRwQjtBQUFBO0FBQUEsNEJBQVEsWUFBd0YsQ0FBQztBQUlqRztBQUFBO0FBQUEsNEJBQVEsdUJBQXlFLENBQUM7QUFHbEY7QUFBQSw0QkFBUSxhQUFnRCxDQUFDO0FBRXpELDRCQUFRLGVBQWM7QUFDdEIsNEJBQVEscUJBQW9CO0FBQzVCLDRCQUFRLGVBQWM7QUFDdEIsNEJBQVEsZ0JBQXVDLENBQUM7QUFxQmhEO0FBQUE7QUFBQTtBQUFBO0FBQUEsNEJBQVEsYUFDSixFQUFFLFFBQVEsT0FBTyxNQUFNLE1BQU0sT0FBTyxPQUFPLE1BQU0sTUFBTTtBQU8zRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsNEJBQVEsa0JBQWlCO0FBQUEsVUFDckIsVUFBVTtBQUFBLFVBQUcsYUFBYTtBQUFBLFVBQUcsVUFBVTtBQUFBLFVBQUcsV0FBVztBQUFBO0FBQUEsVUFFckQsWUFBWTtBQUFBLFVBQUcsYUFBYTtBQUFBLFVBQUcsYUFBYTtBQUFBO0FBQUEsVUFFNUMsZUFBZTtBQUFBLFVBQUcsV0FBVztBQUFBLFVBQUcsWUFBWTtBQUFBLFFBQ2hEO0FBb0RBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsNEJBQVEsZ0JBQWUsb0JBQUksSUFBb0U7QUFDL0YsNEJBQVEsZUFBYztBQXladEI7QUFBQTtBQUFBLDRCQUFRLGVBQWMsb0JBQUksSUFBWTtBQUFBLE1BOWV0QztBQUFBLE1BaENBLFdBQVcsT0FBd0I7QUFFL0IsY0FBTSxhQUFhLGNBQWM7QUFDakMsWUFBSSxZQUFZO0FBQ1osaUJBQU87QUFBQSxRQUNYO0FBR0EsWUFBSSxDQUFDLGlCQUFnQixPQUFPO0FBQ3hCLDJCQUFnQixRQUFRLElBQUksaUJBQWdCO0FBQzVDLHdCQUFjLGlCQUFnQixLQUFLO0FBQUEsUUFDdkM7QUFDQSxlQUFPLGlCQUFnQjtBQUFBLE1BQzNCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BMEJBLE9BQWUsV0FBVyxHQUFnQjtBQS9JOUMsWUFBQUMsS0FBQTtBQWdKUSxZQUFJO0FBQUUsb0JBQVEsd0JBQUFBLE1BQUEsdUJBQUcsV0FBSCxnQkFBQUEsSUFBVyxTQUFYLG1CQUFpQixVQUFqQixtQkFBeUIsT0FBekIsbUJBQTZCLFdBQTdCLG1CQUFxQyxTQUFRLElBQUk7QUFBQSxRQUFRLFNBQVFDLElBQUE7QUFBRSxpQkFBTztBQUFBLFFBQUc7QUFBQSxNQUMvRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFzQ0EsWUFBWSxPQUFvRixDQUFDLEdBQUc7QUFDaEcsWUFBSSxLQUFLLFdBQVcsT0FBVyxNQUFLLFVBQVUsU0FBUyxDQUFDLENBQUMsS0FBSztBQUM5RCxZQUFJLEtBQUssU0FBUyxPQUFXLE1BQUssVUFBVSxPQUFPLEtBQUs7QUFDeEQsWUFBSSxLQUFLLFVBQVUsT0FBVyxNQUFLLFVBQVUsUUFBUSxDQUFDLENBQUMsS0FBSztBQUM1RCxZQUFJLEtBQUssU0FBUyxPQUFXLE1BQUssVUFBVSxPQUFPLENBQUMsQ0FBQyxLQUFLO0FBQUEsTUFDOUQ7QUFBQTtBQUFBLE1BR0EsZ0JBQWdCO0FBL0xwQixZQUFBRDtBQWdNUSxlQUFPLGlDQUFLLEtBQUssaUJBQVY7QUFBQSxVQUEwQixPQUFNQSxNQUFBLEtBQUssVUFBVSxTQUFmLE9BQUFBLE1BQXVCLGlCQUFnQjtBQUFBLFVBQ3JFLFFBQVEsS0FBSyxVQUFVO0FBQUEsVUFBUSxPQUFPLEtBQUssVUFBVTtBQUFBLFVBQU8sTUFBTSxLQUFLLFVBQVU7QUFBQSxRQUFLO0FBQUEsTUFDbkc7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BU00sa0JBQWlDO0FBQUE7QUFDbkMsZ0JBQU0sY0FBYyxNQUFNO0FBQUEsUUFDOUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1Bd0JRLGVBQWUsYUFBcUIsS0FBYSxRQUFjO0FBQ25FLGNBQU0sTUFBTSxTQUFTLEdBQUcsV0FBVyxJQUFJLE1BQU0sS0FBSztBQUNsRCxjQUFNLE1BQU0sS0FBSyxhQUFhLElBQUksR0FBRztBQUNyQyxZQUFJLElBQUssS0FBSTtBQUFBLFlBQ1IsTUFBSyxhQUFhLElBQUksS0FBSyxFQUFDLElBQUksYUFBYSxLQUFLLE9BQU8sR0FBRyxPQUFNLENBQUM7QUFDeEUsYUFBSyxVQUFVO0FBQUEsTUFDbkI7QUFBQTtBQUFBLE1BR1EsWUFBWTtBQUNoQixZQUFJLEtBQUssZUFBZSxPQUFPLGFBQWEsWUFBYTtBQUN6RCxhQUFLLGNBQWM7QUFDbkIsY0FBTSxTQUFTLE1BQU07QUFBRSxjQUFJLFNBQVMsb0JBQW9CLFNBQVUsTUFBSyxpQkFBaUI7QUFBQSxRQUFHO0FBQzNGLGlCQUFTLGlCQUFpQixvQkFBb0IsTUFBTTtBQUNwRCxlQUFPLGlCQUFpQixZQUFZLE1BQU0sS0FBSyxpQkFBaUIsQ0FBQztBQUFBLE1BQ3JFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BT0EsbUJBQXlCO0FBQ3JCLFlBQUksQ0FBQyxLQUFLLGFBQWEsS0FBTTtBQUM3QixjQUFNLFFBQVEsQ0FBQyxHQUFHLEtBQUssYUFBYSxRQUFRLENBQUMsRUFDeEMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxFQUFFLEtBQUssR0FBRyxFQUFFLFNBQVMsTUFBTSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsS0FBSyxHQUFHO0FBQzVGLGFBQUssYUFBYSxNQUFNO0FBQ3hCLFlBQUk7QUFDQSxnQkFBTSxNQUFNLEdBQUcsS0FBSyxhQUFhLENBQUMsa0JBQWtCLG1CQUFtQixLQUFLLENBQUM7QUFDN0UsZ0JBQU0sS0FBSyxFQUFDLFdBQVcsTUFBTSxNQUFNLFFBQVEsYUFBYSxPQUFNLENBQUMsRUFBRSxNQUFNLE1BQU07QUFBQSxVQUFDLENBQUM7QUFBQSxRQUNuRixTQUFRO0FBQUEsUUFBb0M7QUFBQSxNQUNoRDtBQUFBO0FBQUEsTUFHUSxlQUF1QjtBQUMzQixlQUFPLEtBQUssVUFBVSxRQUFRLEtBQUs7QUFBQSxNQUN2QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQWFjLGNBQWMsTUFBaUM7QUFBQTtBQXRSakUsY0FBQUE7QUF5UlEsY0FBSSxLQUFLLGFBQWEsS0FBTSxNQUFLLGlCQUFpQjtBQUNsRCxnQkFBTSxPQUFPLEtBQUssYUFBYTtBQUMvQixnQkFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLElBQUk7QUFDOUIsZUFBSyxlQUFlO0FBQ3BCLGdCQUFNLFlBQVksU0FBUyxLQUFLO0FBQ2hDLGNBQUk7QUFDQSxrQkFBTSxNQUFNLE1BQU0sTUFBTSxPQUFPO0FBQy9CLGdCQUFJLElBQUksTUFBTSxJQUFJLFNBQVMsT0FBTyxDQUFDLFdBQVc7QUFDMUMsa0JBQUksYUFBYSxJQUFJLEdBQUksTUFBSyxlQUFlO0FBQzdDLHFCQUFPO0FBQUEsWUFDWDtBQUNBLGlCQUFLLGVBQWUsWUFBWSxRQUFRLElBQUksTUFBTSxTQUFTLElBQUk7QUFBQSxVQUNuRSxTQUFTLEdBQVE7QUFDYixnQkFBSSxDQUFDLFVBQVcsT0FBTTtBQUN0QixpQkFBSyxlQUFlLFlBQVksUUFBT0EsTUFBQSx1QkFBRyxZQUFILE9BQUFBLE1BQWMsQ0FBQztBQUFBLFVBQzFEO0FBQ0EsZUFBSyxlQUFlO0FBQ3BCLGtCQUFRLEtBQUssZ0NBQWdDLEtBQUssZUFBZSxTQUFTLDRCQUF1QixLQUFLLFFBQVEsRUFBRTtBQUNoSCxpQkFBTyxNQUFNLE1BQU0sR0FBRyxLQUFLLFFBQVEsR0FBRyxJQUFJLEVBQUU7QUFBQSxRQUNoRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BT0EsbUJBQW1CO0FBQ2YsYUFBSyxjQUFjO0FBQUEsTUFDdkI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BTUEsZUFBZSxRQUFnQztBQUMzQyxhQUFLLGVBQWU7QUFBQSxNQUN4QjtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BS0EsZUFBZSxLQUFhO0FBQ3hCLGFBQUssY0FBYztBQUNuQixhQUFLLG9CQUFvQjtBQUFBLE1BQzdCO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFLQSx3QkFBZ0M7QUFDNUIsZUFBTyxLQUFLO0FBQUEsTUFDaEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFRQSxZQUFZLGFBQXFCLEtBQWMsU0FBNEI7QUFFdkUsWUFBSSxRQUFRLFVBQWEsWUFBWSxRQUFXO0FBQzVDLGdCQUFNLFdBQVcsR0FBRyxXQUFXLElBQUksT0FBTyxLQUFLLFdBQVcsSUFBSSxVQUFVLFlBQVksTUFBTTtBQUMxRixpQkFBTyxZQUFZLEtBQUs7QUFBQSxRQUM1QjtBQUVBLGVBQU8sZUFBZSxLQUFLO0FBQUEsTUFDL0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BTUEsbUJBQW1CLGFBQW9FO0FBQ25GLGVBQU8sS0FBSyxvQkFBb0IsV0FBVztBQUFBLE1BQy9DO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQWtCTSxpQkFBaUIsYUFBcUIsS0FBYyxTQUE4QztBQUFBO0FBQ3BHLGlCQUFPLEtBQUssaUJBQWlCLGFBQWEsS0FBSyxPQUFPO0FBQUEsUUFDMUQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BUU0saUJBQWlCLGFBQXFCLHVCQUFnQyxTQUE4QztBQUFBO0FBQ3RILGdCQUFNLEVBQUUsS0FBSyxZQUFZLFNBQVMsSUFBSSxLQUFLLGNBQWMsYUFBYSx1QkFBdUIsT0FBTztBQUVwRyxrQkFBUSxJQUFJLHNDQUFzQztBQUFBLFlBQzlDLGFBQWEsWUFBWSxNQUFNLEdBQUcsQ0FBQyxJQUFJO0FBQUEsWUFDdkM7QUFBQSxZQUNBO0FBQUEsWUFDQTtBQUFBLFlBQ0EsUUFBUSxZQUFZLEtBQUs7QUFBQSxVQUM3QixDQUFDO0FBRUQsY0FBSSxDQUFDLEtBQUssU0FBUyxRQUFRLEdBQUc7QUFFMUIsZ0JBQUksQ0FBQyxLQUFLLG9CQUFvQixXQUFXLEdBQUc7QUFDeEMsbUJBQUssb0JBQW9CLFdBQVcsSUFBSSxFQUFFLEtBQUssU0FBUyxXQUFXO0FBQUEsWUFDdkU7QUFHQSxpQkFBSyxTQUFTLFFBQVEsSUFBSSxJQUFJO0FBQUEsY0FDMUIsQ0FBTyxTQUFTLFdBQVc7QUFDdkIsb0JBQUk7QUFDQSxzQkFBSTtBQUNKLHNCQUFJLEtBQUssYUFBYTtBQUNsQiwwQkFBTSxPQUFPLGFBQWEsWUFBWTtBQUN0QywwQkFBTSxHQUFHLEtBQUssUUFBUSxlQUFlLFdBQVcsSUFBSSxJQUFJO0FBQ3hELDBCQUFNLEtBQUssSUFBSSxnQkFBZ0IsS0FBSyxZQUFZLEVBQUUsU0FBUztBQUMzRCx3QkFBSSxHQUFJLFFBQU8sSUFBSSxFQUFFO0FBQUEsa0JBQ3pCLE9BQU87QUFDSCwwQkFBTSxlQUFlLFdBQVcsUUFBUSxHQUFHO0FBQzNDLHdCQUFJLFlBQVk7QUFDWiw2QkFBTztBQUFBLG9CQUNYO0FBR0Esd0JBQUksS0FBSyxVQUFVLFVBQVUsQ0FBQyxZQUFZO0FBQ3RDLDZCQUFPO0FBQUEsb0JBQ1g7QUFBQSxrQkFDSjtBQUlBLHdCQUFNLFlBQVksS0FBSyxVQUFVLFNBQVMsQ0FBQyxLQUFLLGVBQWUsQ0FBQztBQUNoRSx3QkFBTSxXQUFXLFlBQVksY0FBYztBQUFBLG9CQUN2QyxLQUFLLGFBQWE7QUFBQSxvQkFBRztBQUFBLG9CQUFhO0FBQUEsb0JBQ2xDO0FBQUEsb0JBQVksS0FBSyxVQUFVLFNBQVMsUUFBUTtBQUFBLGtCQUFLLElBQUk7QUFDekQsc0JBQUksT0FBTyxZQUFZLE1BQU0sY0FBYyxJQUFJLFFBQVEsSUFBSTtBQUUzRCxzQkFBSSxRQUFRLGNBQWMsTUFBTSxJQUFJLEdBQUc7QUFHbkMseUJBQUssZUFBZTtBQUNwQix5QkFBSyxlQUFlLGFBQWEsR0FBRztBQUNwQyxvQkFBQyxLQUFLLFNBQVMsUUFBUSxFQUFVLFdBQVcsS0FBSztBQUNqRCw0QkFBUSxLQUFLLE1BQU07QUFDbkI7QUFBQSxrQkFDSjtBQUVBLHNCQUFJLFFBQVEsS0FBSyxLQUFLO0FBWWxCLDBCQUFNLFdBQVcsZ0JBQWdCLFdBQVcsUUFBUSxHQUFHLE1BQ2xELEtBQUssVUFBVSxTQUFTLGFBQWEsTUFDdEMsU0FBUyxtQkFBbUIsS0FBSyxHQUFHLENBQUM7QUFDekMseUJBQUssZUFBZTtBQUNwQix3QkFBSTtBQUNBLDRCQUFNLFFBQVEsTUFBTSxLQUFLLGNBQWMsUUFBUTtBQUMvQywwQkFBSSxNQUFNLElBQUk7QUFDViw4QkFBTSxPQUFPLE1BQU0sTUFBTSxLQUFLO0FBQzlCLDZCQUFLLEtBQUssYUFBYSxDQUFDLEdBQUcsU0FBUyxXQUFXLEdBQUc7QUFDOUMsK0JBQUssZUFBZTtBQUNwQiwrQkFBSyxlQUFlLGNBQWMsaUJBQWdCLFdBQVcsSUFBSTtBQUNqRSwrQkFBSyxXQUFXLEtBQUssSUFBSTtBQUN6QiwrQkFBSyxXQUFXLGNBQWMsV0FBVyxNQUFNLE9BQU8sS0FBSyxLQUFLO0FBQ2hFLGdDQUFNLGNBQWMsSUFBSSxJQUFJO0FBQzVCLDBCQUFDLEtBQUssU0FBUyxRQUFRLEVBQVUsV0FBVyxLQUFLO0FBQ2pELGtDQUFRLEtBQUssTUFBTTtBQUNuQjtBQUFBLHdCQUNKO0FBRUEsOEJBQU0sUUFBUSxLQUFLLFNBQVMsQ0FBQyxHQUFHLENBQUM7QUFDakMsNEJBQUksTUFBTTtBQUNOLGdDQUFNLE1BQU0sa0NBQWtDLElBQUk7QUFDbEQsK0JBQUssZUFBZTtBQUNwQixnQ0FBTSxjQUFjLElBQUk7QUFBQSw0QkFDcEIsS0FBSztBQUFBLDRCQUFVLFFBQVE7QUFBQSw0QkFBSyxLQUFLLEtBQUssT0FBTztBQUFBLDRCQUM3QyxVQUFVLEtBQUssSUFBSTtBQUFBLDRCQUNuQixVQUFVLGNBQWMsV0FBVyxNQUFNLE9BQU87QUFBQSw0QkFDaEQsTUFBTSxLQUFLLGFBQWE7QUFBQSwwQkFDNUIsQ0FBUTtBQUNSLDBCQUFDLEtBQUssU0FBUyxRQUFRLEVBQVUsV0FBVztBQUM1QyxrQ0FBUSxHQUFHO0FBQ1g7QUFBQSx3QkFDSjtBQUFBLHNCQUNKO0FBQUEsb0JBQ0osU0FBUTtBQUFBLG9CQUdSO0FBQUEsa0JBQ0o7QUFFQSx3QkFBTSxNQUFNLEtBQUssY0FDWCxNQUFNLE1BQU0sR0FBRyxJQUNmLE1BQU0sS0FBSyxjQUFjLEdBQUc7QUFDbEMsc0JBQUksQ0FBQyxJQUFJLElBQUk7QUFDVCwyQkFBTyxJQUFJLE1BQU0sNkJBQTZCLFdBQVcsTUFBTSxJQUFJLE1BQU0sR0FBRyxLQUFLLGNBQWMsU0FBUyxHQUFHLEtBQUssRUFBRSxHQUFHLENBQUM7QUFDdEg7QUFBQSxrQkFDSjtBQUNBLHdCQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUs7QUFDNUIsd0JBQU0sVUFBVSxLQUFLO0FBRXJCLHNCQUFJLENBQUMsU0FBUztBQUNWLDJCQUFPLElBQUksTUFBTSxjQUFjLFdBQVcsYUFBYSxDQUFDO0FBQ3hEO0FBQUEsa0JBQ0o7QUFFQSxzQkFBSSxDQUFDLFFBQVEsbUJBQW1CLENBQUMsUUFBUSxnQkFBZ0IsUUFBUTtBQUM3RCwyQkFBTyxJQUFJLE1BQU0sY0FBYyxXQUFXLDRDQUE0QyxHQUFHLEdBQUcsQ0FBQztBQUM3RjtBQUFBLGtCQUNKO0FBRUEsd0JBQU0sa0JBQWtCLGtDQUFrQyxPQUFPO0FBQ2pFLHVCQUFLLGVBQWU7QUFDcEIsc0JBQUksV0FBVztBQUdYLDBCQUFNLGNBQWMsSUFBSTtBQUFBLHNCQUNwQixLQUFLO0FBQUEsc0JBQVUsUUFBUTtBQUFBLHNCQUN2QixLQUFNLFFBQWdCLE9BQU87QUFBQSxzQkFDN0IsVUFBVSxLQUFLLElBQUk7QUFBQSxzQkFDbkIsVUFBVSxjQUFjLFdBQVcsSUFBSSxPQUFPO0FBQUEsc0JBQzlDLE1BQU0sS0FBSyxhQUFhO0FBQUEsb0JBQzVCLENBQVE7QUFBQSxrQkFDWjtBQUVBLGtCQUFDLEtBQUssU0FBUyxRQUFRLEVBQVUsV0FBVztBQUM1QywwQkFBUSxlQUFlO0FBQUEsZ0JBQzNCLFNBQVMsR0FBRztBQUdSLHlCQUFPLEtBQUssU0FBUyxRQUFRO0FBQzdCLHlCQUFPLENBQUM7QUFBQSxnQkFDWjtBQUFBLGNBQ0o7QUFBQSxZQUNKO0FBQUEsVUFDSjtBQUVBLGlCQUFPLE1BQU0sS0FBSyxTQUFTLFFBQVE7QUFBQSxRQUN2QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQWVBLGtCQUFrQixhQUFxQixLQUFjLFNBQTRDO0FBM2lCckcsWUFBQUE7QUE0aUJRLGNBQU0sRUFBRSxTQUFTLElBQUksS0FBSyxjQUFjLGFBQWEsS0FBSyxPQUFPO0FBQ2pFLGlCQUFPQSxNQUFBLEtBQUssU0FBUyxRQUFRLE1BQXRCLGdCQUFBQSxJQUF5QixhQUFZO0FBQUEsTUFDaEQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BTUEsaUJBQWlCLGFBQXFCLEtBQWMsU0FBNkI7QUFwakJyRixZQUFBQSxLQUFBO0FBcWpCUSxpQkFBTyxNQUFBQSxNQUFBLEtBQUssa0JBQWtCLGFBQWEsS0FBSyxPQUFPLE1BQWhELGdCQUFBQSxJQUFtRCxTQUFuRCxtQkFBeUQsV0FBVSxDQUFDO0FBQUEsTUFDL0U7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFVUSxjQUFjLGFBQXFCLHVCQUFnQyxTQUFtQjtBQUUxRixjQUFNLFlBQVksS0FBSyxvQkFBb0IsV0FBVztBQUN0RCxjQUFNLG9CQUFvQiwwQkFBMEIsVUFBYSxZQUFZO0FBRTdFLFlBQUk7QUFDSixZQUFJO0FBRUosWUFBSSxDQUFDLHFCQUFxQixXQUFXO0FBRWpDLGdCQUFNLFVBQVU7QUFDaEIsdUJBQWEsVUFBVTtBQUFBLFFBQzNCLE9BQU87QUFFSCxnQkFBTSx5QkFBeUIsS0FBSztBQUlwQyxnQkFBTSxrQkFBa0IseUJBQXlCLEtBQUs7QUFDdEQsdUJBQWEsWUFBWSxPQUFPLE9BQVEsWUFBWSxRQUFRLFFBQVEsQ0FBQztBQUFBLFFBQ3pFO0FBRUEsZUFBTyxFQUFFLEtBQUssWUFBWSxVQUFVLEdBQUcsV0FBVyxJQUFJLEdBQUcsSUFBSSxhQUFhLFlBQVksTUFBTSxHQUFHO0FBQUEsTUFDbkc7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFnQkEsaUJBQWlCLGFBQXFCLFFBQTBCLEtBQWMsU0FBeUI7QUFDbkcsY0FBTSxFQUFFLEtBQUssYUFBYSxZQUFZLFNBQVMsSUFBSSxLQUFLLGNBQWMsYUFBYSxLQUFLLE9BQU87QUFFL0YsY0FBTSxVQUFVLFFBQVEsUUFBUSxNQUFNO0FBR3RDLGdCQUFRLFdBQVc7QUFFbkIsYUFBSyxTQUFTLFFBQVEsSUFBSTtBQUMxQixhQUFLLG9CQUFvQixXQUFXLElBQUksRUFBRSxLQUFLLGFBQWEsU0FBUyxXQUFXO0FBQUEsTUFDcEY7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQW1CQSxtQkFBbUIsYUFBcUIsTUFBNkM7QUFwb0J6RixZQUFBQSxLQUFBO0FBcW9CUSxjQUFNLFFBQVFBLE1BQUEsNkJBQWMsU0FBZCxPQUFBQSxNQUFzQjtBQUNwQyxZQUFJLEdBQUMsa0NBQU0sZUFBTixtQkFBa0IsU0FBUTtBQUMzQixnQkFBTSxJQUFJLE1BQU0sc0JBQXNCLFdBQVcsbUNBQW1DO0FBQUEsUUFDeEY7QUFDQSxhQUFLLFVBQVUsV0FBVyxJQUFJLFFBQVEsUUFBUSxJQUFpQjtBQUMvRCxhQUFLLFlBQVksSUFBSSxXQUFXO0FBQUEsTUFDcEM7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQUtNLGlCQUFpQixhQUFxQixRQUFpQjtBQUFBO0FBQ3pELGNBQUksUUFBUTtBQUNSLGtCQUFNLE9BQU8sTUFBTSxLQUFLLFVBQVUsTUFBTTtBQUN4QyxtQkFBTyxLQUFLLFdBQVcsS0FBSyxPQUFLLEVBQUUsS0FBSyxPQUFPLFdBQVc7QUFBQSxVQUM5RCxPQUFPO0FBQ0gsa0JBQU0sT0FBTyxNQUFNLEtBQUssY0FBYyxXQUFXO0FBQ2pELG1CQUFPLEtBQUssV0FBVyxDQUFDO0FBQUEsVUFDNUI7QUFBQSxRQUNKO0FBQUE7QUFBQSxNQUVNLGNBQWMsYUFBcUI7QUFBQTtBQUNyQyxjQUFJLEtBQUssWUFBWSxPQUFPLFdBQVcsR0FBRztBQUN0QyxpQkFBSyxlQUFlLGFBQWEsZ0JBQWdCLEdBQUc7QUFBQSxVQUN4RDtBQUNBLGNBQUksQ0FBQyxLQUFLLFVBQVUsV0FBVyxHQUFHO0FBRTlCLGlCQUFLLFVBQVUsV0FBVyxJQUFJLElBQUk7QUFBQSxjQUM5QixDQUFPLFNBQVMsV0FBVztBQUN2QixvQkFBSTtBQUdBLHdCQUFNLE9BQU8sWUFBWSxXQUFXO0FBQ3BDLHdCQUFNLE1BQU0sS0FBSyxVQUFVLFFBQVEsS0FBSyxVQUFVLE9BQzVDLE1BQU0sS0FBSyxjQUFjLElBQUksSUFDN0IsTUFBTSxNQUFNLEdBQUcsS0FBSyxRQUFRLEdBQUcsSUFBSSxFQUFFO0FBQzNDLHdCQUFNLE9BQU8sTUFBTSxJQUFJLEtBQUs7QUFDNUIsMEJBQVEsS0FBSyxJQUFJO0FBQUEsZ0JBQ3JCLFNBQVMsR0FBRztBQUNSLHlCQUFPLEtBQUssVUFBVSxXQUFXO0FBQ2pDLHlCQUFPLENBQUM7QUFBQSxnQkFDWjtBQUFBLGNBQ0o7QUFBQSxZQUNKO0FBQUEsVUFDSjtBQUVBLGlCQUFPLE1BQU0sS0FBSyxVQUFVLFdBQVc7QUFBQSxRQUMzQztBQUFBO0FBQUEsTUFFTSxVQUFVLFFBQWdCO0FBQUE7QUFDNUIsY0FBSSxDQUFDLEtBQUssVUFBVSxNQUFNLEdBQUc7QUFFekIsaUJBQUssVUFBVSxNQUFNLElBQUksSUFBSTtBQUFBLGNBQ3pCLENBQU8sU0FBUyxXQUFXO0FBQ3ZCLG9CQUFJO0FBQ0Esd0JBQU0sTUFBTSxNQUFNO0FBQUEsb0JBQ2QsR0FBRyxLQUFLLFFBQVEsWUFBWSxNQUFNO0FBQUEsa0JBQ3RDO0FBQ0Esd0JBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QiwwQkFBUSxLQUFLLElBQUk7QUFBQSxnQkFDckIsU0FBUyxHQUFHO0FBQ1IseUJBQU8sS0FBSyxVQUFVLE1BQU07QUFDNUIseUJBQU8sQ0FBQztBQUFBLGdCQUNaO0FBQUEsY0FDSjtBQUFBLFlBQ0o7QUFBQSxVQUNKO0FBRUEsaUJBQU8sTUFBTSxLQUFLLFVBQVUsTUFBTTtBQUFBLFFBQ3RDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFRTSxlQUFlLGFBQXFCLFFBQWlCO0FBQUE7QUFDdkQsaUJBQU8sS0FBSyxpQkFBaUIsYUFBYSxNQUFNO0FBQUEsUUFDcEQ7QUFBQTtBQUFBLElBQ0o7QUEvbUJJLGtCQURTLGtCQUNNLFNBQWdDO0FBOEMvQztBQUFBLGtCQS9DUyxrQkErQ2UsZ0JBQWU7QUEvQ3BDLElBQU0sa0JBQU47QUFxbkJBLElBQU0scUJBQXFCO0FBQUE7QUFBQTs7O0FDMXRCbEMsSUFHSSxrQkFFUyxvQkFFQSxhQUlBLG9CQUlBLGdCQUlBLHVCQVNBLGtCQW9DQSxlQUdBLFVBa0JBLGlCQVdBLGVBR0EsYUFLQSxvQkFJQSxnQkFJQSxtQkFhQSxrQkFJQSxtQkF1QkEsbUJBeUJBO0FBakxiO0FBQUE7QUFBQTtBQUFBO0FBR0EsSUFBSSxtQkFBbUIsZ0JBQWdCO0FBRWhDLElBQU0scUJBQXFCLE1BQU07QUFFakMsSUFBTSxjQUFjLENBQUMsYUFBcUIsS0FBYyxZQUErQjtBQUMxRixhQUFPLGlCQUFpQixZQUFZLGFBQWEsS0FBSyxPQUFPO0FBQUEsSUFDakU7QUFFTyxJQUFNLHFCQUFxQixDQUFDLGdCQUF3QjtBQUN2RCxhQUFPLGlCQUFpQixtQkFBbUIsV0FBVztBQUFBLElBQzFEO0FBRU8sSUFBTSxpQkFBaUIsTUFBTTtBQUNoQyx5QkFBbUIsSUFBSSxnQkFBZ0IsdUJBQXVCO0FBQUEsSUFDbEU7QUFFTyxJQUFNLHdCQUF3QixDQUFDLFFBQWdCO0FBQ2xELHlCQUFtQixJQUFJLGdCQUFnQixHQUFHO0FBQUEsSUFDOUM7QUFPTyxJQUFNLG1CQUFtQixDQUFDLFFBQWdCLGdCQUF5QztBQUN0Rix5QkFBbUIsSUFBSSxnQkFBZ0IsTUFBTTtBQUM3Qyx1QkFBaUIsaUJBQWlCO0FBQ2xDLFVBQUksYUFBYTtBQUNiLHlCQUFpQixlQUFlLFdBQVc7QUFBQSxNQUMvQztBQUFBLElBQ0o7QUE4Qk8sSUFBTSxnQkFBZ0I7QUFHdEIsSUFBTSxXQUFXLENBQUMsT0FBb0YsQ0FBQyxNQUFNO0FBbkVwSCxVQUFBRSxLQUFBO0FBb0VJLFlBQU0sWUFBWSxLQUFLLFdBQVcsU0FBUyxLQUFLLFVBQVUsUUFBUSxLQUFLLFNBQVM7QUFDaEYsdUJBQWlCLFlBQVk7QUFBQSxRQUN6QixTQUFRQSxNQUFBLEtBQUssV0FBTCxPQUFBQSxNQUFlO0FBQUEsUUFDdkIsUUFBTyxVQUFLLFVBQUwsWUFBYztBQUFBLFFBQ3JCLE9BQU0sVUFBSyxTQUFMLFlBQWE7QUFBQSxRQUNuQixNQUFNLEtBQUssU0FBUyxTQUFZLEtBQUssT0FBUSxZQUFZLGdCQUFnQjtBQUFBLE1BQzdFLENBQUM7QUFDRCxhQUFPLGNBQWM7QUFBQSxJQUN6QjtBQVNPLElBQU0sa0JBQWtCLE1BQVk7QUFDdkMsWUFBTSxpQkFBaUIsZ0JBQWdCO0FBQ3ZDLGFBQU8sY0FBYztBQUFBLElBQ3pCO0FBUU8sSUFBTSxnQkFBZ0IsTUFBTSxpQkFBaUIsY0FBYztBQUczRCxJQUFNLGNBQWMsTUFBTTtBQUM3Qix1QkFBaUIsWUFBWSxFQUFFLFFBQVEsT0FBTyxPQUFPLE9BQU8sTUFBTSxPQUFPLE1BQU0sS0FBSyxDQUFDO0FBQ3JGLGFBQU8sY0FBYztBQUFBLElBQ3pCO0FBRU8sSUFBTSxxQkFBcUIsQ0FBQyxlQUFnQztBQUMvRCx5QkFBbUI7QUFBQSxJQUN2QjtBQUVPLElBQU0saUJBQWlCLENBQUMsUUFBZ0I7QUFDM0MsdUJBQWlCLGVBQWUsR0FBRztBQUFBLElBQ3ZDO0FBRU8sSUFBTSxvQkFBb0IsQ0FBQyxhQUFxQixLQUFjLFlBQXNCO0FBQ3ZGLGFBQU8saUJBQWlCLGtCQUFrQixhQUFhLEtBQUssT0FBTztBQUFBLElBQ3ZFO0FBV08sSUFBTSxtQkFBbUIsQ0FBQyxhQUFxQixLQUFjLFlBQWdDO0FBQ2hHLGFBQU8saUJBQWlCLGlCQUFpQixhQUFhLEtBQUssT0FBTztBQUFBLElBQ3RFO0FBRU8sSUFBTSxvQkFBb0IsQ0FBTyxLQUFlLEtBQWMsWUFBc0I7QUFDdkYsYUFBTyxRQUFRO0FBQUEsUUFDWCxJQUFJLElBQUksQ0FBQyxPQUFPLGlCQUFpQixpQkFBaUIsSUFBSSxLQUFLLE9BQU8sQ0FBQztBQUFBLE1BQ3ZFO0FBQUEsSUFDSjtBQW1CTyxJQUFNLG9CQUFvQixDQUM3QixTQUNBLEtBQ0EsWUFDQztBQUNELGlCQUFXLENBQUMsSUFBSSxNQUFNLEtBQUssT0FBTyxRQUFRLE9BQU8sR0FBRztBQUNoRCx5QkFBaUIsaUJBQWlCLElBQUksUUFBUSxLQUFLLE9BQU87QUFBQSxNQUM5RDtBQUFBLElBQ0o7QUFpQk8sSUFBTSxzQkFBc0IsQ0FBQyxVQUErQjtBQUMvRCxpQkFBVyxDQUFDLElBQUksSUFBSSxLQUFLLE9BQU8sUUFBUSxLQUFLLEdBQUc7QUFDNUMseUJBQWlCLG1CQUFtQixJQUFJLElBQUk7QUFBQSxNQUNoRDtBQUFBLElBQ0o7QUFBQTtBQUFBOzs7QUNyTEEsSUFNc0I7QUFOdEI7QUFBQTtBQUFBO0FBQUE7QUFNTyxJQUFlLGlDQUFmLGNBQXVGLDBCQUE2RTtBQUFBLE1BSXZLLFlBQVksZUFBMkIsU0FBeUQ7QUFDNUYsY0FBTSxhQUFhO0FBRGdCO0FBTXZDLHdDQUFXLENBQUMsVUFBYTtBQUVyQixjQUFJLE1BQU0sYUFBYTtBQUNuQixrQkFBTSxjQUFjLE1BQU07QUFDMUIsZ0JBQUksS0FBSyxRQUFRLFdBQVcsRUFBRSxTQUFTO0FBR25DLG9CQUFNLGlCQUFpQixDQUFDLFNBQTBCLGFBQStCO0FBQzdFLHFCQUFLLGNBQWMsaUNBQ1osVUFEWTtBQUFBLGtCQUVmLFFBQVEsTUFBTSxjQUFjLE1BQU0sY0FBYyxNQUFNO0FBQUEsa0JBQ3RELGFBQWEsTUFBTSxTQUFTLE1BQU0sU0FBUyxNQUFNO0FBQUEsZ0JBQ3JELElBQXNCLFFBQVE7QUFBQSxjQUNsQztBQUVBLHFCQUFPLEtBQUssY0FBYyxPQUFPLEtBQUssUUFBUSxXQUFXLEVBQUUsU0FBUyxjQUFjO0FBQUEsWUFDdEYsT0FBTztBQUNIO0FBQUEsWUFDSjtBQUFBLFVBQ0osT0FBTztBQUNIO0FBQUEsVUFDSjtBQUFBLFFBQ0o7QUFBQSxNQTFCQTtBQUFBLElBMkJKO0FBQUE7QUFBQTs7O0FDdkNBLElBQWE7QUFBYixJQUFBQyxlQUFBO0FBQUE7QUFBQTtBQUFPLElBQU0saUJBQWlCO0FBQUEsTUFDMUIsSUFBSTtBQUFBLElBQ1I7QUFBQTtBQUFBOzs7QUNGQSxJQUdhLGtCQUlBO0FBUGI7QUFBQTtBQUFBO0FBQUEsSUFBQUM7QUFHTyxJQUFNLG1CQUFtQixDQUFDLEtBQVUsT0FBbUI7QUFDMUQsYUFBTyxHQUFHLGlCQUFpQixJQUFJLGVBQWUsRUFBRSxLQUFLLElBQUksVUFBVSxRQUFRLElBQUk7QUFBQSxJQUNuRjtBQUVPLElBQU0sdUJBQXVCLENBQUMsS0FBVSxPQUFtQjtBQUM5RCxZQUFNLFdBQVcsaUJBQWlCLEtBQUssRUFBRTtBQUN6QyxVQUFJLFNBQVMsUUFBUTtBQUNqQixlQUFPLFNBQVMsS0FBSyxDQUFDO0FBQUEsTUFDMUI7QUFDQSxhQUFPO0FBQUEsSUFDWDtBQUFBO0FBQUE7OztBQ2JBLElBTWE7QUFOYjtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUVPLElBQU0scUJBQU4sY0FBaUMsK0JBQWlEO0FBQUEsTUFBbEY7QUFBQTtBQUVILDJDQUFjLGFBQWE7QUFFM0IsNkNBQWdCLENBQUMsT0FBeUIsZUFBOEIsa0JBQWlDO0FBQ3JHLGdCQUFNLFFBQVEsaUJBQWlCLE1BQU0sS0FBSyxjQUFjLFVBQVU7QUFDbEUsZ0JBQU0sZUFBc0IsQ0FBQztBQUU3QixnQkFBTSxRQUFRLFVBQVE7QUFDbEIsa0JBQU0sVUFBVSxNQUFNO0FBQ2xCLDRCQUFjLElBQUksbUJBQW1CLE1BQU0sZUFBZSxDQUFDO0FBQUEsWUFDL0Q7QUFFQSxpQkFBSyxpQkFBaUIsU0FBUyxPQUFPO0FBQ3RDLHlCQUFhLEtBQUssTUFBTTtBQUNwQixtQkFBSyxvQkFBb0IsU0FBUyxPQUFPO0FBQUEsWUFDN0MsQ0FBQztBQUFBLFVBQ0wsQ0FBQztBQUVELGlCQUFPLE1BQU07QUFDVCx5QkFBYSxRQUFRLFVBQVEsS0FBSyxDQUFDO0FBQUEsVUFDdkM7QUFBQSxRQUNKO0FBQUE7QUFBQSxJQUNKO0FBQUE7QUFBQTs7O0FDN0JBLElBTWE7QUFOYjtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBRUE7QUFFTyxJQUFNLG9CQUFOLGNBQWdDLCtCQUFtRDtBQUFBLE1BQW5GO0FBQUE7QUFFSCwyQ0FBYyxhQUFhO0FBRTNCLDZDQUFnQixDQUFDLE9BQTJCLGtCQUFpQztBQUN6RSxnQkFBTSxRQUFRLGlCQUFpQixNQUFNLEtBQUssY0FBYyxVQUFVO0FBQ2xFLGdCQUFNLFFBQVEsVUFBUTtBQUNsQixpQkFBSyxjQUFjLE1BQU07QUFBQSxVQUM3QixDQUFDO0FBQUEsUUFDTDtBQUFBO0FBQUEsSUFDSjtBQUFBO0FBQUE7OztBQ2hCQSxJQUVhO0FBRmI7QUFBQTtBQUFBO0FBQUE7QUFFTyxJQUFNLGdCQUFOLGNBQTRCLFFBQVE7QUFBQSxNQUN2QyxZQUFtQixXQUErQixZQUF3QjtBQUN0RSxjQUFNLFdBQVcsVUFBVTtBQURaO0FBQStCO0FBQUEsTUFFbEQ7QUFBQSxJQUNKO0FBQUE7QUFBQTs7O0FDTkEsSUFPYTtBQVBiO0FBQUE7QUFBQTtBQUFBO0FBQ0EsSUFBQUM7QUFDQTtBQUVBO0FBQ0E7QUFFTyxJQUFNLCtCQUFOLGNBQTJDLCtCQUFzRDtBQUFBLE1BQWpHO0FBQUE7QUFDSCw2Q0FBZ0IsQ0FBQyxPQUE4QixrQkFBaUM7QUFHNUUsZ0JBQU0sZUFBZSxjQUFjLFdBQVcsaUJBQWlCLElBQUksZUFBZSxFQUFFLEdBQUc7QUFFdkYsY0FBSSxXQUE2QixDQUFDO0FBRWxDLHVCQUFhLFFBQVEsVUFBUTtBQUt6QixrQkFBTSxTQUFTLEtBQUssYUFBYSxlQUFlLEVBQUU7QUFFbEQsZ0JBQUksUUFBUTtBQUdSLHVCQUFTLEtBQUssSUFBSSxlQUFlLFFBQVEsS0FBSyxTQUFTLEtBQUssc0JBQXNCLEdBQUcsS0FBSyxXQUFXLEtBQUssVUFBVSxDQUFDO0FBQUEsWUFDekg7QUFBQSxVQUNKLENBQUM7QUFFRCxlQUFLLGNBQWMsSUFBSSx3QkFBd0IsTUFBTSxpQkFBaUIsUUFBUSxDQUFDO0FBQUEsUUFDbkY7QUFFQSwyQ0FBYyxhQUFhO0FBQUE7QUFBQSxJQUcvQjtBQUFBO0FBQUE7OztBQ25DQSxJQU1hO0FBTmI7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUVBO0FBRU8sSUFBTSxzQkFBTixjQUFrQywrQkFBb0Q7QUFBQSxNQUF0RjtBQUFBO0FBRUgsMkNBQWMsYUFBYTtBQUUzQiw2Q0FBZ0IsQ0FBQyxPQUE0QixrQkFBaUM7QUFDMUUsZ0JBQU0sUUFBUSxpQkFBaUIsTUFBTSxLQUFLLGNBQWMsVUFBVTtBQUNsRSxnQkFBTSxRQUFRLFVBQVE7QUFDbEIsaUJBQUssYUFBYSxNQUFNLE1BQU0sTUFBTSxLQUFLO0FBQUEsVUFDN0MsQ0FBQztBQUFBLFFBQ0w7QUFBQTtBQUFBLElBQ0o7QUFBQTtBQUFBOzs7QUNoQkEsSUFVYTtBQVZiO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFJQTtBQUVBO0FBQ0E7QUFFTyxJQUFNLDBCQUFOLGNBQXNDLCtCQUF3RDtBQUFBLE1BQTlGO0FBQUE7QUFFSCwyQ0FBYyxhQUFhO0FBRTNCLDZDQUFnQixDQUFDLE9BQWdDLGVBQThCLGtCQUFpQztBQUU1RyxnQkFBTSxRQUFRLGlCQUFpQixNQUFNLEtBQUssY0FBYyxVQUFVO0FBQ2xFLGdCQUFNLGVBQStCLENBQUM7QUFFdEMsZ0JBQU0sUUFBUSxVQUFRO0FBQ2xCLGtCQUFNLFVBQVUsQ0FBQyxNQUFNO0FBR25CLDRCQUFjLElBQUksNkJBQTZCLE1BQU0saUJBQWtCLGlCQUFpQixHQUFHLE1BQU0sb0JBQW9CLENBQUMsQ0FBQztBQUFBLFlBQzNIO0FBRUEsaUJBQUssaUJBQWlCLE1BQU0sTUFBTSxPQUFPO0FBRXpDLHlCQUFhLEtBQUssTUFBTTtBQUNwQixtQkFBSyxvQkFBb0IsTUFBTSxNQUFNLE9BQU87QUFBQSxZQUNoRCxDQUFDO0FBQUEsVUFDTCxDQUFDO0FBRUQsaUJBQU8sTUFBTTtBQUNULHlCQUFhLFFBQVEsVUFBUSxLQUFLLENBQUM7QUFBQSxVQUN2QztBQUFBLFFBQ0o7QUFBQTtBQUFBLElBQ0o7QUFBQTtBQUFBOzs7QUNyQ0EsSUFRYTtBQVJiO0FBQUE7QUFBQTtBQUFBO0FBQ0EsSUFBQUM7QUFDQTtBQUNBO0FBQ0E7QUFJTyxJQUFNLG1DQUFOLGNBQStDLCtCQUEwRDtBQUFBLE1BQXpHO0FBQUE7QUFFSCwyQ0FBYyxhQUFhO0FBRTNCLDZDQUFnQixDQUFDLE9BQWtDLGVBQThCLGtCQUFpQztBQUU5RyxnQkFBTSxZQUFZLE1BQVk7QUFFMUIsa0JBQU0sV0FBVyxjQUFjLFdBQVcsaUJBQThCLElBQUksZUFBZSxFQUFFLEtBQUssTUFBTSxVQUFVLFFBQVEsSUFBSTtBQUU5SCxnQkFBSSxTQUFTLFdBQVcsR0FBRztBQUN2QixvQkFBTUMsV0FBVSxRQUFRLFNBQVM7QUFFakMsb0JBQU0sZUFBZUEsU0FBUSxXQUFXLEtBQUssT0FBSyxFQUFFLE9BQU8sTUFBTSxRQUFRLEVBQUU7QUFDM0Usa0JBQUksY0FBYztBQUVkLDZCQUFhLFFBQVE7QUFBQSxjQUN6QixPQUFPO0FBQUEsY0FFUDtBQUlBLG9CQUFNLFFBQVFBLFNBQVEsV0FBVyxRQUFRLFlBQVk7QUFDckQsa0JBQUksVUFBVSxJQUFJO0FBQ2QsZ0JBQUFBLFNBQVEsV0FBVyxPQUFPLE9BQU8sQ0FBQztBQUFBLGNBRXRDLE9BQU87QUFBQSxjQUVQO0FBRUEsb0JBQU0sMEJBQTBCLE1BQU1BLFNBQVE7QUFBQSxnQkFBYyxNQUFNO0FBQUEsZ0JBQzlELFNBQVMsS0FBSyxDQUFDO0FBQUEsZ0JBQ2YsTUFBTTtBQUFBLGNBQU87QUFTakIsb0JBQU0sa0JBQXlCLENBQUM7QUFFaEMscUJBQU8sS0FBSyx3QkFBd0IsSUFBSSxFQUFFLFFBQVEsYUFBVztBQUN6RCxvQkFBSSxNQUFNLHdCQUF3QixLQUFLLE9BQU87QUFDOUMsc0JBQU0sSUFBSSxnQkFBZ0I7QUFFMUIsb0JBQUssSUFBdUIscUJBQXFCO0FBQzdDLGtDQUFnQixLQUFLO0FBQUEsb0JBQ2pCO0FBQUEsb0JBQ0EsdUJBQXdCLElBQXVCLG9CQUFvQjtBQUFBLGtCQUN2RSxDQUFDO0FBQUEsZ0JBQ0w7QUFBQSxjQUNKLENBQUM7QUFFRCw0QkFBYyxJQUFJLDJCQUEyQixNQUFNLGlCQUFpQixlQUFlLENBQUM7QUFBQSxZQUN4RixPQUFPO0FBQ0gsc0JBQVEsTUFBTSwwREFBMEQ7QUFDeEUsbUJBQUssY0FBYyxJQUFJLDJCQUEyQixNQUFNLGlCQUFpQixDQUFDLEdBQUcsSUFBSSxDQUFDO0FBRWxGO0FBQUEsWUFDSjtBQUFBLFVBQ0o7QUFFQSxvQkFBVSxFQUFFLEtBQUs7QUFBQSxRQUVyQjtBQUFBO0FBQUEsSUFDSjtBQUFBO0FBQUE7OztBQzVFQSxJQUlhO0FBSmI7QUFBQTtBQUFBO0FBRUE7QUFFTyxJQUFNLCtCQUErQixDQUFDLE9BQTZCLFNBQThCLFlBQXFCO0FBQ3pILFlBQU0saUJBQWlCLE1BQU0sZUFBZSxNQUFNLGVBQWUsQ0FBQztBQUNsRSxxQkFBZSxtQkFBbUI7QUFFbEMscUJBQWUsT0FBTztBQUN0QixxQkFBZSxVQUFVO0FBQ3pCLHFCQUFlLGlCQUFpQjtBQUVoQyxZQUFNLGtCQUFrQixJQUFJLFNBQVMsV0FBVyxNQUFNLE1BQU0saUJBQWlCO0FBQzdFLFlBQU0sTUFBTSxnQkFBZ0IsY0FBYztBQUkxQyxjQUFRLEdBQUc7QUFBQSxJQUNmO0FBQUE7QUFBQTs7O0FDbEJBLElBTWE7QUFOYixJQUFBQyw2QkFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUVPLElBQU0sdUJBQU4sY0FBbUMsK0JBQXFEO0FBQUEsTUFBeEY7QUFBQTtBQUNILDJDQUFjLGFBQWE7QUFFM0IsNkNBQWdCLENBQUMsT0FBNkIsZUFBOEIsa0JBQWlDO0FBQ3pHLGdCQUFNLFVBQVUsQ0FBQyxTQUFjO0FBQzNCLDBCQUFjLElBQUksMEJBQTBCLE1BQU0saUJBQWlCLElBQUksQ0FBQztBQUFBLFVBQzVFO0FBRUEsdUNBQTZCLE9BQU8sU0FBUyxhQUFhO0FBQUEsUUFDOUQ7QUFBQTtBQUFBLElBQ0o7QUFBQTtBQUFBOzs7QUNoQkEsSUFRTSxlQTJFTztBQW5GYjtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBLElBQUFDO0FBQ0E7QUFFQSxJQUFNLGdCQUFnQixDQUFDLFlBQStCO0FBQ2xELFVBQUksQ0FBQyxRQUFTLFFBQU87QUFHckIsVUFBSSxRQUFRLFlBQVksUUFBUTtBQUM1QixjQUFNLFdBQVcsSUFBSSxTQUFTLE9BQU87QUFDckMsY0FBTSxhQUFnQztBQUFBLFVBQ2xDLFVBQVUsQ0FBQztBQUFBLFVBQ1gsY0FBYyxDQUFDO0FBQUEsUUFDbkI7QUFHQSxjQUFNLFdBQVcsUUFBUSxpQkFBaUIseUJBQXlCO0FBQ25FLFlBQUksa0JBQWtCO0FBRXRCLGlCQUFTLFFBQVEsQ0FBQUMsYUFBVztBQUN4QixjQUFJLE9BQU9BLFNBQVEsVUFBVSxVQUFVO0FBQ25DLGtCQUFNLFNBQVNBLFNBQVEsYUFBYSxlQUFlLEVBQUU7QUFDckQsZ0JBQUksTUFBTUEsU0FBUSxhQUFhLE1BQU07QUFJckMsa0JBQU0sV0FBMEI7QUFBQSxjQUM1QixJQUFJQSxTQUFRO0FBQUEsY0FDWixNQUFNO0FBQUEsY0FDTixPQUFPLGNBQWNBLFFBQU87QUFBQSxjQUM1QixVQUFVQSxTQUFRO0FBQUEsY0FDbEIsVUFBVSxpQkFBaUJBLFNBQVEsVUFBVSxJQUFJO0FBQUEsY0FDakQ7QUFBQSxZQUNKO0FBRUEsZ0JBQUksQ0FBQyxLQUFLO0FBQ04seUJBQVcsYUFBYyxLQUFLLFFBQVE7QUFBQSxZQUMxQyxPQUFPO0FBQ0gsa0JBQUksV0FBVyxTQUFVLEdBQUcsR0FBRztBQUMzQixvQkFBSSxXQUFXLFNBQVUsR0FBRyxFQUFFLE9BQU87QUFDakMsNkJBQVcsYUFBYyxLQUFLLFFBQVE7QUFBQSxnQkFDMUMsT0FBTztBQUNILDZCQUFXLGFBQWMsS0FBSyxXQUFXLFNBQVUsR0FBRyxDQUFDO0FBQ3ZELDZCQUFXLFNBQVUsR0FBRyxJQUFJO0FBQUEsZ0JBQ2hDO0FBQUEsY0FDSixPQUFPO0FBQ0gsMkJBQVcsU0FBVSxHQUFHLElBQUk7QUFBQSxjQUNoQztBQUFBLFlBQ0o7QUFBQSxVQUNKO0FBQUEsUUFDSixDQUFDO0FBRUQsZUFBTztBQUFBLE1BQ1g7QUFHQSxVQUFJLFFBQVEsU0FBUyxjQUFjLFFBQVEsU0FBUyxTQUFTO0FBQ3pELGVBQU8sUUFBUSxVQUFVLFFBQVEsUUFBUTtBQUFBLE1BQzdDO0FBR0EsVUFBSSxRQUFRLFlBQVksV0FBVyxRQUFRLFlBQVksWUFBWTtBQUMvRCxlQUFPLFFBQVE7QUFBQSxNQUNuQjtBQUdBLFVBQUksUUFBUSxZQUFZLFVBQVU7QUFDOUIsZUFBTyxRQUFRO0FBQUEsTUFDbkI7QUFHQSxVQUFJLFFBQVEsbUJBQW1CO0FBQzNCLGVBQU8sUUFBUSxhQUFhLFFBQVE7QUFBQSxNQUN4QztBQUdBLGFBQU87QUFBQSxJQUNYO0FBRU8sSUFBTSx5QkFBTixjQUFxQywrQkFBdUQ7QUFBQSxNQUE1RjtBQUFBO0FBRUgsMkNBQWMsYUFBYTtBQUUzQiw2Q0FBZ0IsQ0FBQyxPQUErQixlQUE4QixrQkFBaUM7QUFDM0csZ0JBQU0sUUFBUSxpQkFBaUIsTUFBTSxLQUFLLGNBQWMsVUFBVTtBQUNsRSxnQkFBTSxRQUFRLFVBQVE7QUFFbEIsMEJBQWMsSUFBSSwwQkFBMEIsY0FBYyxJQUFJLENBQUMsR0FBRyxLQUFLO0FBQUEsVUFDM0UsQ0FBQztBQUFBLFFBQ0w7QUFBQTtBQUFBLElBQ0o7QUFBQTtBQUFBOzs7QUM5RkEsSUFPYTtBQVBiO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFFQTtBQUVPLElBQU0sc0JBQU4sY0FBa0MsK0JBQTZDO0FBQUEsTUFBL0U7QUFBQTtBQUVILDJDQUFjLGFBQWE7QUFFM0IsNkNBQWdCLENBQUMsT0FBMkIsa0JBQWlDO0FBQ3pFLGdCQUFNLFFBQVEsaUJBQWlCLE1BQU0sS0FBSyxjQUFjLFVBQVU7QUFDbEUsZ0JBQU0sUUFBUSxVQUFRO0FBQ2xCLGlCQUFLLFlBQVksTUFBTTtBQUFBLFVBQzNCLENBQUM7QUFBQSxRQUNMO0FBQUE7QUFBQSxJQUNKO0FBQUE7QUFBQTs7O0FDakJBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUErRGE7QUEvRGI7QUFBQTtBQUFBO0FBc0JBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUNBLElBQUFDO0FBQ0E7QUFDQTtBQW1CTyxJQUFNLGtCQUFOLGNBQThCLFlBQVk7QUFBQSxNQUExQztBQUFBO0FBRUgseURBQTRCO0FBRzVCO0FBQUEsaURBQW9CLENBQUMsV0FBd0IsV0FBdUI7QUFDaEUsb0JBQVUsaUJBQWlCLHVCQUF1QiwwQkFBMEIsQ0FBQyxNQUFXO0FBRXBGLGtCQUFNLGVBQWUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFO0FBQ3pDLGdCQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxNQUFNO0FBQ3JDO0FBQ0Esb0JBQU0sSUFBSSxNQUFNLDhDQUE4QztBQUFBLFlBQ2xFLE9BQU87QUFDSCxvQkFBTSxVQUFVO0FBR2hCLG1CQUFLLHFCQUFxQixDQUFDO0FBRTNCLGtCQUFJLFFBQVEsZ0JBQWdCLGFBQWEsYUFBYTtBQUVsRCxzQkFBTSxpQkFBa0IsUUFBd0IsUUFBUTtBQUN4RCxxQkFBSyxXQUFXLGNBQWMsRUFBRSxVQUFVLElBQUksY0FBYyxXQUFXLE1BQU07QUFBQSxjQUtqRjtBQUFBLFlBQ0o7QUFBQSxVQUNKLENBQUM7QUFHRCxxQkFBVyxNQUFNO0FBQ2IsaUJBQUssY0FBYyxJQUFJLFlBQVksQ0FBQztBQUFBLFVBQ3hDLEdBQUcsQ0FBQztBQUFBLFFBQ1I7QUFFQSw2Q0FBZ0IsQ0FBQyxTQUFnQyxhQUErQjtBQUM1RSxrQkFBUSxZQUFZLGlCQUFpQjtBQUdyQyxjQUFJLENBQUMsUUFBUSxvQkFBbUIscUNBQVU7QUFDdEMsb0JBQVEsa0JBQWtCLFNBQVM7QUFFdkMsaUJBQU8sS0FBSyxRQUFRLEtBQUssT0FBTztBQUFBLFFBQ3BDO0FBRUEsaURBQXNEO0FBQUEsVUFDbEQsSUFBSSxrQkFBa0IsS0FBSyxlQUFlLEtBQUssVUFBVTtBQUFBLFVBQ3pELElBQUksb0JBQW9CLEtBQUssZUFBZSxLQUFLLFVBQVU7QUFBQSxVQUMzRCxJQUFJLG1CQUFtQixLQUFLLGVBQWUsS0FBSyxVQUFVO0FBQUEsVUFDMUQsSUFBSSw2QkFBNkIsS0FBSyxlQUFlLEtBQUssVUFBVTtBQUFBLFVBQ3BFLElBQUksb0JBQW9CLEtBQUssZUFBZSxLQUFLLFVBQVU7QUFBQSxVQUMzRCxJQUFJLHdCQUF3QixLQUFLLGVBQWUsS0FBSyxVQUFVO0FBQUEsVUFDL0QsSUFBSSxxQkFBcUIsS0FBSyxlQUFlLEtBQUssVUFBVTtBQUFBLFVBQzVELElBQUksdUJBQXVCLEtBQUssZUFBZSxLQUFLLFVBQVU7QUFBQTtBQUFBLFVBRTlELElBQUksaUNBQWlDLEtBQUssZUFBZSxLQUFLLFVBQVU7QUFBQSxRQUM1RTtBQUVBLDRCQUFPLFFBQU8sTUFBTTtBQUFBLFFBR3BCO0FBQUE7QUFBQSxJQUNKO0FBRUEsd0JBQW9CLG1CQUFtQixlQUFlO0FBQUE7QUFBQTs7O0FDaEl0RDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7OztBQ2NBLFNBQVEsc0JBQXNCLHdCQUF1QjtBQXVCckQsU0FBUyw2QkFBNkIsWUFBb0IsZ0JBQXlFO0FBQy9ILFNBQU8sY0FBYyxZQUFZO0FBQUEsSUFFN0Isb0JBQW9CO0FBQ2hCLFlBQU0sT0FBTyxtQkFBbUIsbUJBQW1CLE9BQU8sU0FBUztBQUNuRSxZQUFNLFNBQVMsS0FBSyxhQUFhLEVBQUMsS0FBSSxDQUFDO0FBQ3ZDLHNCQUFnQixFQUFFLEtBQUssQ0FBQ0MsU0FBUTtBQUM1QixRQUFBQSxLQUFJLGtCQUFrQixNQUFNLE1BQU07QUFDbEMsZUFBTyxZQUFZO0FBQUEsTUFDdkIsQ0FBQztBQUFBLElBQ0w7QUFBQSxFQUNKO0FBQ0o7QUFqREEsSUFpQk0sMkJBQ0EsOEJBTUEsOEJBRUFDLE9BQ0YsS0FDRSxpQkF1QkEsMEJBS0Esb0JBT0EscUJBT087QUF0RWI7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQU9BO0FBQ0E7QUFJQSxJQUFNLDRCQUE0QjtBQUNsQyxJQUFNLCtCQUErQjtBQU1yQyxJQUFNLCtCQUFvRCxvQkFBSSxJQUFJO0FBRWxFLElBQU1BLFFBQWlCLENBQUM7QUFFeEIsSUFBTSxrQkFBa0IsTUFBWTtBQUNoQyxVQUFJLENBQUMsS0FBSztBQUVOLGNBQU0sSUFBSSxnQkFBZ0I7QUFDMUIsWUFBSSxLQUFLO0FBQUEsTUFDYjtBQUNBLGFBQU87QUFBQSxJQUNYO0FBZ0JBLElBQU0sMkJBQTJCLENBQUMsZUFBdUIsTUFBYyxtQkFBcUQ7QUFDeEgscUJBQWUsT0FBTyxlQUFlLDZCQUE2QixNQUFNLGNBQWMsQ0FBQztBQUN2RixjQUFRLElBQUksV0FBVyxhQUFhLDJDQUEyQztBQUFBLElBQ25GO0FBRUEsSUFBTSxxQkFBcUIsQ0FBQyxRQUFRO0FBQ2hDLGFBQU8sSUFDRixRQUFRLG1CQUFtQixPQUFPLEVBQ2xDLFFBQVEsVUFBVSxLQUFLLEVBQ3ZCLFlBQVk7QUFBQSxJQUNyQjtBQUVBLElBQU0sc0JBQXNCLENBQUMsU0FBaUI7QUFDMUMsYUFBTyxtQkFBbUIsSUFBSTtBQUM5QixhQUFPLEtBQUssUUFBUSxNQUFNLEdBQUc7QUFBQSxJQUNqQztBQUlPLElBQU0sc0JBQU4sY0FBa0MsZUFBZTtBQUFBLE1BQWpEO0FBQUE7QUFFSCxvQ0FBTyxZQUFZO0FBMFBuQixvQ0FBTyxDQUFPLHFCQUFpRCxNQUFtQixXQUF3QixZQUE0QjtBQUVsSSxnQkFBTSxlQUFnQixLQUFLO0FBRTNCLGdCQUFNLE9BQU8sS0FBSyxtQkFBbUIsYUFBYSxJQUFJO0FBQ3RELGdCQUFNLEVBQUUsTUFBTSxRQUFRLElBQUksTUFBTSxLQUFLLGtCQUFrQixxQkFBcUIsTUFBTSxjQUFjLE1BQU0sT0FBTztBQUU3RyxjQUFJLFNBQVMsT0FBTztBQUNoQixrQkFBTSxJQUFJLE1BQU0sNERBQTRELG9CQUFvQixFQUFFLEdBQUc7QUFBQSxVQUN6RztBQUVBLGNBQUksTUFBTTtBQUlOLGdCQUFJLFNBQVMsZ0JBQWdCO0FBQ3pCLG9CQUFNLElBQUksTUFBTSx5RUFBeUUsb0JBQW9CLEVBQUUsR0FBRztBQUFBLFlBQ3RIO0FBQ0EsbUJBQU8sS0FBSywwQkFBMEIscUJBQXFCLE1BQU0sV0FBVyxhQUFhLE1BQU0sT0FBTztBQUFBLFVBQzFHO0FBRUEsY0FBSSxRQUFRLGFBQWEsT0FBTyxDQUFDO0FBQ2pDLGNBQUk7QUFFSixjQUFJLGFBQWEsbUJBQW1CLG1CQUFtQixZQUFZO0FBQy9ELGtCQUFNLFNBQVMsT0FBTztBQUN0QixrQkFBTUMsU0FBUSxhQUFhLE1BQU07QUFFakMsZ0JBQUksZ0JBQWdCLFNBQVMsY0FBYyxRQUFRO0FBQ25ELDBCQUFjLEtBQUtBO0FBS25CLGdCQUFJLFNBQVM7QUFDVCw0QkFBYyxhQUFhLFdBQVcsd0NBQXdDO0FBQUEsWUFDbEY7QUFHQSwwQkFBYyxNQUFNLFVBQVU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLDRCQVFmLG1DQUFTLFVBQVMsTUFBTSxHQUFHO0FBQUE7QUFBQTtBQUFBLG1DQUdwQixtQ0FBUyxVQUFTLFNBQVMsS0FBSztBQUFBO0FBSXRELGdCQUFJLENBQUMsVUFBVSxjQUFjLG9CQUFvQjtBQUM3Qyx3QkFBVSxZQUFZO0FBRTFCLDRCQUFnQixLQUFLLFlBQVksV0FBVyxlQUFlLE9BQU87QUFLbEUsa0JBQU0sYUFBdUIsQ0FBQztBQUM5QixrQkFBTSxNQUFpRSxVQUNqRTtBQUFBLGNBQ0UsT0FBTztBQUFBLGNBQUM7QUFBQSxjQUNSLFFBQVEsR0FBVztBQUFFLDJCQUFXLEtBQUssQ0FBQztBQUFBLGNBQUc7QUFBQSxjQUN6QyxRQUFRO0FBQUUsOEJBQWMsU0FBUyxXQUFXLEtBQUssSUFBSTtBQUFBLGNBQUc7QUFBQSxZQUM1RCxLQUNHLE1BQU07QUFFTCxvQkFBTSxJQUFJLGNBQWMsbUJBQW1CLGNBQWMsY0FBYztBQUN2RSxnQkFBRSxLQUFLO0FBQ1AscUJBQU87QUFBQSxZQUNYLEdBQUc7QUFLUCxnQkFBSSxpQkFBNko7QUFDaks7QUFDSSxvQkFBTSxhQUFhLElBQUksVUFBVTtBQUNqQyxvQkFBTSxVQUFVLFdBQVcsZ0JBQWdCLGFBQWEsTUFBTSxXQUFXO0FBQ3pFLG9CQUFNLFdBQVcsUUFBUSxjQUFjLHdCQUF3QjtBQUMvRCxrQkFBSSxVQUFVO0FBQ1Ysb0JBQUk7QUFBRSxtQ0FBaUIsS0FBSyxNQUFNLFNBQVMsYUFBYSxTQUFTLEtBQUssSUFBSTtBQUFBLGdCQUFHLFNBQVE7QUFBQSxnQkFBQztBQUFBLGNBQzFGO0FBQUEsWUFDSjtBQUVBLGdCQUFJLGNBQWMsYUFBYTtBQUUvQixnQkFBSSxtQ0FBUyxhQUFhO0FBRXRCLG9CQUFNLFNBQVMsSUFBSSxVQUFVO0FBQzdCLG9CQUFNLE9BQU8sT0FBTyxnQkFBZ0IsYUFBYSxNQUFNLFdBQVc7QUFHbEUsb0JBQU0sc0JBQXNCLEtBQUssZUFBZSxjQUFjO0FBQzlELHlFQUFxQixnQkFBZ0I7QUFHckMsb0JBQU0sT0FBTyxLQUFLLGVBQWUsbUJBQW1CO0FBQ3BELG1CQUFLLEtBQUssWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFPdEIsb0JBQU0sT0FBTyxLQUFLLEtBQUs7QUFFdkIsa0JBQUksUUFBUSxLQUFLLE1BQU07QUFDbkIscUJBQUssS0FBSyxhQUFhLEtBQUssV0FBVyxNQUFNLElBQUksR0FBRyxLQUFLLEtBQUssVUFBVTtBQUFBLGNBQzVFO0FBT0EsNEJBQWMsb0JBQW9CLEtBQUssZ0JBQWdCO0FBQUEsWUFDM0QsWUFBVyxtQ0FBUyxVQUFTLFFBQVc7QUFLcEMsb0JBQU0sU0FBUyxJQUFJLFVBQVU7QUFDN0Isb0JBQU0sT0FBTyxPQUFPLGdCQUFnQixhQUFhLE1BQU0sV0FBVztBQUNsRSxvQkFBTSxzQkFBc0IsS0FBSyxlQUFlLGNBQWM7QUFFOUQsa0JBQUkscUJBQXFCO0FBQ3JCLG9DQUFvQixPQUFPO0FBRTNCLDhCQUFjLG9CQUFvQixLQUFLLGdCQUFnQjtBQUFBLGNBQzNEO0FBQUEsWUFDSjtBQUtBLGdCQUFJLG1DQUFTLFdBQVc7QUFDcEIsb0JBQU0sU0FBUyxJQUFJLFVBQVU7QUFDN0Isb0JBQU0sT0FBTyxPQUFPLGdCQUFnQixhQUFhLFdBQVc7QUFDNUQsb0JBQU0sV0FBVyxLQUFLLGNBQWMsT0FBTztBQUMzQyx1QkFBUyxhQUFhLHNCQUFzQixNQUFNO0FBT2xELHVCQUFTLGNBQWMsUUFBUSxVQUFVLFFBQVEsb0JBQW9CLFdBQVc7QUFDaEYsZUFBQyxLQUFLLFFBQVEsS0FBSyxpQkFBaUIsWUFBWSxRQUFRO0FBRXhELDRCQUFjLG9CQUFvQixLQUFLLGdCQUFnQjtBQUFBLFlBQzNEO0FBR0EsZ0JBQUksUUFBUSxXQUFXO0FBZ0J2QixrQkFBTSxZQUFZLG1CQUNaLFdBQVcsb0JBQW9CLGVBQy9CLGdCQUFnQixPQUFPLEtBQUssdUJBQXVCO0FBS3pELGtCQUFNLGFBQWEsbUJBQ2I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLDhCQVNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVlOLGdCQUFJLENBQUMsU0FBUztBQUNWLGtCQUFJLFFBQVEsR0FBRyxTQUFTLEdBQUcsVUFBVSxFQUFFO0FBQUEsWUFDM0M7QUFlQSxnQkFBSSxDQUFDLFlBQVcsbUNBQVMsVUFBUyxXQUFhLG1DQUFTLFVBQVMsTUFBTTtBQUVuRSxvQkFBTSxpQkFBaUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBU3ZCLG9CQUFNLGNBQWMsS0FBSyxVQUFVLFFBQVEsSUFBSSxFQUMxQyxRQUFRLGVBQWUsZ0JBQWdCO0FBTzVDLG9CQUFNLGFBQWE7QUFBQTtBQUFBLHFDQUVFLFdBQVc7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQTJEaEMsa0JBQUksUUFBUSxpQkFBaUIsVUFBVTtBQUFBLFlBQzNDO0FBR0EsZ0JBQUksU0FBUztBQUVULG9CQUFNLGVBQWMsbUNBQVMsVUFBUyxXQUFhLG1DQUFTLFVBQVMsT0FDL0QsS0FBSyxVQUFVLFFBQVEsSUFBSSxFQUFFLFFBQVEsZUFBZSxnQkFBZ0IsSUFDcEU7QUFDTixrQkFBSSxRQUFRLEtBQUsscUJBQXFCLFdBQVcsQ0FBQztBQUFBLFlBQ3REO0FBRUEsZ0JBQUksTUFBTTtBQUtWLGtCQUFNLE9BQU8sSUFBSSxvQkFBb0IscUJBQXFCLE1BQU0sV0FBVyxlQUFlLE9BQU87QUFHakcsZ0JBQUksUUFBUyxNQUFLLGdCQUFnQjtBQUdsQyxpQkFBSyxXQUFXO0FBTWhCLGlCQUFLLFVBQVUsRUFBRSxLQUFLLE1BQU07QUFDeEIsbUJBQUksbUNBQVMsY0FBYSxPQUFPO0FBRzdCO0FBQUEsY0FDSjtBQUNBLGtCQUFJLFFBQVE7QUFDWixtQkFBSyxnQkFBZ0I7QUFBQSxnQkFDakIsZUFBZTtBQUFBLGdCQUNmLGNBQWMsTUFBTTtBQUloQixzQkFBSSxDQUFDLFNBQVMsRUFBQyxtQ0FBUyxTQUFRO0FBQzVCLDRCQUFRO0FBQ1IseUJBQUssS0FBSztBQUFBLGtCQUNkO0FBQUEsZ0JBQ0o7QUFBQSxjQUNKLENBQUM7QUFBQSxZQUNMLENBQUM7QUFHRCxtQkFBTztBQUFBLFVBRVg7QUFFQSxjQUFJLGFBQWEsbUJBQW1CLG1CQUFtQixNQUFNO0FBTXpELGtCQUFNLFdBQVcsU0FBUyxjQUFjLFVBQVU7QUFDbEQscUJBQVMsWUFBWSxhQUFhO0FBQ2xDLHNCQUFVLFNBQVMsUUFBUTtBQWEzQiw0QkFBZ0IsRUFBRSxLQUFLLENBQUNGLFNBQVE7QUFDNUIsY0FBQUEsS0FBSSxrQkFBa0IsU0FBUyxPQUFPO0FBQUEsWUFDMUMsQ0FBQztBQUFBLFVBQ0wsT0FBTztBQUNILGtCQUFNLG9CQUFvQixvQkFBb0Isb0JBQW9CLE9BQU8sS0FBSyxFQUFFO0FBR2hGLGdCQUFJLENBQUNDLE1BQUssU0FBUyxpQkFBaUIsR0FBRztBQUNuQyx1Q0FBeUIsbUJBQW1CLGFBQWEsTUFBTSxhQUFhLGNBQWM7QUFDMUYsY0FBQUEsTUFBSyxLQUFLLGlCQUFpQjtBQUFBLFlBQy9CO0FBQ0Esc0JBQVUsU0FBUyxjQUFjLGlCQUFpQjtBQUFBLFVBQ3REO0FBRUEsY0FBSSxDQUFDLFVBQVUsY0FBYyxvQkFBb0I7QUFDN0Msc0JBQVUsWUFBWTtBQUcxQixrQkFBUSxLQUFLO0FBRWIsY0FBSSxtQ0FBUyxRQUFRO0FBQ2pCLG9CQUFRLE1BQU0sVUFBVTtBQUN4QixvQkFBUSxNQUFNLFdBQVc7QUFDekIsb0JBQVEsTUFBTSxTQUFTO0FBQ3ZCLG9CQUFRLE1BQU0sUUFBUTtBQUN0QixvQkFBUSxNQUFNLGdCQUFnQjtBQUM5QixvQkFBUSxNQUFNLGFBQWE7QUFBQSxVQUMvQjtBQVVBLGVBQUssWUFBWSxXQUFXLFNBQVMsT0FBTztBQUc1QyxpQkFBTyxJQUFJLGlCQUFpQixxQkFBcUIsTUFBTSxXQUFXLFNBQVMsT0FBTztBQUFBLFFBQ3RGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQXBvQlEsbUJBQW1CLE1BQXVCO0FBQzlDLFlBQUksS0FBSyxVQUFVLEVBQUUsV0FBVyx5QkFBeUIsRUFBRyxRQUFPO0FBQ25FLGVBQU8sSUFBSSxPQUFPLDBCQUEwQiw0QkFBNEIsWUFBWSxHQUFHLEVBQUUsS0FBSyxJQUFJO0FBQUEsTUFDdEc7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQVFjLGtCQUNWLHFCQUNBLE1BQ0EsY0FDQSxnQkFDQSxTQUN1RDtBQUFBO0FBaEgvRCxjQUFBRSxLQUFBO0FBaUhRLGdCQUFNLGdCQUE0QixpQkFDNUIsaUJBQ0UsYUFBYSxjQUFhLG1DQUFTLGFBQWEsbUJBQW1CO0FBRzNFLGdCQUFNLFVBQ0Ysd0NBQVMsaUJBQVQsYUFBMEIsWUFBQUEsTUFBQSxpQ0FBZ0IsU0FBaEIsZ0JBQUFBLElBQXNCLFlBQXRCLG1CQUErQixvQkFBL0I7QUFFOUIsZ0JBQU0sT0FBMkIsU0FDM0IsTUFBTSxPQUFPLEVBQUUscUJBQXFCLE1BQU0sZUFBZSxlQUFlLENBQUMsSUFDekU7QUFFTixpQkFBTyxFQUFFLE1BQU0sU0FBUyxTQUFTLGlCQUFpQjtBQUFBLFFBQ3REO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFzQlEscUJBQXFCLG9CQUFvQztBQUM3RCxlQUFPO0FBQUE7QUFBQSxrQ0FFbUIsa0JBQWtCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1Bc0RoRDtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BS1EsMEJBQTBCLE1BQTZCO0FBQzNELGNBQU0sU0FBUyxJQUFJLFVBQVU7QUFDN0IsY0FBTSxNQUFNLE9BQU8sZ0JBQWdCLE1BQU0sV0FBVztBQUNwRCxjQUFNLFNBQVMsSUFBSSxlQUFlLDRCQUE0QjtBQUM5RCxnQkFBTyxpQ0FBUSxnQkFBZTtBQUFBLE1BQ2xDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQU1RLDBCQUEwQixlQUF1QixVQUFzQztBQUUzRixjQUFNLGdCQUFnQiw2QkFBNkIsSUFBSSxRQUFRO0FBQy9ELFlBQUksZUFBZTtBQUNmLGtCQUFRLElBQUksa0RBQWtELFFBQVEsY0FBYyxhQUFhLEdBQUc7QUFDcEcsaUJBQU87QUFBQSxRQUNYO0FBRUEsY0FBTSxTQUFTLFNBQVMsY0FBYyxRQUFRO0FBQzlDLGVBQU8sY0FBYztBQUNyQixlQUFPLEtBQUssa0JBQWtCLFFBQVE7QUFDdEMsaUJBQVMsS0FBSyxZQUFZLE1BQU07QUFHaEMsY0FBTSxVQUFXLE9BQWU7QUFDaEMsWUFBSSxTQUFTO0FBQ1QsdUNBQTZCLElBQUksVUFBVSxPQUFPO0FBQUEsUUFDdEQ7QUFDQSxnQkFBUSxJQUFJLHFEQUFxRCxRQUFRLFFBQVEsT0FBTyxHQUFHO0FBQzNGLGVBQU87QUFBQSxNQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFLYywwQkFDVixxQkFDQSxNQUNBLFdBQ0EsTUFDQSxTQUNrQztBQUFBO0FBQ2xDLGdCQUFNLGdCQUFnQixLQUFLLDBCQUEwQixJQUFJO0FBRXpELGNBQUksQ0FBQyxlQUFlO0FBQ2hCLGtCQUFNLElBQUksTUFBTSxzRUFBc0U7QUFBQSxVQUMxRjtBQUdBLGdCQUFNLFdBQVcsR0FBRyxvQkFBb0IsRUFBRSxJQUFJLEtBQUssRUFBRTtBQU1yRCxnQkFBTSxVQUFVLEtBQUssMEJBQTBCLGVBQWUsUUFBUTtBQUV0RSxjQUFJLENBQUMsU0FBUztBQUNWLGtCQUFNLElBQUksTUFBTSxnRUFBZ0U7QUFBQSxVQUNwRjtBQUdBLGdCQUFNLFFBQVEsYUFBYSxPQUFPLENBQUM7QUFDbkMsZ0JBQU0sVUFBVSxTQUFTLGNBQWMsT0FBTztBQUM5QyxrQkFBUSxLQUFLO0FBRWIsY0FBSSxtQ0FBUyxRQUFRO0FBQ2pCLG9CQUFRLE1BQU0sVUFBVTtBQUN4QixvQkFBUSxNQUFNLFdBQVc7QUFDekIsb0JBQVEsTUFBTSxTQUFTO0FBQ3ZCLG9CQUFRLE1BQU0sUUFBUTtBQUN0QixvQkFBUSxNQUFNLGdCQUFnQjtBQUM5QixvQkFBUSxNQUFNLGFBQWE7QUFBQSxVQUMvQjtBQUdBLGNBQUksQ0FBQyxVQUFVLGNBQWMsb0JBQW9CLEdBQUc7QUFDaEQsc0JBQVUsWUFBWTtBQUFBLFVBQzFCO0FBVUEsZ0JBQU0sWUFBWSxJQUFJO0FBQUEsWUFDbEI7QUFBQSxZQUNBO0FBQUEsWUFDQTtBQUFBLFlBQ0E7QUFBQSxZQUNBO0FBQUEsWUFDQTtBQUFBLFVBQ0o7QUFFQSxlQUFLLFlBQVksV0FBVyxTQUFTLE9BQU87QUFLNUMsZUFBSSxtQ0FBUyxVQUFTLFdBQWEsbUNBQVMsVUFBUyxNQUFNO0FBQ3ZELHNCQUFVLGFBQWEsUUFBUSxJQUFJO0FBQUEsVUFDdkM7QUFFQSxrQkFBUSxJQUFJLDhCQUE4QixPQUFPLGtCQUFrQjtBQUVuRSxpQkFBTztBQUFBLFFBQ1g7QUFBQTtBQUFBLElBb2FKO0FBQUE7QUFBQTs7O0FDcHVCQSxJQVlhLGlCQTRDQTtBQXhEYjtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBU08sSUFBTSxrQkFBa0IsQ0FBQyxXQUEyQixZQUFrQyxRQUFpQjtBQUMxRyxZQUFNLFFBQVEsWUFBWSxPQUFPLENBQUM7QUFDbEMsZ0JBQVUsS0FBSyxJQUFJLHFCQUFxQixDQUFDLEVBQUMsU0FBUyxhQUFhLFFBQVEsS0FBSSxNQUFNO0FBQzlFLGNBQU0sV0FBVyxTQUFTLGNBQWMsT0FBTztBQUMvQyxpQkFBUyxPQUFPO0FBR2hCLFlBQUksWUFBWTtBQUVoQixtQkFBVyxZQUFZLGFBQWE7QUFDaEMsdUJBQWEsR0FBRyxRQUFRO0FBQ3hCLGdCQUFNLGFBQWEsWUFBWSxRQUFRO0FBQ3ZDLHFCQUFXLFlBQVksWUFBWTtBQUMvQix5QkFBYSxHQUFHLFFBQVEsS0FBSyxXQUFXLFFBQVEsQ0FBQztBQUFBLFVBQ3JEO0FBQ0EsdUJBQWE7QUFBQSxRQUNqQjtBQUdBLGlCQUFTLFlBQVksU0FBUyxlQUFlLFNBQVMsQ0FBQztBQUN2RCxpQkFBUyxLQUFLO0FBRWQsU0FBQyxRQUFRLGNBQWMsUUFBUSxXQUFXLFlBQVksUUFBUTtBQUFBLE1BRWxFLEdBQUcsTUFBTTtBQUFBLE1BQ1QsR0FBRztBQUFBLFFBQ0MsYUFBYTtBQUFBLFFBQ2IsTUFBTyxNQUFNLE1BQU07QUFBQSxRQUNuQixRQUFRO0FBQUEsTUFDWixDQUFDLENBQUM7QUFFRixhQUFPLE1BQU07QUFDVCxrQkFBVSxLQUFLLElBQUkscUJBQXFCLENBQUMsRUFBQyxTQUFTLE9BQU0sTUFBTTtBQUMzRCxnQkFBTSxXQUFXLFFBQVEsY0FBYyxVQUFVLGVBQWUsTUFBTTtBQUN0RSxjQUFJLFNBQVM7QUFDVCxvQkFBUSxPQUFPO0FBQUEsVUFDbkI7QUFBQSxRQUNKLEdBQUcsTUFBTTtBQUFBLFFBQ1QsR0FBRztBQUFBLFVBQ0MsUUFBUTtBQUFBLFFBQ1osQ0FBQyxDQUFDO0FBQUEsTUFDTjtBQUFBLElBQ0o7QUFFTyxJQUFNLHNCQUFzQixDQUFDLFdBQTJCLFNBQWlCO0FBQzVFLFlBQU0sUUFBUSxZQUFZLE9BQU8sQ0FBQztBQUNsQyxnQkFBVSxLQUFLLElBQUkscUJBQXFCLENBQUMsRUFBQyxTQUFTLFFBQVEsTUFBSyxNQUFNO0FBQ2xFLGNBQU0sY0FBYyxTQUFTLGNBQWMsTUFBTTtBQUNqRCxvQkFBWSxLQUFLO0FBQ2pCLG9CQUFZLE1BQU07QUFDbEIsb0JBQVksT0FBTztBQUNuQixpQkFBUyxLQUFLLFlBQVksV0FBVztBQUdyQyxTQUFDLFFBQVEsY0FBYyxRQUFRLFdBQVcsWUFBWSxXQUFXO0FBQUEsTUFDckUsR0FBRyxNQUFNO0FBQUEsTUFDVCxHQUFHO0FBQUEsUUFDQyxPQUFRO0FBQUEsUUFDUixRQUFRO0FBQUEsTUFDWixDQUFDLENBQUM7QUFFRixhQUFPLE1BQU07QUFDVCxrQkFBVSxLQUFLLElBQUkscUJBQXFCLENBQUMsRUFBQyxTQUFTLE9BQU0sTUFBTTtBQUMzRCxnQkFBTSxXQUFXLFFBQVEsY0FBYyxVQUFVLGVBQWUsTUFBTTtBQUN0RSxjQUFJLFNBQVM7QUFDVCxvQkFBUSxPQUFPO0FBQUEsVUFDbkI7QUFBQSxRQUNKLEdBQUcsTUFBTTtBQUFBLFFBQ1QsR0FBRztBQUFBLFVBQ0MsUUFBUTtBQUFBLFFBQ1osQ0FBQyxDQUFDO0FBQUEsTUFDTjtBQUFBLElBQ0o7QUFBQTtBQUFBOzs7QUNwRkEsSUFJTSxlQVdPLDZCQWVBO0FBOUJiO0FBQUE7QUFBQTtBQUlBLElBQU0sZ0JBQWdCLENBQUMsT0FBZSxhQUErQjtBQUVqRSxZQUFNLFVBQVUsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLEVBQUUsS0FBSyxHQUFHLEdBQUcsR0FBRztBQUcvRCxhQUFPLE1BQU0sUUFBUSxTQUFTLENBQUMsWUFBWTtBQUV2QyxnQkFBUSxTQUFTLE9BQU8sS0FBSyxTQUFTLFNBQVM7QUFBQSxNQUNuRCxDQUFDO0FBQUEsSUFDTDtBQUVPLElBQU0sOEJBQThCLENBQUMsY0FBMkIsYUFBdUI7QUFDMUYsWUFBTSxrQkFBbUIsYUFBYTtBQUN0QyxVQUFJLGdCQUFnQixTQUFTLGdCQUFnQjtBQUN6QyxjQUFNLElBQUksTUFBTSwwREFBMEQsZ0JBQWdCLElBQUksK0NBQStDO0FBQUEsTUFDako7QUFFQSxtQkFBYSxTQUFTLG1CQUNmLGFBQWE7QUFHcEIsbUJBQWEsT0FBTyxNQUFNLGNBQWMsYUFBYSxPQUFPLEtBQUssUUFBUTtBQUV6RSxhQUFPO0FBQUEsSUFDWDtBQUVPLElBQU0sMkJBQTJCLENBQUMsYUFBdUI7QUFDNUQsYUFBTyxDQUFPLGlCQUE4QjtBQUN4QyxlQUFPLDRCQUE0QixjQUFjLFFBQVE7QUFBQSxNQUM3RDtBQUFBLElBQ0o7QUFBQTtBQUFBOzs7QUNsQ0EsSUFtQmEsVUFTQTtBQTVCYjtBQUFBO0FBQUE7QUFBQTtBQW1CTyxJQUFNLFdBQVcsQ0FBQyxXQUEyQixXQUFtQixXQUFtQjtBQUN0RixnQkFBVSxLQUFLLElBQUksaUJBQWlCLENBQUMsRUFBQyxLQUFLLFdBQVUsTUFBTTtBQUN2RCxtQ0FBSyxVQUFVLElBQUk7QUFBQSxNQUN2QixHQUFHO0FBQUEsUUFDQyxXQUFXO0FBQUEsUUFDWCxZQUFZO0FBQUEsTUFDaEIsQ0FBQyxDQUFDO0FBQUEsSUFDTjtBQUVPLElBQU0sY0FBYyxDQUFDLFdBQTJCLFdBQW1CLFdBQW1CO0FBQ3pGLGdCQUFVLEtBQUssSUFBSSxpQkFBaUIsQ0FBQyxFQUFDLEtBQUssV0FBVSxNQUFNO0FBQ3ZELG1DQUFLLFVBQVUsT0FBTztBQUFBLE1BQzFCLEdBQUc7QUFBQSxRQUNDLFdBQVc7QUFBQSxRQUNYLFlBQVk7QUFBQSxNQUNoQixDQUFDLENBQUM7QUFBQSxJQUNOO0FBQUE7QUFBQTs7O0FDbkNBLElBVWEseUJBOEJBO0FBeENiO0FBQUE7QUFBQTtBQVFBO0FBRU8sSUFBTSxjQUFOLE1BQU0sWUFBa0M7QUFBQSxNQUF4QztBQUNILGtEQUFxQix5QkFBeUIsT0FBTztBQUNyRCwwQ0FBYSxnQkFBZ0IsT0FBTztBQUNwQyw0Q0FBZSxrQkFBa0IsT0FBTztBQU14QyxrQ0FBSyxLQUFLO0FBQ1Ysb0NBQU8sS0FBSztBQUNaLDJDQUFjO0FBQ2Qsc0NBQVM7QUFFVCwwQ0FBYSxDQUFDLFdBQThCO0FBQ3hDLGVBQUssU0FBUztBQUNkLGlCQUFPO0FBQUEsUUFDWDtBQUVBLDhDQUFpQixDQUFDLFdBQTRDO0FBQzFELGlCQUFPLE9BQU87QUFDZCxlQUFLLFNBQVM7QUFDZCxpQkFBTztBQUFBLFFBQ1g7QUFFQSxxQ0FBUSxNQUFNO0FBQ1YsaUJBQU87QUFBQSxRQUNYO0FBQUE7QUFBQSxJQUNKO0FBdkJJLGtCQUxTLGFBS0YsVUFBUyxNQUFNO0FBQ2xCLGFBQU8sSUFBSSxZQUFXO0FBQUEsSUFDMUI7QUFQRyxJQUFNLGFBQU47QUE4QkEsSUFBTSxtQkFBTixNQUFNLGlCQUE0QztBQUFBLE1BQWxEO0FBQ0gsa0RBQXFCLHlCQUF5QixPQUFPO0FBQ3JELDBDQUFhLGdCQUFnQixPQUFPO0FBQ3BDLDRDQUFlLGtCQUFrQixPQUFPO0FBTXhDLHdDQUFXO0FBQUEsVUFDUCxJQUFJLEtBQUs7QUFBQSxVQUNULGFBQWEsS0FBSztBQUFBLFVBQ2xCLGVBQWUsS0FBSztBQUFBLFVBQ3BCLGNBQWM7QUFBQSxRQUNsQjtBQUVBLG9DQUFPLEtBQUs7QUFDWixvQ0FBTztBQUFBLFVBQ0gsSUFBSSxLQUFLO0FBQUEsVUFDVCxNQUFNLEtBQUs7QUFBQSxVQUNYLGFBQWE7QUFBQSxVQUNiLE9BQU8sQ0FBQztBQUFBLFVBQ1IsTUFBTSxDQUFDO0FBQUEsVUFDUCxPQUFPLENBQUM7QUFBQSxVQUNSLGFBQWE7QUFBQSxRQUNqQjtBQUVBLDRDQUFlLENBQUMsYUFBdUM7QUFDbkQsZUFBSyxXQUFXO0FBQ2hCLGlCQUFPO0FBQUEsUUFDWDtBQUVBLHdDQUFXLENBQUMsU0FBcUM7QUFDN0MsZUFBSyxPQUFPO0FBQ1osaUJBQU87QUFBQSxRQUNYO0FBRUEsd0NBQVcsQ0FBQyxTQUFpQjtBQUN6QixlQUFLLE9BQU87QUFDWixpQkFBTztBQUFBLFFBQ1g7QUFFQSwrQ0FBa0IsQ0FBQyxnQkFBNkI7QUFDNUMsZUFBSyxLQUFLLE1BQU0sS0FBSyxXQUFXO0FBQ2hDLGVBQUssS0FBSyxjQUFjLEtBQUssS0FBSyxNQUFNLFNBQVM7QUFDakQsZUFBSyxTQUFTLGVBQWU7QUFBQSxZQUN6QixNQUFNO0FBQUEsWUFDTixNQUFNO0FBQUEsY0FDRixJQUFJLFlBQVk7QUFBQSxZQUNwQjtBQUFBLFVBQ0o7QUFFQSxpQkFBTztBQUFBLFFBQ1g7QUFFQSx1Q0FBVSxDQUFDLFFBQW9CO0FBQzNCLGVBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUN2QixpQkFBTztBQUFBLFFBQ1g7QUFFQSw0Q0FBZSxDQUFDLGdCQUF3QjtBQUNwQyxnQkFBTSxjQUFjO0FBQUEsWUFDaEIsSUFBSTtBQUFBLFlBQ0osTUFBTTtBQUFBLFlBQ04sYUFBYTtBQUFBLFlBQ2IsY0FBYztBQUFBLFlBQ2QsVUFBVTtBQUFBLFlBQ1YsVUFBVTtBQUFBLGNBQ04sTUFBTTtBQUFBLFlBQ1Y7QUFBQSxVQUNKO0FBRUEsZUFBSyxLQUFLLEtBQUssS0FBSyxXQUFXO0FBQy9CLGlCQUFPO0FBQUEsUUFDWDtBQUVBLHFDQUFRLE1BQU07QUFDVixpQkFBTyxLQUFLLE1BQU0sS0FBSyxVQUFVLElBQUksQ0FBQztBQUFBLFFBQzFDO0FBQUE7QUFBQSxJQUNKO0FBMUVJLGtCQUxTLGtCQUtGLFVBQVMsTUFBTTtBQUNsQixhQUFPLElBQUksaUJBQWdCO0FBQUEsSUFDL0I7QUFQRyxJQUFNLGtCQUFOO0FBQUE7QUFBQTs7O0FDeENQLElBQWE7QUFBYjtBQUFBO0FBQUE7QUFBTyxJQUFNLE9BQU8sQ0FBTyxXQUFnQjtBQUN2QyxhQUFPLE1BQU0sT0FBTztBQUFBLElBQ3hCO0FBQUE7QUFBQTs7O0FDRkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTs7O0FDTkEsSUFVYTtBQVZiO0FBQUE7QUFBQTtBQUFBO0FBQ0EsSUFBQUM7QUFDQTtBQVFPLElBQU0sb0JBQW9CLENBQU8sb0JBQXdFO0FBQzVHLFVBQUk7QUFFQSxjQUFNLE1BQU0sSUFBSSxJQUFJLE9BQU8sU0FBUyxJQUFJO0FBQ3hDLGNBQU0sU0FBUyxJQUFJLGdCQUFnQixJQUFJLE1BQU07QUFDN0MsY0FBTSxlQUFlLE9BQU8sSUFBSSxjQUFjO0FBQzlDLFlBQUksY0FBYztBQUNkLGdCQUFNLENBQUMsUUFBUSxHQUFHLEtBQUssSUFBSSxnQkFBZ0IsWUFBWTtBQUV2RCxrQkFBUSxRQUFRO0FBQUEsWUFDWixLQUFLO0FBQWE7QUFDZCxzQkFBTSxDQUFDLGFBQWEsTUFBTSxJQUFJO0FBQzlCLHNCQUFNLHNCQUFzQixNQUFNLGdCQUFnQixLQUFLLGVBQWUsV0FBVztBQUNqRixvQkFBSSxxQkFBcUI7QUFFckIsd0JBQU0sT0FBTyxvQkFBb0IsS0FBSyxNQUFNLEtBQUssQ0FBQUMsVUFBUUEsTUFBSyxPQUFPLE1BQU07QUFDM0Usc0JBQUksTUFBTTtBQUdOLHdDQUFvQixTQUFTLGVBQWU7QUFBQSxzQkFDeEMsTUFBTSxrQkFBa0I7QUFBQSxzQkFDeEIsTUFBTTtBQUFBLHdCQUNGLElBQUk7QUFBQSxzQkFDUjtBQUFBLG9CQUVKO0FBRUEsMkJBQU87QUFBQSxrQkFDWDtBQUFBLGdCQUNKO0FBQUEsY0FDSjtBQUNJO0FBQUE7QUFBQSxZQUVKO0FBQVU7QUFFTixzQkFBTSxDQUFDLFFBQVEsWUFBWSxJQUFJLGdCQUFnQixZQUFZO0FBQzNELHNCQUFNLE9BQU8sTUFBTSxnQkFBZ0IsS0FBSyxVQUFVLE1BQU07QUFDeEQsc0JBQU0sc0JBQXNCLEtBQUssV0FBVyxLQUFLLE9BQUssRUFBRSxLQUFLLE9BQU8sZ0JBQWdCLEtBQUssRUFBRTtBQUMzRixvQkFBSSxxQkFBcUI7QUFDckIsc0JBQUksb0JBQW9CLFNBQVMsYUFBYSxTQUFTLGtCQUFrQixXQUFXO0FBRWhGLHdCQUFJLG9CQUFvQixTQUFTLHFCQUFxQjtBQUNsRCw0QkFBTSxxQkFBcUIsb0JBQW9CLFNBQVMsb0JBQW9CLEtBQUssT0FBSyxFQUFFLE9BQU8sWUFBWTtBQUUzRywyQkFBSSx5REFBb0IsVUFBUyxnQkFBZ0IsU0FBUztBQUV0RCw4QkFBTSwwQkFBMEI7QUFFaEMsOEJBQU0sb0JBQW9CLG9CQUFvQixTQUFTO0FBQ3ZELDhCQUFNLFVBQVUsa0JBQWtCLFNBQVMsS0FBSyxPQUFLLEVBQUUsY0FBYyx3QkFBd0IsUUFBUSxFQUFFO0FBQ3ZHLDRCQUFJLFNBQVM7QUFDVCw4Q0FBb0IsU0FBUyxlQUFlLG1DQUFTO0FBQ3JELGlDQUFPO0FBQUEsd0JBQ1g7QUFBQSxzQkFDSjtBQUFBLG9CQUNKO0FBQUEsa0JBQ0o7QUFBQSxnQkFDSjtBQUFBLGNBQ0o7QUFDSTtBQUFBLFVBQ1I7QUFBQSxRQUNKO0FBQUEsTUFDSixVQUFFO0FBQ0UsZUFBTztBQUFBLE1BQ1g7QUFBQSxJQUNKO0FBQUE7QUFBQTs7O0FDM0VBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQStDTSx5QkFPTyxTQXluQkE7QUEvcUJiO0FBQUE7QUFBQTtBQU1BO0FBR0E7QUFDQTtBQU1BO0FBQ0E7QUFHQTtBQUNBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFhQSxJQUFNLDBCQUEwQjtBQU96QixJQUFNLFVBQU4sTUFBYztBQUFBLE1BQWQ7QUFHSCwrQ0FBb0MsQ0FBQztBQUNyQywwQ0FBK0IsQ0FBQztBQUNoQyxpREFBbUMsQ0FBQztBQUlwQztBQUFBO0FBQUEsNEJBQVE7QUFDUiw0QkFBTyxtQkFBa0IsQ0FBQyxXQUEwQjtBQUFFLGVBQUssZ0JBQWdCO0FBQUEsUUFBUTtBQUNuRiw0QkFBTyxtQkFBa0IsTUFBZ0MsS0FBSztBQUU5RCw0QkFBTyxhQUFxQjtBQUU1Qiw0QkFBTyxXQUFVO0FBRWpCLGtEQUE2QyxDQUFDO0FBQzlDLDRCQUFPLFlBQVcsQ0FBQyx3QkFBb0Q7QUFDbkUsY0FBSSxDQUFDLEtBQUssbUJBQW1CLG9CQUFvQixFQUFFLEdBQUc7QUFDbEQsaUJBQUssbUJBQW1CLG9CQUFvQixFQUFFLElBQUk7QUFBQSxVQUN0RDtBQUNBLGlCQUFPLEdBQUcsb0JBQW9CLEVBQUUsSUFBSSxFQUFFLEtBQUssbUJBQW1CLG9CQUFvQixFQUFFLENBQUM7QUFBQSxRQUN6RjtBQUlBO0FBQUE7QUFBQSw0QkFBUSxhQUFZO0FBQ3BCLDRCQUFPLFdBQVUsTUFBTTtBQUNuQixjQUFJLEtBQUs7QUFDTDtBQUVKLGVBQUssWUFBWTtBQUVqQixlQUFLLFdBQVcsUUFBUSxlQUFhO0FBQ2pDLGdCQUFJLFVBQVUsU0FBUztBQUNuQix3QkFBVSxRQUFRO0FBQUEsWUFDdEI7QUFBQSxVQUNKLENBQUM7QUFBQSxRQUNMO0FBS0E7QUFBQTtBQUFBO0FBQUEsNEJBQVEsbUJBQWtCLENBQUMsV0FBc0M7QUFDN0QsY0FBSSxDQUFDLFVBQVUsV0FBVyxPQUFRLFFBQU87QUFDekMsZ0JBQU0sYUFBYSxDQUFDLGNBQThCO0FBQzlDLGtCQUFNLFVBQVUsVUFBVTtBQUMxQixvQkFBTyxtQ0FBUyxjQUFhLFlBQVksUUFBUSxrQkFBa0I7QUFBQSxVQUN2RTtBQUNBLGlCQUFPLEtBQUssV0FBVyxLQUFLLFVBQVUsS0FBSyxLQUFLLGdCQUFnQixLQUFLLFVBQVU7QUFBQSxRQUNuRjtBQUVBLDRCQUFRLDBCQUF5QixDQUFDLFVBQXlDO0FBM0cvRSxjQUFBQztBQTRHUSxjQUFJLEdBQUNBLE1BQUEsTUFBTSxTQUFOLGdCQUFBQSxJQUFZLE1BQU07QUFFdkIsY0FBSSxDQUFDLEtBQUssZ0JBQWdCLE1BQU0sTUFBTSxHQUFHO0FBQ3JDO0FBQUEsVUFDSjtBQUVBLGNBQUksTUFBTSxLQUFLLE1BQU07QUFDakIsZ0JBQUksTUFBTSxLQUFLLGNBQWMsaUJBQWlCLE1BQU0sTUFBTSxLQUFLLGdCQUFnQixhQUFhLGtCQUFrQjtBQUUxRztBQUFBLFlBQ0o7QUFHQSxrQkFBTSxjQUErQixNQUFNO0FBRTNDLGdCQUFJLFlBQVksZ0JBQWdCLGFBQWEsYUFBYTtBQWlCdEQsb0JBQU0sa0JBQWtCLEtBQUssZ0JBQWdCLE9BQU8sQ0FBQUMsZUFBYTtBQUM3RCxzQkFBTSxVQUFVQSxXQUFVO0FBQzFCLHdCQUFPLG1DQUFTLGNBQWEsWUFBWSxRQUFRLGtCQUFrQixNQUFNO0FBQUEsY0FDN0UsQ0FBQztBQUNELG9CQUFNLFVBQVUsZ0JBQWdCLFNBQVMsa0JBQWtCLEtBQUs7QUFDaEUsc0JBQVEsUUFBUSxDQUFBQSxlQUFhO0FBQ3pCLGdCQUFBQSxXQUFVLEtBQUssSUFBSSxZQUFZQSxXQUFVLEVBQUUsQ0FBQztBQUFBLGNBQ2hELENBQUM7QUFDRDtBQUFBLFlBQ0o7QUFFQSxnQkFBSSxZQUFZLGdCQUFnQixhQUFhLGNBQWM7QUFHdkQsbUJBQUssa0JBQWtCLEtBQUssZ0JBQWdCLE9BQU8sQ0FBQUEsZUFBYUEsV0FBVSxPQUFRLFlBQTZCLFFBQVEsRUFBRTtBQUV6SCxvQkFBTSxxQkFBcUIsS0FBSyxXQUFXLEtBQUssQ0FBQUEsZUFBVTtBQTVKMUUsb0JBQUFEO0FBNEo2RSx1QkFBQUMsV0FBVSxTQUFRRCxNQUFBLFlBQTZCLFlBQTdCLGdCQUFBQSxJQUFzQztBQUFBLGVBQUU7QUFDdkgsdUVBQW9CO0FBR3BCO0FBQUEsWUFDSjtBQUVBLGdCQUFJLFlBQVksZ0JBQWdCLGFBQWEsa0JBQWtCO0FBRTNELG9CQUFNLGVBQWU7QUFDckIsb0JBQU0sZUFBZSxLQUFLLFdBQVcsS0FBSyxDQUFBQyxlQUFhQSxXQUFVLE9BQU8sYUFBYSxXQUFXO0FBRWhHLGtCQUFJLGNBQWM7QUFDZCxvQkFBSSxhQUFhLGNBQWMsaUJBQWlCLE1BQU07QUFDbEQsc0JBQUksYUFBYSxRQUFRLGdCQUFnQix1QkFBdUIsTUFBTTtBQUNsRSxpQ0FBYSxrQkFBa0IsYUFBYSxPQUFPO0FBQUEsa0JBQ3ZELE9BQU87QUFFSCxpQ0FBYSxRQUFRLFFBQVEsYUFBYTtBQUMxQyxpQ0FBYSxLQUFLLGFBQWEsT0FBTztBQUFBLGtCQUMxQztBQUNBO0FBQUEsZ0JBQ0o7QUFBQSxjQUNKLE9BQU87QUFDSCxzQkFBTSxpQkFBaUIsS0FBSyxXQUFXLEtBQUssQ0FBQUEsZUFBYUEsV0FBVSxPQUFPLGFBQWEsUUFBUSxXQUFXO0FBQzFHLG9CQUFJLGdCQUFnQjtBQUNoQixpQ0FBZSxLQUFLLGFBQWEsT0FBTztBQUFBLGdCQUM1QyxPQUFPO0FBQUEsZ0JBRVA7QUFBQSxjQUNKO0FBSUE7QUFBQSxZQUNKO0FBRUEsa0JBQU0sWUFBWSxLQUFLLFdBQVcsS0FBSyxDQUFBQSxlQUFhQSxXQUFVLE9BQU8sWUFBWSxXQUFXO0FBRTVGLGdCQUFJLENBQUMsV0FBVztBQUdaLGtCQUFJLE9BQU8sS0FBSyxXQUFXO0FBQ3ZCLHVCQUFPLEtBQUssVUFBVSxjQUFjLFdBQVc7QUFBQSxjQUNuRDtBQUNBO0FBQUEsWUFDSjtBQUVBLGdCQUFJLFdBQVc7QUFDWCxrQkFBSSxVQUFVLGtCQUFrQixXQUFXLEdBQUc7QUFDMUM7QUFBQSxjQUNKLE9BQU87QUFHSCxvQkFBSSxPQUFPLEtBQUs7QUFDWix5QkFBTyxLQUFLLFVBQVUsY0FBYyxXQUFXO0FBQUEsY0FDdkQ7QUFBQSxZQUNKO0FBQUEsVUFDSjtBQUFBLFFBTUo7QUFFQSw0QkFBTyxRQUFPLENBQUMsWUFBNkI7QUFDeEMsZ0JBQU0saUJBQWlCLElBQUk7QUFBQSxZQUE4QjtBQUFBLFlBQ3JELEVBQUMsTUFBTSxRQUFPO0FBQUEsVUFDbEI7QUFFQSxlQUFLLHVCQUF1QixjQUFjO0FBQUEsUUFDOUM7QUFFQSw0QkFBTyxRQUFPLENBQUMsa0NBQTZEO0FBQ3hFLGNBQUksS0FBSyxXQUFXO0FBR2hCLGdCQUFJLCtFQUErQixRQUFRO0FBQ3ZDLG1CQUFLLGlCQUFpQiw2QkFBNkI7QUFBQSxZQUN2RDtBQUNBO0FBQUEsVUFDSjtBQUVBLGdCQUFNLGVBQWU7QUFBQSxZQUNqQixJQUFJLGlCQUFpQjtBQUFBLFlBQ3JCLElBQUksbUJBQW1CO0FBQUEsWUFDdkIsSUFBSSxvQkFBb0I7QUFBQSxVQUM1QjtBQUVBLGVBQUssb0JBQW9CO0FBQUEsWUFDckIsR0FBRztBQUFBLFVBQ1A7QUFFQSxjQUFJLCtCQUErQjtBQUMvQixpQkFBSyxpQkFBaUIsNkJBQTZCO0FBQUEsVUFDdkQ7QUFHQSxpQkFBTztBQUFBLFlBQ0g7QUFBQSxZQUNBLEtBQUs7QUFBQSxZQUNMO0FBQUEsVUFDSjtBQUVBLGtCQUFRLElBQUksMEJBQTBCLFNBQVMsU0FBUyxJQUFJO0FBQzVELGVBQUssWUFBWTtBQUFBLFFBQ3JCO0FBRUEsNEJBQVEsb0JBQW1CLENBQUMsa0NBQTREO0FBQ3BGLGdCQUFNLGVBQTRDLENBQUM7QUFFbkQsd0NBQThCLFFBQVEsa0NBQWdDO0FBQ2xFLGtCQUFNLGVBQWUsSUFBSSw2QkFBNkIsS0FBSyxpQkFBaUI7QUFDNUUseUJBQWEsYUFBYSxJQUFJLElBQUk7QUFBQSxVQUN0QyxDQUFDO0FBRUQsZUFBSyxrQkFBa0IsUUFBUSxZQUFVO0FBQ3JDLGdCQUFJLENBQUMsYUFBYSxPQUFPLElBQUk7QUFDekIsMkJBQWEsT0FBTyxJQUFJLElBQUk7QUFBQSxVQUNwQyxDQUFDO0FBRUQsZUFBSyxvQkFBb0IsT0FBTyxPQUFPLFlBQVk7QUFBQSxRQUN2RDtBQUVBLDRCQUFRLDRCQUEyQixDQUFPLE9BQTZHLHNCQUE3RyxJQUE2RyxtQkFBN0csY0FBbUMsY0FBNkIsQ0FBQyxHQUFHLE9BQXlDO0FBelIzSixjQUFBRDtBQTBSUSxtQkFBZSxVQUNYLE9BQ0EsV0FDc0I7QUFBQTtBQUN0Qix5QkFBVyxRQUFRLE9BQU87QUFDdEIsb0JBQUksTUFBTSxVQUFVLElBQUksR0FBRztBQUN2Qix5QkFBTztBQUFBLGdCQUNYO0FBQUEsY0FDSjtBQUNBLHFCQUFPO0FBQUEsWUFDWDtBQUFBO0FBRUEsa0JBQVEsYUFBYSxNQUFNO0FBQUE7QUFBQSxZQUV2QixLQUFLO0FBQUE7QUFBQSxZQUNMLEtBQUssa0JBQWtCO0FBQVc7QUFDOUIsb0JBQUksbUJBQWtCQSxNQUFBLGFBQXNDLFNBQXRDLGdCQUFBQSxJQUE0QyxPQUMxRCxhQUFzQyxNQUFPLENBQUMsRUFBRTtBQUV4RCx1QkFBTztBQUFBLGNBQ1g7QUFDSTtBQUFBLFlBQ0osS0FBSyxrQkFBa0I7QUFBVztBQUM5QixzQkFBTSxvQkFBcUI7QUFDM0Isc0JBQU0sVUFBVSxNQUFNLFVBQVUsa0JBQWtCLFVBQVUsQ0FBTUUsYUFBVztBQUN6RSxzQkFBSUEsU0FBUSxjQUFjLFdBQVc7QUFDakMsMkJBQU87QUFBQSxrQkFDWDtBQUVBLHdCQUFNLGFBQWEsWUFBWSxLQUFLLENBQUFDLGdCQUFjO0FBQzlDLHdCQUFJQSxZQUFXLFNBQVMsZ0JBQWdCLFNBQVM7QUFDN0MsNkJBQVFBLFlBQWtDLFFBQVEsT0FBT0QsU0FBUTtBQUFBLG9CQUNyRTtBQUNBLDJCQUFPO0FBQUEsa0JBQ1gsQ0FBQztBQUVELHNCQUFJLENBQUMsWUFBWTtBQUNiLDBCQUFNLElBQUksTUFBTSxzQkFBc0I7QUFBQSxrQkFDMUM7QUFFQSx3QkFBTSxrQkFBa0I7QUFDeEIsd0JBQU0sZUFBZ0IsZ0JBQWdCO0FBRXRDLHdCQUFNLG1CQUFtQixRQUFRLFFBQVEsQ0FBQyxHQUFHLGFBQWEsUUFBUTtBQUNsRSxzQkFBSSxpQkFBaUI7QUFDakIsMEJBQU0sVUFBVSxNQUFNLGdCQUFnQjtBQUN0QywyQkFBTztBQUFBLGtCQUNYLE9BQU87QUFDSCw0QkFBUSxLQUFLLGFBQWFBLFNBQVEsU0FBUyxLQUFLLGFBQWEsUUFBUSwwQkFBMEI7QUFBQSxrQkFDbkc7QUFFQSx5QkFBTztBQUFBLGdCQUNYLEVBQUM7QUFFRCxvQkFBSTtBQUNBLHlCQUFPLEtBQUsseUJBQXlCLFFBQVEsY0FBYyxXQUFXO0FBQUEscUJBQ3JFO0FBQ0Q7QUFBQSxnQkFDSjtBQUFBLGNBQ0o7QUFDSTtBQUFBLFlBQ0osU0FBUztBQUNMO0FBQUEsWUFDSjtBQUFBLFVBQ0o7QUFDQSxpQkFBTztBQUFBLFFBQ1g7QUFFQSw0QkFBUSxtQkFBa0IsQ0FBTyxpQkFBbUMsVUFBd0I7QUFDeEYsZ0JBQU0sU0FBUyxNQUFNLEtBQUsseUJBQXlCLGdCQUFnQixTQUFTLGNBQWMsZ0JBQWdCLFNBQVMscUJBQXFCLEtBQUs7QUFDN0ksaUJBQU8sZ0JBQWdCLEtBQUssTUFBTSxLQUFLLFVBQVEsS0FBSyxPQUFPLE1BQU07QUFBQSxRQUNyRTtBQUVBLDRCQUFPO0FBRVAsNEJBQU8saUJBQWdCLENBQWtELGlCQUFtQyxXQUErQixZQUN6SDtBQXRXdEIsY0FBQUYsS0FBQTtBQXdXUSxjQUFJLENBQUMsV0FBVztBQUNaO0FBQ0Esa0JBQU0sSUFBSSxNQUFNLDJDQUEyQztBQUFBLFVBQy9EO0FBRUEsZ0JBQU0sbUJBQW1CLE1BQU0sa0JBQWtCLGVBQWU7QUFDaEUsY0FBSSxrQkFBa0I7QUFFbEIsOEJBQWtCO0FBQUEsVUFDdEI7QUFtQkEsZ0JBQU0sUUFBUSxtQ0FBS0EsTUFBQSxLQUFLLGdCQUFMLE9BQUFBLE1BQW9CLENBQUMsS0FBUSx3Q0FBUyxVQUFULFlBQWtCLENBQUM7QUFFbkUsZ0JBQU0sTUFBTTtBQUNaLGNBQUksSUFBSSxNQUFNO0FBQ1YsZ0JBQUksSUFBSSxXQUFXO0FBRWYsZ0NBQWtCLG1CQUFJO0FBQ3RCLDhCQUFnQixXQUFXLG1CQUNwQixnQkFBZ0I7QUFHdkIsa0JBQUlJLGdCQUFlLE1BQU0sS0FBSyxnQkFBZ0IsaUJBQWlCLEtBQUs7QUFDcEUsa0JBQUksQ0FBQ0EsZUFBYztBQUNmLHNCQUFNLElBQUksTUFBTSxrRUFBa0U7QUFBQSxjQUN0RjtBQUVBLG1CQUFJLHdDQUFTLFVBQVQsbUJBQWdCLG1CQUFtQjtBQUNuQyxnQkFBQUEsZ0JBQWUsTUFBTSxRQUFRLE1BQU0sa0JBQWtCLG1CQUFJQSxjQUFhO0FBQUEsY0FDMUU7QUFFQSw4QkFBZ0IsU0FBUyxlQUFlO0FBQUEsZ0JBQ3BDLE1BQU0sa0JBQWtCO0FBQUEsZ0JBQ3hCLE1BQU1BO0FBQUE7QUFBQSxjQUVWO0FBRUEsa0JBQUksU0FBUztBQUNULDBCQUFVLG1CQUFJO0FBQ2QsdUJBQU8sUUFBUTtBQUFBLGNBQ25CO0FBRUEsb0JBQU0sZUFBZSxNQUFNLG1CQUFzQixLQUFLLGlCQUFpQixLQUFLLFlBQVksT0FBTztBQUcvRixxQkFBTztBQUFBLFlBQ1gsT0FBTztBQUNILG9CQUFNLElBQUksTUFBTSxvQ0FBb0M7QUFBQSxZQUN4RDtBQUFBLFVBQ0o7QUFFQSxzQkFBWTtBQVFaLGNBQUksZUFBZSxNQUFNLEtBQUssZ0JBQWdCLGlCQUFpQixLQUFLO0FBRXBFLGNBQUksQ0FBQyxjQUFjO0FBQ2Ysa0JBQU0sSUFBSSxNQUFNLGtFQUFrRTtBQUFBLFVBQ3RGO0FBRUEsZUFBSSx3Q0FBUyxVQUFULG1CQUFnQixtQkFBbUI7QUFDbkMsMkJBQWUsTUFBTSxRQUFRLE1BQU0sa0JBQWtCLG1CQUFJLGFBQWE7QUFBQSxVQUMxRTtBQUNBLGdCQUFNLGtCQUFrQixLQUFLLGtCQUFrQixLQUFLLFlBQVUsT0FBTyxTQUFTLGFBQWEsT0FBTyxJQUFJO0FBRXRHLGNBQUksQ0FBQyxpQkFBaUI7QUFDbEI7QUFDQSxrQkFBTSxJQUFJLE1BQU0sY0FBYyxhQUFhLE9BQU8sSUFBSSwyQkFBMkI7QUFBQSxVQUNyRjtBQUdBLGNBQUksWUFBWSxNQUFNLGdCQUFnQixLQUFLLGdCQUFnQixNQUFNLGNBQWMsV0FBVyxPQUFPO0FBR2pHLGNBQUksQ0FBQyxVQUFVLGFBQWE7QUFDeEIsaUJBQUssZ0JBQWdCLEtBQUssU0FBUztBQUFBLFVBQ3ZDO0FBRUEsb0JBQVUsS0FBSyxhQUFhLE1BQU07QUFFOUIsaUJBQUssYUFBYSxLQUFLLFdBQVcsT0FBTyxPQUFLLE1BQU0sU0FBUztBQUM3RCxpQkFBSyxrQkFBa0IsS0FBSyxnQkFBZ0IsT0FBTyxPQUFLLE1BQU0sU0FBUztBQUN2RSxtQkFBTztBQUFBLFVBQ1gsQ0FBQztBQUVELGVBQUssV0FBVyxLQUFLLFNBQVM7QUEyQjlCLGNBQUksQ0FBQyxVQUFVLGFBQWE7QUFDeEIsc0JBQVUsS0FBSyxJQUFJLFlBQVksVUFBVSxFQUFFLENBQUM7QUFBQSxVQUNoRDtBQUdBLGNBQUksQ0FBQyxXQUFXLFFBQVEsaUJBQWlCLE9BQU87QUFFNUMsd0JBQVksYUFBYSxXQUFXLGdCQUFnQixLQUFLLE9BQU8sWUFBWTtBQUFBLFVBQ2hGO0FBRUEsY0FBSTtBQUdBLGtCQUFNLFlBQVksV0FBVyxpQkFBaUIsS0FBSyxVQUFVO0FBQUEsVUFDakUsU0FBUyxHQUFHO0FBQ1Isa0JBQU07QUFBQSxVQUdWO0FBQ0EsY0FBSSxFQUFDLG1DQUFTO0FBQ1Ysa0JBQU0sVUFBVSxVQUFVO0FBRTlCLGlCQUFPO0FBQUEsUUFDWDtBQUVBLDRCQUFPLFlBQVcsQ0FBa0QsV0FBMkIsb0JBQXNDLFlBQWdDO0FBQ2pLLGNBQUksVUFBVSxRQUFRO0FBQ2xCLGtCQUFNLElBQUksTUFBTSw0REFBNEQ7QUFBQSxVQUNoRjtBQWtCQSxjQUFJLG1DQUFTLFFBQVE7QUFFakIsZ0JBQUksZUFBZSxNQUFNLEtBQUssY0FBaUIsb0JBQW9CLFVBQVUsV0FBVztBQUFBLGNBQ3BGLFFBQVE7QUFBQSxjQUNSLFVBQVUsRUFBQyxXQUFXLFNBQVMsT0FBTyxVQUFVLFFBQVE7QUFBQSxlQUNyRCxRQUNOO0FBRUQsZ0JBQUksUUFBUTtBQUNSLG9CQUFNLFFBQVEsS0FBSyxZQUFZO0FBRW5DLHlCQUFhLEtBQUs7QUFDbEIsc0JBQVUsUUFBUTtBQUNsQixtQkFBTztBQUFBLFVBQ1gsT0FBTztBQUNILGtCQUFNLGNBQWMsVUFBVSxRQUFTO0FBRXZDLHNCQUFVLFFBQVE7QUFDbEIsbUJBQU8sS0FBSyxjQUFpQixvQkFBb0IsVUFBVSxXQUFXO0FBQUEsY0FDbEUsVUFBVTtBQUFBLGdCQUNOLFdBQVc7QUFBQSxnQkFDWCxPQUFPO0FBQUEsY0FDWDtBQUFBLGVBQ0csUUFDTjtBQUFBLFVBQ0w7QUFBQSxRQUNKO0FBQUE7QUFBQSxJQUNKO0FBaGdCSSxrQkFEUyxTQUNGLFlBQVcsTUFBTSxPQUFPLEtBQUs7QUE0a0J4QyxRQUFJLENBQUMsT0FBTyxNQUFNO0FBRWQsYUFBTyxPQUFPO0FBQUEsUUFDVjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBRUEsUUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTO0FBQ3RCLFlBQU0sV0FBVyxJQUFJLFFBQVE7QUFFN0IsZUFBUyxLQUFLO0FBRWQsVUFBSSxDQUFDLE9BQU8sTUFBTTtBQUVkLGVBQU8sT0FBTztBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUNBLGFBQU8sS0FBSyxVQUFVO0FBQUEsSUFDMUI7QUFVQSxRQUFJLE9BQU8sUUFBUSxDQUFFLE9BQU8sS0FBYSxVQUFVO0FBQy9DLFlBQU0sTUFBVyxDQUFDLFNBQXFGLFNBQVMsSUFBSTtBQUNwSCxVQUFJLFFBQVE7QUFDWixVQUFJLE1BQU07QUFDVixVQUFJLFVBQVU7QUFDZCxNQUFDLE9BQU8sS0FBYSxXQUFXO0FBQUEsSUFDcEM7QUFJQSxRQUFJLE9BQU8sUUFBUSxDQUFFLE9BQU8sS0FBYSxXQUFXO0FBQ2hELE1BQUMsT0FBTyxLQUFhLFlBQVk7QUFBQSxJQUNyQztBQUdPLElBQU0sVUFBbUIsT0FBTyxLQUFLO0FBRTVDLHdCQUFvQixXQUFXLE9BQU87QUFBQTtBQUFBOzs7QUNqckJ0QyxJQUthQztBQUxiLElBQUFDLHFDQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0EsSUFBQUM7QUFDQTtBQUNBO0FBRU8sSUFBTUYsZ0NBQU4sY0FBMkMsbUJBQTBDO0FBQUEsTUFBckY7QUFBQTtBQUVILDJDQUFjLGFBQWE7QUFFM0Isd0NBQVcsQ0FBQyxZQUFtQztBQUMzQyxnQkFBTSxlQUFlLFNBQVMsaUJBQWlCLElBQUksZUFBZSxFQUFFLEdBQUc7QUFHdkUsY0FBSSxXQUEwQixDQUFDO0FBSS9CLHVCQUFhLFFBQVEsVUFBUTtBQUV6QixrQkFBTSxTQUFTLEtBQUssYUFBYSxlQUFlLEVBQUU7QUFDbEQsZ0JBQUksUUFBUTtBQUNSLHVCQUFTLEtBQUssSUFBSSxlQUFlLFFBQVEsS0FBSyxTQUFTLEtBQUssc0JBQXNCLENBQUMsQ0FBQztBQUFBLFlBQ3hGO0FBQUEsVUFRSixDQUFDO0FBRUQsZUFBSyxjQUFjLElBQUksd0JBQXdCLFFBQVEsaUJBQWlCLFFBQVEsQ0FBQztBQUFBLFFBQ3JGO0FBQUE7QUFBQSxJQUNKO0FBQUE7QUFBQTs7O0FDbENBLElBS2FHO0FBTGIsSUFBQUMsMkJBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFTyxJQUFNRCxzQkFBTixjQUFpQyxtQkFBcUM7QUFBQSxNQUF0RTtBQUFBO0FBRUgsMkNBQWMsYUFBYTtBQUUzQix3Q0FBVyxDQUFDLFVBQTRCO0FBQ3BDLGdCQUFNLGVBQStCLENBQUM7QUFFdEMsZ0JBQU0sUUFBUSxpQkFBaUIsTUFBTSxLQUFLLFFBQVE7QUFDbEQsZ0JBQU0sUUFBUSxVQUFRO0FBQ2xCLGtCQUFNLFVBQVUsTUFBTTtBQUNsQixtQkFBSyxjQUFjLElBQUksbUJBQW1CLEdBQUcsS0FBSztBQUFBLFlBQ3REO0FBQ0EsaUJBQUssaUJBQWlCLFNBQVMsT0FBTztBQUV0QyxrQkFBTSxjQUFjLE1BQU07QUFDdEIsbUJBQUssb0JBQW9CLFNBQVMsT0FBTztBQUFBLFlBQzdDO0FBQ0EseUJBQWEsS0FBSyxXQUFXO0FBQUEsVUFDakMsQ0FBQztBQUdELGlCQUFPLE1BQU07QUFDVCx5QkFBYSxRQUFRLFVBQVEsS0FBSyxDQUFDO0FBQUEsVUFDdkM7QUFBQSxRQUNKO0FBQUE7QUFBQSxJQUNKO0FBQUE7QUFBQTs7O0FDOUJBLElBS2FFO0FBTGIsSUFBQUMsMEJBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBRU8sSUFBTUQscUJBQU4sY0FBZ0MsbUJBQXNDO0FBQUEsTUFBdEU7QUFBQTtBQUVILDJDQUFjLGFBQWE7QUFFM0Isd0NBQVcsQ0FBQyxVQUE2QjtBQUNyQyxnQkFBTSxRQUFRLGlCQUFpQixNQUFNLEtBQUssUUFBUTtBQUNsRCxnQkFBTSxRQUFRLFVBQVE7QUFFbEIsaUJBQUssY0FBYyxNQUFNO0FBQUEsVUFDN0IsQ0FBQztBQUFBLFFBQ0w7QUFBQTtBQUFBLElBQ0o7QUFBQTtBQUFBOzs7QUNoQkEsSUFLYUU7QUFMYixJQUFBQyw2QkFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVPLElBQU1ELHdCQUFOLGNBQW1DLG1CQUF5QztBQUFBLE1BQTVFO0FBQUE7QUFDSCwyQ0FBYyxhQUFhO0FBRTNCLHdDQUFXLENBQUMsVUFBZ0M7QUFDeEMsZ0JBQU0sVUFBVSxDQUFDLFNBQWM7QUFDM0IsaUJBQUssY0FBYyxJQUFJLDBCQUEwQixNQUFNLGlCQUFpQixJQUFJLENBQUM7QUFBQSxVQUNqRjtBQUVBLHVDQUE2QixPQUFPLFNBQVMsSUFBSSxRQUFRLFNBQVMsZUFBZSxDQUFDO0FBQUEsUUFDdEY7QUFBQTtBQUFBLElBQ0o7QUFBQTtBQUFBOzs7QUNmQSxJQU1hRTtBQU5iLElBQUFDLGdDQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFTyxJQUFNRCwyQkFBTixjQUFzQyxtQkFBNEM7QUFBQSxNQUFsRjtBQUFBO0FBRUgsMkNBQWMsYUFBYTtBQUUzQix3Q0FBVyxDQUFDLFlBQXFDO0FBRTdDLGdCQUFNLFFBQVEsaUJBQWlCLFFBQVEsS0FBSyxRQUFRO0FBQ3BELGdCQUFNLGVBQXNCLENBQUM7QUFDN0IsZ0JBQU0sUUFBUSxVQUFRO0FBRWxCLGtCQUFNLFVBQVUsQ0FBQyxNQUFNO0FBRW5CLG9DQUFzQixNQUFNO0FBQ3hCLHFCQUFLLGNBQWMsSUFBSSw2QkFBNkIsUUFBUSxpQkFBaUIsaUJBQWlCLEdBQUcsUUFBUSxvQkFBb0IsQ0FBQyxDQUFDO0FBQUEsY0FDbkksQ0FBQztBQUFBLFlBQ0w7QUFDQSxpQkFBSyxpQkFBaUIsUUFBUSxNQUFNLE9BQU87QUFDM0MseUJBQWEsS0FBSyxNQUFNO0FBQ3BCLG1CQUFLLG9CQUFvQixRQUFRLE1BQU0sT0FBTztBQUFBLFlBQ2xELENBQUM7QUFBQSxVQUVMLENBQUM7QUFFRCxpQkFBTyxNQUFNO0FBQ1QseUJBQWEsUUFBUSxVQUFRO0FBQ3pCLG1CQUFLO0FBQUEsWUFDVCxDQUFDO0FBQUEsVUFDTDtBQUFBLFFBQ0o7QUFBQTtBQUFBLElBQ0o7QUFBQTtBQUFBOzs7QUNuQ0EsSUFLYUU7QUFMYixJQUFBQyw0QkFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFFTyxJQUFNRCx1QkFBTixjQUFrQyxtQkFBd0M7QUFBQSxNQUExRTtBQUFBO0FBRUgsMkNBQWMsYUFBYTtBQUUzQix3Q0FBVyxDQUFDLFVBQStCO0FBQ3ZDLGdCQUFNLFFBQVEsaUJBQWlCLE1BQU0sS0FBSyxRQUFRO0FBQ2xELGdCQUFNLFFBQVEsVUFBUTtBQUNsQixpQkFBSyxhQUFhLE1BQU0sTUFBTSxNQUFNLEtBQUs7QUFBQSxVQUM3QyxDQUFDO0FBQUEsUUFDTDtBQUFBO0FBQUEsSUFDSjtBQUFBO0FBQUE7OztBQ2ZBLElBT2FFO0FBUGIsSUFBQUMseUNBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQSxJQUFBQztBQUNBO0FBQ0E7QUFDQTtBQUdPLElBQU1GLG9DQUFOLGNBQStDLG1CQUE4QztBQUFBLE1BQTdGO0FBQUE7QUFFSCwyQ0FBYyxhQUFhO0FBRTNCLHdDQUFXLENBQUMsVUFBcUM7QUFDN0MsZ0JBQU0sWUFBWSxNQUFZO0FBRTFCLGtCQUFNLFdBQVcsU0FBUyxpQkFBOEIsSUFBSSxlQUFlLEVBQUUsS0FBSyxNQUFNLFVBQVUsUUFBUSxJQUFJO0FBQzlHLGdCQUFJLFNBQVMsV0FBVyxHQUFHO0FBQ3ZCLG9CQUFNRyxXQUFVLFFBQVEsU0FBUztBQUNqQyxvQkFBTSxlQUFlLE1BQU1BLFNBQVE7QUFBQSxnQkFBYyxNQUFNO0FBQUEsZ0JBQ25ELFNBQVMsS0FBSyxDQUFDO0FBQUEsZ0JBQ2YsTUFBTTtBQUFBLGNBQU87QUFHakIsb0JBQU0sa0JBQXlCLENBQUM7QUFFaEMscUJBQU8sS0FBSyxhQUFhLElBQUksRUFBRSxRQUFRLGFBQVc7QUFDOUMsb0JBQUksTUFBTSxhQUFhLEtBQUssT0FBTztBQUNuQyxzQkFBTSxJQUFJLGdCQUFnQjtBQUcxQixvQkFBSyxJQUF1QixxQkFBcUI7QUFDN0Msa0NBQWdCLEtBQUs7QUFBQSxvQkFDakI7QUFBQSxvQkFDQSx1QkFBd0IsSUFBdUIsb0JBQW9CO0FBQUEsa0JBQ3ZFLENBQUM7QUFBQSxnQkFDTDtBQUFBLGNBQ0osQ0FBQztBQUlELG1CQUFLLGNBQWMsSUFBSSwyQkFBMkIsTUFBTSxpQkFBaUIsZUFBZSxDQUFDO0FBQUEsWUFDN0YsT0FBTztBQUNILHNCQUFRLE1BQU0sMERBQTBEO0FBQ3hFLG1CQUFLLGNBQWMsSUFBSSwyQkFBMkIsTUFBTSxpQkFBaUIsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUNsRjtBQUFBLFlBQ0o7QUFBQSxVQUNKO0FBRUEsb0JBQVUsRUFBRSxLQUFLO0FBQUEsUUFFckI7QUFBQTtBQUFBLElBQ0o7QUFBQTtBQUFBOzs7QUNsREEsSUFDYTtBQURiO0FBQUE7QUFBQTtBQUNPLElBQU0sYUFBYSxDQUFDLEtBQXlCLGFBQTJEO0FBQzNHLFVBQUksQ0FBQyxLQUFLO0FBQ04sZ0JBQVEsSUFBSSxHQUFHO0FBQ2Y7QUFBQSxNQUNKO0FBQ0EsVUFBSUMsb0JBQW1CLE9BQU8sb0JBQW9CLE9BQU87QUFFekQsVUFBSSxDQUFDLE9BQU8sSUFBSSxhQUFhLEVBQUc7QUFFaEMsVUFBSUEsbUJBQWtCO0FBRWxCLGNBQU0sbUJBQW1CLElBQUlBLGtCQUFpQixRQUFRO0FBRXRELGNBQU0sU0FBUyxFQUFDLFlBQVksTUFBTSxXQUFXLE1BQU0sU0FBUyxLQUFJO0FBQ2hFLHlCQUFpQixRQUFRLEtBQUssTUFBTTtBQUNwQyxlQUFPO0FBQUEsTUFDWCxXQUdTLE9BQU8sa0JBQWtCO0FBQzlCLFlBQUksaUJBQWlCLG1CQUFtQixVQUFVLEtBQUs7QUFDdkQsWUFBSSxpQkFBaUIsa0JBQWtCLFVBQVUsS0FBSztBQUFBLE1BQzFEO0FBQUEsSUFDSjtBQUFBO0FBQUE7OztBQ3hCQSxJQUthO0FBTGI7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFTyxJQUFNLDZCQUFOLGNBQXlDLG1CQUF5QztBQUFBLE1BQWxGO0FBQUE7QUFDSCwyQ0FBYyxhQUFhO0FBRTNCLHdDQUFXLENBQUMsVUFBZ0M7QUFDeEMsY0FBSSxNQUFNLFFBQVE7QUFDZCx1QkFBVyxTQUFTLE1BQU0sTUFBTTtBQUM1QixtQkFBSztBQUFBLGdCQUFjLElBQUksd0JBQXdCO0FBQUE7QUFBQSxjQUUvQztBQUFBLFlBQ0osQ0FBQztBQUFBLFVBQ0w7QUFBQSxRQUNKO0FBQUE7QUFBQSxJQUNKO0FBQUE7QUFBQTs7O0FDakJBLElBT01DLGdCQW1GT0M7QUExRmIsSUFBQUMsK0JBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQSxJQUFBQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUEsSUFBTUgsaUJBQWdCLENBQUMsWUFBK0I7QUFDbEQsVUFBSSxDQUFDLFFBQVMsUUFBTztBQUdyQixVQUFJLFFBQVEsWUFBWSxRQUFRO0FBQzVCLGNBQU0sV0FBVyxJQUFJLFNBQVMsT0FBTztBQUNyQyxjQUFNLGFBQWdDO0FBQUEsVUFDbEMsVUFBVSxDQUFDO0FBQUEsVUFDWCxjQUFjLENBQUM7QUFBQSxRQUNuQjtBQUdBLGNBQU0sV0FBVyxRQUFRLGlCQUFpQix5QkFBeUI7QUFDbkUsWUFBSSxrQkFBa0I7QUFFdEIsaUJBQVMsUUFBUSxDQUFBSSxhQUFXO0FBQ3hCLGNBQUksT0FBT0EsU0FBUSxVQUFVLFVBQVU7QUFDbkMsa0JBQU0sU0FBU0EsU0FBUSxhQUFhLGVBQWUsRUFBRTtBQUNyRCxnQkFBSSxNQUFNQSxTQUFRLGFBQWEsTUFBTTtBQUlyQyxrQkFBTSxXQUEwQjtBQUFBLGNBQzVCLElBQUlBLFNBQVE7QUFBQSxjQUNaLE1BQU07QUFBQSxjQUNOLE9BQU9KLGVBQWNJLFFBQU87QUFBQSxjQUM1QixVQUFVQSxTQUFRO0FBQUEsY0FDbEIsVUFBVSxpQkFBaUJBLFNBQVEsVUFBVSxJQUFJO0FBQUEsY0FDakQ7QUFBQSxZQUNKO0FBR0EsdUJBQVcsYUFBYyxLQUFLLFFBQVE7QUFDdEMsZ0JBQUksS0FBSztBQUNMLGtCQUFHLENBQUMsV0FBVyxTQUFVLEdBQUcsS0FBSyxDQUFDLFdBQVcsU0FBVSxHQUFHLEVBQUUsU0FBUyxTQUFTLE9BQU07QUFDaEYsMkJBQVcsU0FBVSxHQUFHLElBQUk7QUFBQSxjQUNoQztBQUFBLFlBQ0o7QUFBQSxVQWdCSjtBQUFBLFFBQ0osQ0FBQztBQUVELGVBQU87QUFBQSxNQUNYO0FBR0EsVUFBSSxRQUFRLFNBQVMsY0FBYyxRQUFRLFNBQVMsU0FBUztBQUN6RCxlQUFPLFFBQVEsVUFBVSxRQUFRLFFBQVE7QUFBQSxNQUM3QztBQUdBLFVBQUksUUFBUSxZQUFZLFdBQVcsUUFBUSxZQUFZLFlBQVk7QUFDL0QsZUFBTyxRQUFRO0FBQUEsTUFDbkI7QUFHQSxVQUFJLFFBQVEsWUFBWSxVQUFVO0FBQzlCLGVBQU8sUUFBUTtBQUFBLE1BQ25CO0FBR0EsVUFBSSxRQUFRLG1CQUFtQjtBQUMzQixlQUFPLFFBQVEsYUFBYSxRQUFRO0FBQUEsTUFDeEM7QUFHQSxhQUFPO0FBQUEsSUFDWDtBQUVPLElBQU1ILDBCQUFOLGNBQXFDLG1CQUEyQztBQUFBLE1BQWhGO0FBQUE7QUFFSCwyQ0FBYyxhQUFhO0FBRTNCLHdDQUFXLENBQUMsVUFBa0M7QUFDMUMsZ0JBQU0sUUFBUSxpQkFBaUIsTUFBTSxLQUFLLFFBQVE7QUFDbEQsZ0JBQU0sUUFBUSxVQUFRO0FBRWxCLGlCQUFLLGNBQWMsSUFBSTtBQUFBLGNBQ25CRCxlQUFjLElBQUk7QUFBQSxZQUN0QixHQUFHLEtBQUs7QUFBQSxVQUNaLENBQUM7QUFBQSxRQUNMO0FBQUE7QUFBQSxJQUNKO0FBQUE7QUFBQTs7O0FDdkdBLElBS2E7QUFMYjtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVPLElBQU0sc0JBQU4sY0FBa0MsbUJBQXdDO0FBQUEsTUFBMUU7QUFBQTtBQUVILDJDQUFjLGFBQWE7QUFFM0Isd0NBQVcsQ0FBQyxVQUErQjtBQUN2QyxnQkFBTSxPQUFPLHFCQUFxQixNQUFNLEtBQUssUUFBUTtBQUNyRCxjQUFJLE1BQU07QUFDTixpQkFBSyxjQUFjLElBQUksMEJBQTBCLEtBQUssYUFBYSxNQUFNLElBQUksQ0FBQyxHQUFHLEtBQUs7QUFBQSxVQUMxRjtBQUFBLFFBQ0o7QUFBQTtBQUFBLElBQ0o7QUFBQTtBQUFBOzs7QUNmQSxJQUlhO0FBSmI7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRU8sSUFBTSwyQkFBTixjQUF1QyxtQkFBNkM7QUFBQSxNQUFwRjtBQUFBO0FBQ0gsMkNBQWMsYUFBYTtBQUUzQix3Q0FBVyxDQUFDLFVBQW9DO0FBQzVDLGdCQUFNLGlCQUFpQixJQUFJLGVBQWUsQ0FBQyxZQUFZO0FBRW5ELGlCQUFLLGNBQWMsSUFBSSxzQkFBc0IsQ0FBQztBQUFBLFVBQ2xELENBQUM7QUFDRCx5QkFBZSxRQUFRLFNBQVMsSUFBSTtBQUVwQyxpQkFBTyxNQUFNO0FBQ1QsMkJBQWUsV0FBVztBQUFBLFVBQzlCO0FBQUEsUUFDSjtBQUFBO0FBQUEsSUFDSjtBQUFBO0FBQUE7OztBQ2xCQSxJQUthSztBQUxiLElBQUFDLDRCQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUVPLElBQU1ELHVCQUFOLGNBQWtDLG1CQUFpQztBQUFBLE1BQW5FO0FBQUE7QUFFSCwyQ0FBYyxhQUFhO0FBRTNCLHdDQUFXLENBQUMsVUFBd0I7QUFDaEMsZ0JBQU0sUUFBUSxpQkFBaUIsTUFBTSxLQUFLLFFBQVE7QUFDbEQsZ0JBQU0sUUFBUSxVQUFRO0FBRWxCLGlCQUFLLFlBQVksTUFBTTtBQUFBLFVBQzNCLENBQUM7QUFBQSxRQUNMO0FBQUE7QUFBQSxJQUNKO0FBQUE7QUFBQTs7O0FDaEJBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUE2RGE7QUE3RGI7QUFBQTtBQUFBO0FBcUJBO0FBQ0E7QUFDQSxJQUFBRTtBQUVBLElBQUFDO0FBQ0EsSUFBQUM7QUFDQSxJQUFBQztBQUNBO0FBQ0EsSUFBQUM7QUFDQSxJQUFBQztBQUNBO0FBTUEsSUFBQUM7QUFDQTtBQUNBLElBQUFDO0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBQUM7QUFpQk8sSUFBTSxZQUFOLGNBQXdCLFlBQVk7QUFBQSxNQUl2QyxjQUFjO0FBQ1YsY0FBTTtBQUhWLDRCQUFPLFdBQVU7QUFhakIsNkNBQWdCLENBQUMsU0FBZ0MsYUFBK0I7QUE1RXBGLGNBQUFDLEtBQUE7QUE2RVEsY0FBSSxDQUFDLFFBQVEsb0JBQW1CLHFDQUFVO0FBQ3RDLG9CQUFRLGtCQUFrQixTQUFTO0FBRXZDLGdCQUFNLGVBQWUsT0FBTyxLQUFLLEtBQUssVUFBVTtBQUVoRCxjQUFJLENBQUMsUUFBUSxhQUFhO0FBQ3RCLGdCQUFJLHFDQUFVLE9BQU87QUFFakIsc0JBQVEsY0FBYyxTQUFTLE1BQU0sU0FBUyxNQUFNLFNBQVMsQ0FBQztBQUFBLFlBQ2xFLE9BQU87QUFDSCxzQkFBUSxjQUFjLGFBQWEsQ0FBQztBQUFBLFlBQ3hDO0FBQUEsVUFDSjtBQUNBLGNBQUksQ0FBQyxRQUFRO0FBQ1Qsb0JBQVEsU0FBUyxhQUFhLENBQUM7QUFFbkMsa0JBQVEsWUFBWSxpQkFBaUI7QUFNckMsV0FBQyxNQUFBQSxNQUFBLEtBQUssZUFBTCxPQUFBQSxNQUFtQixPQUFPLFdBQTFCLG1CQUFtQyxZQUFZLG1CQUN6QyxVQUNKO0FBQUEsUUFDUDtBQUVBLGlEQUEwQztBQUFBLFVBQ3RDLElBQUlDLG1CQUFrQixLQUFLLGFBQWE7QUFBQSxVQUN4QyxJQUFJQyxxQkFBb0IsS0FBSyxhQUFhO0FBQUEsVUFDMUMsSUFBSUMsb0JBQW1CLEtBQUssYUFBYTtBQUFBLFVBQ3pDLElBQUlDLDhCQUE2QixLQUFLLGFBQWE7QUFBQSxVQUNuRCxJQUFJQyxzQkFBcUIsS0FBSyxhQUFhO0FBQUEsVUFDM0MsSUFBSUMseUJBQXdCLEtBQUssYUFBYTtBQUFBLFVBQzlDLElBQUlDLHFCQUFvQixLQUFLLGFBQWE7QUFBQSxVQUMxQyxJQUFJQyx3QkFBdUIsS0FBSyxhQUFhO0FBQUEsVUFDN0MsSUFBSSwyQkFBMkIsS0FBSyxhQUFhO0FBQUEsVUFDakQsSUFBSSx5QkFBeUIsS0FBSyxhQUFhO0FBQUEsVUFDL0MsSUFBSSxvQkFBb0IsS0FBSyxhQUFhO0FBQUE7QUFBQSxVQUcxQyxJQUFJQyxrQ0FBaUMsS0FBSyxhQUFhO0FBQUEsUUFDM0Q7QUFlQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLDRCQUFRLGNBQTRCLE9BQU87QUFtQjNDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSw0QkFBUSxtQkFBa0IsQ0FBQyxXQUErQztBQUN0RSxjQUFJLENBQUMsT0FBUSxRQUFPO0FBQ3BCLGNBQUksV0FBVyxPQUFRLFFBQU87QUFFOUIsY0FBSSxVQUFrQjtBQUN0QixtQkFBUyxRQUFRLEdBQUcsUUFBUSxJQUFJLFNBQVM7QUFDckMsa0JBQU0sU0FBUyxRQUFRO0FBQ3ZCLGdCQUFJLENBQUMsVUFBVSxXQUFXLFFBQVMsUUFBTztBQUMxQyxnQkFBSSxXQUFXLE9BQVEsUUFBTztBQUM5QixzQkFBVTtBQUFBLFVBQ2Q7QUFDQSxpQkFBTztBQUFBLFFBQ1g7QUFFQSw0QkFBTyxRQUFPLE1BQU07QUFDaEIsaUJBQU8sWUFBWSxDQUFDLFVBQXdCO0FBeEtwRCxnQkFBQVQ7QUF5S1ksZ0JBQUksQ0FBQyxLQUFLLGdCQUFnQixNQUFNLE1BQU0sRUFBRztBQVV6QyxnQkFBSSxNQUFNLFVBQ0gsTUFBTSxXQUFXLFlBQ2pCQSxNQUFBLE1BQU0sU0FBTixnQkFBQUEsSUFBWSxpQkFBZ0IsYUFBYSxhQUFhO0FBQ3pELG1CQUFLLGFBQWEsTUFBTTtBQUFBLFlBQzVCO0FBRUEsaUJBQUsscUJBQXFCLEtBQUs7QUFBQSxVQUNuQztBQUNBLGVBQUssY0FBYyxJQUFJLFlBQVksQ0FBQztBQUFBLFFBQ3hDO0FBeEhJLFlBQUksQ0FBQyxPQUFPLE1BQU07QUFFZCxpQkFBTyxPQUFPLENBQUM7QUFBQSxRQUNuQjtBQUVBLGVBQU8sS0FBSyxZQUFZO0FBQUEsTUFDNUI7QUFBQSxJQW9ISjtBQUVBLHdCQUFvQixhQUFhLFNBQVM7QUFBQTtBQUFBOzs7QUNoTTFDO0FBQUEsSUFHTVU7QUFITixJQUFBQyxxQkFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUEsSUFBTUQsZ0JBQWUsbUJBQ2Q7QUFHUCx3QkFBb0IsZ0JBQWdCQSxhQUFZO0FBQUE7QUFBQTs7O0FDUGhEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBLElBQUFFO0FBRUEsSUFBQUE7QUFFQSx3QkFBb0IsZUFBZSxlQUFXO0FBQUE7QUFBQTs7O0FDSjlDO0FBREE7QUFHQSxJQUFJLENBQUMsT0FBTyxnQkFBZ0IsR0FBRztBQUczQixRQUFNLGFBQVksY0FBUyxrQkFBVCxtQkFBd0I7QUFDMUMsUUFBTSx1QkFBdUIsWUFBWSxVQUFVLE1BQU0sR0FBRyxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsS0FBSyxHQUFHLElBQUk7QUFFdkYsU0FBTyxnQkFBZ0IsSUFBSTtBQUFBLElBQ3ZCO0FBQUEsSUFDQSwwQkFBMEI7QUFBQSxJQUMxQixpQkFBaUI7QUFBQSxJQUNqQixxQkFBc0IsSUFBSTtBQUFBLEVBQzlCO0FBQ0osT0FBTztBQUNILFVBQVEsSUFBSSx1Q0FBdUM7QUFDdkQ7QUFFQSxPQUFPLGdCQUFnQixFQUFFLG9CQUFvQixJQUFJLENBQUMsZ0JBQWdCLFlBQVksV0FBVztBQUVyRixNQUFJLENBQUMsT0FBTyxnQkFBZ0IsRUFBRSxVQUFVLEdBQUc7QUFDdkMsUUFBSTtBQUlKLFVBQU0sVUFBVSxDQUFDLE1BQU07QUFFdkIsV0FBTyxnQkFBZ0IsRUFBRSxVQUFVLElBQUksRUFBQyxRQUFPO0FBQy9DLFdBQU8sZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLFNBQVMsSUFBSSxDQUFDLFdBQVc7QUFDMUQsVUFBSSxXQUFXO0FBQ1gsaUJBQVMsS0FBSyxZQUFZLFNBQVM7QUFFbkMsb0JBQVk7QUFBQSxNQUVoQjtBQUdBLGFBQU8sZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixJQUFJO0FBQzFELGNBQVEsT0FBTyxDQUFDLEVBQUUsUUFBUSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7QUFBQSxJQUNoRDtBQUVBLFVBQU0sYUFBYSxDQUFDLFFBQVE7QUFDeEIsa0JBQVksU0FBUyxjQUFjLFFBQVE7QUFDM0MsZ0JBQVUsT0FBTztBQUNqQixnQkFBVSxNQUFNO0FBQ2hCLGdCQUFVLFFBQVE7QUFJbEIsZ0JBQVUsVUFBVSxNQUFNO0FBbER0QyxZQUFBQyxLQUFBO0FBbURnQixjQUFNLFdBQVUsTUFBQUEsTUFBQSxPQUFPLFNBQVAsZ0JBQUFBLElBQWEsNEJBQWIsbUJBQXNDLE1BQU0sS0FBSyxNQUFNLEdBQUcsSUFBSSxLQUFLO0FBQ25GLGNBQU0sZ0JBQWdCLElBQUksTUFBTSxHQUFHLEVBQUUsSUFBSTtBQUN6QyxZQUFJLFdBQVcsQ0FBQyxJQUFJLFdBQVcsT0FBTyxHQUFHO0FBQ3JDLGtCQUFRLEtBQUssaUNBQWlDLEdBQUcscUJBQXFCO0FBQ3RFLG1CQUFTLEtBQUssWUFBWSxTQUFTO0FBQ25DLHFCQUFXLEdBQUcsT0FBTyxJQUFJLGFBQWEsRUFBRTtBQUFBLFFBQzVDO0FBQUEsTUFDSjtBQUVBLGVBQVMsS0FBSyxZQUFZLFNBQVM7QUFBQSxJQUN2QztBQUVBLGVBQVcsY0FBYztBQUFBLEVBUTdCLE9BQU87QUFDSCxVQUFNLFFBQVEsT0FBTyxnQkFBZ0IsRUFBRSxVQUFVO0FBQ2pELFFBQUksTUFBTSxpQkFBaUIsR0FBRztBQUMxQixhQUFPLE1BQU0saUJBQWlCLENBQUM7QUFBQSxJQUNuQyxXQUFXLE1BQU0sU0FBUztBQUN0QixZQUFNLFFBQVEsS0FBSyxNQUFNO0FBQUEsSUFDN0IsT0FBTztBQUNILGNBQVEsSUFBSSx5QkFBeUIsVUFBVSxrQkFBa0I7QUFDakUsYUFBTyxNQUFNLGlCQUFpQixDQUFDO0FBQUEsSUFDbkM7QUFBQSxFQUNKO0FBQ0o7OztBQ2hGQTtBQUVBLFFBQVEsSUFBSSwwQkFBMEIsU0FBUyxTQUFTLE1BQU07QUFJOUQsSUFBTUMsMkJBQTBCO0FBRWhDLElBQU0sZ0JBQWdCLE1BQU07QUFDNUIsSUFBTSxrQkFBa0IsTUFBTTtBQUM5QixJQUFNLHdCQUF3QixNQUFNO0FBQ3BDLElBQU0sa0JBQWtCLE1BQU07QUFDOUIsSUFBTSxpQkFBaUIsTUFBTTtBQUk3QixJQUFNLGlCQUFpQixDQUFDLG1CQUF1QztBQUMzRCxTQUFPLE1BQVk7QUFDZixVQUFNLE1BQU0sTUFBTSxlQUFlO0FBQ2pDLFdBQU8sT0FBTyxJQUFJLFFBQVEsYUFBYSxJQUFJLElBQUksSUFBSTtBQUFBLEVBQ3ZEO0FBQ0o7QUFHQSxJQUFNLFVBQVU7QUFBQSxFQUNaLFNBQVU7QUFBQSxFQUNWLGVBQWUsZUFBZSxhQUFhO0FBQUEsRUFDM0MsaUJBQWlCLGVBQWUsZUFBZTtBQUFBLEVBQy9DLHVCQUF1QixlQUFlLHFCQUFxQjtBQUFBLEVBQzNELGlCQUFpQixlQUFlLGVBQWU7QUFBQSxFQUMvQyxnQkFBZ0IsZUFBZSxjQUFjO0FBQ2pEO0FBR0EsSUFBSSxDQUFDLE9BQU8sTUFBTTtBQUVkLFNBQU8sT0FBTztBQUFBLElBQ1YseUJBQUFBO0FBQUEsRUFDSjtBQUNKO0FBR0EsSUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTO0FBRXRCLFNBQU8sT0FBTztBQUFBO0FBQUEsSUFFVjtBQUFBLEtBQ0csT0FBTztBQUVsQixPQUFPO0FBQ0gsVUFBUSxJQUFJLHVDQUF1QztBQUN2RDsiLAogICJuYW1lcyI6IFsiUmVwbGF5TWVzc2FnZUtleSIsICJtYXRjaCIsICJzY3JpcHRJbnB1dHMiLCAic2NyaXB0SW5wdXRzIiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIl9hIiwgInNlZW4iLCAiX2EiLCAidGFyZ2V0IiwgIm1ha2VTZXJpYWxpemFibGUiLCAiX2EiLCAiaGVpZ2h0IiwgIndpZHRoIiwgIl9hIiwgIl9hIiwgIl9hIiwgIl9hIiwgImUiLCAiX2EiLCAiaW5pdF9jb25zdHMiLCAiaW5pdF9jb25zdHMiLCAiaW5pdF9jb25zdHMiLCAiaW5pdF9jb25zdHMiLCAiaG9zdFNESyIsICJpbml0X2V4ZWN1dGVTY3JpcHRIYW5kbGVyIiwgImluaXRfY29uc3RzIiwgImVsZW1lbnQiLCAiaW5pdF9leGVjdXRlU2NyaXB0SGFuZGxlciIsICJzZGsiLCAic2VlbiIsICJkb21JZCIsICJfYSIsICJpbml0X2hlbHBlcnMiLCAiaW5pdF9oZWxwZXJzIiwgInNraW4iLCAiX2EiLCAiY29tcG9uZW50IiwgInNlZ21lbnQiLCAiZXhwZXJpZW5jZSIsICJzZWxlY3RlZFNraW4iLCAiRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlciIsICJpbml0X0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIiLCAiaW5pdF9jb25zdHMiLCAiQmluZE9uQ2xpY2tIYW5kbGVyIiwgImluaXRfYmluZE9uQ2xpY2tIYW5kbGVyIiwgIkNoYW5nZVRleHRIYW5kbGVyIiwgImluaXRfY2hhbmdlVGV4dEhhbmRsZXIiLCAiRXhlY3V0ZVNjcmlwdEhhbmRsZXIiLCAiaW5pdF9leGVjdXRlU2NyaXB0SGFuZGxlciIsICJBZGRFdmVudExpc3RlbmVySGFuZGxlciIsICJpbml0X2FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIiwgInNldEF0dHJpYnV0ZUhhbmRsZXIiLCAiaW5pdF9zZXRBdHRyaWJ1dGVIYW5kbGVyIiwgIkNyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIiwgImluaXRfQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIiLCAiaW5pdF9jb25zdHMiLCAiaG9zdFNESyIsICJNdXRhdGlvbk9ic2VydmVyIiwgImdldElucHV0VmFsdWUiLCAiR2V0RWxlbWVudFZhbHVlSGFuZGxlciIsICJpbml0X0dldEVsZW1lbnRWYWx1ZUhhbmRsZXIiLCAiaW5pdF9jb25zdHMiLCAiZWxlbWVudCIsICJTZXRJbm5lckh0bWxIYW5kbGVyIiwgImluaXRfc2V0SW5uZXJIdG1sSGFuZGxlciIsICJpbml0X0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIiLCAiaW5pdF9iaW5kT25DbGlja0hhbmRsZXIiLCAiaW5pdF9jaGFuZ2VUZXh0SGFuZGxlciIsICJpbml0X2V4ZWN1dGVTY3JpcHRIYW5kbGVyIiwgImluaXRfYWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIiLCAiaW5pdF9zZXRBdHRyaWJ1dGVIYW5kbGVyIiwgImluaXRfQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIiLCAiaW5pdF9HZXRFbGVtZW50VmFsdWVIYW5kbGVyIiwgImluaXRfc2V0SW5uZXJIdG1sSGFuZGxlciIsICJfYSIsICJDaGFuZ2VUZXh0SGFuZGxlciIsICJTZXRJbm5lckh0bWxIYW5kbGVyIiwgIkJpbmRPbkNsaWNrSGFuZGxlciIsICJEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyIiwgIkV4ZWN1dGVTY3JpcHRIYW5kbGVyIiwgIkFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIiwgInNldEF0dHJpYnV0ZUhhbmRsZXIiLCAiR2V0RWxlbWVudFZhbHVlSGFuZGxlciIsICJDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciIsICJNeW9wTWVzc2FnZXMiLCAiaW5pdF9NeW9wTWVzc2FnZXMiLCAiaW5pdF9oZWxwZXJzIiwgIl9hIiwgIl9fUk9PVF9TREtfUFVCTElDX1VSTF9fIl0KfQo=
|